博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图书商城:用户模块
阅读量:2176 次
发布时间:2019-05-01

本文共 11351 字,大约阅读时间需要 37 分钟。

这里写图片描述

用户模块

1、用户模块的相关类创建

  • domain:User
  • dao:UserDao
  • service:UserDao
  • web.servlet:UserServlet

2、用户注册

2.1 注册流程

/jsps/user/regist.jsp -> UserServlet#regist() -> msg.jsp

2.2 注册页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>      注册    

注册

<%-- 1. 显示errors --> 字段错误 2. 显示异常错误 3. 回显 --%>

${msg }

用户名:
${errors.username }
密 码:
${errors.password }
邮 箱:
${errors.email }

2.3 UserServlet

User

/** * User的领域对象 */public class User {
/* * 对应数据库表 */ private String uid;// 主键 private String username;// 用户名 private String password;// 密码 private String email;// 邮箱 private String code;// 激活码 private boolean state;// 状态(已激活和未激活)

BaseServlet

public class BaseServlet extends HttpServlet {
/* * 它会根据请求中的method,来决定调用本类的哪个方法 */ protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); res.setContentType("text/html;charset=utf-8"); try { // 例如:http://localhost:8080/demo1/xxx?m=add String method = req.getParameter("method");// 它是一个方法名称 Class c = this.getClass(); Method m = c.getMethod(method, HttpServletRequest.class, HttpServletResponse.class); String result = (String) m.invoke(this, req, res); if(result != null && !result.isEmpty()) { req.getRequestDispatcher(result).forward(req, res); } } catch (Exception e) { throw new ServletException(e); } }}

UserServlet

/** * User表述层 */public class UserServlet extends BaseServlet {
private UserService userService = new UserService(); /** * 退出功能 * @param request * @param response * @return * @throws ServletException * @throws IOException */ public String quit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().invalidate(); return "r:/index.jsp"; } public String login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 1. 封装表单数据到form中 * 2. 输入校验(不写了) * 3. 调用service完成激活 * > 保存错误信息、form到request,转发到login.jsp * 4. 保存用户信息到session中,然后重定向到index.jsp */ User form = CommonUtils.toBean(request.getParameterMap(), User.class); try { User user = userService.login(form); request.getSession().setAttribute("session_user", user); /* * 给用户添加一个购物车,即向session中保存一Cart对象 */ request.getSession().setAttribute("cart", new Cart()); return "r:/index.jsp"; } catch (UserException e) { request.setAttribute("msg", e.getMessage()); request.setAttribute("form", form); return "f:/jsps/user/login.jsp"; } } /** * 激活功能 * @param request * @param response * @return * @throws ServletException * @throws IOException */ public String active(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 1. 获取参数激活码 * 2. 调用service方法完成激活 * > 保存异常信息到request域,转发到msg.jsp * 3. 保存成功信息到request域,转发到msg.jsp */ String code = request.getParameter("code"); try { userService.active(code); request.setAttribute("msg", "恭喜,您激活成功了!请马上登录!"); } catch (UserException e) { request.setAttribute("msg", e.getMessage()); } return "f:/jsps/msg.jsp"; } /** * 注册功能 * @param request * @param response * @return * @throws ServletException * @throws IOException */ public String regist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 1. 封装表单数据到form对象中 * 2. 补全:uid、code * 3. 输入校验 * > 保存错误信息、form到request域,转发到regist.jsp * 4. 调用service方法完成注册 * > 保存错误信息、form到request域,转发到regist.jsp * 5. 发邮件 * 6. 保存成功信息转发到msg.jsp */ // 封装表单数据 User form = CommonUtils.toBean(request.getParameterMap(), User.class); // 补全 form.setUid(CommonUtils.uuid()); form.setCode(CommonUtils.uuid() + CommonUtils.uuid()); /* * 输入校验 * 1. 创建一个Map,用来封装错误信息,其中key为表单字段名称,值为错误信息 */ Map
errors = new HashMap
(); /* * 2. 获取form中的username、password、email进行校验 */ String username = form.getUsername(); if(username == null || username.trim().isEmpty()) { errors.put("username", "用户名不能为空!"); } else if(username.length() < 3 || username.length() > 10) { errors.put("username", "用户名长度必须在3~10之间!"); } String password = form.getPassword(); if(password == null || password.trim().isEmpty()) { errors.put("password", "密码不能为空!"); } else if(password.length() < 3 || password.length() > 10) { errors.put("password", "密码长度必须在3~10之间!"); } String email = form.getEmail(); if(email == null || email.trim().isEmpty()) { errors.put("email", "Email不能为空!"); } else if(!email.matches("\\w+@\\w+\\.\\w+")) { errors.put("email", "Email格式错误!"); } /* * 3. 判断是否存在错误信息 */ if(errors.size() > 0) { // 1. 保存错误信息 // 2. 保存表单数据 // 3. 转发到regist.jsp request.setAttribute("errors", errors); request.setAttribute("form", form); return "f:/jsps/user/regist.jsp"; } /* * 调用service的regist()方法 */ try { userService.regist(form); } catch (UserException e) { /* * 1. 保存异常信息 * 2. 保存form * 3. 转发到regist.jsp */ request.setAttribute("msg", e.getMessage()); request.setAttribute("form", form); return "f:/jsps/user/regist.jsp"; } /* * 发邮件 * 准备配置文件! */ // 获取配置文件内容 Properties props = new Properties(); props.load(this.getClass().getClassLoader() .getResourceAsStream("email_template.properties")); String host = props.getProperty("host");//获取服务器主机 String uname = props.getProperty("uname");//获取用户名 String pwd = props.getProperty("pwd");//获取密码 String from = props.getProperty("from");//获取发件人 String to = form.getEmail();//获取收件人 String subject = props.getProperty("subject");//获取主题 String content = props.getProperty("content");//获取邮件内容 content = MessageFormat.format(content, form.getCode());//替换{0} Session session = MailUtils.createSession(host, uname, pwd);//得到session Mail mail = new Mail(from, to, subject, content);//创建邮件对象 try { MailUtils.send(session, mail);//发邮件! } catch (MessagingException e) { } /* * 1. 保存成功信息 * 2. 转发到msg.jsp */ request.setAttribute("msg", "恭喜,注册成功!请马上到邮箱激活"); return "f:/jsps/msg.jsp"; }}

2.4 UserService

/** * User业务层 */public class UserService {
private UserDao userDao = new UserDao(); /** * 注册功能 * @param form */ public void regist(User form) throws UserException{ // 校验用户名 User user = userDao.findByUsername(form.getUsername()); if(user != null) throw new UserException("用户名已被注册!"); // 校验email user = userDao.findByEmail(form.getEmail()); if(user != null) throw new UserException("Email已被注册!"); // 插入用户到数据库 userDao.add(form); } /** * 激活功能 * @throws UserException */ public void active(String code) throws UserException { /* * 1. 使用code查询数据库,得到user */ User user = userDao.findByCode(code); /* * 2. 如果user不存在,说明激活码错误 */ if(user == null) throw new UserException("激活码无效!"); /* * 3. 校验用户的状态是否为未激活状态,如果已激活,说明是二次激活,抛出异常 */ if(user.isState()) throw new UserException("您已经激活过了,不要再激活了,除非你想死!"); /* * 4. 修改用户的状态 */ userDao.updateState(user.getUid(), true); } /** * 登录功能 * @param form * @return * @throws UserException */ public User login(User form) throws UserException { /* * 1. 使用username查询,得到User * 2. 如果user为null,抛出异常(用户名不存在) * 3. 比较form和user的密码,若不同,抛出异常(密码错误) * 4. 查看用户的状态,若为false,抛出异常(尚未激活) * 5. 返回user */ User user = userDao.findByUsername(form.getUsername()); if(user == null) throw new UserException("用户名不存在!"); if(!user.getPassword().equals(form.getPassword())) throw new UserException("密码错误!"); if(!user.isState()) throw new UserException("尚未激活!"); return user; }}

2.5 UserDao

这里写图片描述

/** * User持久层 */public class UserDao {
private QueryRunner qr = new TxQueryRunner(); /** * 按用户名查询 * @param username * @return */ public User findByUsername(String username) { try { String sql = "select * from tb_user where username=?"; return qr.query(sql, new BeanHandler
(User.class), username); } catch(SQLException e) { throw new RuntimeException(e); } } /** * 按email查询 * @param email * @return */ public User findByEmail(String email) { try { String sql = "select * from tb_user where email=?"; return qr.query(sql, new BeanHandler
(User.class), email); } catch(SQLException e) { throw new RuntimeException(e); } } /** * 插入User * @param user */ public void add(User user) { try { String sql = "insert into tb_user values(?,?,?,?,?,?)"; Object[] params = {user.getUid(), user.getUsername(), user.getPassword(), user.getEmail(), user.getCode(), user.isState()}; qr.update(sql, params); } catch(SQLException e) { throw new RuntimeException(e); } } /** * 按激活码查询 * @param code * @return */ public User findByCode(String code) { try { String sql = "select * from tb_user where code=?"; return qr.query(sql, new BeanHandler
(User.class), code); } catch(SQLException e) { throw new RuntimeException(e); } } /** * 修改指定用户的指定状态 * @param uid * @param state */ public void updateState(String uid, boolean state) { try { String sql = "update tb_user set state=? where uid=?"; qr.update(sql, state, uid); } catch(SQLException e) { throw new RuntimeException(e); } }}

3、用户激活

流程:用户的邮件中 -> UserServlet#active() -> msg.jsp

这里写图片描述

4、用户登录

流程:/jsps/user/login.jsp -> UserServlet#login() -> index.jsp

这里写图片描述

5、用户退出

流程:top.jsp -> UserServlet#quit() -> login.jsp

quit():把session销毁!

你可能感兴趣的文章
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>
【雅思】【大作文】【审题作业】关于同不同意的审题作业(重点)
查看>>
【Loadrunner】通过loadrunner录制时候有事件但是白页无法出来登录页怎么办?
查看>>
【English】【托业】【四六级】写译高频词汇
查看>>
【托业】【新东方全真模拟】01~02-----P5~6
查看>>
【托业】【新东方全真模拟】03~04-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST05~06-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST09~10-----P5~6
查看>>
【托业】【新东方托业全真模拟】TEST07~08-----P5~6
查看>>
solver及其配置
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java集合框架知识梳理
查看>>
笔试题(一)—— java基础
查看>>
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>