struts.xml配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 --> <constant name="struts.i18n.encoding" value="UTF-8" /> <!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 --> <constant name="struts.serve.static.browserCache" value="false" /> <!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 --> <constant name="struts.configuration.xml.reload" value="true" /> <!-- 开发模式下使用,这样可以打印出更详细的错误信息 --> <constant name="struts.devMode" value="true" /> <constant name="struts.enable.DynamicMethodInvocation" value="false" /> <!-- 默认的视图主题 --> <constant name="struts.ui.theme" value="simple" /> <constant name="struts.objectFactory" value="spring" /> <package name="default" extends="struts-default,json-default,jfreechart-default,spring-default"> <default-action-ref name="index" /> <!-- 定义全局页面输出信息 --> <global-results> <result name="message">/WEB-INF/page/message.jsp</result> </global-results> <global-exception-mappings> <exception-mapping exception="java.lang.Exception" result="error"/> </global-exception-mappings> <!-- struts2在防止表单重复提交的拦截中有2个,分别是:token,tokenSession。tokenSession继承token而来。 通常情况下,使用tokenSession客户端感觉会比较友好。 --> <action name="token" class="loginAction"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="token" /> <!-- 如果重复提交,跳转到error.jsp页面 --> <result name="invalid.token">/WEB-INF/page/error.jsp</result> <result>/WEB-INF/page/message.jsp</result> </action> <action name="tokenSession" class="loginAction"> <interceptor-ref name="defaultStack" /> <interceptor-ref name="tokenSession" /> <!-- 如果重复提交,不会跳转到error.jsp页面 --> <result name="invalid.token">/WEB-INF/page/error.jsp</result> <result>/WEB-INF/page/message.jsp</result> </action> </package> </struts>
applicationContext.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <!-- 添加对Annotation的支持 --> <context:annotation-config /> <!-- 配置数据源 --> <context:property-placeholder location="classpath:database.properties"/> <!-- DataSource --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${dataSource.driverClassName}" /> <property name="jdbcUrl" value="${dataSource.url}" /> <property name="user" value="${dataSource.username}" /> <property name="password" value="${dataSource.password}" /> <!-- 当连接池中的连接用完时,C3P0一次性创建新连接的数目2 --> <property name="acquireIncrement" value="5"></property> <!-- 初始化时创建的连接数,必须在minPoolSize和maxPoolSize之间 --> <property name="initialPoolSize" value="10"></property> <property name="minPoolSize" value="5"></property> <property name="maxPoolSize" value="20"></property> <!-- 最大空闲时间,超过空闲时间的连接将被丢弃 [需要注意:mysql默认的连接时长为8小时(28800)【可在my.ini中添加 wait_timeout=30(单位秒)设置连接超时】,这里设置c3p0的超时必须<28800] --> <property name="maxIdleTime" value="300"></property> <!-- 每60秒检查连接池中的空闲连接 --> <property name="idleConnectionTestPeriod" value="60"></property> <!-- jdbc的标准参数 用以控制数据源内加载的PreparedStatement数量,但由于预缓存的Statement属 于单个Connection而不是整个连接 --> <property name="maxStatements" value="20"></property> </bean> <!-- SessionFactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <!--ORM映射文件:mappingResources--> <!-- ORM目录 --> <property name="mappingResources"> <list> <value>cn/itcast/bean/Person.hbm.xml</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.autoReconnect">true</prop> <!-- 数据库方言 --> <prop key="hibernate.dialect">${dataSource.dialect}</prop> <prop key="hibernate.hbm2ddl.auto">${dataSource.auto}</prop> <!-- 控制台是否打印SQL --> <prop key="hibernate.show_sql">${dataSource.show_sql}</prop> <!-- 控制台是否格式化SQL语句显示样式 --> <prop key="hibernate.format_sql">${dataSource.format_sql}</prop> <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> <!-- 是否使用二级缓存 --> <prop key="hibernate.cache.use_second_level_cache">true</prop> <!-- 使用查询缓存 --> <prop key="hibernate.cache.use_query_cache">true</prop> <!-- QueryCacheFactory的实现类 --> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> <prop key="hibernate.cache.use_structured_entries">true</prop> </props> </property> </bean> <!-- TransactionManager --> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> <tx:annotation-driven transaction-manager="txManager"/> <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean"/> <bean id="loginAction" class="cn.itcast.web.PersonManageAction" scope="prototype"/> </beans>
PersonManageAction类
package cn.itcast.web; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import cn.itcast.bean.Person; import cn.itcast.service.PersonService; public class PersonManageAction extends ActionSupport{ /** * @Controller("loginAction") */ private static final long serialVersionUID = -1625398401024059186L; @Resource PersonService personService; private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String execute() throws Exception { HttpServletRequest request = ServletActionContext.getRequest(); personService.save(new Person(getName())); request.setAttribute("message", "添加成功"); return "message"; } }
index.jsp表单页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <!-- 防止表单重复提交,记得在form表单里填上<s:token></s:token> --> <!-- action="token"、action="tokenSession" --> <s:form action="token" method="post"> 名称:<s:textfield name="name" id="name" /><s:token></s:token> <input type="submit" value="发送"> </s:form> <s:form action="tokenSession" method="post"> 名称:<s:textfield name="name" id="name" /><s:token></s:token> <input type="submit" value="发送"> </s:form> </body> </html>
error.jsp表单重复提交提示页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'error.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> <font style="color: red;">您已经提交了表单,请不要重复提交。</font> </body> </html>
这个例子是在“关于struts2.3.1.2_spring3.1.1_hibernate4.1.2整合总结”例子的基础上加的代码。