基于xml的用户注册登录案例
用户注册登录
要求:3层框架,使用验证码
1 功能分析
l 注册
l 登录
1.1 JSP页面
l regist.jsp
- 注册表单:用户输入注册信息;
- 回显错误信息:当注册失败时,显示错误信息;
l login.jsp
- 登录表单:用户输入登录信息;
- 回显错误信息:当登录失败时,显示错误信息;
l index.jsp
- 用户已登录:显示当前用户名,以及“退出”链接;
- 用户未登录:显示“您还没有登录”;
1.2 实体类
User:
l String username;
l String password;
1.3 Servlet
l VerifyCodeServlet
- 生成验证码;
- 在session中保存验证码文本;
- 把图片输出到页面
l RegistServlet
- 获取用户名、密码,封装到User对象中;
- 获取验证码、获取确认密码;
校验用户名、密码、验证码不能为空,校验失败,向request中保存错误信息,转发回
- regist.jsp显示错误信息;
- 比较两次输入的错误是否一致,如果不一致,向request中保存错误信息,转发回regist.jsp显示错误信息;
- 获取session中的验证码,与表单输入的验证码比较,如果不一致,向request中保存错误信息,转发回regist.jsp显示错误信息;
- 使用UserService的regist()方法完成注册,如果注册失败,向request中保存错误信息,转发回regist.jsp显示错误信息,如果注册成功,转发到login.jsp页面,表示注册成功;
l LoginServlet
- 获取用户名、密码、验证码;
- 校验用户名、密码、验证码是否为空,校验失败,向request中保存错误信息,转发回login.jsp显示错误信息;
- 获取session中的验证码,与表单中的验证码比较,如果不同,向request中保存错误信息,转发回login.jsp显示错误信息;
- 删除session中的验证码;
- 通过UserService的login()方法完成登录,如果抛出异常,获取异常信息,保存到request中,转发到login.jsp显示错误信息;
- 向session中保存当前用户对象;
- 转发到index.jsp页面,表示登录成功!
l QuitServlet
- 获取session,销毁之;
- 重定向到index.jsp;
1.4 Service
UserException:为UserService使用的异常类;
UserService:
l void regist(User user):
- 使用UserDao的findByUsername()方法查询名为user.getUsername()的用户,如果用户存在,说明用户名已经被注册,抛出异常;
- 使用UserDao的add(User)方法保存用户信息;
l User login(String username, String password):
- 使用UserDao的findByUsername()方法查询名为user.getUsername()的用户,如果用户不存在,说明用户名错误,抛出异常;
- 如果查询到了User,那么比较参数password与user.getPassword()是否相等,如果不等,说明密码错误,抛出异常;
- 如果一致,表示登录成功,返回User对象;
1.5 DAO
UserDao:
l void add(User):
- 创建SAXReader对象,获取Document对象,再获取根元素;
- 给root元素添加子元素;
- 给子元素设置username属性,值为user.getUsername();
- 给子元素设置password属性,值为user.getPassword();
- 创建OutputFormat对象,指定缩进为“\t”,指定添加换行;
- 设置OutputFormat清空原有空白;
- 使用FileWrtier和OutputFormat创建XMLWriter对象;
- 使用XMLWriter对象的write()保存Document;
- 关闭XMLWriter对象;
l User findByUsername(String username):
- 创建SAXReader对象,获取Document对象;
- 使用Xpath(//user[username=’xxx’])来查询元素;
- 如果元素没有查询到,返回null;
- 如果元素查询到了,那么创建User对象;
- 把元素的username属性赋给User的username属性;
- 把元素的password属性赋给User的password属性;
- 返回user对象;
2 流程图
2.1 注册
l 用户在浏览器地址栏中请求regist.jsp;
l 服务器发送html给浏览器;
l 浏览器收到html,开始解析,并显示;
l 解析到<img>时,请求VerifyCodeServlet;
l VerifyCodeServlet生成验证码图片,保存验证码文本,把图片响应给浏览器;
l 浏览器显示在页面中显示图片。
2.2 登录
此处省略10000字
3 代码
login.jsp
|
<body> <h1>登录</h1> <hr/> <p style="font-weight: 900; color: red;">${msg }</p> <form action="<c:url value='/LoginServlet'/>" method="post"> 用户名:<input type="text" name="username" value="${user.username }" /><br/> 密 码:<input type="password" name="password"/><br/> 验证码:<input type="text" name="loginCode" size="2"/> <img id="vCode" src="<c:url value='/VerifyCodeServlet?name=loginCode'/>" border="2"/> <a href="javascript:_change()" style="font-size: 12;">看不清,换一张</a><br/> <input type="submit" value="登录"/> </form> </body> |
|
<script type="text/javascript"> 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 style="font-weight: 900; color: red;">${msg }</p> <form action="<c:url value='/RegistServlet'/>" method="post"> 用户名:<input type="text" name="username" value="${user.username }" /><br/> 密 码:<input type="password" name="password"/><br/> 确认密码:<input type="password" name="repassword"/><br/> 验证码:<input type="text" name="registCode" size="2"/> <img id="vCode" src="<c:url value='/VerifyCodeServlet?name=registCode'/>" border="2"/> <a href="javascript:_change()" style="font-size: 12;">看不清,换一张</a><br/> <input type="submit" value="注册"/> </form> </body> |
|
<script type="text/javascript"> 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 test="${empty sessionScope.user }"> 您还没有登录 </c:when> <c:otherwise> 用户名:${sessionScope.user.username } <a href="<c:url value='/QuitServlet'/>">退出</a> </c:otherwise> </c:choose> </body> |
VerifyCodeServlet
|
public class VerifyCodeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) 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 class RegistServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) 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 class LoginServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) 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 class QuitServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 使session失效 request.getSession().invalidate(); response.sendRedirect(request.getContextPath() + "/index.jsp"); } } |
UserException
|
public class UserException extends Exception { 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 class UserService { private UserDao userDao = new UserDao(); public User login(String username, String password) throws UserException { User user = userDao.findByUsername(username); if(user == null) { throw new UserException("用户名错误!"); } if(!user.getPassword().equals(password)) { throw new UserException("密码错误!"); } return user; } public void regist(User user) throws UserException { User _user = userDao.findByUsername(user.getUsername()); if(_user != null) { throw new UserException("用户名已注册!"); } userDao.add(user); } } |
UserDao
|
public class UserDao { private String path; public UserDao() { path = this.getClass().getResource("/users.xml").getPath(); } public void add(User user) { 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 new RuntimeException(e); } } 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 null; } User user = new User(); user.setUsername(ele.attributeValue("username")); user.setPassword(ele.attributeValue("password")); return user; } catch (Exception e) { throw new RuntimeException(e); } } } |
基于xml的用户注册登录案例的更多相关文章
- 基于Struts2框架实现登录案例 之 使用Struts2标签库简化表单+继承ActionSupport完成输入交验
一,使用Struts2标签库简化表单 在文章[基于Struts2框架实现登录案例]的基础上,通过使用Struts标签库可以简化登录页面login2.jsp <%@ page language=& ...
- spring的基于xml的AOP配置案例和切入点表达式的一些写法
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- 基于Struts2框架实现登录案例 之 程序国际化
国际化牵涉的知识非常多,这里只能简单的介绍,程序国际化的一般做法是:在jsp页面时, 不是直接输出信息,而是输出一个key值,该key值在不同语言环境下找到对应资源文件下的 对应信息,因此首先要创建满 ...
- 阶段3 2.Spring_05.基于XML的IOC的案例1_4 注解IOC案例-把自己编写的类使用注解配置
注解改造案例 复制之前的xml配置的pom.xml里面的依赖. 复制com文件 bean.xml配置文件也拷贝过来 测试类也复制过来 开始基于注解的IOC配置 右键项目,选择maven.选择更新 更新 ...
- 基于Struts2框架实现登录案例
一,准备工作 1)新建web项目,并导入Struts2jar文件和配置web.xml文件. struts2 jar文件 web.xml文件 <?xml version="1.0&qu ...
- 阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例
编写测试方法. TestMehtod 生成测试方法 只需要改个名字叫做testFindAll 然后就复制这个方法,多复制几次改改名字 findAll方法 编写查询所有的代码 选中和这个方法,run 根 ...
- 阶段3 2.Spring_05.基于XML的IOC的案例1_2 基于XML的IOC的案例-编写spring的Ioc配置
首先配置service对象,配置完Service对象就是注入dao对象. 但是现在没有dao对象,那就需要先配置dao对象.dao配置好以后.上线dao的注入就可以通过refs对象来注入这个dao了 ...
- 阶段3 2.Spring_05.基于XML的IOC的案例1_1 基于XML的IOC的案例-案例准备
导坐标 创建数据库表 create table account( id int primary key auto_increment, name varchar(40), money float )c ...
- Ajax案例-基于XML,以POST方式,完成省份-城市二级下拉联动
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...
随机推荐
- TCP包头
每发一个包,不论大小协议头会占用一定的空间 TCP头20字节,IP头20字节,MAC头14字节,共54字节 //Mac头部,总长度14字节 typedef struct _eth_hdr { ...
- POJ 1947 Rebuilding Roads (树dp + 背包思想)
题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...
- 【转】删除已经存在的 TFS Workspace
删除已经存在的 TFS Workspace 分类: TFS2010-03-03 16:59 1239人阅读 评论(2) 收藏 举报 serverpathcommandcachefilegoogle 工 ...
- JS阻塞的问题
常见问题 http://www.zhihu.com/question/23101413 阻塞特性: JS 有个很无语的阻塞特性,就是当浏览器在执行JS 代码时,不能同时做其他任 ...
- 重学HTML
http://www.imooc.com/learn/9 1.em/strong 如果想在一段话中特别强调某几个文字,这时候就可以用到<em>或<strong>标签. 但两者在 ...
- CSS3- px、em、rem区别介绍
PX px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em ...
- NoSQL 数据建模技术(转)
本文转载自:http://coolshell.cn/articles/7270.html ================================================ 全文译自墙外 ...
- ASP.NET中上传并读取Excel文件数据
在CSDN中,经常有人问如何打开Excel数据库文件.本文通过一个简单的例子,实现读取Excel数据文件. 首先,创建一个Web应用程序项目,在Web页中添加一个DataGrid控件.一个文件控件和一 ...
- bzoj 1041: [HAOI2008]圆上的整点 数学
1041: [HAOI2008]圆上的整点 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...
- linux C(undefined reference to `sqrt')
那是因为没有链接到math库 可以这样来做,在后面加上-lm. 代码如下: gcc 10.c -o 10 -lm