在整合Spring与Struts的过程中 参考了George Franciscus 的《使用 Spring 更好地处理 Struts 动作》一文 文中提到了三种方案:
1. 使用 Spring 的 ActionSupport
2. 覆盖 RequestProcessor
3. 将动作管理委托给 Spring
这三种方法都侵入了struts-config.xml文件
这点我不太喜欢 不希望在struts配置文件中出现任何spring有关的东西 觉得仅仅只需要在Action中注入业务层的对象就可以了
我的实现方式和上面方法2应该来说是一样的 或者他的实现要比我好 。
首先 我不是通过插件的方式来装载Spring的 而是把他的改写在到web.xml里面
这样容器加载的时候Spring的容器也启动 容器加载的时候所有的Action已经实例化
第二步,在spring配置文件中为Action注入业务层方法
注意这里bean的name的名字一定要和类名一样(大小写都一样) 如:
< name="ProductAction" class="com.tangjun.web.struts.action.ProductAction">
第三步,继承RequestProcessor 在struts-config.xml中加入
重写方法processActionCreate
一看名字就知道这个方法是用来创建或获得Action (这个时候大家应该知道了)
拷贝processActionCreate原来的代码
把 instance = (Action) RequestUtils.applicationInstance(className);
这行替换成我需要的:
ApplicationContext app = (ApplicationContext) request.getSession()
.getServletContext()
.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
String beanName=className.substring(className.lastIndexOf('.') + 1);
instance = (Action) app.getBean(beanName);
表示第一次请求来时 从Spring容器中来获得实例对象
OK了 大致的思路就是这样子 关于上面名字对应的问题 做得好的话可以通过反射如配置文件什么的来实现 请多指教 :)
没有评论:
发表评论