修改头像流程
1.点击修改头像超链接,跳转到修改头像的表单 /avatarUpload
2.提交表单
1.将文件保存到项目中的一个指定目录/headImg(3.0版本文件上传)
2.将文件在项目中的路径更新到数据库中
1.获取当前登录用户的id(在Session中)
2.获取文件所在项目中的路径/headImg/xxxxx.jpg
将以上的两个数据传递到service中
3.在service中将两个数据封装到对象中,(因为在mybatis中的update方法只能接收两个参数,一个是namespace+sqlid,另一个就是SQL需要的数据) 传递给DAO
4.DAO层执行方法,将数据更新到数据库中
5.回到service回到servlet
6.将新的图片信息更新到Session中
7.跳转首页,获取头像
修改密码流程
-
用户点击修改密码链接,跳转到修改密码的表单 /updatePassword
-
用户填写表单后,并提交表单
- 获取用户的id(在session中)
- 获取用户的新密码和旧密码
将以上三个数据传递到service(业务层)中
-
在service中校验旧密码与数据库中密码
- 正确,将新密码保存到数据库中对应用户的记录中。
- 错误,抛出异常。
-
DAO层执行方法,将数据更新到数据库中
-
回到service回到Servlet
-
将新的密码信息更新到session中
-
跳转首页
注销用户
- 用户点击注销链接
- 服务端处理请求
- 方式一:使用servlet ,将session销毁或者删除session中的用户数据
- 方式二:在jsp中 ,将session销毁或者删除session中的用户数据
- 跳转到登录页面
记住用户
- 在登录Servlet中创建cookie并将其发送给客户端,以便在下次访问网站时自动填充用户名和密码。
- 在登录JSP页面中检查cookie是否存在,并将其值填充到登录表单中。
// 在登录Servlet中创建cookie并将其发送给客户端
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取用户输入的用户名和密码String username = request.getParameter("username");String password = request.getParameter("password");// 验证用户名和密码是否正确if (checkUser(username, password)) {// 用户名和密码正确,创建cookieCookie cookie = new Cookie("loginCookie", username + ":" + password);cookie.setMaxAge(60 * 60 * 24 * 7); // 设置cookie的有效期为一周response.addCookie(cookie);// 重定向到首页response.sendRedirect("/index");} else {// 用户名或密码不正确,返回错误信息response.getWriter().write("用户名或密码不正确");}
}// 在登录JSP页面中将账号密码填充到登录表单中<%-- 将用户名和密码填充到登录表单中 --%><input type="text" name="username" value="${cookie.username.value}" /><input type="password" name="password" value="${cookie.password.value}" />
验证码
-
在登录页面中生成验证码,并将其存储在session中。
-
在登录Servlet中获取用户输入的验证码,并与session中存储的验证码进行比较。
// RandomCodeSerlet
// 在登录页面中生成验证码,并将其存储在session中
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/** 生成验证码 **/// 将验证码存储在session中HttpSession session = request.getSession();session.setAttribute("RANDOMECODE_IN_SESSION", captcha);// 将验证码绘制到图片上,并将图片发送给客户端// .....
}// LoginServlet
// 在登录Servlet中获取用户输入的验证码,并与session中存储的验证码进行比较
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取用户输入的验证码String captcha = request.getParameter("captcha");// 获取session中存储的验证码HttpSession session = request.getSession();Object storedCaptcha = session.getAttribute("RANDOMECODE_IN_SESSION");// 比较用户输入的验证码和session中存储的验证码if (captcha != null && captcha.equals(storedCaptcha)) {// 验证码正确,继续登录流程// ...} else {// 验证码不正确,返回错误信息request.setAttribute("errorMsg", "验证码不正确。");request.getRequestDispatcher("/login").forward(requset, response);}
}
三层架构
-
表现层(Presentation Layer):负责接收用户请求,将请求转发给业务层,并将业务层的响应返回给用户。在Servlet中,通常由Servlet负责实现。
-
业务层(Business Layer):负责处理业务逻辑,包括数据的处理、计算、验证等。在Servlet中,通常由Service或Manager类负责实现。
-
数据访问层(Data Access Layer):负责与数据库进行交互,包括数据的读取、写入、更新等。在Servlet中,通常由DAO类负责实现。
三层架构可以帮助我们将代码进行分层,使得代码更加清晰、易于维护。
分层的好处
责任分离,各司其职,体现高内聚低耦合。
命名规范
-
包名
- 域名倒写.模块名.service:存放业务接口代码。
- 域名倒写.模块名.service.impl:存放业务接口的实现类。
-
类名
- 表现层(Presentation Layer):通常以“Servlet”结尾,例如“RegisterServlet”、“LoginServlet”等。
- 业务层(Business Layer):通常以“Service”结尾,例如“UserService”、“OrderService”等。
- 数据访问层(Data Access Layer):通常以“Dao”结尾,例如“UserDao”、“OrderDao”等。