day14(编码实战-用户登录注册)
day14
案例:用户注册登录
要求:3层框架,使用验证码
功能分析
- 注册
- 登录
1.1 JSP页面
- regist.jsp
- 注册表单:用户输入注册信息;
- 回显错误信息:当注册失败时,显示错误信息;
- login.jsp
- 登录表单:用户输入登录信息;
- 回显错误便利店:当登录失败时,显示错误信息;
- index.jsp
- 用户已登录:显示当前用户名,以及"退出"链接;
- 用户未登录:显示"您还没有登录";
1.2 实体类
User:
- String username;
- String password;
1.3 Servlet
- VerifyCodeServlet
- 生成验证码;
- 在session中保存验证码文本;
- 把图片输出到页面
- RegistServlet
- 获取用户名、密码,封装到User对象中;
- 获取验证码、获取确认密码;
- 校验用户名、密码、验证码不能为空,校验失败,向request中保存错误信息,转发回regist.jsp显示错误信息;
- 比较两次输入的错误是否一致,如果不一致,向request中保存错误信息,转发回regist.jsp显示错误信息;
- 获取session中的验证码,与表单输入的验证码比较,如果不一致,向request中保存错误信息,转发回regist.jsp显示错误信息;
- 使用UserService的regist()方法完成注册,如果注册失败,向request中保存错误信息,转发回regist.jsp显示错误信息,如果注册成功,转发到login.jsp页面,表示注册成功;
- LoginServlet
- 获取用户名、密码、验证码;
- 校验用户名、密码、验证码是否为空,校验失败,向request中保存错误信息,转发回login.jsp显示错误信息;
- 获取session中的验证码,与表单中的验证码比较,如果不同,向request中保存错误信息,转发回login.jsp显示错误信息;
- 删除session中的验证码;
- 通过UserService的login()方法完成登录,如果抛出异常,获取异常信息,保存到request中,转发到login.jsp显示错误信息;
- 向session中保存当前用户对象;
- 转发到index.jsp页面,表示登录成功!
- QuitServlet
- 获取session,销毁之;
- 重定向到index.jsp;
1.4 Service
UserException:为UserService使用的异常类;
UserService:
- void regist(User user):
- 使用UserDao的findByUsername()方法查询名为user.getUsername()的用户,如果用户存在,说明用户名已经被注册,抛出异常;
- 使用UserDao的add(User)方法保存用户信息;
- User login(String username, String password):
- 使用UserDao的findByUsername()方法查询名为user.getUsername()的用户,如果用户不存在,说明用户名错误,抛出异常;
- 如果查询到了User,那么比较参数password与user.getPassword()是否相等,如果不等,说明密码错误,抛出异常;
- 如果一致,表示登录成功,返回User对象;
1.5 DAO
UserDao:
- void add(User):
- 创建SAXReader对象,获取Document对象,再获取根元素;
- 给root元素添加子元素;
- 给子元素设置username属性,值为user.getUsername();
- 给子元素设置password属性,值为user.getPassword();
- 创建OutputFormat对象,指定缩进为"\t",指定添加换行;
- 设置OutputFormat清空原有空白;
- 使用FileWrtier和OutputFormat创建XMLWriter对象;
- 使用XMLWriter对象的write()保存Document;
- 关闭XMLWriter对象;
- User findByUsername(String username):
- 创建SAXReader对象,获取Document对象;
- 使用Xpath(//user[username='xxx'])来查询元素;
- 如果元素没有查询到,返回null;
- 如果元素查询到了,那么创建User对象;
- 把元素的username属性赋给User的username属性;
- 把元素的password属性赋给User的password属性;
- 返回user对象;
2 流程图
2.1 注册
- 用户在浏览器地址栏中请求regist.jsp;
- 服务器发送html给浏览器;
- 浏览器收到html,开始解析,并显示;
- 解析到<img>时,请求VerifyCodeServlet;
- VerifyCodeServlet生成验证码图片,保存验证码文本,把图片响应给浏览器;
- 浏览器显示在页面中显示图片。


2.2 登录
此处省略10000字
3 代码
login.jsp
|
<body> <h1>登录</h1> <hr/> <p <form 用户名:<input 密 码:<input 验证码:<input <img <a <input </form> </body> |
|
<script function _change() { var img = document.getElementById("vCode"); img.src = "<c:url value='/VerifyCodeServlet?name=loginCode&'/>" + new Date().getTime(); } </script> |
regist.jsp
|
<body> <h1>注册</h1> <hr/> <p <form 用户名:<input 密 码:<input 确认密码:<input 验证码:<input <img <a <input </form> </body> |
|
<script function _change() { var img = document.getElementById("vCode"); img.src = "<c:url value='/VerifyCodeServlet?name=registCode&'/>" + new Date().getTime(); } </script> |
index.jsp
|
<body> <h1>主页</h1> <hr/> <c:choose> <c:when 您还没有登录 </c:when> <c:otherwise> 用户名:${sessionScope.user.username } <a </c:otherwise> </c:choose> </body> |
VerifyCodeServlet
|
public public throws ServletException, IOException { String name = request.getParameter("name");
VerifyCode vc = new VerifyCode();//创建验证码类 BufferedImage image = vc.getImage();//创建验证码图片 request.getSession().setAttribute(name, vc.getText());//获取验证码文本 System.out.println(vc.getText()); VerifyCode.output(image, response.getOutputStream());//输出图片到页面 } } |
RegistServlet
|
public public throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8");
User user = new User(); try { BeanUtils.populate(user, request.getParameterMap()); } catch (Exception e) { } String loginCode = request.getParameter("registCode"); String repassword = request.getParameter("repassword");
if(user.getUsername() == null || user.getUsername().trim().isEmpty()) { request.setAttribute("msg", "用户名不能为空!"); request.setAttribute("user", user); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; } if(user.getPassword() == null || user.getPassword().trim().isEmpty()) { request.setAttribute("msg", "密码不能为空!"); request.setAttribute("user", user); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; } if(!user.getPassword().equals(repassword)) { request.setAttribute("msg", "两次输入不一致!"); request.setAttribute("user", user); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; } if(loginCode == null || loginCode.trim().isEmpty()) { request.setAttribute("msg", "验证码不能为空!"); request.setAttribute("user", user); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; }
String vCode = (String)request.getSession().getAttribute("registCode"); request.getSession().removeAttribute("registCode"); if(!vCode.equalsIgnoreCase(loginCode)) { request.setAttribute("msg", "验证码错误!"); request.setAttribute("user", user); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; }
UserService userService = new UserService(); try { userService.regist(user); request.getRequestDispatcher("/login.jsp").forward(request, response); } catch (UserException e) { request.setAttribute("msg", e.getMessage()); request.setAttribute("user", user); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; } } } |
LoginServlet
|
public public throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8");
String username = request.getParameter("username"); String password = request.getParameter("password"); String loginCode = request.getParameter("loginCode");
if(username == null || username.trim().isEmpty()) { request.setAttribute("msg", "用户名不能为空!"); request.setAttribute("username", username); request.getRequestDispatcher("/login.jsp").forward(request, response); return; } if(password == null || password.trim().isEmpty()) { request.setAttribute("msg", "密码不能为空!"); request.setAttribute("username", username); request.getRequestDispatcher("/login.jsp").forward(request, response); return; } if(loginCode == null || loginCode.trim().isEmpty()) { request.setAttribute("msg", "验证码不能为空!"); request.setAttribute("username", username); request.getRequestDispatcher("/login.jsp").forward(request, response); return; }
String vCode = (String)request.getSession().getAttribute("loginCode"); request.getSession().removeAttribute("loginCode"); if(!vCode.equalsIgnoreCase(loginCode)) { request.setAttribute("msg", "验证码错误!"); request.setAttribute("username", username); request.getRequestDispatcher("/login.jsp").forward(request, response); return; }
UserService userService = new UserService(); User user; try { user = userService.login(username, password); } catch (UserException e) { request.setAttribute("msg", e.getMessage()); request.setAttribute("username", username); request.getRequestDispatcher("/login.jsp").forward(request, response); return; }
request.getSession().setAttribute("user", user); request.getRequestDispatcher("/index.jsp").forward(request, response); } } |
QuitServlet
|
public public throws ServletException, IOException { // 使session失效 request.getSession().invalidate(); response.sendRedirect(request.getContextPath() + "/index.jsp"); } } |
UserException
|
public public UserException() {} public UserException(String message, Throwable cause) { super(message, cause); } public UserException(String message) { super(message); } public UserException(Throwable cause) { super(cause); } } |
UserService
|
public private UserDao userDao = new UserDao();
public User login(String username, String password) throws UserException { User user = userDao.findByUsername(username); if(user == null) { throw } if(!user.getPassword().equals(password)) { throw } return user; }
public User _user = userDao.findByUsername(user.getUsername()); if(_user != null) { throw } userDao.add(user); } } |
UserDao
|
public private String path;
public UserDao() { path = this.getClass().getResource("/users.xml").getPath(); }
public try { SAXReader reader = new SAXReader(); Document doc = reader.read(path);
Element root = doc.getRootElement(); Element userEle = root.addElement("user"); userEle.addAttribute("username", user.getUsername()); userEle.addAttribute("password", user.getPassword());
// 创建格式化器,使用\t缩进,添加换行 OutputFormat format = new OutputFormat("\t", true); // 清空数据中原有的换行 format.setTrimText(true); // 创建XML输出流对象 XMLWriter writer = new XMLWriter(new FileWriter(path), format); // 输出Document writer.write(doc); // 关闭流 writer.close();
} catch (Exception e) { throw } }
public User findByUsername(String username) { try { SAXReader reader = new SAXReader(); Document doc = reader.read(path); Element ele = (Element) doc.selectSingleNode("//user[@username='" + username + "']"); if(ele == null) { return } User user = new User(); user.setUsername(ele.attributeValue("username")); user.setPassword(ele.attributeValue("password")); return user; } catch (Exception e) { throw } } } |
day14(编码实战-用户登录注册)的更多相关文章
- android安卓Sqlite数据库实现用户登录注册
看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下!建立一个类 并继承SQLiteOpenHelper public ...
- javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- 纯JSP实现用户登录注册,记事本
没有美化,没有格式,没有样式 1.JSP登陆注册 将用户注册的信息保存在application对象中,用于登录时的验证. 首页如下: 如果未登录,在 session 中找不到 currentUser ...
- JavaWeb学习 (二十一)————基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- Java Spring+Mysql+Mybatis 实现用户登录注册功能
前言: 最近在学习Java的编程,前辈让我写一个包含数据库和前端的用户登录功能,通过看博客等我先是写了一个最基础的servlet+jsp,再到后来开始用maven进行编程,最终的完成版是一个 Spri ...
- 基于Servlet+JSP+JavaBean开发模式的用户登录注册
http://www.cnblogs.com/xdp-gacl/p/3902537.html 一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBea ...
- javaweb(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
- /*用户登录注册页面输入框的设置*/<span>的使用
<!DOCTYPE html> /*用户登录注册页面输入框的设置*/ <html lang="en"> <head> <meta char ...
- flask 开发用户登录注册功能
flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ...
随机推荐
- 【Java面试题】54 去掉一个Vector集合中重复的元素
在Java中去掉一个 Vector 集合中重复的元素 1)通过Vector.contains()方法判断是否包含该元素,如果没有包含就添加到新的集合当中,适用于数据较小的情况下. import jav ...
- c++ list 合并list
1.参考 http://www.cplusplus.com/reference/list/list/ 2.合并 主要有两个函数:splice()和merge()splice()有三种调用形式:第一种: ...
- ChemDraw 16最新版本发布 更效率科研的首选
ChemDraw一直是全球领先的科学绘图软件,致力于为科学家.教师以及学生提供最新的智能应用程序.ChemDraw 16版本相较于15版本做出了较大的改进,大大缩短科研时间,提高科研效率.扩展Name ...
- retinex相关代码汇总
混合方法 SSR.m matlab代码,本来是RGB,改成了处理灰度图像的. %%%%%%%%%%%%%%%RGB normalisation%%%%%%%%%%%%%%%%%%%%%% %its c ...
- 帝国留言板管理员回复发送EMAIL通知客户
说明:修改1:e/admin/tool/ReGook.php /*回复表单*/ 43行处添加代码 ------------------------------------------------- ...
- Java精选笔记_Java入门
Java概述 什么是Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言 JavaSE标准版 是为开发普通桌面和商务应用程序提供的解决方案 JavaEE企业版 是为开发企业级应用程序提供的解 ...
- laravel安装 redis 并驱动 session
1)composer 安装 redis composer require predis/predis 如果感兴趣,可以看一下这里 2)配置 redis 连接(config/database.php 配 ...
- Tomcat连接参数的优化,主要是针对吞吐量做优化
Tomcat连接参数的优化,主要是针对吞吐量做优化: 修改conf/server.xml文件,把原来 <Connector port="8080" protocol=&quo ...
- TextSwitcher实现文本自动垂直滚动
实现功能:用TextSwitcher实现文本自动垂直滚动,类似淘宝首页广告条. 实现效果: 注意:由于网上横向滚动的例子比较多,所以这里通过垂直的例子演示. 实现步骤:1.extends TextSw ...
- shell 强大的awk
from here 小用法,使用awk来对文件随机抽取n行 awk 'BEGIN{srand()} {print rand()"\t"$0}' input_file | sort ...