自定义MVC框架

自定义MVC框架

学习过程中的一些记录,很多东西也许不正确,还希望大家能不吝赐教呀!


初级版MVC

1、定义Action接口

接口中定义execute方法。

public interface Action {
    public String execute(HttpServletRequest request,HttpServletResponse response);
}

2、实现Action

根据具体的业务逻辑实现Action,在实现类中定义不同的业务处理逻辑。

public class HelloAction implements Action {

    @Override
    public String execute(HttpServletRequest request,
            HttpServletResponse response) {
        request.setAttribute("hello", "hello world!");
        return "HelloAction.jsp";
    }
}

3、定义控制器

其实就是个servlet,相当于struts2中的dispatcher,对所有的请求进行分派,根据请求的URI指定相应的action对象进行处理,并且根据返回的视图对用户进行响应。本质是一个servlet,因此需要配置web.xml。

public class Controller extends HttpServlet {
    private Map actions;//维护所有的action,struts2中是在访问时候通过反射创建action对象的。

    @Override
    public void init() throws ServletException {
        actions = new HashMap();
        actions.put("HelloAction", new HelloAction());
        super.init();
    }


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        Action action = determineActionByUri(request, response);

        if(action == null){
            request.getRequestDispatcher("错误路径").forward(request, response);
            return;
        }   
        String result = action.execute(request, response);
        if(result!= null)
            request.getRequestDispatcher(result).forward(request, response);

    }
    //根据uri获取对应的ACtion对象
    private Action determineActionByUri(HttpServletRequest request, HttpServletResponse response){
        String requestURI = request.getRequestURI();
        String requestAction = requestURI.substring(requestURI.lastIndexOf("/")+1,requestURI.length()-7);
        Action action = actions.get(requestAction);
        return action;
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }
}

4、配置web.xml

保证所有的请求都经过servlet处理。servlet是单例的,第一次访问之后创建对象,之后就不再创建对象了。当然也可以在web.xml中配置启动tomcat服务器时候就创建对象,这样在第一次访问时候不会感觉到延迟。


<web-app version="3.0" 
    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_3_0.xsd">
  <display-name>display-name>
  <servlet>
    <servlet-name>Controllerservlet-name>
    <servlet-class>action.Controllerservlet-class>
    <load-on-startup>1load-on-startup>
  servlet>

  <servlet-mapping>
    <servlet-name>Controllerservlet-name>
    <url-pattern>*.actionurl-pattern>
  servlet-mapping>    
web-app>

5、创建必要的视图

视图的路径需要个返回的路径匹配,在struts2中根据struts.xml配置文件配置了action对象和result结果集,其原理也是差不多的。
到这里,一个简单的MVC框架就能跑起来了。

其中
- M:Model部分并没有过多的设计,model部分更多的是涉及持久层的东西,这里由于业务逻辑太简单(其实根本就没有业务逻辑),所以就没有POJO类。
- V:View。JSP,这个还是有的,主要是和用户的一些交互,接受请求,返回响应都需要在JSP上进行展示。
- C:Controller,在这里是一个Servlet,负责对用户的请求进行分发处理。struts2中用的是filter,并且struts2中定义了很多的拦截器,来对请求的业务进行处理。个人理解拦截器和过滤器其实是一个东西,只不过过滤器是JavaEE中的概念,拦截器(inteceptor)只有Struts2才有的吧。

Model1模型中,不涉及分层结构,当项目过大时难以管理和维护。
Model2采用了MVC的模型,也就是分层结构,将持久层和视图层通过控制层分隔解耦开来。能让项目更大时解耦。

进阶版MVC

进阶版相对于简单版的一些主要的差别:
1. 利用反射技术创建action
2. result采用了面向对象编程的思想,因此result更加强大。

reference:http://blog.csdn.net/jackfrued/article/details/42774459

你可能感兴趣的:(框架,mvc,框架)