MVC框架的实现

现在web开发基本都是MVC的架构了,struts、springMvc 等等。其中一个重要的功能就是将客户发起的请求,分发至我们定义的Action里面的方法之中。

闲暇之余,我也做了一个类似于spring的方式,在Action中配置注解RequestMapping,将前端的请求分发至action的方法中。实现的过程还是比较简单的。

 

1. 实现url映射的注解

2. 在servlet容器启动时,解析配置当中所有的模块。解析模块中的所有方法。将对应的URL以及处理方法保存起来。

3. 在servlet处理请求时,取得请求的servlet容器,然后从保存的URL映射中取处理的类和方法。如果没有则404,如果有则调用该方法处理。

4.然后根据方法的返回值,返回响应的jsp页面。

 

代码非常简陋,只是为了弄懂如何通过注解实现URL映射。源码:YMvc

demo的效果如下:

Action中配置:

/**
 *
 * @author yingzi.zhu
 */
@RequestMapping("/my")
public class MyAction {
    
    @RequestMapping("/sayHello")
    public String add(HttpServletRequest request, HttpServletResponse response){
        request.setAttribute("param", "Hello, everyone");
        return "hello";
    }
        
}

web.xml中的配置如下:

    <servlet>
        <servlet-name>yservlet</servlet-name>
        <servlet-class>org.yz.mvc.action.YServlet</servlet-class>
        <init-param>
            <param-name>entrance</param-name>
            <param-value>org.yz.mvc.MainModule</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>yservlet</servlet-name>
        <url-pattern>*.test</url-pattern>
    </servlet-mapping>

其中 org.yz.mvc.MainModule 为主入口,作用是通过@YMvc注解,标记模块。

/**
 *
 * @author yingzi.zhu
 */
@YMvc(MyAction.class)
public class MainModule {
    
}

hello.jsp。测试Action中的返回,从Request中取值。在页面显示。

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1><%= request.getAttribute("param") %></h1>
    </body>
</html>

 

最后的显示结果。

image

 

image

 

整个映射过程还是比较简单的。只需要在web.xml中进行servlet配置,然后在入口中配置要加载的Action。然后在Action中配置匹配的路径。

 

实现的思路是:

1. 在servlet类中,获取web.xml中配置的入口模块

2. 在入口模块中解析注解 @YMvc 的内容。

3. 根据解析的内容继续解析 配置了URL映射的模块,分别解析类名的注解以及方法的注解

4. 将注解以及处理类存放在map里面。如 前面demo中的  (/my/sayHello, MyAction, add)

5. 在servlet有请求时,解析请求的路径,从map中取匹配

6. 配置到了,则调用Java类的反射机制,来执行配置的方法。获取方法的返回值

7. 将使用请求转发,将请求转发至 方法的返回值。

posted @ 2013-12-20 10:51  yingzi.zhu  阅读(1507)  评论(1编辑  收藏  举报