在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文件。