java

位置:IT落伍者 >> java >> 浏览文章

Spring 和struts 整合的三种方式


发布日期:2018年01月26日
 
Spring 和struts 整合的三种方式

使用Spring 的 ActionSupport

使用Spring 的 DelegatingRequestProcessor 类

全权委托

无论用那种方法来整合第一步就是要为struts来装载spring的应用环境 就是在 struts 中加入一个插件

strutsconfigxml中

<plugin className=orgspringframeworkwebstrutsContextLoaderPlugIn>

<setproperty property=contextConfigLocation value=/WEBINF/applicationContextxml/>

</plugin>

spring 的配置文件被作为参数配置进来这样可以省略对webxml 文件中的配置确保你的applicationContextxml 在WEBINF目录下面

使用Spring的ActionSupport

Spring 的ActionSupport 继承至 orgapachestrutsactionAction ActionSupport的子类可以或得 WebApplicationContext类型的全局变量通过getWebApplicationContext()可以获得这个变量

这是一个 servlet 的代码

public class LoginAction extends orgspringframeworkwebstrutsActionSupport {

public ActionForward execute(ActionMapping mapping ActionForm form

HttpServletRequest request HttpServletResponse response) {

LoginForm loginForm = (LoginForm) form;// TODO Autogenerated method stub

//获得 WebApplicationContext 对象

WebApplicationContext ctx = thisgetWebApplicationContext();

LoginDao dao = (LoginDao) ctxgetBean(loginDao);

User u = new User();

usetName(loginFormgetName());

usetPwd(loginFormgetPwd());

if(daocheckLogin(u)){

return mappingfindForward(success);

}else{

return mappingfindForward(error);

}

}

}

applicationContextxml 中的配置

<beans>

<bean id=loginDao class=comcaodaoLoginDao/>

</beans>

这中配置方式同直接在webxml文件配置差别不大注意Action继承自 orgspringframeworkwebstrutsActionSupport 使得struts和spring耦合在一起

但实现了表示层和业务逻辑层的解耦(LoginDao dao = (LoginDao) ctxgetBean(loginDao))

使用Spring 的 DelegatingRequestProcessor 类

DelegatingRequestProcessor 继承自 orgapachestrutsactionRequestProcessor 并覆盖了里面的方法

sturtsconfigxml 中 <controller processorClass=orgspringframeworkwebstrutsDelegatingRequestProcessor/> 通过 <controller >来替代orgapachestrutsactionRequestProcessor 的请求处理

public class LoginAction extends Action {

//利用spring来注入这个对象

private LoginDao dao ;

public void setDao(LoginDao dao) {

Systemoutprintln(执行注入);

thisdao = dao;

}

public LoginDao getDao() {

return dao;

}

public ActionForward execute(ActionMapping mapping ActionForm form

HttpServletRequest request HttpServletResponse response) {

LoginForm loginForm = (LoginForm) form;// TODO Autogenerated method stub

//这样一改这行代码似乎没有必要了

//WebApplicationContext ctx = thisgetWebApplicationContext();

//LoginDao dao = (LoginDao) ctxgetBean(loginDao);

User u = new User();

usetName(loginFormgetName());

usetPwd(loginFormgetPwd());

//直接用dao来调用spring会将这个对象实例化

if(daocheckLogin(u)){

return mappingfindForward(success);

}else{

return mappingfindForward(error);

}

}

}

这里的

LoginAction extends Action 说明 struts 每有和spring 耦合

看一下

applicationContextxml 中的配置

<beans>

<bean id=loginDao class=comcaodaoLoginDao/>

<bean name=/login class=comcaostrutsactionLoginAction>

<property name=dao>

<ref local=loginDao/>

</property>

</bean>

</beans>

这里 name=/login 与struts 中的path匹配class=comcaostrutsactionLoginAction 与struts 中的type匹配

还要为 LoginAction 提供必要的setXXX方法 获得ApplicationCotext和依赖注入的工作都在DelegatingRequestProcessor中完成

全权委托

Action 的创建和对象的依赖注入全部由IOC容器来完成 使用Spring的DelegatingAcionProxy来帮助实现代理的工作orgspringframeworkwebstrutsDelegatingActiongProxy继承于orgapachestrutsactionAction

全权委托的配置方式同 方式 类似 (applcationContextxml文件的配置和 Action类的实现方式相同)

<strutsconfig>

<datasources />

<formbeans >

<formbean name=loginForm type=comcaostrutsformLoginForm />

</formbeans>

<globalexceptions />

<globalforwards />

<actionmappings >

<! type指向的是spring 的代理类 >

<action

attribute=loginForm

input=loginjsp

name=loginForm

path=/login

scope=request

type=orgspringframeworkwebstrutsDelegatingActionProxy >

<forward name=success path=/okjsp />

<forward name=error path=/errorjsp />

</action>

</actionmappings>

<messageresources parameter=comcaostrutsApplicationResources />

<plugin className=orgspringframeworkwebstrutsContextLoaderPlugIn>

<setproperty property=contextConfigLocation value=/WEBINF/applicationContextxml/>

</plugin>

</strutsconfig>

不同之处

<action>中 type指向的是spring 的代理类

去掉strutsconfigxml中 <controller >

三种整和方式中我们优先选用 全权委托的方式

理由

第一种使得过多的耦合了Spring和Action

RequestProcessor类已经被代理 如果要再实现自己的实现方式(如编码处理)怕有点麻烦

总结一下

整合工作中的步骤

修改strutsconfigxml

配置applicationContextxml

为Action添加get/set方法 来获得依赖注入的功能

上一篇:在Eclipse中编写JavaFX

下一篇:Spring的自动装配