UserDao位于dao包

package cn.itcast.dao;
import cn.itcast.domain.User;
public interface UserDao {//操作1,添加一个用户到数据库void add(User user);//操作2,登录时,校验用户名和密码,正确则返回该用户User find(String username, String password);//操作3,注册时,检验用户名是否已存在,返回布尔值boolean find(String username);
}

UserDaoImpl位于dao.impl包

package cn.itcast.dao.impl;
import java.io.IOException;
import java.text.SimpleDateFormat;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import cn.itcast.dao.UserDao;
import cn.itcast.domain.User;
import cn.itcast.utils.XmlUtils;
public class UserDaoImpl implements UserDao {//操作1,添加一个用户到数据库public void add(User user){try {Document doc= XmlUtils.getDocument();Element root=doc.getRootElement();Element user_tag=root.addElement("user");user_tag.setAttributeValue("id", user.getId());user_tag.setAttributeValue("username", user.getUsername());user_tag.setAttributeValue("password", user.getPassword());user_tag.setAttributeValue("email", user.getEmail());user_tag.setAttributeValue("birthday", user.getBirthday()==null?"":user.getBirthday().toLocaleString());user_tag.setAttributeValue("nickname", user.getNickname());XmlUtils.write2Xml(doc);} catch (Exception e) {// 不能抛,转型,异常链不能断throw new RuntimeException(e);}}//操作2,登录时,校验用户名和密码,正确则返回该用户public User find(String username,String password){try {Document doc= XmlUtils.getDocument();Element e= (Element) doc.selectSingleNode("//user[@username='"+username+"' and @password='"+password+"']");if (e==null) {return null;}//如果找到了,将xml中的数据封装到User里面返回User user=new User();user.setId(e.attributeValue("id"));user.setUsername(e.attributeValue("username"));user.setPassword(e.attributeValue("password"));user.setEmail(e.attributeValue("email"));user.setNickname(e.attributeValue("nickname"));//封装生日的时候,需分情况讨论String date=e.attributeValue("birthday");if (date==null || "".equals(date)) {user.setBirthday(null);} else {//注意大小写,含义不一样SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");user.setBirthday(df.parse(date));}return user;} catch (Exception e) {// 不能抛,转型,异常链不能断throw new RuntimeException(e);}}//操作3,注册时,检验用户名是否已存在,返回布尔值public boolean find(String username){try {Document doc= XmlUtils.getDocument();Element e= (Element) doc.selectSingleNode("//user[@username='"+username+"']");if (e==null) {return false;}return true;} catch (Exception e) {// 不能抛,转型,异常链不能断throw new RuntimeException(e);}}
}

User位于domain包

package cn.itcast.domain;
import java.util.Date;
public class User {private String id;private String username;private String password;private String email;private Date   birthday; private String nickname;public String getId() {return id;}public void setId(String id) {this.id = id;}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 getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}
}

UserExistException位于exception包

package cn.itcast.exception;
public class UserExistException extends Exception {public UserExistException() {}public UserExistException(String message) {super(message);}public UserExistException(Throwable cause) {super(cause);}public UserExistException(String message, Throwable cause) {super(message, cause);}public UserExistException(String message, Throwable cause,boolean enableSuppression, boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}
}

BusinessServiceImpl位于service.impl包

package cn.itcast.service.impl;
import cn.itcast.dao.UserDao;
import cn.itcast.dao.impl.UserDaoImpl;
import cn.itcast.domain.User;
import cn.itcast.exception.UserExistException;
import cn.itcast.utils.ServiceUtils;
/*对web层提供所有的服务,* web层收到请求后,统一交给BusinessServiceImpl处理*/
public class BusinessServiceImpl {private UserDao dao=new UserDaoImpl();//若要解耦需要工厂模式或spring//服务1,提供注册服务public void register(User user) throws UserExistException{// 先检查用户名是否存在,如果存在抛编译时异常,让调用者知道!boolean b=dao.find(user.getUsername());if (b) {//如果存在,抛编译时异常(必须处理),让调用者(web层)知道(给友好提示)!throw new UserExistException();} else {//如果不存在,先将密码用工具类md5加密,然后将用户添加进数据库user.setPassword(ServiceUtils.md5(user.getPassword()));dao.add(user);}}//服务2,提供登录服务public User login(String username,String password){//注意查找时,要用加密后的密码找password=ServiceUtils.md5(password);//找不到返回null,找到了返回userreturn dao.find(username, password);}
}

ServiceUtils位于utils包

package cn.itcast.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;
public class ServiceUtils {public static String md5(String message){/*工具类异常直接抛,异常链不能断* 提供md5加密标准4步骤(生成图片验证码曾用到)*/try {MessageDigest md=MessageDigest.getInstance("md5");byte[] md5=md.digest(message.getBytes());BASE64Encoder encoder=new BASE64Encoder();return encoder.encode(md5);} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}}
}

WebUtils位于utils包

package cn.itcast.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.UUID;import javax.servlet.http.HttpServletRequest;import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;
public class WebUtils {//方法1, 将表单中的数据封装到RegisterForm里面//使用字节码避免new 对象,使用泛形避免强转public static <T> T request2Bean(HttpServletRequest request,Class<T> beanClass){try{//1.实例化要封装数据的beanT bean = beanClass.newInstance();//2.用BeanUtils的方法把request中的数据封装到bean对象中Enumeration  e = request.getParameterNames();//参数列表while(e.hasMoreElements()){String name = (String) e.nextElement();   //username password email birthdayString value = request.getParameter(name); BeanUtils.setProperty(bean, name, value);}//3,返回封装了表单数据的RegisterForm对象return bean;}catch (Exception e) {throw new RuntimeException(e);}}//方法2, 将RegisterForm中的数据封装到User里面public static void copyBean(Object src,Object dest){//需要注册日期转换器//(将RegisterForm里的字符串转成User里的日期)ConvertUtils.register(new Converter(){public Object convert(Class type, Object value) {/*方法说明:(将value转成type类型)*1,判断value是不是null*2,判断value是不是String*3,判断value是不是空白字符串*4,用SimpleDateFormat parse  *5,工具类异常统统往外抛      */if(value==null){return null;}String date=(String)value;if("".equals(date.trim())){return null;}//设计转换格式SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");try {return df.parse(date);} catch (Exception e) {throw new RuntimeException(e);}}}, Date.class);try {//使用BeanUtils的复制bean方法BeanUtils.copyProperties(dest, src);} catch (Exception e) {throw new RuntimeException(e);} }//方法3, 产生一个唯一的id(UUID.randomUUID().toString())public static String generateId(){return UUID.randomUUID().toString();}
}

XmlUtils位于utils包

package cn.itcast.utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XmlUtils {private static String filepath;static{filepath=XmlUtils.class.getClassLoader().getResource("users.xml").getPath();}public static Document getDocument() throws DocumentException{/*dom4j读取Document* 工具类有异常直接抛出去*/SAXReader reader=new SAXReader();Document document=reader.read(new File(filepath));return document;}public static void write2Xml(Document doc) throws IOException{//dom4j写入XmlOutputFormat format=OutputFormat.createPrettyPrint();format.setEncoding("UTF-8");XMLWriter writer=new XMLWriter(new FileOutputStream(filepath),format);writer.write(doc);writer.close();}
}

ImageServlet位于web.controller包

package cn.itcast.web.controller;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
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.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImageServlet extends HttpServlet {private static final int WIDTH=120;private static final int HEIGHT=30;private static final int IMAGETYPE=BufferedImage.TYPE_INT_RGB;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//内存里的图像BufferedImage image=new BufferedImage(WIDTH,HEIGHT,IMAGETYPE);Graphics g=image.getGraphics();//设置背景色setBackground(g);//设置边框setBorder(g);//设置干扰线setLine(g);//设置汉字,需要旋转,强转为Graphics2DString random=setCode((Graphics2D) g);//要在服务器也存一份request.getSession().setAttribute("s_checkcode", random);//设置不要缓存,告知是图片,并写给浏览器response.setDateHeader("expires", -1);response.setHeader("Cache-Control", "no-cache");response.setHeader("Prama", "no-cache");response.setContentType("image/jpeg");ImageIO.write(image, "jpg", response.getOutputStream());}private String setCode(Graphics2D g) {/*方法说明:*生成随机汉字如:林黛玉薛宝钗史湘云*/g.setColor(Color.RED);g.setFont(new Font("宋体",Font.BOLD,20));StringBuffer sb=new StringBuffer();String base="\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6";int x=5;//首个汉字 偏离边框的距离for (int i = 0; i < 4; i++) {//生成4个汉字int degree=new Random().nextInt()%30;//-30~30度String ch=base.charAt(new Random().nextInt(base.length()))+"";sb.append(ch);g.rotate(degree*Math.PI/180, x, 20);//Graphics2D的方法g.drawString(ch, x, 20);g.rotate(-degree*Math.PI/180, x, 20);//写下个字前角度还原x+=30;//字宽20 间距为10}return sb.toString();}private void setLine(Graphics g) {g.setColor(Color.GREEN);for (int i = 0; i < 5; i++) {int x1=new Random().nextInt(WIDTH);int y1=new Random().nextInt(HEIGHT);int x2=new Random().nextInt(WIDTH);int y2=new Random().nextInt(HEIGHT);g.drawLine(x1, y1, x2, y2);//两个端点需在矩形框内}}private void setBorder(Graphics g) {g.setColor(Color.BLUE);g.drawRect(0, 0, WIDTH-1, HEIGHT-1);}private void setBackground(Graphics g) {g.setColor(Color.WHITE);g.fillRect(0, 0, WIDTH, HEIGHT);}
}

RegisterServlet位于web.controller包

package cn.itcast.web.controller;
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.itcast.domain.User;
import cn.itcast.exception.UserExistException;
import cn.itcast.service.impl.BusinessServiceImpl;
import cn.itcast.utils.WebUtils;
import cn.itcast.web.formbean.RegisterForm;
public class RegisterServlet extends HttpServlet {//处理用户注册请求public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//首先解决post提交上来的中文乱码问题request.setCharacterEncoding("UTF-8");//1.把表单数据封装到RegisterForm对象,对提交表单的字段进行合法性校验//注意要把服务器的验证码封装到RegisterForm,以供校验RegisterForm form=WebUtils.request2Bean(request, RegisterForm.class);String s_checkcode=(String) request.getSession().getAttribute("s_checkcode");form.setS_checkcode(s_checkcode);boolean b=form.validate();//2.如果校验失败,跳回到表单页面,回显校验失败信息if(!b){request.setAttribute("form", form);   request.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request, response);return;}//3.如果校验成功,则调用service处理注册请求//(将RegisterForm里面的字符数据全放到User里)User user=new User();WebUtils.copyBean(form, user);user.setId(WebUtils.generateId());BusinessServiceImpl service=new BusinessServiceImpl();try {service.register(user);//成功,跳转到网站的全局消息显示页//session中存入登录成功的标记request.getSession().setAttribute("user", user);String url=request.getContextPath();request.setAttribute("message", "恭喜您,注册成功!!浏览器将在3秒后跳转至首页<meta http-equiv='refresh' content='3;url="+url+"/index.jsp'>");request.getRequestDispatcher("/message.jsp").forward(request, response);return;} catch (UserExistException e) {//注册用户已存在则跳回到注册页面,显示注册用户已存在的消息form.getErrors().put("username", "注册的用户名已存在!!");request.setAttribute("form", form);request.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request, response);return;}catch(Exception e){//抓住其他的问题e.printStackTrace();request.setAttribute("message", "服务器出现未知错误!!!");request.getRequestDispatcher("/message.jsp").forward(request, response);return;}}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

LoginServlet位于web.controller包

package cn.itcast.web.controller;
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.itcast.domain.User;
import cn.itcast.service.impl.BusinessServiceImpl;
public class LoginServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {String username = request.getParameter("username");String password = request.getParameter("password");BusinessServiceImpl service = new BusinessServiceImpl();User user = service.login(username, password);if(user!=null){//session中存入登录成功的标记request.getSession().setAttribute("user", user);//让用户登陆成功后,跳转首页//得到web应用所在目录day09String url=request.getContextPath();response.sendRedirect(url+ "/index.jsp");return;}request.setAttribute("message", "用户名或密码错误!!");request.getRequestDispatcher("/message.jsp").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

LogoutServlet位于web.controller包

package cn.itcast.web.controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LogoutServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {HttpSession session = request.getSession(false);if(session!=null){session.removeAttribute("user");}//注销成功,跳到全局消息显示页面,显示注销成功消息//并控制消息显示页面过3秒后跳转到首页//实用的跳转技术String url=request.getContextPath();//day04request.setAttribute("message", "注销成功,浏览器将在3秒后跳转至首页<meta http-equiv='refresh' content='3;url="+url+"/index.jsp'>");request.getRequestDispatcher("/message.jsp").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

RegisterForm位于web.formbean包

package cn.itcast.web.formbean;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
public class RegisterForm {
/*用一个类封装表单提交过来的数据* 表单提交过来全是String */private String username;private String password;private String password2;private String email;private String birthday;private String nickname;private String c_checkcode;private String s_checkcode;
// Map errors  保存所有校验不通过的错误消息private Map errors = new HashMap();public boolean validate(){//默认是真,只要有一个错误,flag为假boolean flag = true;//用户名不能为空,并且要是3-8位字母if(this.username==null || this.username.trim().equals("")){flag = false;errors.put("username", "用户名不能为空!");}else{if(!this.username.matches("[A-Za-z]{3,8}")){flag = false;errors.put("username", "用户名必须是3-8位字母!");}}//密码不能为空,并且是3-8位数字if(this.password==null || this.password.trim().equals("")){flag = false;errors.put("password", "密码不能为空!");}else{if(!this.password.matches("\\d{3,8}")){flag = false;errors.put("password", "密码必须是3-8位数字!");}}//确认密码不能为空,并且要和一次一致if(this.password2==null || this.password2.trim().equals("")){flag = false;errors.put("password2", "确认密码不能为空!");}else{if(!this.password.equals(this.password2)){flag = false;errors.put("password2", "两次密码必须一致!");}}//电子邮箱不能为空,并且要是一个格式合法的邮箱if(this.email==null || this.email.trim().equals("")){flag = false;errors.put("email", "邮箱不能为空!");}else{if(!this.email.matches("\\w+@\\w+(\\.\\w+)+")){flag = false;errors.put("email", "邮箱格式错误!");}}/*生日可以为空,不为空时,必须要是一个日期* 不能用SimpleDateFormat因为12月32日会转成第2年的* 可以使用BeanUtils里面的DateLocaleConverter* 日期错误转不了,就会抛异常!*/if(this.birthday!=null && !this.birthday.trim().equals("")){try{DateLocaleConverter conv= new DateLocaleConverter();conv.convert(this.birthday, "yyyy-MM-dd");}catch (Exception e) {flag = false;errors.put("birthday", "日期格式不对!");}}//昵称不可以为空,并且要是汉字区间(\u4e00-\u9fa5)if(this.nickname==null || this.nickname.trim().equals("")){flag = false;errors.put("nickname", "昵称不能为空!");}else{  //[^\u4e00-\u9fa5]*if(!this.nickname.matches("^([\u4e00-\u9fa5]+)$")){flag = false;errors.put("nickname", "呢称必须是汉字!");}}//客户端提交的验证码不可以为空if(c_checkcode==null || this.c_checkcode.trim().equals("")){flag = false;errors.put("c_checkcode", "必须输入认证码!");}else{if(!this.c_checkcode.equals(this.s_checkcode)){flag = false;errors.put("c_checkcode", "认证码错误!");}}return flag;}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 getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public String getC_checkcode() {return c_checkcode;}public void setC_checkcode(String c_checkcode) {this.c_checkcode = c_checkcode;}public String getS_checkcode() {return s_checkcode;}public void setS_checkcode(String s_checkcode) {this.s_checkcode = s_checkcode;}public Map getErrors() {return errors;}public void setErrors(Map errors) {this.errors = errors;}
}

RegisterUIServlet位于web.UI包

package cn.itcast.web.UI;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RegisterUIServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//为用户转到注册页面register.jsprequest.getRequestDispatcher("/WEB-INF/jsp/register.jsp").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

LoginUIServlet位于web.UI包

package cn.itcast.web.UI;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginUIServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//为用户转到登录页面login.jsprequest.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

UserDaoTest位于junit.test包

package junit.test;
import java.util.Date;
import org.junit.Test;
import cn.itcast.dao.UserDao;
import cn.itcast.dao.impl.UserDaoImpl;
import cn.itcast.domain.User;
public class UserDaoTest {/* 测试UserDaoImpl中的3个方法* 改动的是类目录下的* day09\WebRoot\WEB-INF\classes\\users.xml*/@Testpublic void testAdd(){User user=new User();user.setId("8882");user.setUsername("keke");user.setPassword("666");user.setEmail("keke@163.com");user.setBirthday(new Date());user.setNickname("可可");UserDao dao=new UserDaoImpl();dao.add(user);}@Testpublic void testFind(){//断点模式测试UserDaoImpl的find方法,结果是null还是User对象UserDao dao=new UserDaoImpl();dao.find("weixi", "888");}@Testpublic void testFindByUsername(){//测试UserDaoImpl的find方法(根据用户名查找是否已存在),结果是boolean类型UserDao dao=new UserDaoImpl();System.out.println(dao.find("keke"));}
}

ServiceTest位于junit.test包

package junit.test;
import java.util.Date;import org.junit.Test;import cn.itcast.domain.User;
import cn.itcast.exception.UserExistException;
import cn.itcast.service.impl.BusinessServiceImpl;
public class ServiceTest {@Testpublic void testRegister(){//测试BusinessServiceImpl的注册方法User user=new User();user.setId("8883");user.setUsername("xixi");user.setPassword("666");user.setEmail("xixi@163.com");user.setBirthday(new Date());user.setNickname("熙熙");BusinessServiceImpl service=new BusinessServiceImpl();try {service.register(user);System.out.println("注册成功!");} catch (UserExistException e) {System.out.println("用户名已存在!");}}@Testpublic void testLogin(){BusinessServiceImpl service=new BusinessServiceImpl();User user=service.login("xixi", "666");System.out.println(user);}
}

users.xml位于src目录

<?xml version="1.0" encoding="UTF-8"?>
<users><user id="8881" username="weixi" password="888" email="weixi@163.com" birthday="1990-09-09" nickname="潇湘妃子"/>
</users>

index.jsp位于WebRoot目录

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>网站首页</title></head><body><c:if test="${user!=null}">欢迎您:${user.nickname }<a href="${pageContext.request.contextPath }/servlet/LogoutServlet">注销</a></c:if><c:if test="${user==null}"><a href="${pageContext.request.contextPath }/servlet/LoginUIServlet">登录</a><a href="${pageContext.request.contextPath }/servlet/RegisterUIServlet">注册</a></c:if></body>
</html>

message.jsp位于WebRoot目录 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>您有新的消息,请注意查收</title></head><body>${message }</body>
</html>

register.jsp位于WebRoot\WEB-INF\jsp目录

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>用户注册</title><script type="text/javascript" src="${pageContext.request.contextPath }/js/ShowCalendar.js"></script>
</head>
<body><h3>注册须知:</h3> 1:在本站注册的会员,必须遵守《互联网电子公告服务管理规定》,不得在本站发表诽谤他人,侵犯他人隐私,侵犯他人知识产权,传播病毒,政治言论,商业机密等信息。<form action="${pageContext.request.contextPath }/servlet/RegisterServlet" method="post"><table><tr><td >登陆帐号:</td><td><input  type="text" name="username" value="${form.username }"><span >${form.errors.username }</span></td></tr><tr><td >重复密码:</td><td><input  type="password" name="password" value="${form.password }"><span >${form.errors.password }</span></td></tr><tr><td >确认密码:</td><td><input  type="password" name="password2"  value="${form.password2 }"><span >${form.errors.password2 }</span>  </td></tr><tr><td >电子邮箱:</td><td><input  type="text" name="email"  value="${form.email }"><span >${form.errors.email }</span></td></tr><tr><td >生日:</td><td><input  type="text" name="birthday" id="birthday" title="点击选择" onClick="showCalendar(this.id)" value="${form.birthday }"><span >${form.errors.birthday }</span></td></tr><tr><td >您的呢称:</td><td><input  type="text" name="nickname" value="${form.nickname }"><span >${form.errors.nickname }</span>  </td></tr><tr><td >图片认证:</td><td><input  type="text" name="c_checkcode"><span >${form.errors.c_checkcode }</span>  <img src="${pageContext.request.contextPath }/servlet/ImageServlet" height="25px" width="120px" alt="看不清" style="cursor: hand;" οnclick="this.src=this.src+'?'+Math.random().toString().substr(2,3)"></td></tr></table><span><input class="btn" type="reset" name="reset" value="重 置"></span><span><input class="btn" type="submit" name="submit" value="注 册"></span></form>
</body>
</html>

login.jsp位于WebRoot\WEB-INF\jsp目录

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>登陆界面</title></head><body><form action="${pageContext.request.contextPath }/servlet/LoginServlet" method="post">用户:<input type="text" name="username" />密码:<input type="password" name="password" /><input type="submit" value="登陆" /><input type="button" value="注册" οnclick="window.location.href='${pageContext.request.contextPath }/servlet/RegisterUIServlet'" /></form></body>
</html>

ShowCalendar位于WebRoot\js目录

// 日期选择 使用方法:
// <script type="text/javascript" src="${pageContext.request.contextPath }/js/ShowCalendar.js"></script>
// <input name="birthday" type="text" id="birthday" title="点击选择" onClick="showCalendar(this.id)">
var today;
document.writeln("<div id='Calendar' style='position:absolute; z-index:1; visibility: hidden; filter:\"progid:DXImageTransform.Microsoft.Shadow(direction=135,color=#999999,strength=3)\"'></div>");
function getDays(month, year)
{ var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); //下面的这段代码是判断当前是否是闰年的 if (1 == month) return ((0 == year % 4) && (0 != (year % 100))) || (0 == year % 400) ? 29 : 28; else return daysInMonth[month];
}
function getToday()
{ //得到今天的年,月,日 this.now = new Date(); this.year = this.now.getFullYear(); this.month = this.now.getMonth(); this.day = this.now.getDate();
}
function getStringDay(str)
{ //得到输入框的年,月,日var str=str.split("-")this.now = new Date(parseFloat(str[0]),parseFloat(str[1])-1,parseFloat(str[2])); this.year = this.now.getFullYear(); this.month = this.now.getMonth(); this.day = this.now.getDate();
}
function newCalendar() { var parseYear = parseInt(document.all.Year.options[document.all.Year.selectedIndex].value); var newCal = new Date(parseYear, document.all.Month.selectedIndex, 1); var day = -1; var startDay = newCal.getDay(); var daily = 0; if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth())) day = today.day; var tableCal = document.all.calendar; var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear());for (var intWeek = 1; intWeek < tableCal.rows.length;intWeek++) for (var intDay = 0;intDay < tableCal.rows[intWeek].cells.length;intDay++) { var cell = tableCal.rows[intWeek].cells[intDay]; if ((intDay == startDay) && (0 == daily)) daily = 1; if(day==daily) //今天,调用今天的Class {cell.style.background='#6699CC';cell.style.color='#FFFFFF';//cell.style.fontWeight='bold';}else if(intDay==6) //周六 cell.style.color='green'; else if (intDay==0) //周日 cell.style.color='red';if ((daily > 0) && (daily <= intDaysInMonth)) { cell.innerText = daily; daily++; } else cell.innerText = ""; } }
function GetDate(InputBox)
{ var sDate; //这段代码处理鼠标点击的情况 if (event.srcElement.tagName == "TD") if (event.srcElement.innerText != "") { sDate = document.all.Year.value + "-" + document.all.Month.value + "-" + event.srcElement.innerText;eval("document.all."+InputBox).value=sDate;HiddenCalendar();}
}
function HiddenCalendar()
{//关闭选择窗口document.all.Calendar.style.visibility='hidden';
}function showCalendar(InputBox)
{var months = new Array("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"); var days = new Array("日","一", "二", "三", "四", "五", "六"); var x,y,intLoop,intWeeks,intDays;var DivContent;var year,month,day;var o=eval("document.all."+InputBox);var thisyear; //真正的今年年份thisyear=new getToday();thisyear=thisyear.year;today = o.value;if(isDate(today))today = new getStringDay(today);elsetoday = new getToday(); //显示的位置x=o.offsetLeft;y=o.offsetTop;while(o=o.offsetParent){x+=o.offsetLeft;y+=o.offsetTop;}document.all.Calendar.style.left=x+2;document.all.Calendar.style.top=y+20;document.all.Calendar.style.visibility="visible";//下面开始输出日历表格(border-color:#9DBAF7)DivContent="<table border='0' cellspacing='0' style='border:1px solid #0066FF; background-color:#EDF2FC'>";DivContent+="<tr>";DivContent+="<td style='border-bottom:1px solid #0066FF; background-color:#C7D8FA'>";//年DivContent+="<select name='Year' id='Year' onChange='newCalendar()' style='font-family:Verdana; font-size:12px'>";for (intLoop = thisyear - 35; intLoop < (thisyear + 2); intLoop++) DivContent+="<option value= " + intLoop + " " + (today.year == intLoop ? "Selected" : "") + ">" + intLoop + "</option>"; DivContent+="</select>";//月DivContent+="<select name='Month' id='Month' onChange='newCalendar()' style='font-family:Verdana; font-size:12px'>";for (intLoop = 0; intLoop < months.length; intLoop++) DivContent+="<option value= " + (intLoop + 1) + " " + (today.month == intLoop ? "Selected" : "") + ">" + months[intLoop] + "</option>"; DivContent+="</select>";DivContent+="</td>";DivContent+="<td style='border-bottom:1px solid #0066FF; background-color:#C7D8FA; font-weight:bold; font-family:Wingdings 2,Wingdings,Webdings; font-size:16px; padding-top:2px; color:#4477FF; cursor:hand' align='center' title='关闭' onClick='javascript:HiddenCalendar()'>S</td>";DivContent+="</tr>";DivContent+="<tr><td align='center' colspan='2'>";DivContent+="<table id='calendar' border='0' width='100%'>";//星期DivContent+="<tr>";for (intLoop = 0; intLoop < days.length; intLoop++) DivContent+="<td align='center' style='font-size:12px'>" + days[intLoop] + "</td>"; DivContent+="</tr>";//天for (intWeeks = 0; intWeeks < 6; intWeeks++){ DivContent+="<tr>"; for (intDays = 0; intDays < days.length; intDays++) DivContent+="<td onClick='GetDate(\"" + InputBox + "\")' style='cursor:hand; border-right:1px solid #BBBBBB; border-bottom:1px solid #BBBBBB; color:#215DC6; font-family:Verdana; font-size:12px' align='center'></td>"; DivContent+="</tr>"; } DivContent+="</table></td></tr></table>";document.all.Calendar.innerHTML=DivContent;newCalendar();
}
function isDate(dateStr)
{ var datePat = /^(\d{4})(\-)(\d{1,2})(\-)(\d{1,2})$/;var matchArray = dateStr.match(datePat);if (matchArray == null) return false; var month = matchArray[3];var day = matchArray[5]; var year = matchArray[1]; if (month < 1 || month > 12) return false; if (day < 1 || day > 31) return false; if ((month==4 || month==6 || month==9 || month==11) && day==31) return false; if (month == 2){var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); if (day > 29 || (day==29 && !isleap)) return false; } return true;
}

用到的第三方库

jaxen-1.1-beta-6.jar

jstl.jar    standard.jar

dom4j-1.6.1.jar

commons-beanutils-1.8.0.jar commons-logging.jar

JavaWeb_10_mvc案例_注册登录相关推荐

  1. Jsp+Servlet+MYSQL注册登录案例(界面难看,ε=(´ο`*)))唉)

    注册登录界面尤为常见,我的界面尤为难看,勉为其难的写吧,前端不熟就是这样... 这个案例运用到了: 1.Jsp动态页面--->动态页面 2.Servlet逻辑判断后台---->实现界面与数 ...

  2. 用HTML做一个简单的web登录页面,简单的JavaWeb注册登录案例

    简单的JavaWeb注册登录案例 1.注册页面register.html register 姓名: 电话: 邮箱: qq: 2.注册案例实现程序register.java /** * 注册案例实现程序 ...

  3. 项目案例模板之登录注册的实现

    项目案例模板之登录注册的实现 案例演示 案例代码 设计表 pom.xml <dependencies> <dependency> <groupId>junit< ...

  4. JavaWeb--用户注册登录案例

    用户注册登录案例 1 用户登录 1.1 需求分析 1.2 环境准备 1.3 代码实现 2 用户注册 2.1 需求分析 2.2 代码编写 3 SqlSessionFactory工具类抽取 目标: 能够完 ...

  5. Java基础案例2-6:登录注册小程序

    [案例2-6] 登录注册小程序 [案例介绍] 编写程序实现简单的登录注册功能.程序包含以下4个功能: (1)登录功能,用户输入正确的账号密码进行成功: (2)注册功能,输入用户名和密码进行注册: (3 ...

  6. python用户登录程序_「Python」每日一练:函数的应用之注册登录程序

    编程题 函数的应用之注册登录程序 任务内容:要求模拟系统注册及登录的情境,注册密码要求:密码是6位或以上,必须包涵大写字母.小写字母.数字.程序若未退出前,则一直循环运行. 程序编写要求:按要求完善各 ...

  7. html登录界面_使用数据库制作一套注册登录系统

    经过了那么多个星期的学习,终于到了使用数据库的阶段了,最基本的也就是制作注册登录与数据库连接. 首先要制作一个注册窗口 先是html界面 < 效果如图: (样子怎么样不重要,重要的是测试) 这主 ...

  8. Redis(案例一:注册登录-图形验证码+谷歌开源Kaptcha)

    文章目录 背景 Kaptcha 框架介绍 添加Kaptcha依赖 Kaptcha配置 CommonUtil⼯具类 接⼝开发 JsonData响应⼯具类封装 校验逻辑 背景 注册-登录-修改密码⼀般需要 ...

  9. 云闪付持卡人认证信息失败_云闪付app注册登录常见问答

    云闪付app注册登录常见问答 1.如何注册成为云闪付App用户? 持卡人可通过以下方式注册成为云闪付APP用户: (1)通过持卡人服务网站(www.95516.com): (2)通过云闪付App. 通 ...

最新文章

  1. c# 经验谈:巧用Expression表达式 解决类似于sql中 select in 的查询(适合于中小型项目)...
  2. MySQL赋权navicat_mysql 的root 用户无法授权及解决navicat 远程授权提示1044问题
  3. JS判断数字/字母/中文
  4. 计算机网络之数据链路层:4、流量控制和可靠传输机制(停止等待协议、后退N帧协议、选择重传协议)
  5. TiDB 源码阅读系列文章(二十二)Hash Aggregation
  6. 大数据测试之hadoop单机环境搭建(超级详细版)
  7. 添加roster好友 命令
  8. 红外遥控模块的使用方法,以及stm32代码
  9. Halcon教程六:为什么要二值化
  10. 用html代码制作一个表单页面,HTML网页表单制作详细讲解
  11. 小牛叔讲Python第6章:for循环-能计数的循环1234567
  12. 禅道mysql怎么在本地配置_本地安装部署禅道
  13. dlib android版本号,dlib-android
  14. 拍摄高质量数码照片的三条原则:安全快门、低感光度、最佳光圈
  15. 在vue项目中引用萤石云播放器插件
  16. freetype的简单使用
  17. 小游戏贪吃蛇的c++源代码
  18. Mosaix首席科学家劳逆:弱监督学习是未来发展趋势
  19. Sublime Text Mac完美版
  20. 同惠LCR测试仪TH2829产品技术参数

热门文章

  1. 每次创建新项目都要去设置更改maven仓库位置? 如何解决
  2. Qt 实现excel加法
  3. 已知满二叉树先序序列如何求后序序列
  4. 普罗米修斯监控搭建大全
  5. AcWing 826. 单链表
  6. AcWing仓库选址
  7. 大数据之-Nifi-了解Nifi处理器_和Nifi的其他组件---大数据之Nifi工作笔记0003
  8. 数据库远程还原,本地备份。
  9. 阻挡***狙击攻略 配置安全的路由器
  10. tplink886n变无线打印服务器,TP-LINK TL-WR886N如何设置无线桥接