用户注册

  • 需求分析
  • 步骤实现
  • 创建自定义异常
  • 创建转换器Conventer

需求分析

需求描述

查看注册界面

用户可以填写信息(账号,密码,email,姓名,性别,出生日期)完成注册,注册后需要对账号进行邮箱激活,激活后可以使用该账号进行登录。

步骤实现

  1. 在entity包下新建实体类User映射数据库的user数据表用于实体封装,在dao包和service包下新建UserDao接口和UserService接口,分别在其impl包下新建UserDaoImpl和UserServiceImpl实现类。
  2. 进入注册界面
    ①修改register.html为jsp
    ②修改首页注册的超链接地址,通过servlet转发到注册界面register.jsp
  3. 在servlet中获取请求参数,完成实体封装,调用service执行注册
    ①封装实体,设置id和激活码为自动生成
    ②调用service执行注册
    ③转发到msg.jsp
  4. 在service中调用dao执行注册
  5. 在dao层使用beanutils完成注册(增加操作)
  6. 测试
  7. 编写自定义异常
  8. 编写转换器Conventer

1)User实体类

在com.zhumengkj.entity下新建实体类User

public class User implements Serializable{/*** */private static final long serialVersionUID = -243642070602497283L;private String uid;private String username;private String name;private String email;private String telephone;private String birthday;private String sex;private Integer state;private String code;//...getter和setter方法
}


2)进入注册界面

以前很多同学喜欢直接使用超链接跳转到注册界面,如下:

<a href="${path}/jsp/register.jsp">注册</a>

这样的话跳转之后会在地址栏显示静态资源的位置:

为了提高安全性,我们需要隐藏静态资源的路径,则需要先访问servlet,然后通过转发进入到注册几面,修改超链接地址为:

<a href="${path}/user/toRegister">注册</a>

在com.zhumengkj.web.servlet包中新建UserServlet,重写service方法,添加@WebServlet("/user/*")用于处理所有user下的请求

@WebServlet("/user/*")
public class UserServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
}

得到请求路径真名URI,分析路径并进行处理:

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//得到URIString uri=request.getRequestURI();if(uri.endsWith("/toRegister")) {toRegister(request,response);}
}
private void toRegister(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//转发到注册界面request.getRequestDispatcher("/jsp/register.jsp").forward(request, response);
}

重启项目,点击注册:


3)Servlet处理

不要忘了修改注册界面的form表单

private void register(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{//1、得到参数,实体封装User user=new User();//1.1 使用BeanUtils替换掉原始封装方法try {BeanUtils.populate(user, request.getParameterMap());} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} System.out.println(user);//1.2 设置用户id--随机生成user.setUid(UUIDUtils.getId());//1.3 设置激活码--随机生成user.setCode(UUIDUtils.getCode());//2、调用service完成注册userService.regist(user);//3、页面请求转发request.setAttribute("msg", "用户注册成功,请去邮箱激活");request.getRequestDispatcher("/jsp/msg.jsp").forward(request, response);
}

4)Service层处理

接口:

public interface UserService {/*** 注册* @param user 要注册的用户信息*/void regist(User user);
}

实现类:

public class UserServiceImpl implements UserService{//创建dao层对象private UserDao userDao=new UserDaoImpl();@Overridepublic void regist(User user) {userDao.regist(user);}
}

5)Dao层处理

使用beanUtils完成注册
UserDao接口:

public interface UserDao {/*** 增加一个用户信息* @param user 要添加的用户信息*/void add(User user);
}

实现类:

public class UserDaoImpl implements UserDao{//QueryRunnerprivate QueryRunner qr=new QueryRunner(DBUtil.getDataSource());@Overridepublic void add(User user) {String sql="insert into `user` values (?,?,?,?,?,?,?,?,?,?)";try {qr.update(sql,user.getUid(),user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),user.getBirthday(),user.getSex(),user.getState(),user.getCode());} catch (SQLException e) {e.printStackTrace();}}}

6)测试


点击注册,显示用户注册成功,但是后台报错:


7)创建自定义异常

点击注册,后台报错,但是显示用户注册成功,没有跳转到500.jsp中
原因是我们在各个层次都处理了异常,现在我们把异常全部抛给web容器去处理

① 自定义异常

在com.zhumengkj.exception中创建MyException

/*** 自定义异常,因为要在servlet中的service中抛出该异常,* 所以该异常类型不能大于重写的service方法本身的异常,* 所以要继承ServletException而不能继承Exception*/
public class MyException extends ServletException{/*** */private static final long serialVersionUID = -1031514310435909910L;private String msg;public MyException(String msg) {this.msg=msg;}public MyException() {super();}}

② 自定义异常

在dao层和service层把异常向上抛出
UserDao:

/*** 增加一个用户信息* @param user 要添加的用户信息* @throws SQLException */
void add(User user) throws SQLException;

UserService:

/*** 注册* @param user 要注册的用户信息* @throws SQLException */
void regist(User user) throws SQLException;

servlet:

//得到URI
String uri=request.getRequestURI();
//处理各个方法抛出的异常
try {if(uri.endsWith("/toRegister")) {toRegister(request,response);}else if(uri.endsWith("/register")) {register(request,response);}
} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();//抛出自定义异常throw new MyException();
}

③ 测试

注册,出错时跳转到500.jsp:


8)创建转换器Conventer

① 编写一个类,实现Conventer接口
② 实现方法
convert(转换成的类型,前台页面传入的字符串)
③ 注册转换器 在封装数据之前注册
ConvertUtils.register(…);

① 转换器MyConventer,实现convert方法,完成转换逻辑

public class MyConventer implements Converter{/*** 将传入的字符串转换为Date类型* @param c 要封装的类型* @param value 传入的值*/@Overridepublic Object convert(Class c, Object value) {SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");try {Date date=sdf.parse((String)value);return date;} catch (ParseException e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}

② 注册转换器 在封装数据之前注册-UserServlet

     ···//1、得到参数,实体封装User user=new User();//注册自定义转换器ConvertUtils.register(new MyConventer(), Date.class);//1.1 使用BeanUtils替换掉原始封装方法BeanUtils.populate(user, request.getParameterMap());···

③ 测试

进行注册:

点击注册:

查看数据库:

数据添加成功,但是在name处的姓名“张三”和sex性别的“男”是乱码。下一章我们讲解如何处理中文乱码。

04_用户注册与自定义数据转换器Conventer相关推荐

  1. 【struts2】struts2实现自定义数据类型转换器

    JSP提交的数据全部都是String类型的.struts2也是通过request.getParameter(name)获取到String类型数据,并通过拦截器将String转换成各种常用的数据类型,如 ...

  2. SpringMVC学习笔记

    文章目录 SpringMVC学习笔记 Spring MVC 什么是 MVC 设计模式? Spring MVC 的核心组件 Spring MVC 的工作流程 如何使用? Spring MVC 注解 Sp ...

  3. mvc:annotation-driven 注解的作用

    1.自动注册映射处理器和适配器 这是该注解的主要功能,添加< mvc:annotation-driven/>注解后,容器中会<自动注册HandlerMapping与HandlerAd ...

  4. 像聊天机器人一样的c语言程序,示例:聊天机器人

    结合咱们之前的学习,本节将带领大家来编写一个聊天机器人的雏形.下面的代码中展示了一个很傻的聊天程序. package main import ( "bufio" "fmt ...

  5. 【pytest】Hook 方法之 pytest_addoption :注册命令行参数

    Hook 方法之 pytest_addoption : pytest_addoption 可以让用户注册一个自定义的命令行参数,方便用户将数据传递给 pytest: 这个 Hook 方法一般和 内置 ...

  6. 第八-九周-总结(day38-54)

    HTML 一.html结构 <!DOCTYPE html> h5默认的文档声明<html> html根标签<head> 头标签<meta charset=&q ...

  7. 新闻推荐系统-项目介绍(PRD)

    新闻推荐系统 b站链接 制作不易,6月后开源全部代码以及数据,记得一键三联哦! 开源代码: github代码库 mysql: 链接:https://pan.baidu.com/s/1jLzfYbpsf ...

  8. 【无标题】智慧工厂数字孪生建设方案

    概述 项目背景 数字化转型是我国经济社会未来发展的必由之路,数字孪生技术作为推动实现企业数字化转型.促进数字经济发展的重要抓手,并在产品设计制造.生产监管.工艺优化.仿真验证起到重要作用. 项目目标 ...

  9. java中imp结尾,imp java

    适配器模式之桥梁模式 设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 桥梁模式 Bridge Pattern ...

  10. @InitBinder注解绑定表单数据

    在SpringMVC框架的项目中,bean中定义了Date,double等类型,如果没有做任何处理的话,日期以及double都无法绑定.      比如经常会遇到页面表单中某些数据类型是Date.In ...

最新文章

  1. 迅速返回页面顶部代码
  2. GameDev.net日报 2010.11.12 要卖了
  3. webpack基础+webpack配置文件常用配置项介绍+webpack-dev-server - QxQstar - 博客园
  4. [Java基础]对象(反)序列化流
  5. tabel表格制作及操作
  6. java c 引用区别_Java的引用c++的引用和C指针的区别
  7. scrapy通过item类直接创建数据库中的数据表
  8. 精准 iOS 内存泄露检测工具
  9. 一份清单:所有可以放进head标签的元素
  10. Padavan(老毛子)脚本自动切换网关和 DNS 服务器
  11. GPS经纬度的表示方法及换算
  12. Oracle 字段 中文英文拆分
  13. Java中new一个对象的过程
  14. 代写品牌故事-品牌故事的结构
  15. Win 10 Edge不能上网,微软商店打不开的问题
  16. 纪录片《向北1500米》
  17. oracle中的start with connect by用法
  18. 天耀18期 - 02.Java基础-标识符、关键字、数据类型【作业】
  19. 硬汉内贾德:让美国人战栗(推荐)
  20. 一次日歪了的渗透测试

热门文章

  1. 史上最简单的上传文件到linux系统方法
  2. 【洛谷 P3979】遥远的国度【树链剖分、换根】
  3. 【Codeforces Round #291 (Div. 2) D】R2D2 and Droid Army【线段树+二分】
  4. 实数系的连续性的含义
  5. html缓存失败是什么,HTML5离线“应用程序缓存错误事件:清单读取失败(-1)”...
  6. 计算几何——poj1410,线段不规范交
  7. CSS设置一行文字,超出部分自动隐藏
  8. 【转】64位win7环境eclipse集成svn后出现Failed to load JavaHL Library的解决办法
  9. [Unity3D]自制UnityForAndroid二维码扫描插件
  10. 人一生的8种朋友(看看身边的朋友属于哪种)