用户注册登录

要求: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的用户注册登录案例的更多相关文章

  1. 基于Struts2框架实现登录案例 之 使用Struts2标签库简化表单+继承ActionSupport完成输入交验

    一,使用Struts2标签库简化表单 在文章[基于Struts2框架实现登录案例]的基础上,通过使用Struts标签库可以简化登录页面login2.jsp <%@ page language=& ...

  2. spring的基于xml的AOP配置案例和切入点表达式的一些写法

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  3. 基于Struts2框架实现登录案例 之 程序国际化

    国际化牵涉的知识非常多,这里只能简单的介绍,程序国际化的一般做法是:在jsp页面时, 不是直接输出信息,而是输出一个key值,该key值在不同语言环境下找到对应资源文件下的 对应信息,因此首先要创建满 ...

  4. 阶段3 2.Spring_05.基于XML的IOC的案例1_4 注解IOC案例-把自己编写的类使用注解配置

    注解改造案例 复制之前的xml配置的pom.xml里面的依赖. 复制com文件 bean.xml配置文件也拷贝过来 测试类也复制过来 开始基于注解的IOC配置 右键项目,选择maven.选择更新 更新 ...

  5. 基于Struts2框架实现登录案例

    一,准备工作  1)新建web项目,并导入Struts2jar文件和配置web.xml文件. struts2 jar文件 web.xml文件 <?xml version="1.0&qu ...

  6. 阶段3 2.Spring_05.基于XML的IOC的案例1_3 测试基于XML的IOC案例

    编写测试方法. TestMehtod 生成测试方法 只需要改个名字叫做testFindAll 然后就复制这个方法,多复制几次改改名字 findAll方法 编写查询所有的代码 选中和这个方法,run 根 ...

  7. 阶段3 2.Spring_05.基于XML的IOC的案例1_2 基于XML的IOC的案例-编写spring的Ioc配置

    首先配置service对象,配置完Service对象就是注入dao对象. 但是现在没有dao对象,那就需要先配置dao对象.dao配置好以后.上线dao的注入就可以通过refs对象来注入这个dao了 ...

  8. 阶段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 ...

  9. Ajax案例-基于XML,以POST方式,完成省份-城市二级下拉联动

    <%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC & ...

随机推荐

  1. 60分钟内从零起步驾驭Hive实战学习笔记

    本博文的主要内容是: 1. Hive本质解析 2. Hive安装实战 3. 使用Hive操作搜索引擎数据实战 SparkSQL前身是Shark,Shark强烈依赖于Hive.Spark原来没有做SQL ...

  2. C++11变长参数模板

    [C++11变长参数模板] C++03只有固定模板参数.C++11 加入新的表示法,允许任意个数.任意类别的模板参数,不必在定义时将参数的个数固定. 实参的个数也可以是 0,所以 tuple<& ...

  3. ProxyFactory的一个问题

    今天写了一段很简单的代码,但一直都有问题.代码如下. 接口定义 using System; using System.Collections.Generic; using System.Linq; u ...

  4. windows 7 获取SYSTEM权限

    当Adobe Reader 9.0卸载之后,你会发现原来的C:\Program Files\Adobe\Reader 9.0\Resource\CMap文件夹下的一些文件无法删除,提示你需要SYSTE ...

  5. oracle出现的小问题

    oracle无法解析指定的标识符:检查oracle的数据库实例名是否正确. oracle增大db_files:alter system set db_files=1000 scope=spfile;之 ...

  6. does not support ASP.NET compatibility 错误

    The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibi ...

  7. Codeforces Round #292 (Div. 1) B. Drazil and Tiles (类似拓扑)

    题目链接:http://codeforces.com/problemset/problem/516/B 一个n*m的方格,'*'不能填.给你很多个1*2的尖括号,问你是否能用唯一填法填满方格. 类似t ...

  8. 使用WSAIoctl获取socket扩展函数(如AcceptEx)的指针

    未获取函数指针就调用函数(如直接连接mswsock.lib并直接调用AcceptEx)的消耗是很大的,因为AcceptEx 实际上是存在于Winsock2结构体系之外的.每次应用程序常试在服务提供层上 ...

  9. 结构类模式(三):组合(Composite)

    定义 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客 ...

  10. IE6/IE7下margin-bottom失效兼容解决办法及双倍边距问题

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-04-08) 一.IE6/IE7下margin-bottom失效兼容解决办法 1.用padding-bottom代替:2.在 ...