JSF1.2+JPA2.0+Spring3.1整合开发

导入必须的Jar包

JSF1.2的依赖包

${jsf_home}\mojarra-1.2_15-b01-FCS\lib
jsf-api.jar
jsf-impl.jar
额外
jstl.jar

JPA用Hibenrate3.6.0实现的依赖包

${hibernate_home}\hibernate-distribution-3.6.0.Final\hibernate3.jar
${hibernate_home}\hibernate-distribution-3.6.0.Final\lib\required\*
${hibernate_home}\hibernate-distribution-3.6.0.Final\lib\jpa\*
${hibernate_home}\hibernate-distribution-3.6.0.Final\lib\optional\c3p0\* (加入C3P0)
${hibernate_home}\hibernate-distribution-3.6.0.Final\lib\optional\ehcache\* (加入缓存)

slf4j-nop-1.6.1.jar(可选)
backport-util-concurrent.jar (缓存依赖包)


Spring3.1.0的依赖包

${spring_home}\spring-framework-3.1.0.RELEASE\dist\
org.springframework.aop-3.1.0.RELEASE.jar
org.springframework.asm-3.1.0.RELEASE.jar
org.springframework.aspects-3.1.0.RELEASE.jar
org.springframework.beans-3.1.0.RELEASE.jar
org.springframework.context-3.1.0.RELEASE.jar
org.springframework.core-3.1.0.RELEASE.jar
org.springframework.expression-3.1.0.RELEASE.jar
org.springframework.jdbc-3.1.0.RELEASE.jar
org.springframework.orm-3.1.0.RELEASE.jar
org.springframework.test-3.1.0.RELEASE.jar
org.springframework.transaction-3.1.0.RELEASE.jar
org.springframework.web-3.1.0.RELEASE.jar

com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.junit-4.7.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

MySQL驱动
mysql-connector-java-5.1.7-bin.jar

因为开发很简单,就是CRUD...

所以能省略的就尽量省略了。。。

package org.monday.app.domain;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "user_table")
public class User {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	@Column(name = "name")
	private String name;

	@Column(name = "phone")
	private String phone;

	@Temporal(TemporalType.DATE)
	@Column(name = "birthday")
	private Date birthday;

	//......

}

  

3. Dao实现类

package org.monday.app.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.monday.app.dao.UserDao;
import org.monday.app.domain.User;
import org.springframework.stereotype.Repository;

@Repository(value = "userDao")
public class UserDaoImpl implements UserDao {

	/**
	 * Spring3.1推荐使用原生的EntityManager 
	 * 而JpaDaoSupport和JpaTemplate被标记为过时
	 */
	@PersistenceContext(unitName = "jpa")
	private EntityManager entityManager;

	@Override
	public void save(User user) {
		entityManager.persist(user);
	}

	@Override
	public void update(User user) {
		entityManager.merge(user);
	}

	@Override
	public void delete(Integer id) {
		entityManager.remove(findById(id));
	}

	@Override
	public User findById(Integer id) {
		return entityManager.find(User.class, id);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<User> findAll() {
		Query query = entityManager.createQuery("from User");
		// 转换为HibernateQuery
		// if (query instanceof org.hibernate.ejb.QueryImpl) {
		// ((org.hibernate.ejb.QueryImpl) query).getHibernateQuery().setCacheable(true);
		// }
		return query.getResultList();
	}

}

3.Service实现类

就到对Dao的简单调用

现在,除了Web层组件,其他的组件都准比完毕。接下来,整合JPA+Spring

在“源文件”的目录下建立一个META-INF文件夹,里面建立一个persistence.xml文件。这个就不解释了。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
	http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

	
	<!-- Spring整合JPA只要指定持久化单元的名称就可以了 -->
	<persistence-unit name="jpa"/>

</persistence>

下面,编写Spring的配置文件.beans.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:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-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">

	<!-- 引入注解扫描器 -->
	<context:annotation-config />

	<!-- 引入属性文件 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	
	<!-- 配置要扫描的包 -->
	<context:component-scan base-package="org.monday.app.dao.impl"/> 
	<context:component-scan base-package="org.monday.app.service.impl"/> 

	<!-- 配置数据源 -->
	<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
		<property name="targetDataSource">
			<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
				<property name="driverClass" value="${jdbc.driverClass}"/>
				<property name="jdbcUrl" value="${jdbc.jdbcUrl}"/>
				<property name="user" value="${jdbc.user}"/>
				<property name="password" value="${jdbc.password}"/>
				<property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
				<property name="minPoolSize" value="${c3p0.minPoolSize}"/>
				<property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
				<property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
			</bean>
		</property>
	</bean>
	
	<!-- 配置EntityManagerFactory -->
	<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="persistenceUnitName" value="jpa" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
				<property name="database" value="MYSQL" /> 
				<property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
				<property name="generateDdl" value="true" />
				<property name="showSql" value="true" />
			</bean>
		</property>
		<property name="jpaProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
				<prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
				<prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
				<!-- 配置二级缓存 -->
				<prop key="hibernate.cache.use_second_level_cache">true</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
			</props>
		</property>
		<!-- 配置要扫描的实体类 -->
		<property name="packagesToScan">
			<list>
				<value>classpath*:org.monday.app.domain.*</value>
			</list>			
		</property>
	</bean>
	
	<!-- 配置事务 -->
	<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"/>
	</bean>
	<tx:annotation-driven transaction-manager="txManager"/>
	
	
</beans>

自此,JPA+Spring 整合完毕。

 下面也是重点JSF+Spring 整合

配置web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">

	<!-- 指定Spring的配置文件 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:beans.xml</param-value>
	</context-param>

	<!-- 注册Spring的WEB监听器 -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- JSF+Spring整合必须的 -->
	<listener>
		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
	</listener>

	<!-- 配置JSF -->
	<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>client</param-value>
	</context-param>
	<context-param>
		<param-name>com.sun.faces.validateXml</param-name>
		<param-value>true</param-value>
	</context-param>

	<servlet>
		<servlet-name>jsf</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>jsf</servlet-name>
		<!-- <url-pattern>/faces/*</url-pattern> -->
		<url-pattern>*.faces</url-pattern>
	</servlet-mapping>

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

  

这样JSF+Spring就配置好了。

但是,还有一个问题,JSF的托管bean(类似于Struts的Action)怎么取得Service组件。

首先,在代码中取得Service组件是这样的。

package org.monday.app.web.action;

import java.util.List;

import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.monday.app.domain.User;
import org.monday.app.service.UserService;

public class ListAction {

	private List<User> list;

	private UserService userService;

	/** 注入Service,不要使用注解注入 */
	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	/** 列表 */
	public List<User> getList() {
		list = userService.getAll();
		return list;
	}

	public void setList(List<User> list) {
		this.list = list;
	}

	/** 删除 */
	public void delete() throws Exception {
		// 取得id参数
		ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
		Integer id = Integer.parseInt(ctx.getRequestParameterMap().get("id"));

		userService.delete(id);
	}
}

  

但是,这样还不够,因为,JSF还不知道Sprig容器管理的Service组件。

所以,还要在JSF的配置文件faces-config.xml中,做点“手脚”。

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd" version="1.2">

	<!-- 整合JSF+Spring -->
	<application>
		<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
	</application>


	<!-- 配置托管Bean -->
	<managed-bean>
		<managed-bean-name>listBean</managed-bean-name>
		<managed-bean-class>org.monday.app.web.action.ListAction</managed-bean-class>
		<managed-bean-scope>request</managed-bean-scope>
		<!-- 注入Service -->
		<managed-property>
			<property-name>userService</property-name>
			<value>#{userService}</value>
		</managed-property>
	</managed-bean>

	<!-- 配置导航规则 -->
</faces-config>

 使用的是setter的设值注入。

 这样就将Service组件注入到托管Bean中了。

终于其他的...可以参考附件


===============================注意===============================

JpaDaoSupport在Spring3.1中过时

@deprecated as of Spring 3.1, in favor of native EntityManager usage
(typically obtained through <code>@PersistenceContext</code>)

JpaTemplate在Spring3.1中过时

@deprecated as of Spring 3.1, in favor of native EntityManager usage
(typically obtained through <code>@PersistenceContext</code>)
Note that this class did not get upgraded to JPA 2.0 and never will.

两者都推荐使用
@PersistenceContext(unitName = "jpa")
private EntityManager entityManager;

但是Hibenrate3.X的却没有过时,而Spring整合Hibenate4.X的时候,却没有了HibernateDaoSupport和HibernateTemplate的支持,却推荐使用SessionFactory,即使用Hibenate原生的API。


呵呵,编辑器真的好了。。。

相关推荐