domain
package cn.code.domain; /* * 實體類 * */ public class User { private String username; private String password; private String verifyCode; @Override public String toString() { return "User [username=" + username + ", password=" + password + ", verifyCode=" + verifyCode + "]"; } public User(String username, String password, String verifyCode) { super(); this.username = username; this.password = password; this.verifyCode = verifyCode; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getVerifyCode() { return verifyCode; } public void setVerifyCode(String verifyCode) { this.verifyCode = verifyCode; } public User() { } }
dao
package cn.code.dao; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import cn.code.domain.User; /** * 數據類 * */ public class UserDao { private String path="G:/users.xml"; public User findByUsername(String username){ /** * 得到Document * xpath查詢 * 校驗查詢結果是否為null,如果為null,返回null; * 如果不為null,需要把Element封裝到user對象中。 * */ SAXReader r = new SAXReader(); try{ Document document = r.read(path); Element element = (Element) document.selectSingleNode("//user[@username='"+username+"']"); if(element==null){return null;} User user = new User(); String attrUsername = element.attributeValue("username"); String attrPassword = element.attributeValue("password"); user.setUsername(attrUsername); user.setPassword(attrPassword); return user; }catch(Exception e){ throw new RuntimeException(e); } } public void add(User user){ /** * 得到document * 通過document得到root元素! * 將參數user轉換成user標簽 * 添加屬性並賦值 * 保存document * */ SAXReader reader = new SAXReader(); try { Document document = reader.read(path); Element root = document.getRootElement(); Element userEle = root.addElement("user"); userEle.addAttribute("username", user.getUsername()); userEle.addAttribute("password", user.getPassword()); OutputFormat format = OutputFormat.createPrettyPrint(); // OutputFormat format = new OutputFormat("\t",true);//縮進,是否換行 // format.setTrimText(true);//清空所有換行跟縮進 XMLWriter writer = null; try { writer = new XMLWriter( new OutputStreamWriter( new FileOutputStream(path),"utf-8"),format); //注意字符編碼,默認使用電腦默認編碼保存,這里我們使用utf-8; } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { writer.write(document); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { writer.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (DocumentException e) { throw new RuntimeException(e); } } }
service
package cn.code.service; import cn.code.dao.UserDao; import cn.code.domain.User; public class UserService { private UserDao userDao = new UserDao(); public void regist(User user)throws UserException{ /** * 使用用戶名去查詢,如果返回null,完成添加 * 如果返回布市null,拋出異常! * */ User u = userDao.findByUsername(user.getUsername()); if(u!=null)throw new UserException("用戶名"+user.getUsername()+"已經被注冊!"); userDao.add(user); } public User login(User user) throws UserException { User u = userDao.findByUsername(user.getUsername()); if(u==null)throw new UserException("用戶名不存在!"); if(!u.getPassword().equals(user.getPassword())){ throw new UserException("密碼錯誤"); } return u; } }
package cn.code.service; public class UserException extends Exception { /** * */ private static final long serialVersionUID = 1L; public UserException() { super(); // TODO Auto-generated constructor stub } public UserException(String message) { super(message); // TODO Auto-generated constructor stub } }
servlet
package cn.code.web.servlet; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.code.CommonUtils.CommonUtils; import cn.code.domain.User; import cn.code.service.UserException; import cn.code.service.UserService; public class RegistServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); /** * 封裝表單數據(封裝到user對象中) * */ User user = CommonUtils.toBean(request.getParameterMap(), User.class); /** * 表單校驗 * */ String sessionVerifyCode = (String)request.getSession().getAttribute("session_vcode"); // if(!sessionVerifyCode.equalsIgnoreCase(user.getVerifyCode())){ // request.setAttribute("msg", "驗證碼不一致"); // request.setAttribute("user", user); // request.getRequestDispatcher("/regist.jsp").forward(request, response); // return; // } String username = user.getUsername(); String password = user.getPassword(); Map<String,String>errors = new HashMap<String, String>(); if(username==null||username.trim().isEmpty()){ errors.put("username", "用戶名不能為空"); }else if(username.length()<3||username.length()>15){ errors.put("username", "請輸入3-15為用戶名"); } if(password==null||password.trim().isEmpty()){ errors.put("password", "用戶名不能為空"); }else if(password.length()<3||password.length()>15){ errors.put("password", "請輸入3-15為用戶名"); } if(!sessionVerifyCode.equalsIgnoreCase(user.getVerifyCode())){ errors.put("msg", "驗證碼不一致"); } if(errors!=null&&errors.size()>0){ request.setAttribute("errors", errors); request.setAttribute("user", user); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; } UserService userService = new UserService(); try { userService.regist(user); response.getWriter().print("注冊成功!<a href='"+request.getContextPath()+"/login.jsp"+"'>登錄</a>"); } catch (UserException e) { request.setAttribute("msg", e.getMessage()); request.setAttribute("user", user); request.getRequestDispatcher("/regist.jsp").forward(request, response); } } }
package cn.code.web.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.code.CommonUtils.CommonUtils; import cn.code.domain.User; import cn.code.service.UserException; import cn.code.service.UserService; public class LoginServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8");//請求編碼 response.setContentType("text/html;charset=utf-8");//響應編碼 //依賴UserService /** * 封裝表單數據到user * 調用sevice的login()方法,得到返回的user對象 * 如果拋出異常:獲取異常信息,保存到request域中,再保存user,轉發到login.jsp * 如果沒有異常;保存返回值到session中,重定向到welcome.jsp * */ User user =CommonUtils.toBean(request.getParameterMap(), User.class); UserService userService = new UserService(); try{ User u= userService.login(user); request.getSession().setAttribute("sessionUser", u); response.sendRedirect(request.getContextPath()+"/index.jsp"); }catch(UserException e){ request.setAttribute("msg", e.getMessage()); request.setAttribute("user", user); request.getRequestDispatcher("/login.jsp").forward(request, response); } } }
package cn.code.web.servlet; import java.awt.image.BufferedImage; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.code.image.VerifyCode; public class VerifyCodeServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //驗證碼類 VerifyCode vc = new VerifyCode(); //生成圖片 BufferedImage image = vc.getImage(); //保存圖片文本到session中 request.getSession().setAttribute("session_vcode", vc.getText()); //把圖片響應給客戶端 VerifyCode.output(image, response.getOutputStream()); } }
驗證碼類
package cn.code.image; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imageio.ImageIO; public class VerifyCode { private int w=70; private int h=35; private Random r = new Random(); private String[] fontNames = {"宋體","華文楷體","黑體","微軟雅黑","楷體_GB2321"}; private String codes = "23456789abcdefghjkmnopqrstuvwxyzQWERTYUIOPASDFGHJKLZXCVBNM"; private Color bgColor = new Color(255,255,255);//顏色類對象,背景色白色 private String text; //生成隨機顏色 private Color randomColor(){ int red = r.nextInt(150); int green = r.nextInt(150); int blue = r.nextInt(150); return new Color(red,green,blue); } //生成隨機字體 private Font randomFont(){ int index = r.nextInt(fontNames.length); String fontName = fontNames[index];//生成隨機的字體名稱 int style = r.nextInt(4);//生成隨機樣式,0(無樣式),1(粗體),2(斜體),3(粗體+斜體) int size = r.nextInt(5)+24;//生成隨機字號,24-28 return new Font(fontName,style,size); } //畫干擾線 private void drawLine(BufferedImage image){ int num = 3;//一共畫三條 Graphics2D g2 = (Graphics2D)image.getGraphics(); for(int i = 0;i<num;i++){//生成2個點的坐標,即4個值; int x1 = r.nextInt(w); int y1 = r.nextInt(h); int x2 = r.nextInt(w); int y2 = r.nextInt(h); g2.setStroke(new BasicStroke(1.5F)); g2.setColor(Color.BLUE);//干擾線是藍色 g2.drawLine(x1, y1, x2, y2);//畫線 } } //隨機生成一個字符 private char randomChar(){ int index = r.nextInt(codes.length()); return codes.charAt(index); } //創建bufferedImage private BufferedImage createImage(){ BufferedImage image = new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); Graphics2D g2 = (Graphics2D)image.getGraphics(); g2.setColor(this.bgColor); g2.fillRect(0, 0, w, h); return image; } //外界調用這個方法得到驗證碼 public BufferedImage getImage(){ //創建圖片緩沖區 BufferedImage image = createImage(); //得到繪制環境 Graphics2D g2 = (Graphics2D)image.getGraphics(); //用來裝載生成的驗證碼文本 StringBuilder sb = new StringBuilder(); //向圖片中畫4個字符 for(int i = 0;i<4;i++){ String s = randomChar()+"";//隨機生成一個字符 sb.append(s);//把字母添加到sb中 float x = i * 1.0F * w / 4;//設置當前字符x軸坐標 g2.setFont(randomFont());//設置隨即字體 g2.setColor(randomColor());//設置隨機顏色 g2.drawString(s,x,h-5);//畫圖 } this.text=sb.toString();//把生成的字符串賦給this.text drawLine(image);//添加干擾線 return image; } //返回驗證碼圖片上的文本 public String getText(){ return text; } //保存圖片到指定的輸出流 public static void output(BufferedImage image,OutputStream out) throws IOException{ ImageIO.write(image, "JPEG", out); } }
jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'regist.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> <script type="text/javascript"> function change(){ var ele = document.getElementById("vCode"); ele.src="<c:url value='/servlet/VerifyCodeServlet'/>?xxx="+new Date().getTime(); //alert(ele.src); } </script> </head> <body> <h1>注冊</h1> <p style="color:red;font=weigth:900">${msg}</p> <!-- ${pageContext.request.contextPath}/RegistServlet } --> <form action="<c:url value='/RegistServlet'/>" method="post"> 用戶名:<input type="text" name="username" value='${user.username}'/>${errors.username}<br/> 密 碼:<input type="password" name="password" value="${user.password}"/>${errors.password}<br/> 驗證碼:<input type="text" name="verifyCode" value="${user.verifyCode }" size="3"/> <img id="vCode" src="<c:url value='/servlet/VerifyCodeServlet' /> "/> <a href="javascript:change()">換一張</a><br/> <input type="submit" value="注冊"/> </form> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'login.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>登錄</h1> <p>${msg}</p> <form action=<c:url value='/LoginServlet'/> method="post"> 用戶名:<input type="text" name="username" value='${user.username}'/><br/> 密 碼:<input type="password" name="password" value="${user.password}"/><br/> <input type="submit" value="登錄"/> </form> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <h1>歡迎登錄本網站:</h1> <c:choose> <c:when test="${empty sessionScope.sessionUser }">請先登錄</c:when> <c:otherwise> ${sessionScope.sessionUser } </c:otherwise> </c:choose> </body> </html>