今天决定拿一个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包
pageEncoding="UTF-8"%>
系统入口
第一天写博客
登录
注册
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
系统注册
${entry.value}
${requestScope["regist.msg"]}
用户名: | |
密码: | |
再次密码: | |
生日: | |
介绍: | |
pageEncoding="UTF-8"%>
Insert title here
${requestScope["login.msg"]}
请输入用户名: | |
请输入密码: | |
七天内记住密码 | |
接着就是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 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("");
builder.append("").append(user.getUsername())
.append("");
builder.append("").append(user.getPassword())
.append("");
builder.append("")
.append(DateUtils.dateToString(user.getDate()))
.append("");
builder.append("").append(user.getResume()).append("");
builder.append("");
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 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 validate(){
Map m = new HashMap();
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,先到这,夜深睡觉,分享手感,大神勿喷,