写简单的mvc框架实例讲解

项目地址在:https://github.com/hjx601496320/aMvc

测试代码在:https://github.com/hjx601496320/amvc-test

怎么写呢?

因为在之前写代码的时候,我把每个类要做的事情分的比较清楚,所以在添加这个功能的时候写起来还是比较简单的,需要修改的地方也比较小。

这一章里我们需要干的事情有:

定义一个注解,标识某一个class中的被添加注解的方法是一个UrlMethodMapping。

修改配置文件,添加需要扫描的package。

写一个方法,根据package中值找到其中所有的class。

在UrlMethodMapping的工厂类UrlMethodMappingFactory中新加一个根据注解创建UrlMethodMapping的方法。

在Application中的init()方法中,根据是否开启注解支持,执行新的工厂类方法。

完了。

多么简单呀~~~

现在开始写

定义一个注解Request

关于怎样自定义注这件事,大家可以上网搜一下,比较简单。我这里只是简单的说一下。我先把代码贴出来:

import com.hebaibai.amvc.RequestType; import java.lang.annotation.*; /** * 表示这个类中的,添加了@Request注解的method被映射为一个http地址。 * * @author hjx */ @Documented @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface Request { /** * 请求类型 * 支持GET,POST,DELETE,PUT * * @return */ RequestType[] type() default {RequestType.GET, RequestType.POST, RequestType.DELETE, RequestType.PUT}; /** * 请求地址 * 添加在class上时,会将value中的值添加在其他方法上的@Request.value()的值前,作为基础地址。 * * @return */ String value() default "https://www.jb51.net/"; }

定义一个注解,需要用到一下几个东西:

1:@interface:说明这个类是一个注解。

2:@Retention:注解的保留策略,有这么几个取值范围:

代码 说明
@Retention(RetentionPolicy.SOURCE)   注解仅存在于源码中  
@Retention(RetentionPolicy.CLASS)   注解会在class字节码文件中存在  
@Retention(RetentionPolicy.RUNTIME)   注解会在class字节码文件中存在,运行时可以通过反射获取到  

因为我们在程序中需要取到自定义的注解,所以使用:RetentionPolicy.RUNTIME。

3:@Target:作用目标,表示注解可以添加在什么地方,取值范围有:

代码 说明
@Target(ElementType.TYPE)   接口、类、枚举、注解  
@Target(ElementType.FIELD)   字段、枚举的常量  
@Target(ElementType.METHOD)   方法  
@Target(ElementType.PARAMETER)   方法参数  
@Target(ElementType.CONSTRUCTOR)   构造函数  
@Target(ElementType.LOCAL_VARIABLE)   局部变量  
@Target(ElementType.ANNOTATION_TYPE)   注解  
@Target(ElementType.PACKAGE)    

3:@Documented:这个主要是让自定义注解保留在文档中,没啥实际意义,一般都给加上。

4:default:是给注解中的属性(看起来像是一个方法,也可能就是一个方法,但是我就是叫属性,略略略~~~)一个默认值。

上面大致上讲了一下怎么定义一个注解,现在注解写完了,讲一下这个注解的用处吧。

首先这个注解可以加在class和method上。加在class上的时候表示这个类中会有method将要被处理成为一个UrlMethodMapping,然后其中的value属性将作为这个class中所有UrlMethodMapping的基础地址,type属性不起作用。加在method上的时候,就是说明这个method将被处理成一个UrlMethodMapping,注解的两个属性发挥其正常的作用。

注解写完了,下面把配置文件改一改吧。

修改框架的配置文件

只需要添加一个属性就好了,修改完的配置文件这个样子:

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

1:annotationSupport 值是true的时候表示开启注解。

2:annotationPackage 表示需要扫描的包的路径。

3:因为开了注解支持,为了防止重复注册 UrlMethodMapping,所以我把下面的配置注释掉了。

写一个包扫描的方法

这个方法需要将项目中jar文件和文件夹下所有符合条件的class找到,会用到递归,代码在ClassUtils.java中,由三个方法构成,分别是:

1:void getClassByPackage(String packageName, Set

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsdws.html