陆陆续续用闲暇时间写的自用 MVC 框架,本来想利用十一期间整理整理代码放出来,结果一直拖延症终于缓慢地完工了(然后这帖又写了两天……)
先放地址: https://github.com/cloudeecn/mocha-mvc 求 Star 和 Fork , orz
README 和 Wiki 还不全,大家先凑合一下看看这里和 example 工程
运行环境要求:
clone 工程,用 eclipse/IDEA/whatever 你喜欢的 IDE 导入 maven 工程,用支持 Servlet3.0 的容器启动里面的 example 子工程就 OK 啦
在 web.xml 中有使用Spring
和Guice
作为 DI 的两套配置,默认打开的是用Guice
作 DI 的,也可以打开Spring
来试一下。
Spring
的配置在 example 工程中src/main/resources/works/cirno/mocha/example/spring/applicationContext.xml
Guice
的配置在
works.cirno.mocha.example.guice
包下
用过Guice
的同学应该对这种方式很熟悉,创建一个works.cirno.mocha.MVCConfigurator
的子类,并在public void configure()
方法中进行配置。配置好后配置到 DispatcherFilter / DispatcherServlet 的 init-param["configurator"]中
serve({路径}[, "GET/POST/PUT..."])
会产生一个路由项,利用方法链的方式可以进一步对匹配这个路径的访问进行配置
serve({路径}[, "GET/POST/PUT..."]).with({controller}, {method});
中的 with 方法给路由项配置响应的Controller
和其中的方法method
Controller 方法可以支持返回一下几个类型
Integer :直接用 response.sendError 返回返回码
String :作为 view 的名字寻找对应的 jsp 进行渲染
View 对象:根据 view 的名字寻找对应的 jsp 进行渲染, view 对象中有 attribute(key, value)方法可以给 request 的 attribute 提供值
null 或者方法返回类型为 void :不做后续处理
可以通过 forward 方法执行响应 view 名对应的 jsp 文件( forward 方法返回一个支持 to 方法的接口,其中的 to 方法执行 JSP 的位置)
可以配置多个
serve({路径}[, "GET/POST/PUT..."]).with({controller}, {method})
.forward("view 名").to("JSP 位置")
.forward("view 名").to("JSP 位置")
...
;
serve("/parameter/\\+${userId}").with(ParameterController.class, "user").forward("success").to("/WEB-INF/jsp/parameter-rest.jsp");
serve("/parameter/\\+${userId}", "POST").with(ParameterController.class, "userPost");
serve("/parameter/\\+${userId}.json").with(ParameterController.class, "userJson");
会匹配 /parameter/+后面的任何内容,并作为 userId 参数和候选
目前有两种写法:
JDK7 终于支持了的 namedGroup :写法如下:(?<name>pattern)
,会匹配 pattern 正则并且作为 name 参数的候选
另外支持一种比较基本的${name}
写法,会被翻译成(?<name>.*?)
,最小匹配接下来的内容作为 name 参数的候选
Controller 方法中的参数目前会根据以下的规则获取:
按类型匹配
如果是 multipart 请求,如果参数类型是 InputStream 或者 Reader ,根据参数名匹配上传文件的内容
根据参数的名称,按照url 中的变量 - multipart 中解析到的表单域 - request.getParameter
的顺序获取字符串,并尝试通过系统中的 PropertyEditor 进行类型转换,如果转换成功将转换结果给予参数
将这个类型用无参构造函数实例化,如果成功作为 JavaBean 遍历其中的属性,根据规则 1-4 获取参数名.属性名
的参数值进行填充,如果能获取到至少一个,将这个实例给予参数
以上都不匹配返回参数的默认值(基本类型给 false/0 ,对象类型给 null )
随后我会慢慢在 GitHub 的 README.md 和 Wiki 中补充上各种文档,请大家期待;)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.