用戶注冊登錄
要求: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); } } } |