论坛首页 Java企业应用论坛

学习用的原创框架:JomperMVC Framework 0.2 beta

浏览 4869 次
精华帖 (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和我联系.
程序对异常的处理非常简陋,将在接下来重点完善。
需要大家批评、指正。
  • 大小: 555.7 KB
   发表时间: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包
0 请登录后投票
   发表时间:2007-07-24  
沉的真快.最近发现 setter注入,让IoC容器里的bean过于敏感。
一旦set里注入的参数不能得到满足,就会异常。

下一步,减少框架里的入侵。ServletAction接口和filter都存在这个问题。

BO和model之间弱耦合以后,BO和DAO是否也通过接口实现解耦,层与层之间的分离点实在不好把握。
0 请登录后投票
   发表时间:2007-07-25  
呵呵,参照了webwork
0 请登录后投票
   发表时间:2007-07-25  
说像ww,也只是这里的filter功能上有点像xwork的拦截器。
不过与其说像xw的拦截器,还不如说他像servlet的Filter。

可以肯定楼主没有研究过ww或者不喜欢ww。

0 请登录后投票
   发表时间:2007-07-25  
我没用过ww,ls说的对,我的确是模仿的servlet.filter.

我的filter配制比servlet的简单,而且分前后filter。而且能访问servletcontext。在这个基础上我就能随意编写插件。

比如xml+xslt to html的插件.
0 请登录后投票
   发表时间:2007-07-30  
增加一个时序图,表现出filter和其他部分的关系。
  • 大小: 51.6 KB
0 请登录后投票
   发表时间:2007-07-30  
不错,思路很好.
疑问;
web层异常是哪个filter或chain处理掉的?
表现层支持种类?(jsp,velocity,freemarker..)
权限过滤器?
国际化过滤器?
0 请登录后投票
   发表时间:2007-07-31  
to galaxystar:
web层异常,准备让前端控制器直接抛出。这个用filter我没有思路...
表现层支持jsp,适合使用大量EL。
权限过滤器正在设计之中
国际化过滤器尚未考虑.

呵呵 你也发现了一切都可以是filter,一切都可以是插件。
0 请登录后投票
   发表时间:2007-07-31  
是的,可以自由的装卸插件,才是一个web框架最优先考虑的.

楼主也可以考虑下, 采用observe模式, 实现多链式的, 即针对不同的请求, 有不同的链式filter来处理.

方便扩展rest.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics