苦尽甘来 一个月学通JavaWeb(三十 MVC设计模式)

夜光序言:

嗯唔~~想要成功就要付出百分之百的努力,否则,就算是天才也会变成庸才~~~

 

 

 

正文:

第一个包:package cn.Genius.user.dao;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
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.Genius.user.domain.User;

/**
 * 夜光:数据类
 * @author Genius Team
 *
 */
public class UserDao {
	private String path = "F:/users.xml";//依赖数据文件
	
	/**
	 * 按用户名查询
	 * @param username
	 * @return
	 */
	public User findByUsername(String username) {
		/*
		 * 1. 得到Document
		 * 2. xpath查询!
		 *   3. 校验查询结果是否为null,如果为null,返回null
		 *   4. 如果不为null,需要把Element封装到User对象中。
		 */
		/*
		 * 1. 得到Document
		 */
		// 创建解析器
		SAXReader reader = new SAXReader();
		try {
			Document doc = reader.read(path);
			/*
			 * 2. 通过xpath查询得到Element
			 */
			Element ele = (Element)doc.selectSingleNode("//user[@username='" + username + "']");
			/*
			 * 3. 校验ele是否为null,如果为null,返回null
			 */
			if(ele == null) return  null;
			
			/*
			 * 4. 把ele的数据封装到User对象中
			 */
			User user = new User();
			String attrUsername = ele.attributeValue("username");//获取该元素的名为username属性值
			String attrPassword = ele.attributeValue("password");//获取该元素的名为password属性值
			user.setUsername(attrUsername);
			user.setPassword(attrPassword);
			
			return user;
		} catch (DocumentException e) {
			throw new RuntimeException(e);
		}
	}
	
	/**
	 * 添加用户
	 * @param user
	 */
	public void add(User user) {
		/*
		 * 1. 得到Document
		 * 2. 通过Document得到root元素!<users>
		 * 3. 使用参数user,转发成Element对象
		 * 4. 把element添加到root元素中
		 * 5. 保存Document
		 */
		
		// 得到Document
		SAXReader reader = new SAXReader();
		try {
			Document doc = reader.read(path);
			// 得到根元素
			Element root = doc.getRootElement();
			// 通过根元素创建新元素
			Element userEle = root.addElement("user");
			// 为userEle设置属性
			userEle.addAttribute("username", user.getUsername());
			userEle.addAttribute("password", user.getPassword());
			
			/*
			 * 保存文档
			 */
			// 创建输出格式化器
			OutputFormat format = new OutputFormat("\t", true);//缩进使用\t,是否换行,使用是!
			format.setTrimText(true);//清空原有的换行和缩进
			
			// 创建XmlWriter
			XMLWriter writer;
			try {
				writer = new XMLWriter(
						new OutputStreamWriter(
								new FileOutputStream(path), "UTF-8"), format);
				writer.write(doc);//保存document对象
				writer.close();
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		} catch (DocumentException e) {
			throw new RuntimeException(e);
		}
	}
}

第二个包:package cn.Genius.user.domain;

 

/**
 *  夜光:实体类
 * @author Genius  Team
 *
 */
public class User {
	private String username;
	private String password;
	private String 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;
	}

	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password
				+ ", verifyCode=" + verifyCode + "]";
	}
}

第三个包:package cn.Genius.user.service;

/**
 * 夜光:自定义一个异常类 这个包有两个类,这是其中之一
 *   只是给出父类中的构造器即可~~
 *   这样方便用来创建对象
 * @author Genius  Team
 *
 */
public class UserException extends Exception {
	public UserException() {
		super();
		// TODO Auto-generated constructor stub
	}

	public UserException(String message, Throwable cause) {
		super(message, cause);
		// TODO Auto-generated constructor stub
	}

	public UserException(String message) {
		super(message);
		// TODO Auto-generated constructor stub
	}

	public UserException(Throwable cause) {
		super(cause);
		// TODO Auto-generated constructor stub
	}
	
}
import cn.Genius.user.dao.UserDao;
import cn.Genius.user.domain.User;

/**
 * 夜光:User的业务逻辑层
 * @author Genius  Team
 *
 */
public class UserService {
	private UserDao userDao = new UserDao();
	
	/**
	 * 注册功能
	 * @param user
	 * @throws UserException
	 */
	public void regist(User user) throws UserException {
		/*
		 * 1. 使用用户名去查询,如果返回null,完成添加
		 * 2. 如果返回的不是null,抛出异常!
		 */
		User _user = userDao.findByUsername(user.getUsername());
		if(_user != null) throw new UserException("用户名" + user.getUsername() + ", 已被注册过了~~");
		
		userDao.add(user);
	}

	/**
	 * 夜光:登录功能
	 * @param form
	 * @return
	 * @throws UserException 
	 */
	public User login(User form) throws UserException {
		/*
		 * 1. 使用form中的username进行查询,得到User user
		 */
		User user = userDao.findByUsername(form.getUsername());
		/*
		 * 2. 如果返回null,说明用户名不存在,抛出异常,异常信息为“用户名不存在”
		 */
		if(user == null) throw new UserException("用户名不存在~");
		/*
		 * 3. 比较user的password和form的password,如果不同,抛出异常,异常信息为“密码错误!”
		 */
		if(!form.getPassword().equals(user.getPassword())) {
			throw new UserException("密码错误~~~~");
		}
		
		/*
		 * 返回数据库中查询出来的user,而不是form,因为form中只有用户名和密码,而user是所有用户信息~~
		 */
		return user;
	}
}

第四个包:package cn.Genius.user.web.servlet;  //三个类class

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.Genius.commons.CommonUtils;
import cn.Genius.user.domain.User;
import cn.Genius.user.service.UserException;
import cn.Genius.user.service.UserService;

/**
 * 夜光:UserServlet层
 * @author Genius  Team
 *
 */
public class LoginServlet extends HttpServlet {
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");//请求编码(POST)
		response.setContentType("text/html;charset=utf-8");//响应编码
		
		// 依赖UserService
		UserService userService = new UserService();
		
		/*
          夜光:
		 * 1. 封装表单数据到User form中
		 * 2. 调用service的login()方法,得到返回的User user对象。
		 *   > 如果抛出异常:获取异常信息,保存到request域,再保存form,转发到login.jsp
		 *   > 如果没有异常:保存返回值到session中,重定向到welcome.jsp
		 */
		User form = CommonUtils.toBean(request.getParameterMap(), User.class);
		try {
			User user = userService.login(form);
			request.getSession().setAttribute("sessionUser", user);
			response.sendRedirect(request.getContextPath() + "/user/welcome.jsp");
		} catch(UserException e) {
			request.setAttribute("msg", e.getMessage());
			request.setAttribute("user", form);
			request.getRequestDispatcher("/user/login.jsp").forward(request, response);
		}
		
	}
}
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.Genius.commons.CommonUtils;
import cn.Genius.user.domain.User;
import cn.Genius.user.service.UserException;
import cn.Genius.user.service.UserService;

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");
		
		// Genius:依赖UserServlet
		UserService userService = new UserService();
		
		/*
		 * 1. Genius:封装表单数据(封装到User对象中)
		 */
		User form = CommonUtils.toBean(request.getParameterMap(), User.class);
		
		
		/*
		 * Genius:添加新任务(表单校验)
		 * 1. 创建一个Map,用来装载所有的表单错误信息
		 *   在校验过程中,如果失败,向map添加错误信息,其中key为表单字段名称
		 * 2. 校验之后,查看map长度是否大于0,如果大于0,说明有错误信息,就是有错误!
		 *   > 保存map到request中,保存form到request中,转发到regist.jsp
		 * 
		 * 3. 如果map为空,说明没有错误信息,向下执行~~
		 */
		
		// Genius:用来装载所有错误信息
		Map<String,String> errors = new HashMap<String,String>();
		
		// Genius:对用户名进行校验
		String username = form.getUsername();//获取表单的username
		if(username == null || username.trim().isEmpty()) {
			errors.put("username", "用户名不能为空~~");
		} else if(username.length() < 3 || username.length() > 15) {
			errors.put("username", "用户名长度必须在3~15之间!");
		}
		
		// 对密码进行校验
		String password = form.getPassword();
		if(password == null || password.trim().isEmpty()) {
			errors.put("password", "密码不能为空!");
		} else if(password.length() < 3 || password.length() > 15) {
			errors.put("password", "密码长度必须在3~15之间!");
		}
		
		
		// 对验证码进行校验
		String sessionVerifyCode = (String) request.getSession().getAttribute("session_vcode");
		String verifyCode = form.getVerifyCode();
		if(verifyCode == null || verifyCode.trim().isEmpty()) {
			errors.put("verifyCode", "验证码不能为空!");
		} else if(verifyCode.length() != 4) {
			errors.put("verifyCode", "验证码长度必须为4!");
		} else if(!verifyCode.equalsIgnoreCase(sessionVerifyCode)) {
			errors.put("verifyCode", "验证码错误!");
		}
		
		/*
		 * Genius:判断map是否为空,不为空,说明存在错误
		 */
		if(errors != null && errors.size() > 0) {
			/*
			 * 1. 保存errors到request域
			 * 2. 保存form到request域,为了回显
			 * 3. 转发到regist.jsp
			 */
			request.setAttribute("errors", errors);
			request.setAttribute("user", form);
			request.getRequestDispatcher("/user/regist.jsp").forward(request, response);
			return;
		}
		
		
		
		/*Genius:
		 * 2. 调用userService的regist()方法,传递form过去
		 * 3. 得到异常:获取异常信息,保存到request域,转发到regist.jsp中显示
		 * 4. 没有异常:输出注册成功~~
		 */
		try {
			userService.regist(form);
			response.getWriter().print("<h1>注册成功!</h1><a href='" + 
					request.getContextPath() + 
					"/user/login.jsp" + "'>点击这里去登录</a>");
		} catch (UserException e) {
			// 获取异常信息,保存到request域
			request.setAttribute("msg", e.getMessage());
			// 还要保存表单数据,到request域
			request.setAttribute("user", form);//用来在表单中回显~~
			// 转发到regist.jsp
			request.getRequestDispatcher("/user/regist.jsp").forward(request, response);
		}
	}

}
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.Genius.vcode.utils.VerifyCode;

public class VerifyCodeServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/*Genius:
		 * 1. 创建验证码类
		 */
		VerifyCode vc = new VerifyCode();
		/*
		 * 2. 得到验证码图片
		 */
		BufferedImage image = vc.getImage();
		/*
		 * 3. 把图片上的文本保存到session中
		 */
		request.getSession().setAttribute("session_vcode", vc.getText());
		/*
		 * 4. 把图片响应给客户端
		 */
		VerifyCode.output(image, response.getOutputStream());
	}
}

 

第五个包:test.dao  测试一下

 

import org.junit.Test;

import cn.Genius.user.dao.UserDao;
import cn.Genius.user.domain.User;

/**
 * 夜光:UserDao的测试
 * @author Genius  Team
 *
 */
public class UserDaoTest {
	@Test
	public void testFindByUsername() {
		UserDao userDao = new UserDao();
		User user = userDao.findByUsername("天铭");
		System.out.println(user);
	}
	
	@Test
	public void testAdd() {
		UserDao userDao = new UserDao();
		
		User user = new User();
		user.setUsername("逍遥");
		user.setPassword("xiaoyao");
		userDao.add(user);
	}
}

 

 

 

 

 

 

 

 

 

 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <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 style="color: red; font-weight: 900">${msg }</p>
<%--${pageContext.request.contextPath }/RegistServlet --%>
<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="c" uri="http://java.sun.com/jsp/jstl/core" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <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">
	/*
     夜光:
	如果一个表单项的name和<img>的id相同,那么可能会出问题~~一般只有IE出问题~~
	*/
	function _change() {
		/*
		1. 获取<img>元素
		*/
		var ele = document.getElementById("vCode");
		ele.src = "<c:url value='/VerifyCodeServlet'/>?xxx=" + new Date().getTime();
		
	}
</script>
  </head>
  
  <body>
<h1>注册</h1>
<p style="color: red; font-weight: 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='/VerifyCodeServlet'/>" border="2"/>
        <a href="javascript:_change()">换一张</a>${errors.verifyCode }<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" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'welcome.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>

 

 

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <display-name></display-name>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.Genius.user.web.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>RegistServlet</servlet-name>
    <servlet-class>cn.Genius.user.web.servlet.RegistServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>VerifyCodeServlet</servlet-name>
    <servlet-class>cn.Genius.user.web.servlet.VerifyCodeServlet</servlet-class>
  </servlet>



  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>RegistServlet</servlet-name>
    <url-pattern>/RegistServlet</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>VerifyCodeServlet</servlet-name>
    <url-pattern>/VerifyCodeServlet</url-pattern>
  </servlet-mapping>	
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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>
    Genius:This is my JSP page. <br>
  </body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值