自己手写 springmvc - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gexyuzz
V2EX    Java

自己手写 springmvc

  •  1
     
  •   gexyuzz 2017-06-19 18:55:09 +08:00 4221 次点击
    这是一个创建于 3112 天前的主题,其中的信息可能已经有所发展或是发生改变。

    github 地址:传送门

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

    原理

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

    打包好了 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=" 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="> <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 条附言    2017-06-20 12:21:51 +08:00

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

    10 条回复    2017-06-20 12:23:17 +08:00
    misaka19000
        1
    misaka19000  
       2017-06-19 19:15:57 +08:00
    赞一个
    0915240
        2
    0915240  
       2017-06-19 19:34:25 +08:00
    赞一个。

    以前准备撸一个 netty http router 的,不知道 url 地址匹配是怎么处理的,看了下 springmvc 中用的 antPattern,,还有有些 go web framwork 用的树结构,然后就弃了。
    Sharuru
        3
    Sharuru  
       2017-06-19 19:34:43 +08:00 via Android
    看到的只有满眼错别字...
    gexyuzz
        4
    gexyuzz  
    OP
       2017-06-19 21:15:18 +08:00
    @Sharuru 点一下呗,我改改(尴尬
    /div>
    redtea
        5
    redtea  
       2017-06-19 21:20:16 +08:00
    造轮子
    gexyuzz
        6
    gexyuzz  
    OP
       2017-06-19 21:21:45 +08:00
    @redtea 也是闲来没事,欢迎一起造轮子阿
    chenuu
        7
    chenuu  
       2017-06-20 07:39:46 +08:00 via Android   1
    @0915240 你可以参考下 GitHub 上我项目,bay1ts/bay。netty 撸的。有你需要的。我参考了 spark 和 be E go,spring MVC。设计不是很好
    leaybc
        8
    leaybc  
       2017-06-20 09:36:42 +08:00   1
    所以... 你的 Dmoe ? jsosn ? Resultf ? 是啥玩意....
    wyntergreg
        9
    wyntergreg  
       2017-06-20 11:47:04 +08:00
    @leaybc 手动喷血
    gexyuzz
        10
    gexyuzz  
    OP
       2017-06-20 12:23:17 +08:00
    @wyntergreg 小事小事。认真分析了一下原因,可能是输入法暂时性失忆。
    关于     帮助文档     自助推广系统     博客   &nsp; API     FAQ     Solana     2668 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 13:03 PVG 21:03 LAX 05:03 JFK 08:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86