自己写一个java的mvc框架吧(四)

 

自己写一个mvc框架吧(四)

写一个请求的入口,以及初始化框架

上一章写了获取方法的入参,并根据入参的参数类型进行数据转换。这时候,我们已经具备了通过反射调用方法的一切必要条件。现在我们缺少一个http请求的入口,就是一个servlet。现在我们开始写吧~

在这一章我们要做的事情有

  1. 定义一个配置文件,用来描述什么样的请求映射到哪一个class的哪一个方法上面。

  2. 在servlet初始化后,根据上面定义的配置文件加载mvc框架。

  3. 在一个http请求进入后,根据其请求路径,找到相应的方法,获取参数,使用反射执行该方法。

  4. 得到方法的执行结果后,先以json的形式在浏览器显示出来。

    这一步是视图层的功能,先这样写,之后在写各种视图控制器

现在开始写吧

定义配置文件

这里的配置不一定就必须是一个xml, jsonyaml... 之类的文件,也可以是注解的形式。区别就只是在加载框架的时候根据不同的形式进行解析就好了。这里为了写起来方便,就先定义一个json的配置文件(因为json的文件用起来比较方便)。

着这个配置文件中我们需要定义一些参数,这些参数需要满足我们将一个http请求映射到一个方法上的需求。我是这样定义的:

{   "annotationSupport": false,   "mapping": [     {       "url": "/index",       "requestType": [         "get"       ],       "method": "index",       "objectClass": "com.hebaibai.demo.web.IndexController",       "paramTypes": [         "java.lang.String"       ]     }   ] }

下面说一下各个属性是干啥用的:

1:annotationSupport:用来描述有没有开启注解的支持,现在还没有写,就给了一个false。

2:mapping:用来描述映射关系的数据,是一个数组的类型。一个对象表示一个映射关系。

3:url:http请求的地址,表示这个映射关系对应的是哪一个请求地址。

4:requestType:这个映射支持的请求类型,数组的形式。说明一个方法支持多种请求方式。

5:objectClass:这个映射一定的是哪一个java对象。

6:method:这个映射关系对应的objectClass中的方法名称。

7:paramTypes:方法的入参类型,这里是一个数组,顺序要和定义的方法中的入参顺序相一致。定义这个参数是因为在通过反射找到一个一个Method的时候需要有两个参数,一是方法名称,另一个就是入参类型。所以这两个是必不可少的。

这里的配置说实话看起来有点复杂,用起来也不是很方便。比如在修改一个方法入参的时候,如果修改了参数类型,就要修改对应的配置。这里以后可以做一些简化处理,比如使用注解的形式,这样就会方便很多。但是现在是在设计并实现的阶段,可以把所有的配置按照最复杂的形式来做,完成功能之后再进行优化,可以添加一些全局的默认配置,这样就可以减少配置文件的编写。

上面的配置文件写完了,开始写怎样加载这个配置文件,并初始化这个mvc框架。

根据约定获取配置文件名称

因为请求的入口我用的是servlet,每一个servlet都需要配置 一个servlet-name,所以我们可以约定配置文件的名称就是就是servlet-name的名称后加上”.json“。例如我定义一个servlet:

<servlet>     <servlet-name>mvc</servlet-name>     <servlet-class>com.hebaibai.amvc.MvcServlet</servlet-class> </servlet> <servlet-mapping>     <servlet-name>mvc</servlet-name>     <url-pattern>/*</url-pattern> </servlet-mapping>

这时,配置文件的名称就是mvc.json。那么怎么做呢? 我们这么写:

//先定义一个servlet public class MvcServlet extends HttpServlet {      //重写其中的方法     @Override     public void init(ServletConfig config) {         //执行父类的init方法         super.init(config);         //获取servlet的名称         String servletName = config.getServletName();         //接下来,就可以写别的东西了     } }

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信