Javaweb开发中三层架构
今天决定拿一个JavaWeb开发中的三层架构作为开始,走起~~随着jsp的简单实用,model1和model2被大家所熟悉,但是这两种设计模式过于繁琐,前者在jsp页面中直接页面又写逻辑(我很喜欢在一个里面一顿狂写~),后者在servlet中既写页面又写逻辑业务,繁琐难以维护(页面和业务逻辑的确分开了,但是长长的代码写在servlet中过于臃肿),所以引出今天企业中大都用到的开发架构模式----三层架构,三层指的是web层 service层 dao层 它这种架构是我们在javaweb开发中经常使用的,个人感觉这三层架构大大减少了类之间的耦合性,大家各司其职,利于维护。
1. Web层:它包含了jsp servlet javaBean相关内容,当作业务流程的跳转,层中可写mvc设计模式,便于人机交互。
2. Service层:它也叫做bussiness层,类似中枢神经的存在关联其他两层,但它只处理业务逻辑操作。
3. Dao层 数据层 也叫做持久化层(持久化框架) 它的主要功能是负责对数据源(解析xml,数据库)访问,简单说,它就是包含对数据的CRUD 操作。
流程图
搭建程序包结构
jar包
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>系统入口</title>
</head>
<body>
<h1 align = "center">第一天写博客</h1>
<div align="center">
<h2>
<!-- 超链接 -->
<a href="${pageContext.request.contextPath}/login.jsp">登录</a>
<a href="${pageContext.request.contextPath}/regist.jsp">注册</a>
</h2>
</div>
</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>系统注册</title>
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<div>
<c:forEach items="${map}" var="entry">
${entry.value}
</c:forEach>
${requestScope["regist.msg"]}
</div>
<form action="${pageContext.request.contextPath}/servletregist" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>再次密码:</td>
<td><input type="password" name="repassword"></td>
</tr>
<tr>
<td>生日:</td>
<td><input type="text" name="date"></td>
</tr>
<tr>
<td>介绍:</td>
<td><input type="text" name="resume"></td>
</tr>
<tr>
<td><input type="submit" value="注册" ></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
${requestScope["login.msg"]}
</div>
<form action="${pageContext.request.contextPath}/servletlogin" method="post">
<table>
<tr>
<td>请输入用户名:</td>
<td><input type ="text" name="username" value="${cookie.username.value}"></td>
</tr>
<tr>
<td>请输入密码:</td>
<td><input type ="password" name="password"></td>
</tr>
<tr>
<td>七天内记住密码</td>
<td><input type="checkbox" name="remember" value="ok"></td>
</tr>
<tr>
<td><input type="submit" value="登陆"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</body>
</html>
接着就是web层的servlet
/** 注册*/
public class servletregist extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//设置编码
request.setCharacterEncoding("utf-8");
//创建user对象
User user = new User();
try {
//设置时间
ConvertUtils.register(new MyDateConverter(),java.util.Date.class);
//内省
BeanUtils.populate(user, request.getParameterMap());
} catch (IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
//user类的validate,用来判断运行后的值是否为空,在后面
Map<String, String> map = user.validate();
//如果大于0证明输入有问题
if (map.size()>0) {
//输入有误,在request域中存入map
request.setAttribute("map", map);
//请求转发到注册界面
request.getRequestDispatcher("/regist.jsp").forward(request, response);
return;
}
//创建service层的对象
UserService us = new UserService();
try {
us.regist(user);
//重定向,到当前项目下的制定文件
response.sendRedirect(request.getContextPath()+"/login.jsp");
return;
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("regist.msg", "注册失败");
//请求转发
request.getRequestDispatcher("/regist").forward(request, response);
return;
}
}
}
public class servletlogin extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//从页面拿到运行后的值
String username = request.getParameter("username");
String password = request.getParameter("password");
//
UserService us = new UserService();
try {
User user = us.login(username, password);
if (user == null) {
//登陆失败,设置错误信息
request.setAttribute("login.msg", "用户信息不能为空");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}else {
String remember = request.getParameter("remember");
//如果点击了记住登陆按钮
if ("ok".equals(remember)) {
//cookie可以完成记者登陆
Cookie cookie = new Cookie("username", username);
//设置保留时间
cookie.setMaxAge(7*24*60*60);
cookie.setPath("/");
response.addCookie(cookie);
}
request.getSession().setAttribute("user", user);
response.sendRedirect(request.getContextPath()+"/hello.jsp");
}
} catch (DocumentException e) {
e.printStackTrace();
request.setAttribute("login.msg", "登陆失败");
request.getRequestDispatcher("/login.jsp").forward(request,
response);
return;
}
}
}
还是有一个销毁session的servlet
request.getSession().invalidate();
response.sendRedirect(request.getContextPath()+"/login.jsp");
service层的类中只有两个方法
public void regist(User user) throws DocumentException, IOException{
UserDao ud = new UserDao();
ud.add(user);
}
public User login(String username,String password) throws DocumentException{
UserDao ud = new UserDao();
return ud.read( username, password);
}
dao层完成业务
public class UserDao {
public void add(User user) throws DocumentException, IOException {
// 使用dom4j来完成对users.xml操作
// 1.获取Document对象
Document document = Dom4JUtils.getDocument("E:/Users.xml");
// 2.添加操作
StringBuilder builder = new StringBuilder();
builder.append("<user>");
builder.append("<username>").append(user.getUsername())
.append("</username>");
builder.append("<password>").append(user.getPassword())
.append("</password>");
builder.append("<birthday>")
.append(DateUtils.dateToString(user.getDate()))
.append("</birthday>");
builder.append("<resume>").append(user.getResume()).append("</resume>");
builder.append("</user>");
String xml = builder.toString();
Document doc = DocumentHelper.parseText(xml);
document.getRootElement().add(doc.getRootElement());
// 3.回写
Dom4JUtils.documentToXml(document, "E:/Users.xml");
}
public User read(String username, String password) throws DocumentException {
// 使用dom4j来完成对users.xml操作
// 1.获取Document对象
Document document = Dom4JUtils.getDocument("E:/Users.xml");
// 2.得到根元素
Element root = document.getRootElement();
// 3.得到根下所有user元素
List<Element> users = root.elements();
// 4.遍历users
for (Element user : users) {
// 5.判断每一个user下的username,password元素中的内容与传递的参数username,password是否相等。如果相等了将user对象信息封装,并返回。
String usernameElementText = user.elementText("username");
String passwordElementText = user.elementText("password");
if (username.equals(usernameElementText)
&& password.equals(passwordElementText)) {
User existUser = new User();
existUser.setUsername(username);
existUser.setPassword(password);
existUser.setResume(user.elementText("resume"));
existUser.setDate(DateUtils.stringToDate(user
.elementText("birthday")));
return existUser;
}
}
return null;
}
}
bean实体类
public class User {
private String username;
private String password;
private Date date;
private String resume;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String username, String password, Date date, String resume) {
super();
this.username = username;
this.password = password;
this.date = date;
this.resume = resume;
}
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 Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getResume() {
return resume;
}
public void setResume(String resume) {
this.resume = resume;
}
public Map<String,String> validate(){
Map<String, String> m = new HashMap<String, String>();
if (username == null || username.trim().length() == 0) {
m.put("username.msg", "用户不能为空");
}
if (password == null || password.trim().length() == 0) {
m.put("password.msg", "密码不能为空");
}
if (date == null) {
m.put("date.msg", "生日不能为空");
}
if (resume == null || resume.trim().length() == 0) {
m.put("resume.msg", "介绍不能为空");
}
return m;
}
}
工具类没写用的是dom4j的,感觉很low,先到这,夜深睡觉,分享手感,大神勿喷,

浙公网安备 33010602011771号