首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

AppFuse改建之Struts框架隔离

2012-10-31 
AppFuse改造之Struts框架隔离进入新的项目组,checkout项目下来,看了一下其整体结构与代码,哎,比较乱。经过

AppFuse改造之Struts框架隔离
进入新的项目组,
checkout项目下来,
看了一下其整体结构与代码,哎,比较乱。
经过我的建议,部门经理让我对该项目进行全面重构。

首先,此项目是以AppFuse作为基础的,还记得robin说它就一toy
选择的模板是iBatis + Spring + Struts
我的第一步工作是要隔离Struts。

Struts是老牌的MVC实现,那个年代IoC和轻量级还没现在流行,框架侵入性也没有得到重视。
所以Struts的实现让应用程序严重依赖它:
1.所有控制器都必需继承Action类
2.所有数据封装类必需继承ActionForm
3.控制器方法execute必需返回ActionForward,与Struts藕合
4.控制器方法execute的参数ActionMapping,与Struts藕合
5.控制器方法execute的参数HttpServletRequest,HttpServletResponse,与Servlet容器藕合
6.由于Action类是Struts管理的,不支持Service类的IoC注入,除非将控制权委托给IoC容器,再配一遍(如:org.springframework.web.struts.DelegatingActionProxy)。

目标:
1.控制器不继承任何类,也不实现任何接口
2.数据封装Form类应为简单的POJO,不要继承ActionForm
3.execute返回值可以是任意对象(包括基本类型和void),
标准返回String,即forward的索引值,
如果返回其它类型对象就调用其toString。
如果返回类型为void或返回值为null,forward到默认的"success"
4和5.execute只传入POJO的Form,
如果该动作不需要Form数据,也可以保持空的参数列表。
如果有多个参数,第一个参数为Form(作为传入,也作为传出,这个是struts已经实现的规则),后面的都为传出对象,必需保证为POJO,传出对象会根据struts的action配置的scope,放入相应域。
6.支持IoC注入Service,即然IoC,当然不能依赖某个具体IoC容器,没有Spring一样运行。要不然会被ajoo一顿臭骂,什么什么? IoC还:容器类.getXXX()?
7.当然,还要实现一个线程安全的容器类,持有与Servlet相关的信息,
这样,若有特殊要求需要访问HttpServletRequest,HttpServletResponse
则可以通过:容器类.get当前线程容器().getRequest()方式获取。

最后类应该像这样:



不用说,这样的类是易于测试的。
例如:



IoC的Service供给接口



线程安全的Servlet相关信息持有类,
还有几个Map的封装,不贴也应该猜得到,
就是map.put时调用request,session,cookie,application相应的setAttribute等,get也类似


配置管理类:



Class辅助工具类


其它JUnit的测试类就不贴了。

现在Action解放了,Form对象还没解放
还是必需继承ActionForm,
因为<form-bean配置会检查该对象是否继承于ActionForm,否则报错。
验证框架和ActionForm也有点藕合。
我现在还没有想到好的办法,先搞个权宜之计,
写了一个BaseForm,继承于ActionForm,然后将从ActionForm中继承来的方法全给final掉
其它Form都继承于BaseForm,这样先保证Form不会重写ActionForm中的方法,
看起来像个POJO,若以后能去掉ActionForm,就只要改BaseForm。
public class BHolder { ThreadLocal bContext = new ThreadLocal(); //注意这里也new public static BHolder getBHolder() { // 写法主帖有.... }}


aContext和bContext分别实例化了,
这样aContext和bContext内部分别持有一个Map

你用当前线程作为key,
去AHolder里拿到的是aContext持有的对象
去BHolder里拿到的是bContext持有的对象
怎么会冲突?

6 楼 javatar 2007-01-26   heyosi 写道你可以去看看stecks!annotation风格的struts,不需要直接继承struts的Action和Form了。

谢谢你的提议,但此项目使用weblogic8.1,其solaris版本不支持jdk5.0,
annotation是个不错的主意,可以更好的aop,也省些xml配置。
7 楼 lgx522 2007-03-09   我用的是JSF版本,从头到尾一个人干,30多张表的管理系统,差不多也就一个多月,效率还是很高的。
此系统稳定运行了一年,说明Appfuse是可靠的。
目前第二个系统正要上线。规模差不多,稍复杂,但有了上一个系统的经验,20天左右也就搞定了。
建议同道们不要再搞自行一套的集成方案了。有了Appfuse这种久经考验的东西,开发得快,学习交流起来也方便。 8 楼 shaucle 2007-03-09   injection也可用annotation

其solaris版本不支持jdk5.0, 晕

热点排行