javaweb图书商城设计之用户模块(1)

      2020-02-15 02:19      JAVA编程
这篇文章主要介绍了javaweb图书商城设计之用户模块的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文主要为大家分析了图书商城的用户模块,具体内容如下

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" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>注册</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0">  <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>注册</h1> <%-- 1. 显示errors --> 字段错误 2. 显示异常错误 3. 回显 --%><p style="color: red; font-weight: 900">${msg }</p><form action="<c:url value='/UserServlet'/>" method="post"> <input type="hidden" name="method" value="regist"/> 用户名:<input type="text" name="username" value="${form.username }"/> <span style="color: red; font-weight: 900">${errors.username }</span> <br/> 密 码:<input type="password" name="password" value="${form.password }"/> <span style="color: red; font-weight: 900">${errors.password }</span> <br/> 邮 箱:<input type="text" name="email" value="${form.email }"/> <span style="color: red; font-weight: 900">${errors.email }</span> <br/> <input type="submit" value="注册"/></form> </body></html>

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<String,String> errors = new HashMap<String,String>();  /*   * 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>(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>(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>(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销毁!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。