Jslfl【软件开发技术笔记】

自己写框架-MVC(三)

技术要点:

改造计划:
1.抽取通用servlet
2.完善formbean创建方式

代码结构:
img1-1

1、将formbean的封装操作从action中移出(到servlet中),doService方法中接收formbean参数
1.1、LoginAction.java代码清单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package cn.jslfl.mvc.demo.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.jslfl.mvc.demo.form.LoginForm;

public class LoginAction {
    public String doService(LoginForm formBean, HttpServletRequest req, HttpServletResponse resp){

        //业务处理开始...
        boolean flag = false;
        if("aa".equals(formBean.getUserName()) && "bb".equals(formBean.getPassWord())){
            flag = true;
        }
        //业务处理结束...
       
        String info = "<h1>登录" + (flag ? "成功" : "失败") + "!userName: " + formBean.getUserName()+ ", " + "password: " + formBean.getPassWord() + "</h1>";
        req.setAttribute("info", info);
       
        return "/web/userInfo.jsp";
    }
}

1.2、RegAction.java代码清单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package cn.jslfl.mvc.demo.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.jslfl.mvc.demo.form.RegForm;

public class RegAction {
    public String doService(RegForm regBean, HttpServletRequest req, HttpServletResponse resp){

        //业务处理开始...
        String msg = "";
        if(regBean.getUserName() == null || "".equals(regBean.getUserName().trim())
                ||regBean.getPassWord() == null || "".equals(regBean.getPassWord().trim())
                || regBean.getPassWord2() == null || "".equals(regBean.getPassWord2().trim())){
            msg = "数据不完整";
        }else if(!regBean.getPassWord().equals(regBean.getPassWord2())){
            msg = "两次密码不匹配";
        }else{
            msg = "成功";
        }
        //业务处理结束...
       
        String info = "<h1>注册" + msg + "!userName: " + regBean.getUserName() + ", " + "password: " + regBean.getPassWord() + ", " + "password2: " + regBean.getPassWord2() +"</h1>";
        req.setAttribute("info", info);
       
        return "/web/login.jsp";
    }
}

2、抽取通用servlet,将LoginServletg与RegServlet中的业务移到通用ActionServlet中,删除LoginServletg.java、RegServlet.java
ActionServlet.java代码清单:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package cn.jslfl.mvc.demo.servlet;

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.jslfl.mvc.core.form.FormBeanUtil;
import cn.jslfl.mvc.demo.action.LoginAction;
import cn.jslfl.mvc.demo.action.RegAction;
import cn.jslfl.mvc.demo.form.LoginForm;
import cn.jslfl.mvc.demo.form.RegForm;

public class ActionServlet extends HttpServlet{
    private static final long serialVersionUID = 1L;

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setCharacterEncoding("GBK");
       
        String reqPath = req.getServletPath();
        System.out.println("=== ServletPath:" + reqPath + "  ContextPath:" + req.getContextPath() );
        String actionName = reqPath.substring(1, reqPath.lastIndexOf(".do"));//截取 "/login.do" -> "login"
       
        String returnPath = "/404.jsp";
        if("login".equals(actionName)){
            LoginForm formBean = (LoginForm)FormBeanUtil.packFormBean(req, "cn.jslfl.mvc.demo.form.LoginForm");
            LoginAction action = new LoginAction();
            returnPath = action.doService(formBean, req, resp);
        }else if("reg".equals(actionName)){
            RegForm formBean = (RegForm)FormBeanUtil.packFormBean(req, "cn.jslfl.mvc.demo.form.RegForm");
            RegAction action = new RegAction();
            returnPath = action.doService(formBean, req, resp);
        }
        req.getRequestDispatcher(returnPath).forward(req, resp);
    }
   
    public void doGet(HttpServletRequest req, HttpServletResponse resp){
        try {
            doPost(req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在servlet中封装formbean对象,并调用action.doService方法时传入action中。

3.修改web.xml中servlet配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>mvc_servlet_1</display-name>
 
  <servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>cn.jslfl.mvc.demo.servlet.ActionServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
 
</web-app>

4、发布到tomcat测试
img4-1
img4-2
img4-3
img4-4

本节中login.jsp、reg.jsp、userInfo.jsp、LoginForm.java、RegForm.java未做修改,已提取通用ActionServlet做为前端请求处理转发器,下一节将完成一个简单的MVC框架。

Comments are currently closed.