自己手写 springmvc

2017-06-19 18:55:09 +08:00
 gexyuzz

github 地址:传送门

前两天写了几个注解和处理器的 Dmoe,然后发现可以写一个小框架。感觉 Springmvc 比较合适,之前也看过部分源码,然后就动手搞了一个。 代码没有抽取,设计也是一塌糊涂(比较菜,不会设计),代码不优雅。
实现了几个核心功能:注解式声明控制类,简单的数据绑定,返回 jsosn,支持使用 model 传递数据,Resultf 风格的跳转和重定向(准备添加文件上传功能)。
如果有志之士可以 fork 一份 添加功能,修复 bug。这里谢过了!

原理

1,首先初始化的时候扫描指定的包,然后扫描类上的注解,生成一个 map。把注解上的值为 key,Java 类的全定限名为 value。
2,扫描方法上面的映射,维护映射 map,把 mapping 注解的值为 key,执行的方法为 value。初始化完成!
3,然后根据核心 servlet 去分发请求,然后解析返回字符串,进行跳转或者是重定向。
具体的思路就是这样
如果有志之士可以 fork 一份 添加功能,修复 bug.
留个邮箱,用于交流 gexyuzz@gmail.com !不是广告!!!

打包好了 download ,可以引入到项目使用啦~

用到的 jar 包:bcel-6.0.jar commons-beanutils.jar json-20170516.jar

日志组件: logback

那么怎么使用呢?

首先在 action 类添加 @Action 注解,在方法添加 @Mapping 注解.

@Action("/index")
public class Controller {
	@Mapping(value="/hello",RequestType=Type.get)
	public String sayHello(Model model){
		model.setParameter("root", "Hello");
		return "welcome";
	}
}

它会跳转到 /WEB-INF/jsp 下的 welcome.jsp(这里我写死的,前缀 /WEB-INF/jsp.后缀.jsp)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${root }
</body>
</html>

然后在项目的 web.xml 文件添加核心 servlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
	<servlet>
		<servlet-name>main</servlet-name>
		<servlet-class>cn.xiuyu.servlet.MainServlet</servlet-class>
		<!-- 设置最先启动保证初始化 -->
		<load-on-startup>1</load-on-startup>
		<init-param>
			<!-- 自定扫描的包 -->
			<param-name>package</param-name>
			<param-value>cn.xiuyu</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>main</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

然后访问地址: http:localhost:8080/${项目名}/index/hello

其实使用上 springmvc 差不多,就这样。 有什么 bug 可以告诉我阿! 告诉我阿 ! 我阿! 阿!!!

3505 次点击
所在节点    Java
10 条回复
misaka19000
2017-06-19 19:15:57 +08:00
赞一个👍
0915240
2017-06-19 19:34:25 +08:00
赞一个。

以前准备撸一个 netty http router 的,不知道 url 地址匹配是怎么处理的,看了下 springmvc 中用的 antPattern,,还有有些 go web framwork 用的树结构,然后就弃了。
Sharuru
2017-06-19 19:34:43 +08:00
看到的只有满眼错别字...
gexyuzz
2017-06-19 21:15:18 +08:00
@Sharuru 点一下呗,我改改(尴尬
redtea
2017-06-19 21:20:16 +08:00
造轮子
gexyuzz
2017-06-19 21:21:45 +08:00
@redtea 也是闲来没事,欢迎一起造轮子阿
chenuu
2017-06-20 07:39:46 +08:00
@0915240 你可以参考下 GitHub 上我项目,bay1ts/bay。netty 撸的。有你需要的。我参考了 spark 和 be E go,spring MVC。设计不是很好
leaybc
2017-06-20 09:36:42 +08:00
所以... 你的 Dmoe ? jsosn ? Resultf ? 是啥玩意....
wyntergreg
2017-06-20 11:47:04 +08:00
@leaybc 手动喷血
gexyuzz
2017-06-20 12:23:17 +08:00
@wyntergreg 小事小事。认真分析了一下原因,可能是输入法暂时性失忆。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/369614

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX