案例:用户注册登录

  要求:3层框架,使用验证码

功能分析

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);

    }

  }

}

超全面的JavaWeb笔记day14<用户注册登录>的更多相关文章

  1. 超全面的JavaWeb笔记day03<JS对象&函数>

    1.js的String对象(****) 2.js的Array对象 (****) 3.js的Date对象 (****) 获取当前的月 0-11,想要得到准确的月 +1 获取星期时候,星期日是 0 4.j ...

  2. 超全面的JavaWeb笔记day15<mysql数据库>

    1.数据库的概述 2.SQL 3.DDL 4.DML 5.DCL 6.DQL MySQL 数据库 1 数据库概念(了解) 1.1 什么是数据库 数据库就是用来存储和管理数据的仓库! 数据库存储数据的优 ...

  3. 超全面的JavaWeb笔记day11<JSP&Session&Cookie&HttpSession>

    1.JSP 2.回话跟踪技术 3.Cookie 4.HttpSession JSP入门 1 JSP概述 1.1 什么是JSP JSP(Java Server Pages)是JavaWeb服务器端的动态 ...

  4. 超全面的JavaWeb笔记day22<文件上传>

    文件上传概述 1 文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2 文件上传对页面的要求 上传文件的要求比较多,需要记一下: 1. 必须使用 ...

  5. 超全面的JavaWeb笔记day21<过滤器>

    1.过滤器的原理 2.实现过滤器 写一个类实现javax.servlet.Filter接口 在web.xml中对Filter进行配置 3.Filter接口 void init(FilterConfig ...

  6. 超全面的JavaWeb笔记day20<监听器&国际化>

    JavaWeb监听器 三大组件: l Servlet l Listener l Filter Listener:监听器 1. 初次相见:AWT 2. 二次相见:SAX 监听器: l 它是一个接口,内容 ...

  7. 超全面的JavaWeb笔记day17<JDBC>

    1.JDBC的原理 是由JavaEE提供的连接数据库的规范 需要由各大数据库的厂商提供对JDBC的实现类 2.四大核心类 3.四大参数 driverClassName url username pas ...

  8. 超全面的JavaWeb笔记day13<JSTL&自定义标签>

    1.JSTL标签库(重点) core out set remove url if choose when otherwise forEach fmt formatDate formatNumber 2 ...

  9. 超全面的JavaWeb笔记day12<Jsp&JavaBean&El表达式>

    1.JSP三大指令 page include taglib 2.9个内置对象 out page pageContext request response session application exc ...

随机推荐

  1. Oracle PLSQL Demo - 14.定义定参数的显示游标

    declare v_empno scott.emp.empno%type; v_sal scott.emp.sal%type; ) is select t.empno, t.sal from scot ...

  2. 【转】PowerDesigner表结构和字段大小写转换

    [转自]http://blog.csdn.net/xysh1991/article/details/8016192 使用方法:进入PowerDesigner,打开一个PDM,在菜单栏找到:Tools ...

  3. mysql 的一点点记录

    以后再来整理. -- 查询一个学校的报修单数 SELECT s.id AS schoolId , -- 学校ID COUNT(i.id) as cntId, -- 报修单数 IFNULL(t1.noh ...

  4. Thrift RPC框架介绍

    u 简介 Thrift是一种开源的跨语言的RPC服务框架.Thrift最初由facebook公司开发的,在2007年facebook将其提交apache基金会开源了.对于当时的facebook来说创造 ...

  5. 【C#/WPF】如何查看System.Windows.Interactivity.dll中EventTrigger的EventNames属性有哪些

    WPF项目中,从Nuget搜索并下载System.Windows.Interactivity.dll,安装到项目中,并在XAML界面引入. <UserControl xmlns:i=" ...

  6. [LintCode]计算两个数的交集(一)

    问题分析: 既然返回值没有重复,我们不妨将结果放进set中,然后对两个set进行比较. 问题求解: public class Solution { /** * @param nums1 an inte ...

  7. iOS边练边学--介绍布局的三种方法

    使用代码实现Autolayout的方法1- 创建约束 +(id)constraintWithItem:(id)view1attribute:(NSLayoutAttribute)attr1relate ...

  8. WPF教程六:布局之Grid面板

    Grid:网格面板 Grid顾名思义就是“网格”,以表格形式布局元素,对于整个面板上的元素进行布局,它的子控件被放在一个一个事先定义好的小格子里面,整齐配列. Grid和其他各个Panel比较起来,功 ...

  9. pymongo创建索引、更新、删除

    pymongo创建索引.更新.删除     索引创建 ## collection 为数据集合collection.create_Index({'需创建索引字段': 1})collection.ensu ...

  10. CSS3加载动画

    图1 通常我们都使用gif格式的图片或者使用Ajax来实现诸如这类的动态加载条,但是现在CSS3也可以完成,并且灵活性更大. 选1个例子看看怎么实现的吧: 效果图:   图2 代码: 使用1个名为'l ...