SSH配置

struts2.3.16.1,hibernate4.2.10final,spring3.2版本整合在一起的配置,搞了十几年java还贴这玩意有点丢人,但是搭配这几个框架着实让我忙活了一天,主要是hibernate的高版本需要spring4我不知道,这些年都在用mybatis,以前觉得hibernate特别吃内存,现在跑起来性能好像还不错,具体也没有用性能压力工具去测试。

maven pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>ssh</groupId>
	<artifactId>ssh</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>war</packaging>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<org.springframework.version>3.2.6.RELEASE</org.springframework.version>
		<org.hibernate.version>4.2.10.Final</org.hibernate.version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
	</properties>
	
	<!-- 
	<repositories>
		<repository>
			<id>Java.Net</id>
			<url>http://download.java.net/maven/2/</url>
		</repository>

		<repository>
			<id>JBoss repository</id>
			<url>http://repository.jboss.com/maven2/</url>
		</repository>

		<repository>
			<id>maven</id>
			<url>http://repo1.maven.org/maven2/</url>
		</repository>
	</repositories>
  -->
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
				</configuration>
			</plugin>
			<plugin>
				<artifactId>maven-war-plugin</artifactId>
				<version>2.3</version>
				<configuration>
					<warSourceDirectory>WebContent</warSourceDirectory>
					<failOnMissingWebXml>false</failOnMissingWebXml>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>

		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>

		<!-- Commons -->
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.1.1</version>
		</dependency>
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging-api</artifactId>
			<version>1.1</version>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
			<version>3.2</version>
		</dependency>
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.2.2</version>
		</dependency>
		<dependency>
			<groupId>commons-io</groupId>
			<artifactId>commons-io</artifactId>
			<version>2.0.1</version>
		</dependency>

		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>

		<dependency>
			<groupId>commons-pool</groupId>
			<artifactId>commons-pool</artifactId>
			<version>1.5.6</version>
		</dependency>


		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.27</version>
		</dependency>

		<dependency>
			<groupId>cglib</groupId>
			<artifactId>cglib</artifactId>
			<version>2.2.2</version>
		</dependency>

		<dependency>
			<groupId>asm</groupId>
			<artifactId>asm</artifactId>
			<version>3.3.1</version>
		</dependency>

		<dependency>
			<groupId>javax.validation</groupId>
			<artifactId>validation-api</artifactId>
			<version>1.0.0.GA</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-validator</artifactId>
			<version>4.3.1.Final</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>${org.hibernate.version}</version>
		</dependency>

 
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-entitymanager</artifactId>
			<version>${org.hibernate.version}</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-ehcache</artifactId>
			<version>${org.hibernate.version}</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.7.5</version>
		</dependency>

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.5</version>
		</dependency>

		<!-- Struts 2 -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.3.16.1</version>
		</dependency>

		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-spring-plugin</artifactId>
			<version>2.3.16.1</version>
		</dependency>

		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-json-plugin</artifactId>
			<version>2.3.16.1</version>
		</dependency>

		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-convention-plugin</artifactId>
			<version>2.3.16.1</version>
		</dependency>

	</dependencies>
</project>

spring的配置参数文件application-context.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" xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="      
          http://www.springframework.org/schema/beans      
          http://www.springframework.org/schema/beans/spring-beans-3.2.xsd      
          http://www.springframework.org/schema/tx      
          http://www.springframework.org/schema/tx/spring-tx-3.2.xsd     
          http://www.springframework.org/schema/context      
          http://www.springframework.org/schema/context/spring-context-3.2.xsd      
          http://www.springframework.org/schema/aop      
          http://www.springframework.org/schema/aop/spring-aop-3.2.xsd"
	default-autowire="byName">

 	<context:annotation-config />
	<context:property-placeholder location="classpath:jdbc.properties" />

	<aop:aspectj-autoproxy />

	<context:component-scan base-package="com.xx"></context:component-scan>

	<bean id="dataSource" destroy-method="close"
		class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName" value="${jdbc.driverClassName}" />
		<property name="url" value="${jdbc.url}" />
		<property name="username" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="validationQuery" value="select 1"></property>
		<property name="initialSize" value="10"/>
		<!--maxActive: 最大连接数量 0代表无限制-->    
        <property name="maxActive" value="200"/> 
		<!--maxIdle: 最大空闲连接-->    
        <property name="maxIdle" value="200"/>
        <!--minIdle: 最小空闲连接-->    
        <property name="minIdle" value="5"/>
        
        <property name="testWhileIdle" value="true"/>
         <!--maxWait: 超时等待时间以毫秒为单位 1000等于60秒-->  
        <property name="maxWait" value="1000"/> 
	</bean>

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource"></property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<!-- 
				<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</prop>
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<prop key="hibernate.cache.use_structured_entries">true</prop> 
				<prop key="hibernate.cache.provider_configuration_file_resource_path">WEB-INF/classes/ehcache.xml</prop>
				 -->
				<!-- 用到SessionFactory.getCurrentSession()的话必须配置下面的配置参数,另外不要手动session.close()-->
				<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> 
			</props>
		</property>
		<property name="packagesToScan">
			<list>
				<value>com.xx.entity</value>
			</list>
		</property>
	</bean>

	<bean id="transactionManager"
		class="org.springframework.orm.hibernate4.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>
	
	<tx:annotation-driven transaction-manager="transactionManager"/>
	
	<!-- 
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true" propagation="REQUIRED" />
			<tx:method name="find*" read-only="true" propagation="REQUIRED" />
			<tx:method name="query*" read-only="true" propagation="REQUIRED" />
			<tx:method name="list*" read-only="true" propagation="REQUIRED" />
			<tx:method name="isExist*" read-only="true" propagation="REQUIRED" />
			<tx:method name="insert*" propagation="REQUIRED" />
			<tx:method name="update*" propagation="REQUIRED" />
			<tx:method name="create*" propagation="REQUIRED" />
			<tx:method name="del*" propagation="REQUIRED" />
			<tx:method name="save*" propagation="REQUIRED" />
			<tx:method name="*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>

 	<aop:config>
		<aop:pointcut expression="execution(* com.xx.framework.dao..*.*(..))"
			id="bussinessService" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="bussinessService" />
	</aop:config>
	 
	<aop:config>
		<aop:pointcut expression="execution(* com.xx.dao..*.*(..))"
			id="bussinessService1" />
		<aop:advisor advice-ref="txAdvice" pointcut-ref="bussinessService1" />
	</aop:config>
	
	 -->
</beans>

strutsxml ,采用的是零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>
    <constant name="struts.i18n.reload" value="false" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.custom.i18n.resources" value="globalMessages" />
    <constant name="struts.action.extension" value="action,," />

    <!-- 零配置相关 -->
    <constant name="struts.convention.action.disableScanning" value="false"/>
    <constant name="struts.convention.default.parent.package" value="default"/>
    <!-- struts2 零配置返回结果的默认寻找目录 -->
	<constant name="struts.convention.result.path" value="/WEB-INF/views" />
	<!-- struts2 零配置的默认action寻找目录,以下设定为package名称包含actions的才会搜索识别 -->
	<constant name="struts.convention.package.locators" value="actions" /> 
    
	<constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate."/> 	
	
    <package name="default" extends="struts-default,json-default" namespace="/">
    </package>

</struts>

Hibernate4以后spring貌似就不太管它了,需要自己处理事务等等操作,也没有了DaoSupport类支持,自己胡乱写的BaseDAO基础类,有点简单:

package com.xx.framework.dao;

import java.io.Serializable;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
import org.springframework.transaction.annotation.Transactional;

@SuppressWarnings("unchecked")
public class BaseDAO<T> {

	protected final Logger logger = Logger.getLogger(getClass());

	@Resource
	protected SessionFactory sessionFactory;

	/**
	 * 插入实体类的泛型方法
	 * @param pojo 实体类信息
	 * @return 
	 */
	@Transactional
	public Serializable insert(T pojo)  throws HibernateException{
		Session session = null;
		Serializable result = null;
		try {
			session = sessionFactory.getCurrentSession();		
			result = (Serializable) session.save(pojo);
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
			throw new HibernateException(e);
			
		}
		return result;
	}


	/**
	 * 修改实体类
	 * @param pojo
	 * @return
	 */
	@Transactional
	public boolean update(T pojo) {
		Session session = null;
		boolean result = false;
		try {
			session = sessionFactory.getCurrentSession();
			session.update(pojo);
			result = true;
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}
		return result;
	}


	@Transactional
	public boolean delete(T pojo) {
		Session session = null;
		boolean result = false;
		try {
			session = sessionFactory.getCurrentSession();
			session.delete(pojo);
			result = true;
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		} finally {
	
		}
		return result;
	}


	public T findById(Class<?> c,Serializable id) {
		Session session = null;
		T result = null;
		try {
			session = sessionFactory.getCurrentSession();
			result = (T) session.get(c, id);
		} catch (Exception e) {
			logger.error(e.getMessage(), e);	
		}
		return result;
	}

	public List<T> queryForPage(String hql, int pageIndex, int pageSize) {
		List<T> result = null;
		Session session = null;
		try {
			session = sessionFactory.getCurrentSession();
			Query q = session.createQuery(hql);
			q.setFirstResult((pageIndex - 1) * pageSize);
			q.setMaxResults(pageSize);
			result = q.list();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);		
		}
		return result;
	}


	public List<T> queryForPage(String hql,int pageIndex, int pageSize,final Object... objects) {
		List<T> result = null;
		Session session = null;
		try {
			session = sessionFactory.getCurrentSession();
			Query q = session.createQuery(hql);
			for (int i = 0; i < objects.length; i++) {
				q.setParameter(i, objects[i]);
			}
			q.setFirstResult((pageIndex - 1) * pageSize);
			q.setMaxResults(pageSize);
			result = q.list();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);	
		}
		return result;
	}
	
	public int queryRecordCount(String hql,final Object... objects) {
		int result = 0;
		Session session = null;
		try {
			session = sessionFactory.getCurrentSession();
			Query q = session.createQuery(hql);
			
			for (int i = 0; i < objects.length; i++) {
				q.setParameter(i, objects[i]);
			}
			
			result = ((Long)q.list().get(0)).intValue();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);	
		}

		return result;
	}	
	

	public List<T> findByExample(Class<?> c,T t) {
		List<T> result = null;
		Session session = null;
		try {
			session = sessionFactory.getCurrentSession();
			Example example = Example.create(t);
			Criteria criteria = session.createCriteria(c);
			criteria.add(example);
			result = criteria.list();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}

		return result;
	}
	
	
	public List<T> listAll(Class<?> c) {
		List<T> result = null;
		Session session = null;
		try {
			session = sessionFactory.getCurrentSession();
			Criteria criteria = session.createCriteria(c);
			
			result = criteria.list();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}
		return result;
	}	


	public List<Object[]> findBySql(String sql, final Object... objects) {
		List<Object[]> result = null;
		Session session = null;
		try {
			session = sessionFactory.getCurrentSession();
			Query query = session.createSQLQuery(sql);
			for (int i = 0; i < objects.length; i++) {
				query.setParameter(i, objects[i]);
			}
			result = query.list();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}
		return result;
	}


	public List<Object[]> findByHql(String hql, final Object... objects) {
		List<Object[]> list = null;
		Session session = null;
		try {
			session = sessionFactory.getCurrentSession();
			Query query = session.createQuery(hql);
			for (int i = 0; i < objects.length; i++) {
				query.setParameter(i, objects[i]);
			}
			list = query.list();
		} catch (Exception e) {
			logger.error(e.getMessage(), e);
		}

		return list;
	}
}

Struts2公共基础action类

package com.shinowit.framework.action;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;

import com.opensymphony.xwork2.ActionSupport;


public class BaseAction extends ActionSupport implements ServletRequestAware, ServletContextAware, ServletResponseAware{

	private static final long serialVersionUID = -1040212988363452551L;
	protected final Logger logger = Logger.getLogger(getClass());
	
    protected HttpServletRequest request;
    protected ServletContext application;
    protected HttpServletResponse response;
    protected HttpSession session;
	
	
	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
		session = this.request.getSession();
	}

	@Override
	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}

	@Override
	public void setServletContext(ServletContext application) {
		this.application = application;
	}
	
	
}

Struts2 Action代码

package com.shinowit.actions;

import java.util.List;

import javax.annotation.Resource;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.springframework.context.annotation.Scope;

import com.xx.dao.UserDao;
import com.xx.entity.User;
import com.xxframework.action.BaseAction;

@Namespace("/")  
@ParentPackage("default")  
@Scope("prototype") 
public class UserAction extends BaseAction {
	private static final long serialVersionUID = 1L;
	
	@Resource
	private UserDao userDao;
	
	private User user;
	
	private List<User> users;
	
	public String test(){
		user=new User();
		user.setUserName("test");
		userDao.insert(user);
		return "success";
	}

	@Action(value="find",results={@Result(name="success",location="test.jsp"),  
            @Result(name="failure",location="/index.jsp")})
	public String find(){
		user=userDao.findById(user.getUserId());
		return "success";
	}
	
	@Action(value="page",results={@Result(name="success",location="testpage.jsp"),  
            @Result(name="failure",location="/index.jsp")})
	public String listPage(){
		users=userDao.queryForPage("from User",1, 2);
		return "success";
	}
	
	@Action(value="pagejson",results={@Result(type="json",name="success")})
	public String listPageJson(){
		users=userDao.queryForPage("from User",1, 2);
		return "success";
	}
	
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	public List<User> getUsers() {
		return users;
	}

	
	
}

 -------------------------------------------------------------------------------------

因为有JPA对象的延迟加载,所以hibernate的session改成了通过在web.xml里面定义filter去打开和关闭session,注意务必要把hibernate的opensessioninviewfitler写在struts2的filter前面,另外spring的配置参数文件中务必写上<prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext</prop> 才可以实现延迟加载。

猜你喜欢

转载自peihexian.iteye.com/blog/2031593
今日推荐