苦尽甘来 一个月学通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>