zoukankan      html  css  js  c++  java
  • 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对象,指定缩进为“ ”,指定添加换行;

    Ø 设置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 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());

          // 创建格式化器,使用 缩进,添加换行

          OutputFormat format = new OutputFormat(" ", 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);

        }

      }

    }

  • 相关阅读:
    界面控件DevExpress WPF入门 表达式编辑器功能
    Telerik UI for WPF全新版本——拥有Office2019高对比度主题
    DevExpress报表控件v21.2 全新的Visual Studio报表设计器
    报告生成器FastReport .NET入门指南 在Linux中启动应用程序
    文档控件DevExpress Office File API v21.2 自定义字体加载引擎
    UI组件库Kendo UI for Angular入门 如何开始使用图表功能
    WPF界面工具Telerik UI for WPF入门级教程 设置一个主题(二)
    DevExtreme初级入门教程(React篇) TypeScript支持
    报表开发利器FastReport .NET v2022.1 添加关键对象和属性
    python项目打包(一) setup.py、Python源代码项目结构
  • 原文地址:https://www.cnblogs.com/geniuszhd/p/13057795.html
Copyright © 2011-2022 走看看