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

       }

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM