配置struts2.0.6+spring2.0.3+hibernane3备忘
花了2个小时终于配置好struts2.0.6+spring2.0.3+hibernane3,为自己庆祝一下,分享一下经验
一、struts2。
跟webwork配置基本一致,主要是struts2.properties和struts.xml 2个配置文件,我的struts2.properties如下配置:
- struts.tag.altSyntax = true
- struts.devMode = true
- ### These can be used to set the default HTTP and HTTPS ports
- struts.url.http.port = 80
- #webwork.url.https.port = 443
- ### This can be used to set your locale and encoding scheme
- struts.custom.i18n.resources=ApplicationResources
- struts.locale=zh_CN
- struts.i18n.encoding=utf-8
- # uses javax.servlet.context.tempdir by default
- struts.multipart.parser=com.opensymphony.webwork.dispatcher.multipart.PellMultiPartRequest
- #struts.multipart.saveDir=tmp
- struts.multipart.saveDir=/tmp
- struts.multipart.maxSize=512000000
- struts.configuration.xml.reload=true
- struts.objectFactory = spring
struts.xml 就是配置action了,由于设定了struts.objectFactory = spring,因此struts2会自动将action转为spring的bean,struts.xml可以直接配置我们的action路径,在action中我们只需要设置某个service文件的set方法即可调用事务管理bean。
- xml version="1.0" encoding="UTF-8" ?>
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <include file="struts-default.xml" />
- <package name="default" extends="struts-default">
- <default-interceptor-ref name="completeStack" />
- <global-results>
- <result name="login" type="redirect">login!default.actionresult>
- <result name="unauthorized">unauthorized.jspresult>
- global-results>
- <action name="login" class="com.baseframe.action.LoginAction">
- <result name="input">login.jspresult>
- <result name="success">main.jspresult>
- <result name="error">login.jspresult>
- action>
- <action name="logout" class="com.baseframe.action.LogoutAction">
- <result name="success">login.jspresult>
- action>
- package>
- struts>
二、spring2。
添加dist下的3个spring包,因为不知道哪些包是必须的,把lib里的包都加了,去除jakarta-commons/commons-attributes-compiler.jar、j2ee/servlet-api.jar、j2ee/jsp-api.jar,然后建立配置文件,我分了三个文件:
- xml version="1.0" encoding="UTF-8"?>
- "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
- ...
- bean>
- <bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
- ...
- bean>
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource"/>
- <property name="hibernateProperties">
- <ref bean="hibernateProperties"/>
- property>
- <property name="mappingResources">
- <list>
- <value>com/baseframe/model/AppUser.hbm.xmlvalue>
- list>
- property>
- bean>
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"/>
- bean>
- <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager" ref="transactionManager"/>
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIREDprop>
- <prop key="amount*">PROPAGATION_REQUIRED,readOnlyprop>
- <prop key="find*">PROPAGATION_REQUIRED,readOnlyprop>
- props>
- property>
- bean>
- <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <value>*Servicevalue>
- property>
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptorvalue>
- list>
- property>
- bean>
- <bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
- <property name="transactionInterceptor" ref="transactionInterceptor"/>
- bean>
- beans>
- xml version="1.0" encoding="UTF-8"?>
- "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans default-autowire="byName">
- <bean id="userDao" class="com.baseframe.dao.impl.UserDaoImpl"/>
- beans>
- xml version="1.0" encoding="UTF-8"?>
- "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans default-autowire="byName">
- <bean id="userService" class="com.baseframe.service.impl.UserServiceImpl"/>
- beans>
三、web.xml
有一点很重要,struts的filter需要放在最底,不然action接收的中文可能会乱码,不知道是不是这个原因,反正配置了就没有乱码了,加上org.springframework.orm.hibernate3.support.OpenSessionInViewFilter就不用考虑hibernate的lazy问题了:
- <filter>
- <filter-name>encodingFilterfilter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
- <init-param>
- <param-name>encodingparam-name>
- <param-value>UTF-8param-value>
- init-param>
- filter>
- <filter-mapping>
- <filter-name>encodingFilterfilter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
- <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>/*</url-pattern>
</filter-mapping>
- <filter>
- extremetable的filter
- filter>
- <filter-mapping>
- extremetable的filter mapping
- filter-mapping>
- <filter>
- <filter-name>struts2filter-name>
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcherfilter-class>
- filter>
- <filter-mapping>
- <filter-name>struts2filter-name>
- <url-pattern>/*url-pattern>
- filter-mapping>
如有错误,欢迎指正
评论
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/classes/struts.xml"
/>
</plug-in>
那么strtus2提供的struts2-spring-plugin-2.0.8.jar是干嘛用的呢?
我也跟着先做了一个struts2的helloworld列子,启动成功,struts2的架子搭好了,准备把spring2和hibernate3整合到其中,以下是我的一些配置文件:
web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts2test</display-name>
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>Struts2test.root</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>
/WEB-INF/classes/conf/log4j.properties
</param-value>
</context-param>
<!-- 著名 Character Encoding filter -->
<filter>
<filter-name>encodingFilter</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>
</filter>
<!--Hibernate Open Session in View Filter-->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<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>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!-- 让hibernate open session in view的荣光也照耀xfire -->
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<!--Spring ApplicationContext 载入 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.util.Log4jConfigListener
</listener-class>
</listener>
<!-- session超时定义,单位为分钟 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<include file="struts-default.xml" />
<include file="struts/example.xml"/>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/classes/struts.xml"
/>
</plug-in>
</struts>
struts.properties:
struts.devMode = true
struts.enable.DynamicMethodInvocation = false
#struts.objectFactory = spring 这里有个问题,在struts.xml中已经定义了plugin,在这里还需要再定义这个吗?
以上是我的整合spring的配置文件,但是启动tomcat的时候会报如下错误:
log4j:WARN No appenders could be found for logger (org.apache.catalina.startup.TldConfig).
log4j:WARN Please initialize the log4j system properly.
2007-6-18 7:26:43 org.apache.catalina.core.StandardContext start
严重: Error listenerStart
2007-6-18 7:26:43 org.apache.catalina.core.StandardContext start
严重: Context [/struts2test] startup failed due to previous errors
2007-06-18 07:26:43,109 INFO [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/struts2test]] - Shutting down Log4J
2007-6-18 7:26:43 org.apache.catalina.core.StandardContext processTlds
严重: Error reading tld listeners java.lang.NullPointerException
java.lang.NullPointerException
at org.apache.log4j.Category.isEnabledFor(Category.java:757)
at org.apache.commons.logging.impl.Log4JLogger.isTraceEnabled(Log4JLogger.java:327)
at org.apache.catalina.startup.TldConfig.tldScanResourcePaths(TldConfig.java:581)
at org.apache.catalina.startup.TldConfig.execute(TldConfig.java:282)
at org.apache.catalina.core.StandardContext.processTlds(StandardContext.java:4278)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4115)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:904)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:867)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:474)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
at org.apache.catalina.core.StandardService.start(StandardService.java:450)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
2007-6-18 7:26:43 org.apache.coyote.http11.Http11BaseProtocol start
信息: Starting Coyote HTTP/1.1 on http-8080
2007-6-18 7:26:43 org.apache.jk.common.ChannelSocket init
信息: JK: ajp13 listening on /0.0.0.0:8009
2007-6-18 7:26:43 org.apache.jk.server.JkMain start
信息: Jk running ID=0 time=0/31 config=null
2007-6-18 7:26:43 org.apache.catalina.storeconfig.StoreLoader load
信息: Find registry server-registry.xml at classpath resource
2007-6-18 7:26:43 org.apache.catalina.startup.Catalina start
信息: Server startup in 1422 ms
以下是我加入的jar包:
antlr-2.7.6.jar
asm-2.2.1.jar
cglib-nodep-2.1_3.jar
commons-beanutils-1.7.1-20061106.jar
commons-collections-3.2.jar
commons-dbcp-1.2.1.jar
commons-digester-1.7.jar
commons-lang-2.3.jar
commons-logging-1.1.jar
dom4j-1.6.1.jar
freemarker-2.3.8.jar
hibernate-3.2.0.ga.jar
jstl-1.1.2.jar
jta-1.0.1B.jar
jtds-1.2.jar
log4j-1.2.8.jar
ognl-2.6.11.jar
spring-2.0.jar
struts2-core-2.0.6.jar
struts2-spring-plugin-2.0.6.jar
xwork-2.0.1.jar
tomcat包就不列出来了
起初我看到是log4j的错误时,我就把web.xml中的log4j去掉,但是启动还报这个错误,我有点困惑,为何一加入spring之后就会报这个错误,为何去掉了log4j后还会报log4j的错误。
http://www.javaeye.com/topic/73332
private EmployeeService employeeService;
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
这个EmployeeService才是spring的bean
只要你再struts.properties文件中设定了struts.objectFactory = spring,加入struts2-spring-plugin-2.0.6.jar就可以了
是不是加了struts2-spring-plugin-2.0.6.jar之后action会自动被spring托管了?
还是其他方式,楼主能不能给解释一下?
struts.xml文件中增加:
<constant name="objectFactory" value="spring"></constant>
<action name="Login" class="login">
<result name="input">/example/Login.jsp</result>
<result type="redirect-action">Menu</result>
</action>
applicationContext.xml文件如下:
<beans>
<bean id="helloWorld" class="example.HelloWorld"></bean>
<bean id="logon" class="example.Login"></bean>
<bean id="index" class="example.ExampleSupport"></bean>
</beans>
Login.jsp如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Sign On</title>
</head>
<body>
<s:form action="Login">
<s:textfield key="username"/>
<s:password key="password" />
<s:submit/>
</s:form>
</body>
</html>
Login-validation.xml如下:
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>
<field name="username">
<field-validator type="requiredstring">
<message key="requiredstring"/>
</field-validator>
</field>
<field name="password">
<field-validator type="requiredstring">
<message key="requiredstring"/>
</field-validator>
</field>
</validators>
Login.java代码就不写了,因为程序根本就没进这个Action。每次提交时进行验证,然后返回到原拉的Login界面!如果不把action交给spring管理的话就能正确提交,为什么?
这个当时同事就遇到这个问题,我帮着调了一下,没具体使用了。
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>*Service<value>
property>
<property name="interceptorNames">
<list>
<value>transactionInterceptor<value>
<!-- </span> </li> <li class="alt"><span><span class="comments"> 此处增加新的Interceptor </span> </span></li> <li class=""><span><span class="comments"> -->
list>
<property>
<bean>
这里为什么是*Service
而不是*DAO呢???
为什么要spring控制action呢,你在action中写逻辑代码 ?
如果,有机会的话,像你学习啊
其实你可以参考appfuse啊,mvc层可以用struts,webwork,tapestry。
如果将struts2的action交给spring的ioc容器管理,那这个action实例能够获得springioc容器的一切优点,包括使用spring的aop系统,而且我记得在webwork2里,把action交给spring管理性能上更好一点,但struts2.0就不清楚了,毕竟人家用的是xwork2.0
个人认为让spring管理action更好一些 也可以更灵活的处理客户端请求
如果将struts2的action交给spring的ioc容器管理,那这个action实例能够获得springioc容器的一切优点,包括使用spring的aop系统,而且我记得在webwork2里,把action交给spring管理性能上更好一点,但struts2.0就不清楚了,毕竟人家用的是xwork2.0
Spring配置文件添加
<bean id="LoginAction" class="com.baseframe.action.LoginAction"/>
<bean id="LogoutAction" class="com.baseframe.action.LogoutAction"/>
难道spring2.0里默认的bean实例不是单例的吗
更正
WEB.XML添加
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
Spring配置文件添加
<bean id="LoginAction" class="com.baseframe.action.LoginAction"/>
<bean id="LogoutAction" class="com.baseframe.action.LogoutAction"/>
最后struts.xml配置文件改下
<action name="login" class="LoginAction">
<result name="input">login.jspresult>
<result name="success">main.jspresult>
<result name="error">login.jspresult>
action>
<action name="logout" class="LogoutAction">
<result name="success">login.jspresult>
action>
这样容器管理就交给SPRING好了。
gcgan 写道:
- xml version="1.0" encoding="UTF-8" ?>
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <include file="struts-default.xml" />
- <package name="default" extends="struts-default">
- <default-interceptor-ref name="completeStack" />
- <global-results>
- <result name="login" type="redirect">login!default.actionresult>
- <result name="unauthorized">unauthorized.jspresult>
- global-results>
- <action name="login" class="com.baseframe.action.LoginAction">
- <result name="input">login.jspresult>
- <result name="success">main.jspresult>
- <result name="error">login.jspresult>
- action>
- <action name="logout" class="com.baseframe.action.LogoutAction">
- <result name="success">login.jspresult>
- action>
- package>
- struts>
我觉得是不是应该用spring的bean来代替类呢?
spring的bean应该在action中调用,在LoginAction中应该包含类似如下的代码:
private EmployeeService employeeService;
public void setEmployeeService(EmployeeService employeeService) {
this.employeeService = employeeService;
}
这个EmployeeService才是spring的bean
只要你再struts.properties文件中设定了struts.objectFactory = spring,加入struts2-spring-plugin-2.0.6.jar就可以了
- 浏览: 18215 次

- 详细资料
搜索本博客
我的相册
共 5 张
最近加入圈子
最新评论
-
配置struts2.0.6+spring2. ...
为什么用这个? <plug-in className="org.sprin ...
-- by tony.lee -
配置struts2.0.6+spring2. ...
内容是很好的,我刚开始学这个东西,你能不能把你这个应用的目录结构说一下拉!!
-- by kevin_gzhz -
配置struts2.0.6+spring2. ...
你的spring事务配置用的是1.0的配置呀,不是2.0的
-- by cqyaoran -
配置struts2.0.6+spring2. ...
你是否漏了某些包没加进去?
-- by xugq035 -
配置struts2.0.6+spring2. ...
感谢楼主的知识分享! 我也跟着先做了一个struts2的helloworld列 ...
-- by 越前龙马.sh






评论排行榜