Spring的WEB模块用于整合Web框架,例如Struts1、Struts2、JSF等
整合Struts1
继承方式
Spring框架提供了ActionSupport类支持Struts1的Action。继承了ActionSupport后就能获取Spring的BeanFactory,从而获得各种Spring容器内的各种资源
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import org.springframework.web.struts.ActionSupport;
public class CatAction extends ActionSupport{
public ICatService getCarService(){
return (ICatService) getWebApplicationContext().getBean( "catService" );
}
public ActionForward execute(ActionMappingmapping,ActionForm form,HttpServletRequest request,HttpServletResponseresponse){
CatForm catForm = (CatForm) form;
if ( "list" .equals(catForm.getAction())){
returnthis.list(mapping,form,request,response);
}
}
public ActionForward list(ActionMappingmapping,ActionForm form,HttpServletRequest request,HttpServletResponseresponse){
CatForm catForm = (CatForm) form;
ICatService catService =getCatService();
List<Cat> catList =catService.listCats();
request.setAttribute( "carList" ,catList);
return mapping.find( "list" );
}
}
|
Spring在web.xml中的配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
< context-param > <!-- Spring配置文件的位置-->
< param-name >contextConfigLocation</ param-name >
< param-value >/WEB-INF/classes/applicationContext.xml</ param-value >
</ context-param >
< listener > <!-- 使用Listener加载Spring配置文件-->
< listener-class >
org.springframework.web.context.ContextLoaderListener
</ listener-class >
</ listener >
< filter > <!-- 使用Spring自带的字符过滤器-->
< filter-name >CharacterEncodingFilter</ filter-name >
< filter-class >org.springframework.web.filter.CharacterEncodingFilter</ filter-class >
< init-param >
< param-name >encoding</ param-name >
< param-value >UTF-8</ param-value >
</ init-param >
< init-param >
< param-name >forceEncoding</ param-name >
< param-value >true</ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name >CharacterEncodingFilter</ filter-name >
< url-pattern >/*</ url-pattern >
</ filter-mapping >
|
如果与Hibernate结合使用,需要在web.xml中添加OpenSessionInViewFilter过滤器,将session范围扩大到JSP层,防止抛出延迟加载异常
1
2
3
4
5
6
7
8
|
< filter >
< filter-name >hibernateFilter</ filter-name >
< filter-class >org.springframework.orm.hibernate3.support. OpenSessionInViewFilter</ filter-class >
</ filter >
< filter-mapping >
< filter-name > hibernateFilter</ filter-name >
< url-pattern >*.do</ url-pattern > <!-- 对Struts 1的Action启用-->
</ filter-mapping >
|
代理方式
继承方式融入Spring非常简单,但是缺点是代码与Spring发生了耦合,并且Action并没有交给Spring管理,因此不能使用Spring的AOP、IoC特性,使用代理方式则可以避免这些缺陷
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
public class CatAction extends Action{ //此处继承的Struts 1的Action
private ICatService catService;
//setter、getter略
public ActionForward execute(ActionMappingmapping,ActionForm form,HttpServletRequest request,HttpServletResponseresponse){
CatForm catForm = (CatForm) form;
if ( "list" .equals(catForm.getAction())){
returnthis.list(mapping,form,request,response);
}
}
public ActionForward list(ActionMappingmapping,ActionForm form,HttpServletRequest request,HttpServletResponseresponse){
CatForm catForm = (CatForm) form;
ICatService catService =getCatService();
List<Cat> catList =catService.listCats();
request.setAttribute( "carList" ,catList);
return mapping.find( "list" );
}
}
|
这个Action没有与Spring发生耦合,只是定义了一个ICatService属性,然后由Spring负责注入
struts-congfig.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
< form-beans >
< form-bean name = "catForm" type = "com.clf.spring.CatForm" >
</ form-beans >
< action-mappings >
< action name = " catForm" path = "/cat" type = "com.clf.spring.CatAction" >
< forward name = "list" path = "/jsp/listCat.jsp" ></ forward >
</ action >
</ action-mappings >
<!-- 最核心的配置,该配置把Struts的Action交给Spring代理-->
< controller processorClass = "org.springframework.web.struts.DelegatingRequestProcessor" />
<!-- controller配置生效后,Action的type属性就是去作用了,Struts不会用type属性指定的类来创建CatAction,而是到Spring配置中寻找,因此Spring中必须配置CatAction -->
<!-- Spring中配置Action使用的是name属性而不是id,Spring会截获"/cat.do"的请求,将catService通过setter方法注入到CatAction中,并调用execute()方法-->
< bean name = "/cat" class = " com.clf.spring.CatAction" >
< property name = "catService" ref = "catService" />
</ bean >
|
web.xml的配置与上面的继承方式相同
使用代理方式的Action可以配置拦截器等Spring特性,例如给CatAction配置方法前拦截器和返回后拦截器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
< bean id = "catBeforeInterceptor" class = "org.springframework.aop.support.NameMatchMethodPointcutAdvodor" >
< property name = "advice" >
< bean class = "com.clf.spring.MethodBeforeInterceptor" />
</ property >
< property name = "mappedName" value = "*" ></ property >
</ bean >
< bean id = "catAfterInterceptor" class = "org.springframework.aop.support.NameMatchMethodPointcutAdvodor" >
< property name = "advice" >
< bean class = "com.clf.spring.MethodAfterInterceptor" />
</ property >
< property name = "mappedName" value = "*" ></ property >
</ bean >
< bean name = "/cat" class = "org.springframework.aop.framework.ProxyFactoryBean" >
< property name = "interceptorNames" >
< list >
< value > catBeforeInterceptor</ value >
< value > catAfterInterceptor</ value >
</ list >
</ property >
< property name = "target" >
< bean class = "com.clf.spring.CatAction" >
< property name = "catService" ref = "catService" ></ property >
</ bean >
</ property >
</ bean >
|
整合Struts 2
Spring整合Struts 2需要struts2-spring-2.011.jar包
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public class CatAction{
private ICatService catService;
private Cat cat;
//setter、getter略
public String list(){
catService.listCats();
return "list";
}
public String add(){
catService.createCat(cat);
return list();
}
}
|
struts.xml配置
除了正常的配置之外,还需要<contstant/>添加名为struts.objectFactory的常量,把值设为spring,表示该Action由Sprin*生。然后把<action/>的class属性改为catAction,Struts2将会到Spring中寻找名为catAction的bean
1
2
3
4
5
6
7
8
9
|
< constant name = " struts.objectFactory" value = "spring" />
< packagenamepackagename = "cat" extends = "struts-default" >
< action name = "*_cat" method = "{1}" class = "catAction" >
< param name = "action" >{1}</ param >
< result >/list.jsp</ result >
< result name = "list" >/list.jsp</ result >
</ action >
</ package >
|
Spring配置
1
2
3
|
< bean id = "catAction" scope = "prototype" class = "com.clf.spring.CatAction" >
< property name = "catService" ref = "catService" ></ property >
</ bean >
|
web.xml配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
< context-param > <!-- Spring配置文件的位置-->
< param-name >contextConfigLocation</ param-name >
< param-value >/WEB-INF/classes/applicationContext.xml</ param-value >
</ context-param >
< listener > <!-- 使用Listener加载Spring配置文件-->
< listener-class >
org.springframework.web.context.ContextLoaderListener
</ listener-class >
</ listener >
< filter >
< filter-name >Struts2</ filter-name >
< filter-class >org.apache.struts2.dispatcher.FilterDispatcher</ filter-class >
</ filter >
< filter-mapping >
< filter-name > Struts2</ filter-name >
< url-pattern >/*</ url-pattern >
</ filter-mapping >
|
总结
以上就是本文关于Spring之WEB模块配置详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。
参考:
原文链接:http://blog.csdn.net/u012152619/article/details/44258343