Struts2.1+Hibernate3.1+Spring2.0组合

对于S2SH的组合,其实注意几点就可以了:

第一: 由于Struts2的Action是有状态,而Spring中的Bean默认为单例模式的,故一定要将Spring中配置Struts2的Action的scope设置为prototype 。而Struts1中的Action是无状态故在SSH时可以不用将Spring设置为prototype!

第二:Struts2与Spring的组合不像Struts1,它需要一个Struts2中一个struts2-spring-plugin-2.1.6.jar也不需要在struts.xml中加入其它的配置,只需将struts.xml中的action的class的值改成action在Spring中配置的Bean的id 就可以了!

简单的例子如下:

(说明这个例子当中包括Struts2大部分的内容,主要是想体验一下Struts2的功能)

数据库如下:uid,ufristName,ulastName,uage四个字段

一,加入Spring的支持

二,加入Hibernate的支持(Hibernate的配置由Spring去管理)

三,加入Struts2的支持

四,加入Struts2对Spring的插件(struts2-spring-plugin-2.1.6.jar)

 

在web.xml中加入对Spring和Struts2的配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 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">

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath*:applicationContext.xml</param-value>
	</context-param>

	<listener>
		<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>

	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>
</web-app>

 UsersDAO的接口如下:

public interface UsersDaoInter {

	public abstract void save(Users transientInstance);

	public abstract void delete(Users persistentInstance);

	public abstract void delete(final int uId);

	public abstract Users findById(java.lang.Integer id);

	public abstract List findByExample(Users instance);

	public abstract List findByProperty(String propertyName, Object value);

	public abstract List findAll();

	public abstract Users merge(Users detachedInstance);

}

 UsersService接口如下:

public interface UsersServiceInter {

	public abstract void save(Users transientInstance);

	public abstract void delete(Users persistentInstance);

	public abstract void delete(final int uId);

	public abstract Users findById(java.lang.Integer id);

	public abstract List findByExample(Users instance);

	public abstract List findByProperty(String propertyName, Object value);

	public abstract List findAll();

	public abstract Users merge(Users detachedInstance);
	/**
	 * 导出用户列表的Excel
	 * @return
	 */
	public abstract InputStream exportUsers();

}

 Spring的applicationContext.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	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-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
		   ">
	<!-- 数据源 -->
	<bean id="MyDataSource"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="com.microsoft.jdbc.sqlserver.SQLServerDriver">
		</property>
		<property name="url"
			value="jdbc:microsoft:sqlserver://localhost:1433">
		</property>
		<property name="username" value="sa"></property>
	</bean>
	<!-- SessionFactory配置 -->
	<bean id="MySessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="MyDataSource"></ref>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.SQLServerDialect
				</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>com/mengya/entity/Users.hbm.xml</value>
			</list>
		</property>
	</bean>
	<!-- 事务管理器 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory">
			<ref bean="MySessionFactory"></ref>
		</property>
	</bean>
	<!-- 定义事务的属性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="delete*" propagation="REQUIRED" />
			<tx:method name="merge*" propagation="REQUIRED" />
			<tx:method name="*" read-only="false" />
		</tx:attributes>
	</tx:advice>
	<!-- 使用Spring的AOP管理Hibernate的Transaction -->
	<aop:config>
		<!-- 定义AOP切面 -->
		<aop:pointcut id="allManagerMethod"
			expression="execution(* com.mengya.service.*.*(..))" />
		<!-- 在AOP切面中配置事务 -->
		<aop:advisor advice-ref="txAdvice"
			pointcut-ref="allManagerMethod" />
	</aop:config>
	
	<!-- 如下是DAO,Service,Action的配置 -->
	
	<bean id="UsersDAO" class="com.mengya.dao.imple.UsersDAO">
		<property name="sessionFactory">
			<ref bean="MySessionFactory"></ref>
		</property>
	</bean>
	
	<bean id="userService" class="com.mengya.service.imple.UsersService">
		<property name="usersdao">
			<ref bean="UsersDAO"></ref>
		</property>
	</bean>
	
	<!-- 对于Struts2与Spring集成时,Strtus2的Action是有状态的故这个的scope必须为prototype,Spring默认的是单例模式 -->
	<bean id="saveUserAction" class="com.mengya.usersAction.SaveUsersAction" scope="prototype">
		<property name="usersService">
			<ref bean="userService"></ref>
		</property>
	</bean>
	
	<bean id="listUserAction" class="com.mengya.usersAction.ListUsersAction" scope="prototype">
		<property name="userService">
			<ref bean="userService"></ref>
		</property>
	</bean>
	
	<bean id="deleteUserAction" class="com.mengya.usersAction.DeleteUsersAction" scope="prototype">
		<property name="usersService">
			<ref bean="userService"></ref>
		</property>
	</bean>
	
	<bean id="updateUserAction" class="com.mengya.usersAction.UpdateUsersAction" scope="prototype">
		<property name="userService">
			<ref bean="userService"></ref>
		</property>
	</bean>
	
	<bean id="exportUsersAction" class="com.mengya.usersAction.ExportUsersAction" scope="prototype">
		<property name="userService">
			<ref bean="userService"></ref>
		</property>
	</bean>
	
</beans>

 struts.xml配置如下:

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
	
	<package name="mengya" extends="struts-default">
		<action name="saveUser" class="saveUserAction">
			<result name="success" type="redirectAction">listUser.action</result>
			<result name="input">/add2.jsp</result>
		</action>
		<action name="listUser" class="listUserAction">
			<result name="success">/userList.jsp</result>		
		</action>
		<action name="deleteUser" class="deleteUserAction">
			<result name="success" type="redirectAction">listUser.action</result>
		</action>
		<action name="getUser" class="updateUserAction" method="getUserById">
			<result name="success">/view.jsp</result>
		</action>
		<action name="updateUser" class="updateUserAction" method="updateUser">
			<result name="success" type="redirectAction">listUser.action</result>
			<result name="input">/view.jsp</result>
		</action>
		<!-- 将用户信息用Excel导出 -->
		<action name="exportUsers" class="exportUsersAction">
			<result name="success" type="stream">
				<param name="contentType">application/vnd.ms-excel</param>
				<!-- 对于第一个参数默认值为inline这样的话若在线打开的话会生成两个xls文件 -->
				<param name="contentDisposition">attachment;filename="allUsers.xls"</param>
				<param name="inputName">downloadFile</param>
			</result>
		</action>
		
	</package>
</struts>

 

jsp页面:用户列表

      <table border="1" align="center" width="60%">
          <tr>
              <td colspan="6" align="center"> <s:text name="UserListInfo"></s:text> </td>
          </tr>
          <tr>
              <td>
                  <s:text name="UId"></s:text>
              </td>
              <td>
                  <s:text name="UFristName"></s:text>
              </td>
              <td>
                  <s:text name="ULastName"></s:text>
              </td>
              <td>
                  <s:text name="UAge"></s:text>
              </td>
              <td>
                  <s:text name="UpdateOperaction"></s:text>
              </td>
              <td>
                  <s:text name="DeleteOperaction"></s:text>
              </td>
          </tr>
          <s:iterator value="#request.listUser" var="user">
              <tr>
                  <td>
                      <s:property value="#user.uid"/>
                  </td>
                  <td>
                      <s:property value="#user.ufristName"/>
                  </td>
                  <td>
                      <s:property value="#user.ulastName"/>
                  </td>
                  <td>
                      <s:property value="#user.uage"/>
                  </td>
                  <td>
                      <s:a href="getUser.action?users.uid=%{#user.uid }">
                          <s:text name="UpdateOperaction"></s:text>
                      </s:a>
                  </td>
                  <td>
                      <s:a href="deleteUser.action?uid=%{#user.uid }">
                          <s:text name="DeleteOperaction"></s:text>
                      </s:a>
                  </td>
              </tr>
          </s:iterator>
      </table>
    <tr/>
    <tr/>
    <tr/>
    <div align="center">
        <s:a href="exportUsers.action">Excel导出</s:a>
    </div>

 用户信息修改页面

<s:form action="updateUser" method="post">
          <s:hidden name="users.uid"></s:hidden>
          <s:textfield name="users.ufristName" key="UFristName"></s:textfield>
          <s:textfield name="users.ulastName" key="ULastName"></s:textfield>
          <s:textfield name="users.uage" key="UAge"></s:textfield>
          <s:submit key="submit"></s:submit>
      </s:form>

由于文件很多,不能全部显示,下面的压缩包是本程序的源码,由于jar很大上传不了,故不包含S2SH的jar包

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值