在Web层集成Struts2与Spring

        最近学习传智播客的巴巴运动网教程,在集成Struts与Spring时,遇到很多麻烦,在此记录,希望对以后遇到同样问题的人有所帮助。教程中集成的是Struts1,我选择的是Struts2。两者还是有所不同的。比如,默认情况下,Struts1的action使用单例模式,容易引起线程安全问题;Struts2使用的是原型模式,不存在线程安全问题;框架使用起来很方便,前提是你得配置好。

      项目框架如下:


      附上源码:

web.xml

beans.xml

struts.xml
    上面的代码应该注意两个地方:

        <constant name="struts.action.extension" value="do" />

     在加了这个配置后,在访问是action的后缀名为.do,如:/xxx/yyy.do

       <constant name="struts.objectFactory" value="spring" />

      指定Struts2中的action由Spring容器创建

JDBC.properites 

persistence.xml 

QueryResult.java 

ProductType.java 

DAO.java 

DaoSupport.java 

ProductTypeService.java 

ProductTypeServiceBean.java

ProductTypeAction.java 

         这里应该注意两点,如果不采用@Resource方式注入bean的话,请参考注释中的代码,重写构造一个bean。使用@Controller注解,Spring将扫描指定的路径获得需要的资源,这里注意如果@Controller使用默认配置,那么struts.xml文件中action的class属性应该与这里的ProductTypeAction.java名字一致。如果这里不使用注解的方式,可以参考注释中的代码,相应的在配置文件struts.xml 中也不需要那么复杂,具体请自己思考减少配置代码。

test.jsp(这里有好多中方法,可以使用el表达式测试,下面使用基本的jsp代码)

在实际测试中遇到很多问题,最主要的就是下面两个:

出现异常:

Cannot locate the chosen ObjectFactory implementation: spring

看到网上说原因是  
没有添加struts2-spring-plugin-XXXX.jar  
但是很多人早就已经添加了struts2-spring-plugin-2.0.11.1.jar包,还是会出现上面的异常,在这里请把这个包复制到
/WebRoot/WEB-INT/lib目录下即可解决。

还有一个最常见的异常就是:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productTypeServiceBean': Injection of persistence fields failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [beans.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Cannot parse persistence unit from class path resource.......

    出现这种错误应该是没有指定Struts2中的factory由Spring容器创建,而你在程序中使用了各种Spring的注解,所以应该仔细检查程序中的配置文件,具体可以参考上面的struts.xml文件。

posted on 2011-08-01 18:33  springside5  阅读(227)  评论(0编辑  收藏  举报