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,先到这,夜深睡觉,分享手感,大神勿喷,

 

posted @ 2016-09-23 22:51  何koo  阅读(1422)  评论(0)    收藏  举报