开发案例:
首先,我们确定用xml文件代替数据库,便于测试
建立web工程,基本架构见下图
代码如下:
首先是javabean:User.java
package com.dzq.domian; import java.io.Serializable; import com.dzq.exception.MsgException; public class User implements Serializable{ private String username; private String password; private String password2; private String nickname; private String email; 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 getPassword2() { return password2; } public void setPassword2(String password2) { this.password2 = password2; } public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public User(){ } public User(String username, String password, String password2, String nickname, String email) { this.username = username; this.password = password; this.password2 = password2; this.nickname = nickname; this.email = email; } @Override public String toString() { return username+":"+password; } public void checkValue() throws MsgException{ if(username==null||"".equals(username)){ throw new MsgException("用户名不能为空"); } if(password==null||"".equals(password)){ throw new MsgException("密码不能为空"); } if(password2==null||"".equals(password2)){ throw new MsgException("密码不能为空"); } if(!password.equals(password2)){ throw new MsgException("两次密码输入不一致"); } if(nickname==null||"".equals(nickname)){ throw new MsgException("昵称不能为空"); } if(email==null||"".equals(email)){ throw new MsgException("邮箱不能为空"); } } }
数据类XmlUserDao.java
package com.dzq.dao; import java.util.*; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.dzq.domian.User; import com.dzq.util.XmlDaoUtils; public class XmlUserDao { /** * 根据用户名查找用户 * @param username 用户名 * @return 根据用户名找到的用户信息,如果没找到,返回null */ public User findUserByUserName(String username){ Document dom=XmlDaoUtils.getDom(); Element root=dom.getRootElement(); List<Element> list=root.selectNodes("//user[@username='"+username+"']"); if(list.size()>0){ Element userEle=list.get(0); User user=new User(); user.setUsername(userEle.attributeValue("username")); user.setPassword(userEle.attributeValue("password")); user.setNickname(userEle.attributeValue("nickname")); user.setEmail(userEle.attributeValue("email")); return user; }else{ return null; } } /** * 添加用户 * @param user 要添加用户信息的bean */ public void addUser(User user){ Document dom=XmlDaoUtils.getDom(); Element root=dom.getRootElement(); Element userEle=DocumentHelper.createElement("user"); userEle.setAttributeValue("username", user.getUsername()); userEle.setAttributeValue("password", user.getPassword()); userEle.setAttributeValue("nickname", user.getNickname()); userEle.setAttributeValue("email", user.getEmail()); root.add(userEle); XmlDaoUtils.refXml(); } /** * 根据用户名密码查找用户信息 * @param username 用户名 * @param password 密码 * @return 找到的用户,找不到返回null */ public User findUserByUNAndPWD(String username,String password){ Document dom=XmlDaoUtils.getDom(); Element root=dom.getRootElement(); List<Element> list=root.selectNodes("//user[@username='"+username+"'and @password='"+password+"']"); if(list.size()>0){ Element userEle=list.get(0); User user=new User(); user.setUsername(userEle.attributeValue("username")); user.setPassword(userEle.attributeValue("password")); user.setNickname(userEle.attributeValue("nickname")); user.setEmail(userEle.attributeValue("email")); return user; }else{ return null; } } }
业务类:UserService.java
package com.dzq.service; import com.dzq.dao.XmlUserDao; import com.dzq.domian.User; import com.dzq.exception.MsgException; public class UserService { private XmlUserDao dao=new XmlUserDao(); /** * 添加用户 * @param user * @throws MsgException */ public void registUser(User user) throws MsgException{ if(dao.findUserByUserName(user.getUsername())!=null){ throw new MsgException("用户名已经存在"); } dao.addUser(user); } /** * 检查用户名是否正确 * @param username * @param password */ public User isUser(String username,String password){ return dao.findUserByUNAndPWD(username, password); } }
处理异常的类MsgException
package com.dzq.exception; public class MsgException extends Exception { public MsgException(){ } public MsgException(String msg){ super(msg); } }
测试类:XmlUserDaoTest.java
package com.dzq.test; import org.junit.Test; import com.dzq.dao.XmlUserDao; import com.dzq.domian.User; public class XmlUserDaoTest { @Test public void testfindUserByUserName(){ XmlUserDao dao=new XmlUserDao(); User user=dao.findUserByUserName("admin"); System.out.println(user.toString()); } @Test public void testfinduserByUNAndPWD(){ XmlUserDao dao=new XmlUserDao(); User user=dao.findUserByUNAndPWD("admin", "admin"); System.out.println(user); } @Test public void testAddUser(){ XmlUserDao dao=new XmlUserDao(); User user=new User(); user.setUsername("xiaoduc"); user.setPassword("1234"); user.setNickname("xiaoduc"); user.setEmail("duxiao@qq.com"); dao.addUser(user); } }
工具类:XmlDaoUtils.java
package com.dzq.util; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.UnsupportedEncodingException; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class XmlDaoUtils { private static Document dom=null; private static String path=XmlDaoUtils.class.getClassLoader().getResource("users.xml").getPath(); private XmlDaoUtils(){ } static{ try { SAXReader reader=new SAXReader(); dom= reader.read(path); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } } public static Document getDom(){ return dom; } public static void refXml(){ try { XMLWriter writer=new XMLWriter(new FileOutputStream(path),OutputFormat.createPrettyPrint()); writer.write(dom); writer.close(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } } }
下面是几个servlet
package com.dzq.web; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.dzq.domian.User; import com.dzq.service.UserService; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(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"); UserService service=new UserService(); User user=service.isUser(username, password); if(user==null){ request.setAttribute("msg", "用户名或者密码错误"); request.getRequestDispatcher("/login.jsp").forward(request, response); }else{ request.getSession().setAttribute("user", user); if("ok".equals(request.getParameter("remname"))){ Cookie remNameC=new Cookie("remname",URLEncoder.encode(user.getUsername(),"utf-8")); remNameC.setPath(request.getContextPath()); remNameC.setMaxAge(3600*24*30); response.addCookie(remNameC); }else{ Cookie remNameC=new Cookie("remname",""); remNameC.setPath(request.getContextPath()); remNameC.setMaxAge(0); response.addCookie(remNameC); } response.sendRedirect(request.getContextPath()+"/index.jsp"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package com.dzq.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/LogOutServlet") public class LogOutServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(request.getSession(false)!=null&&request.getSession().getAttribute("user")!=null){ request.getSession().invalidate(); response.sendRedirect(request.getContextPath()+"/index.jsp"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package com.dzq.web; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import com.dzq.domian.User; import com.dzq.exception.MsgException; import com.dzq.service.UserService; @WebServlet("/RegistServlet") public class RegistServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { UserService service=new UserService(); request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //1。检验验证码 String valistr=request.getParameter("valistr"); String valistr2=(String) request.getSession().getAttribute("valistr"); if(valistr==null||valistr2==null||!valistr.equals(valistr2)){ request.setAttribute("msg", "验证码不正确"); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; } //2.封装数据,校验数据 User user=new User(); BeanUtils.populate(user, request.getParameterMap()); user.checkValue(); service.registUser(user); request.getSession().setAttribute("user", user); response.getWriter().write("恭喜您注册成功,3秒回到主页"); response.setHeader("refresh", "3;url="+request.getContextPath()+"/index.jsp"); }catch(MsgException e){ request.setAttribute("msg",e.getMessage()); request.getRequestDispatcher("/regist.jsp").forward(request, response); return; }catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } //3.调用service方法添加用户 //4.提示注册成功,3秒跳转主页 } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
package com.dzq.web; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/ValiImg") public class ValiImg extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); response.setDateHeader("Expires", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma","no-cache"); //1.在内存中构建一张图片 int height=30; int width=120; int xpyl=5; int ypyl=22; int bang=20; BufferedImage img=new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); //2.获取图像上的画布 Graphics2D g=(Graphics2D) img.getGraphics(); //3.设置背景色 g.setColor(Color.LIGHT_GRAY); g.fillRect(0, 0, width, height); //4.设置边框 g.setColor(Color.BLUE); g.drawRect(0, 0, width-2, height-2); //5.画干扰线 for(int i=0;i<5;i++){ g.setColor(Color.RED); g.drawLine(randNum(0, width), randNum(0, height), randNum(0, width), randNum(0, height)); } //6.写字 String base = "u7684u4e00u4e86u662fu6211u4e0du5728u4ebau4eecu6709u6765u4ed6u8fd9u4e0au7740u4e2au5730u5230u5927u91ccu8bf4u5c31u53bbu5b50u5f97u4e5fu548cu90a3u8981u4e0bu770bu5929u65f6u8fc7u51fau5c0fu4e48u8d77u4f60u90fdu628au597du8fd8u591au6ca1u4e3au53c8u53efu5bb6u5b66u53eau4ee5u4e3bu4f1au6837u5e74u60f3u751fu540cu8001u4e2du5341u4eceu81eau9762u524du5934u9053u5b83u540eu7136u8d70u5f88u50cfu89c1u4e24u7528u5979u56fdu52a8u8fdbu6210u56deu4ec0u8fb9u4f5cu5bf9u5f00u800cu5df1u4e9bu73b0u5c71u6c11u5019u7ecfu53d1u5de5u5411u4e8bu547du7ed9u957fu6c34u51e0u4e49u4e09u58f0u4e8eu9ad8u624bu77e5u7406u773cu5fd7u70b9u5fc3u6218u4e8cu95eeu4f46u8eabu65b9u5b9eu5403u505au53ebu5f53u4f4fu542cu9769u6253u5462u771fu5168u624du56dbu5df2u6240u654cu4e4bu6700u5149u4ea7u60c5u8defu5206u603bu6761u767du8bddu4e1cu5e2du6b21u4eb2u5982u88abu82b1u53e3u653eu513fu5e38u6c14u4e94u7b2cu4f7fu5199u519bu5427u6587u8fd0u518du679cu600eu5b9au8bb8u5febu660eu884cu56e0u522bu98deu5916u6811u7269u6d3bu90e8u95e8u65e0u5f80u8239u671bu65b0u5e26u961fu5148u529bu5b8cu5374u7ad9u4ee3u5458u673au66f4u4e5du60a8u6bcfu98ceu7ea7u8ddfu7b11u554au5b69u4e07u5c11u76f4u610fu591cu6bd4u9636u8fdeu8f66u91cdu4fbfu6597u9a6cu54eau5316u592au6307u53d8u793eu4f3cu58ebu8005u5e72u77f3u6ee1u65e5u51b3u767eu539fu62ffu7fa4u7a76u5404u516du672cu601du89e3u7acbu6cb3u6751u516bu96beu65e9u8bbau5417u6839u5171u8ba9u76f8u7814u4ecau5176u4e66u5750u63a5u5e94u5173u4fe1u89c9u6b65u53cdu5904u8bb0u5c06u5343u627eu4e89u9886u6216u5e08u7ed3u5757u8dd1u8c01u8349u8d8au5b57u52a0u811au7d27u7231u7b49u4e60u9635u6015u6708u9752u534au706bu6cd5u9898u5efau8d76u4f4du5531u6d77u4e03u5973u4efbu4ef6u611fu51c6u5f20u56e2u5c4bu79bbu8272u8138u7247u79d1u5012u775bu5229u4e16u521au4e14u7531u9001u5207u661fu5bfcu665au8868u591fu6574u8ba4u54cdu96eau6d41u672au573au8be5u5e76u5e95u6df1u523bu5e73u4f1fu5fd9u63d0u786eu8fd1u4eaeu8f7bu8bb2u519cu53e4u9ed1u544au754cu62c9u540du5440u571fu6e05u9633u7167u529eu53f2u6539u5386u8f6cu753bu9020u5634u6b64u6cbbu5317u5fc5u670du96e8u7a7fu5185u8bc6u9a8cu4f20u4e1au83dcu722cu7761u5174u5f62u91cfu54b1u89c2u82e6u4f53u4f17u901au51b2u5408u7834u53cbu5ea6u672fu996du516cu65c1u623fu6781u5357u67aau8bfbu6c99u5c81u7ebfu91ceu575au7a7au6536u7b97u81f3u653fu57ceu52b3u843du94b1u7279u56f4u5f1fu80dcu6559u70edu5c55u5305u6b4cu7c7bu6e10u5f3au6570u4e61u547cu6027u97f3u7b54u54e5u9645u65e7u795eu5ea7u7ae0u5e2eu5566u53d7u7cfbu4ee4u8df3u975eu4f55u725bu53d6u5165u5cb8u6562u6389u5ffdu79cdu88c5u9876u6025u6797u505cu606fu53e5u533au8863u822cu62a5u53f6u538bu6162u53d4u80ccu7ec6"; StringBuffer buffer=new StringBuffer(); for(int i=0;i<4;i++){ g.setColor(new Color(randNum(0, 255),randNum(0, 255),randNum(0, 255))); g.setFont(new Font("黑体",Font.BOLD,bang)); int r=randNum(-45, 45); g.rotate(1.0*r/180*Math.PI,xpyl+i*30, ypyl); String s=base.charAt(randNum(0, base.length()-1))+""; buffer.append(s); g.drawString(s, xpyl+i*30, ypyl); g.rotate(1.0*-r/180*Math.PI,xpyl+i*30, ypyl); } request.getSession().setAttribute("valistr", buffer.toString()); System.out.println(buffer.toString()); //将图片输出到浏览器 ImageIO.write(img, "jpg", response.getOutputStream()); } private Random rand=new Random(); private int randNum(int begin,int end){ return rand.nextInt((end-begin)+begin); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
自定义标签类:
package com.dzq.tag; import java.io.IOException; import java.net.URLDecoder; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.SimpleTagSupport; public class URLDEcoderTag extends SimpleTagSupport { private String content; private String encode; public void setContent(String content) { this.content = content; } public void setEncode(String encode) { this.encode = encode; } @Override public void doTag() throws JspException, IOException { String str=URLDecoder.decode(content, encode==null?"utf-8":encode); getJspContext().getOut().write(str); } }
自定义标签的tld文件UserTag.tld
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>UserTag</short-name> <uri>http://www.dzq.com/UserTag</uri> <tag> <name>URLDecoder</name> <tag-class>com.dzq.tag.URLDEcoderTag</tag-class> <body-content>empty</body-content> <attribute> <name>content</name> <required>true</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> <attribute> <name>encode</name> <required>false</required> <rtexprvalue>true</rtexprvalue> <type>java.lang.String</type> </attribute> </tag> </taglib>
下面是存储信息的xml文件users.xml
<?xml version="1.0" encoding="UTF-8"?> <users> <user username="admin" password="admin" nickname="admin" email="admin@qq.com" /> </users>
以下是jsp页面:
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html> <head> </head> <body> <h1>我的网站</h1><hr> <c:if test="${sessionScope.user!=null}"> 欢迎回来!${sessionScope.user.username }<a href="${pageContext.request.contextPath }/LogOutServlet">注销</a> </c:if> <c:if test="${sessionScope.user==null}"> 游客,欢迎你!<a href="${pageContext.request.contextPath }/regist.jsp">注册</a>|<a href="${pageContext.request.contextPath }/login.jsp">登录</a> </c:if> </body> </html>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@taglib uri="http://www.dzq.com/UserTag" prefix="UserTag" %> <html> <head> </head> <body> <div align="center"> <h1>我的网站_登录</h1><hr> <font color="red">${msg }</font> <form action="${pageContext.request.contextPath }/LoginServlet" method="post"> <table border="1"> <tr> <td>用户名:</td> <td><input type="text" name="username" value="<UserTag:URLDecoder content="${cookie.remname.value }" encode="utf-8"/>"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password"/></td> </tr> <tr> <td><input type="submit" value="登录"/></td> <td><input type="checkbox" value="ok" name="remname" <c:if test="${cookie.remname!=null }"> checked="checked" </c:if> />记住用户名</td> </tr> </table> </form> </div> </body> </html>
regist.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <html> <head> <script type="text/javascript"> function changeImg(img){ img.src=img.src+"?time="+new Date().getTime(); } </script> </head> <font color="red" >${msg }</font> <body> <div align="center"> <h1>我的网站_注册</h1> <form action="${pageContext.request.contextPath }/RegistServlet" method="post"> <table border="1"> <tr> <td>用户名:</td> <td><input type="text" name="username" value="${param.username }"/></td> <tr/> <tr> <td>密码:</td> <td><input type="password" name="password" /></td> <tr/> <tr> <td>确认密码:</td> <td><input type="password" name="password2" /></td> <tr/> <tr> <td>昵称:</td> <td><input type="text" name="nickname" value="${param.nickname }"/></td> <tr/> <tr> <td>邮箱</td> <td><input type="email" name="email" value="${param.email }"/></td> <tr/> <tr> <td>验证码:</td> <td><input type="text" name="valistr" /></td> <tr/> <tr> <td><input type="submit" value="注册"/></td> <td><img src="${pageContext.request.contextPath }/ValiImg" style="cursor: pointer;" onclick="changeImg(this)"></td> <tr/> </table> </form> </div> </body> </html
运行截图:
采用了cookie 记住用户名