自己写一个mvc框架吧(四)
写一个请求的入口,以及初始化框架
上一章写了获取方法的入参,并根据入参的参数类型进行数据转换。这时候,我们已经具备了通过反射调用方法的一切必要条件。现在我们缺少一个http请求的入口,就是一个servlet。现在我们开始写吧~
在这一章我们要做的事情有
-
定义一个配置文件,用来描述什么样的请求映射到哪一个class的哪一个方法上面。
-
在servlet初始化后,根据上面定义的配置文件加载mvc框架。
-
在一个http请求进入后,根据其请求路径,找到相应的方法,获取参数,使用反射执行该方法。
-
得到方法的执行结果后,先以json的形式在浏览器显示出来。
这一步是视图层的功能,先这样写,之后在写各种视图控制器。
现在开始写吧
定义配置文件
这里的配置不一定就必须是一个xml, json,yaml... 之类的文件,也可以是注解的形式。区别就只是在加载框架的时候根据不同的形式进行解析就好了。这里为了写起来方便,就先定义一个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(); //接下来,就可以写别的东西了 } }
