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

时间:2022-08-31 19:44:04

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

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

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

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

2、用户注册

2.1 注册流程

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

2.2 注册页面

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<%@ 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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * User的领域对象
 */
public class User {
 /*
  * 对应数据库表
  */
 private String uid;// 主键
 private String username;// 用户名
 private String password;// 密码
 private String email;// 邮箱
 private String code;// 激活码
 private boolean state;// 状态(已激活和未激活)

BaseServlet

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/**
 * 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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
 * 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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/**
 * 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

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

用户登录

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

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

用户退出

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

quit():把session销毁!

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