04_用户注册与自定义数据转换器Conventer
用户注册
- 需求分析
- 步骤实现
- 创建自定义异常
- 创建转换器Conventer
需求分析
需求描述
查看注册界面
用户可以填写信息(账号,密码,email,姓名,性别,出生日期)完成注册,注册后需要对账号进行邮箱激活,激活后可以使用该账号进行登录。
步骤实现
- 在entity包下新建实体类User映射数据库的user数据表用于实体封装,在dao包和service包下新建UserDao接口和UserService接口,分别在其impl包下新建UserDaoImpl和UserServiceImpl实现类。
- 进入注册界面
①修改register.html为jsp
②修改首页注册的超链接地址,通过servlet转发到注册界面register.jsp - 在servlet中获取请求参数,完成实体封装,调用service执行注册
①封装实体,设置id和激活码为自动生成
②调用service执行注册
③转发到msg.jsp - 在service中调用dao执行注册
- 在dao层使用beanutils完成注册(增加操作)
- 测试
- 编写自定义异常
- 编写转换器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相关推荐
- 【struts2】struts2实现自定义数据类型转换器
JSP提交的数据全部都是String类型的.struts2也是通过request.getParameter(name)获取到String类型数据,并通过拦截器将String转换成各种常用的数据类型,如 ...
- SpringMVC学习笔记
文章目录 SpringMVC学习笔记 Spring MVC 什么是 MVC 设计模式? Spring MVC 的核心组件 Spring MVC 的工作流程 如何使用? Spring MVC 注解 Sp ...
- mvc:annotation-driven 注解的作用
1.自动注册映射处理器和适配器 这是该注解的主要功能,添加< mvc:annotation-driven/>注解后,容器中会<自动注册HandlerMapping与HandlerAd ...
- 像聊天机器人一样的c语言程序,示例:聊天机器人
结合咱们之前的学习,本节将带领大家来编写一个聊天机器人的雏形.下面的代码中展示了一个很傻的聊天程序. package main import ( "bufio" "fmt ...
- 【pytest】Hook 方法之 pytest_addoption :注册命令行参数
Hook 方法之 pytest_addoption : pytest_addoption 可以让用户注册一个自定义的命令行参数,方便用户将数据传递给 pytest: 这个 Hook 方法一般和 内置 ...
- 第八-九周-总结(day38-54)
HTML 一.html结构 <!DOCTYPE html> h5默认的文档声明<html> html根标签<head> 头标签<meta charset=&q ...
- 新闻推荐系统-项目介绍(PRD)
新闻推荐系统 b站链接 制作不易,6月后开源全部代码以及数据,记得一键三联哦! 开源代码: github代码库 mysql: 链接:https://pan.baidu.com/s/1jLzfYbpsf ...
- 【无标题】智慧工厂数字孪生建设方案
概述 项目背景 数字化转型是我国经济社会未来发展的必由之路,数字孪生技术作为推动实现企业数字化转型.促进数字经济发展的重要抓手,并在产品设计制造.生产监管.工艺优化.仿真验证起到重要作用. 项目目标 ...
- java中imp结尾,imp java
适配器模式之桥梁模式 设计模式目录 http://blog.csdn.net/fenglailea/article/details/52733435 风.fox 桥梁模式 Bridge Pattern ...
- @InitBinder注解绑定表单数据
在SpringMVC框架的项目中,bean中定义了Date,double等类型,如果没有做任何处理的话,日期以及double都无法绑定. 比如经常会遇到页面表单中某些数据类型是Date.In ...
最新文章
- 迅速返回页面顶部代码
- GameDev.net日报 2010.11.12 要卖了
- webpack基础+webpack配置文件常用配置项介绍+webpack-dev-server - QxQstar - 博客园
- [Java基础]对象(反)序列化流
- tabel表格制作及操作
- java c 引用区别_Java的引用c++的引用和C指针的区别
- scrapy通过item类直接创建数据库中的数据表
- 精准 iOS 内存泄露检测工具
- 一份清单:所有可以放进head标签的元素
- Padavan(老毛子)脚本自动切换网关和 DNS 服务器
- GPS经纬度的表示方法及换算
- Oracle 字段 中文英文拆分
- Java中new一个对象的过程
- 代写品牌故事-品牌故事的结构
- Win 10 Edge不能上网,微软商店打不开的问题
- 纪录片《向北1500米》
- oracle中的start with connect by用法
- 天耀18期 - 02.Java基础-标识符、关键字、数据类型【作业】
- 硬汉内贾德:让美国人战栗(推荐)
- 一次日歪了的渗透测试
热门文章
- 史上最简单的上传文件到linux系统方法
- 【洛谷 P3979】遥远的国度【树链剖分、换根】
- 【Codeforces Round #291 (Div. 2) D】R2D2 and Droid Army【线段树+二分】
- 实数系的连续性的含义
- html缓存失败是什么,HTML5离线“应用程序缓存错误事件:清单读取失败(-1)”...
- 计算几何——poj1410,线段不规范交
- CSS设置一行文字,超出部分自动隐藏
- 【转】64位win7环境eclipse集成svn后出现Failed to load JavaHL Library的解决办法
- [Unity3D]自制UnityForAndroid二维码扫描插件
- 人一生的8种朋友(看看身边的朋友属于哪种)