V2EX 首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Java

自己手写 springmvc

  •  1
     
  •   gexyuzz · 64 天前 · 989 次点击
    这是一个创建于 64 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 可以告诉我阿! 告诉我阿 ! 我阿! 阿!!!

    第 1 条附言  ·  63 天前

    更新一下,感谢评论同学提的意见,确实有几个错别字,demo,json,Result
    添加了文件上传(目前仅支持单文件),上传过程可以通过接受json来获取上传状态。
    github添加了 框架使用说明。

    10 回复  |  直到 2017-06-20 12:23:17 +08:00
        1
    misaka19000   64 天前
    赞一个👍
        2
    0915240   64 天前
    赞一个。

    以前准备撸一个 netty http router 的,不知道 url 地址匹配是怎么处理的,看了下 springmvc 中用的 antPattern,,还有有些 go web framwork 用的树结构,然后就弃了。
        3
    Sharuru   64 天前 via Android
    看到的只有满眼错别字...
        4
    gexyuzz   64 天前
    @Sharuru 点一下呗,我改改(尴尬
        5
    redtea   64 天前
    造轮子
        6
    gexyuzz   64 天前
    @redtea 也是闲来没事,欢迎一起造轮子阿
        7
    chenuu   64 天前 via Android   ♥ 1
    @0915240 你可以参考下 GitHub 上我项目,bay1ts/bay。netty 撸的。有你需要的。我参考了 spark 和 be E go,spring MVC。设计不是很好
        8
    leaybc   64 天前   ♥ 1
    所以... 你的 Dmoe ? jsosn ? Resultf ? 是啥玩意....
        9
    wyntergreg   63 天前
    @leaybc 手动喷血
        10
    gexyuzz   63 天前
    @wyntergreg 小事小事。认真分析了一下原因,可能是输入法暂时性失忆。
    DigitalOcean
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   鸣谢   ·   2637 人在线   最高记录 3541   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.7.5 · 57ms · UTC 02:13 · PVG 10:13 · LAX 19:13 · JFK 22:13
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1