现在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>
</servlet-mapping>

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

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


最后的显示结果。

java自实现 mvc框架 mvc框架如何实现_java自实现 mvc框架

 

java自实现 mvc框架 mvc框架如何实现_html_02

 

整个映射过程还是比较简单的。只需要在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. 将使用请求转发,将请求转发至 方法的返回值。