精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-07-16
JomperMVC 0.2 beta.
1.0系统介绍 2.0开发指南 3.0配制文件祥解 4.0例子导读 5.0其他 1.0系统介绍 1.1 系统简图 1.2 简介 这是一个MVC开发框架,也希望这是一个很薄的层。所以JomperMVC的目标是精简。 proxy和filter是他的核心.filter就是真实意义上的插件。是系统组件任意插拔的关键。 model和business object放到IoC容器,便于解决依赖关系。 1.3 特色 ● 灵活。插件任意插拔,你可以在配置文件里去掉所有插件,那么他这时只有一个前端控制器.但它一样能运转。 ● 便利。利用IoC容器,让BO直接能处理到一个带有request里数据的model。(插件带来的功能) ● 开放。用户能在该框架基础上开发出自己的插件。利用插件执行的前后顺序,你能完成想要的功能。samples里带有3个系统插件作为范例。 1.4 开发环境 jdk 1.5 tomcat 5.5.12 1.5 下载 主页:http://code.google.com/p/jomperxo/ 下载地址:http://code.google.com/p/jomperxo/downloads/list svn地址:http://jomperxo.googlecode.com/svn/trunk/JomperMVC 建议从svn地址得到最新的src以及文档. 2.0开发指南 2.1 基于JomperMVC开发 2.1.1 了解org.jomper.mvc.action.ServletAction ● ServletActionImpl 是你的action,相当于struts的Action。在这里它是个接口。在ServletActionImpl里完成你的主要业务并返回一个jsp url,当然是可以在某些情况下返回null,例如xml,xslt transform等... ● request ServletActionImpl mapping 是访问这个impl的途径。(mapping name的定义见3.0 配置文件祥解) ● ServletAction 能访问ServletContext对象。 2.2 插件开发 2.2.1 了解org.jomper.mvc.filter.ActionFilter ● filter位于org.jomper.mvc.action.ServletAction前后。 ● 系统组件和模块组件都以filter的形式存在并由org.jomper.mvc.filter.JomperFilterChain触发。 ● 组件能访问ServletContext对象。 ● filter能设置范围 (mapping name的定义见3.0 配置文件祥解)。 ● 写组件也就是filter,有入侵。需要在filter主方法的最后加上chain.doChain(request, response, servletContext);完成filter的传递。 ● filter能设定位于org.jomper.mvc.action.ServletAction之前或者之后触发。 2.2.2 系统插件介绍 2.2.2.1 org.jomper.mvc.filter.impl.DataWrapperFilter ● 类似于struts的form,这个插件负责把request里的parameters 封装到action link过的model里,在module.xml里能link任意个model到action。对应约束是<input name和model.Field的一致。 ● 如果在配置文件里 model-name='map'则页面的parameters被封装到map里。因为无论是model还是map都能很方便的在jsp里用EL输出。 2.2.2.2 了解org.jomper.mvc.filter.impl.BusinessObjectInvocationFilter ● 这个插件的功能是辅助org.jomper.mvc.util.BOInvocation,当用BOInvocation调用一个使用到IoC容器里model的BO时(例如org.jomper.mvc.bo.BOTest),替换DataWrapperFilter处理过的model到容器.确保这个BO处理的是一个有数据的model. ● 它需要和DataWrapperFilter协同工作,且要在DataWrapperFilter之后注册. 2.2.2.3 了解org.jomper.mvc.filter.impl.XMLTransformFilter ● 这个插件的功能是把xml和xslt转换成html输出. ● 因为需要截获httpresponse的输出流,它是个后置filter. <filter precedence="after"... ● 需要在action里设置xml&xslt的路径,并把返回置null.(见例子:org.jomper.mvc.action.impl.XMLTransformAction) 3.0配置文件祥解 3.1 web.xml配置 留给用户自定义的地方有 <servlet> <servlet-name>MVConfigurator</servlet-name> <init-param> <param-name>configFile</param-name> <param-value>WEB-INF/mvc.xml</param-value> <!-- 根据需要设定mvc.xml的位置以及名字 --> ... <servlet> <servlet-name>ServletController</servlet-name> ... <init-param> <param-name>actionExtension</param-name> <param-value>.jo</param-value> <!-- .jo可以改成.do或者其它 --> ... <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> <!-- UTF-8可以改成你使用的编码 --> ... <servlet-mapping> <servlet-name>ServletController</servlet-name> <url-pattern>*.jo</url-pattern> <!-- .jo可以改成.do或者其它,但是必须和actionExtension的value保持一致 --> 3.2 mvc.xml配置 mvc.xml是核心配置文件,负责组件、模块配置文件、业务对象配置文件的注册。 <filter class="org.jomper.mvc.filter.impl.XMLTransformFilter" precedence="after" path="xml/"/> <!-- filter是插件配置 class="这里写filter类名" precedence="filter优先级分prepare和after" path="filter的过滤范围,与action mapping对应,例如 'aa/'过滤 mapping为'aa/*.jo'及以下的所有action" --> <module name="testModule" path="moduletest\mvc_module.xml" /> <!-- 模块配置 name="模块名" path="模块路径,'moduletest\mvc_module.xml'表示root\moduletest\mvc_module.xml"--> <business-object name="boTest" path="moduletest\businessobject.xml"/> <!-- BO配置 name="BO模块名" path="模块路径,'moduletest\businessobject.xml'表示root\moduletest\businessobject.xml"--> 3.3 mvc_module.xml配置 mvc_module.xml可以任意起名字,只要在mvc.xml就行。它负责model注册、action注册、把model link到action。 <model name="testModel2" class="org.jomper.mvc.model.TestModel2"/> <!-- modelname不能重复,分散在不同模块配置文件的modelname也不能重复 --> <action name="bb/test" class="org.jomper.mvc.action.impl.TestAction"/> <!-- actionname不能重复,分散在不同模块配置文件的actionname也不能重复,class="action类名" --> <link-model action-name="test" model-name="testModel2"/> <!-- 可以将n个任意的model,link到action --> [color=blue]3.4 bsinessobject.xml配置[/color] <component name="botest" class="org.jomper.mvc.bo.BOTest"/> <!-- boname不能重复,分散在不同模块配置文件的boname也不能重复,class="bo类名" --> 4.0例子导读 4.1 运行samples 4.1.1把samples下的project 放到服务器下 4.1.2把lib里的jar放到 WEB-INF\lib下 4.1.3把bin里的JomperMVC_0.2.jar 放到 WEB-INF\lib下 4.1.4根据 JomperMVC\moudletest\mvc_module.xml 的配置 运行mapping http://ip:port/JomperMVC/ 看到欢迎界面,表示项目启动成功. 样例运行mapping http://ip:port/JomperMVC/bb/test.jo 4.2 例子解析 4.2.1 action mapping例子 在IE输入 http://ip:port/JomperMVC/bb/test.jo 4.2.2 model数据装载例子 在你提交数据之后DataWrapperFilter自动把request里和model匹配的参数装载到model.model就是在mvc_module.xml里link的两个. 这时在org.jomper.mvc.action.impl.testAction2里 List models = (List)request.getAttribute(ServletConstants.MODELS);就能得到装载了数据的model. 提交数据到http://ip:port/JomperMVC/aa/test2.jo,立即能看到效果。 4.2.3 BOInvocation例子 你能用BOInvocation.invoke(servletContext, "botest", "changeTestField_2", c);来直接调用org.jomper.mvc.bo.BOTest, 当然BOTest的依赖类org.jomper.mvc.model.TestModel:o已经被BusinessObjectInvocationFilter完成model替换。 BOTest 能处理一个装载了数据的model. 这时你会发现下次调用该model时,还是上次的数据。你可以执行org.jomper.mvc.container.ContainerReset.execute(); 来重置model. 4.2.4 filter组件例子 "PreTestFilter is executed"等类似输出, 测试filter是否被执行。 4.2.5 XMLTransform例子 在IE输入 http://ip:port/JomperMVC/xml/xmltest.jo 能看到一个分页的sample. 4.2.6 jsp显示数据例子 root/moduletest/TestAction.jsp 5.0 其他 5.1 ~ 下面准备写个避免重复提交的filter. 权限控制的filter model cache池... 5.2 写在后面 这次的0.2 beta版本,开发时间比较短,肯定还有很多时间和能力导致的bug.需要大家的支持,意见建议可以通过qq:298045517和jomper.cn@gmail.com和我联系. 程序对异常的处理非常简陋,将在接下来重点完善。 需要大家批评、指正。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-07-16
javax.xml.transform.TransformerFactoryConfigurationError: Provider org.apache.xalan.processor.TransformerFactoryImpl not found
at javax.xml.transform.TransformerFactory.newInstance(Unknown Source) tomcat 5.0.28不能运行 xml xslt transform的sample. 估计是5.0没带org.apache.xalan包 |
|
返回顶楼 | |
发表时间:2007-07-24
沉的真快.最近发现 setter注入,让IoC容器里的bean过于敏感。
一旦set里注入的参数不能得到满足,就会异常。 下一步,减少框架里的入侵。ServletAction接口和filter都存在这个问题。 BO和model之间弱耦合以后,BO和DAO是否也通过接口实现解耦,层与层之间的分离点实在不好把握。 |
|
返回顶楼 | |
发表时间:2007-07-25
呵呵,参照了webwork
|
|
返回顶楼 | |
发表时间:2007-07-25
说像ww,也只是这里的filter功能上有点像xwork的拦截器。
不过与其说像xw的拦截器,还不如说他像servlet的Filter。 可以肯定楼主没有研究过ww或者不喜欢ww。 |
|
返回顶楼 | |
发表时间:2007-07-25
我没用过ww,ls说的对,我的确是模仿的servlet.filter.
我的filter配制比servlet的简单,而且分前后filter。而且能访问servletcontext。在这个基础上我就能随意编写插件。 比如xml+xslt to html的插件. |
|
返回顶楼 | |
发表时间:2007-07-30
增加一个时序图,表现出filter和其他部分的关系。
|
|
返回顶楼 | |
发表时间:2007-07-30
不错,思路很好.
疑问; web层异常是哪个filter或chain处理掉的? 表现层支持种类?(jsp,velocity,freemarker..) 权限过滤器? 国际化过滤器? |
|
返回顶楼 | |
发表时间:2007-07-31
to galaxystar:
web层异常,准备让前端控制器直接抛出。这个用filter我没有思路... 表现层支持jsp,适合使用大量EL。 权限过滤器正在设计之中 国际化过滤器尚未考虑. 呵呵 你也发现了一切都可以是filter,一切都可以是插件。 |
|
返回顶楼 | |
发表时间:2007-07-31
是的,可以自由的装卸插件,才是一个web框架最优先考虑的.
楼主也可以考虑下, 采用observe模式, 实现多链式的, 即针对不同的请求, 有不同的链式filter来处理. 方便扩展rest. |
|
返回顶楼 | |