摘要
本人设计的一套轻量MVC框架,支持嵌入任何支持 Java Servlet 规范的框架,不局限于 Spring ,甚至国产的Web框架也支持嵌入。
一开始是为适用公司某些需求的产品做的轻量框架,经过多次整理后,决定小开源一下。个人能力和眼界有限,自然比不上如 jooby 那样优秀的轻量框架,不过够用。
正文
本人设计的一套轻量MVC框架,支持嵌入任何支持 Java Servlet 规范的框架,不局限于 Spring ,甚至国产的Web框架也支持嵌入。
一开始是为适用公司某些需求的产品做的轻量框架,经过多次整理后,决定小开源一下。个人能力和眼界有限,自然比不上如 jooby 那样优秀的轻量框架,不过够用。
严格来说,这不算是个框架,顶多是便于开发和解耦的路由转发api,这也是为啥我开源的项目叫 route-forward
已实现的功能如下
支持通过@Rest、@GET、@POST注解进行解耦开发,避免大量if...else...。目前请求方式也仅支持GET与POST
传参支持直接使用Map<String,Object>,也支持注解解析
全局异常抓取
请求日志打印
明显的缺陷
- POST请求主要支持任何Content-Type的字符串请求体。POST暂不支持类似GET的直接拼参、不支持文件流,不过也可以实现。
- 目前不支持接入接口文档,不过可以实现,且注解都进行了适用生成文档的参数。不过可以直接使用代码零侵入的Apifox框架。
一、介绍
1.1 项目结构说明
项目结构
- servlet-web-framework:核心。基于Servlet与注解的轻量MVC框架
- servlet-web-framework-example:示例。使用框架进行实际业务开发示例
- springboot-example:示例。嵌入到Spring框架示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| ├─servlet-web-framework 基于Servlet与注解的轻量MVC框架
│ └─src
│ └─main
│ └─java
│ └─top
│ └─meethigher
│ └─webframework
│ ├─annotation 类似SpringMVC的注解
│ ├─exception 通用异常
│ ├─servlet 接口请求入口
│ ├─utils 工具类
│ └─worker 注解的增强实现
├─servlet-web-framework-example 使用框架进行实际业务开发示例
│ └─src
│ └─main
│ ├─java
│ │ └─rest
│ │ └─api
│ │ ├─controlelr
│ │ ├─model
│ │ └─service
│ └─resources
│ └─test
│ └─img
└─springboot-example 嵌入到Spring框架示例
└─src
└─main
├─java
│ └─top
│ └─meethigher
│ └─springboot
│ └─config
└─resources
|
1.2 整体请求流程
以Servlet作为请求入口,这点类似于SpringMVC的DispatcherServlet
二、使用示例
2.1 maven依赖
已上传Maven中央仓库
1
2
3
4
5
| <dependency>
<groupId>top.meethigher</groupId>
<artifactId>servlet-web-framework</artifactId>
<version>1.0</version>
</dependency>
|
2.2 Spring使用示例
创建Controller
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
| @Rest("/test")
public class TestController {
private final TestService testService;
public TestController(TestService testService) {
this.testService = testService;
}
@Get("/api1")
public Resp api1(Map<String, Object> args) {
return testService.api1(args);
}
@Get("/api2")
public Resp api2(@Param("name") String name, @Param("age") Integer age, @Param(value = "money", required = false) Double desc) {
return testService.api2(name,age,desc);
}
@Post("/api3")
public Resp api3(Map<String, Object> args) {
return testService.api3(args);
}
@Post("/api4")
public Resp api4(@Body Person person) {
return testService.api4(person);
}
@Post("/api5")
public Resp api5() throws ServletWebException {
testService.api5();
return Resp.getSuccessResp();
}
@Post("/api6")
public Resp api6() throws ServletWebException {
testService.api6();
return Resp.getSuccessResp();
}
}
|
注册Servlet到Spring容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| class TestServlet extends ResourceHttpServlet {
public TestServlet(ControllerManager controllerManager) {
super("test", "api", controllerManager);
}
}
@Configuration
public class TestServletConfig {
@Resource
private TestController testController;
@Bean
public ServletRegistrationBean workflowServlet() {
ServletRegistrationBean<Servlet> bean = new ServletRegistrationBean<>();
TestServlet servlet = new TestServlet(new ControllerManager());
bean.setServlet(servlet);
bean.addUrlMappings("/" + servlet.getServletPath() + "/*");
servlet.registerController(testController);
return bean;
}
}
|
请求示例