以前有过struts2+spring+jpa的经验,这次前端换成jsf,本以为简单的配置下就行了(实际上就是简单的换了下),但是过程却不是那么顺畅。
以下是个简单的demo,默认打开index.jsp,点击其上的链接,进入list.jsp,显示用户列表
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" 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-app_2_5.xsd"> <context-param> <param-name>com.sun.faces.verifyObjects</param-name> <param-value>false</param-value> </context-param> <context-param> <param-name>com.sun.faces.validateXml</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <session-config> <session-timeout> 30 </session-timeout> </session-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
faces-config.xml
<?xml version='1.0' encoding='UTF-8'?> <!-- =========== FULL CONFIGURATION FILE ================================== --> <faces-config version="1.2" 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"> <application> <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver> </application> <managed-bean> <managed-bean-name>userBean</managed-bean-name> <managed-bean-class>demo.UserBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>userService</property-name><!-- 这里的userService是UserBean.java的一个变量 --> <value>#{userService}</value><!-- 这里的userService是spring里注入的bean --> </managed-property> </managed-bean> </faces-config>
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/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- <property name="loadTimeWeaver"> <bean class="org.springframework.instrument.classloading.glassfish.GlassFishLoadTimeWeaver"/> <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> </property> --> <property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> <property name="database" value="ORACLE" /> <property name="showSql" value="yes" /> </bean> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL" /> <property name="username" value="test" /> <property name="password" value="test" /> </bean> <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> <property name="entityManagerFactory" ref="entityManagerFactory" /> </bean> <tx:annotation-driven transaction-manager="transactionManager" /> <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> <!-- faces-config.xml里定义的#{userService}对应这个bean --> <bean id="userService" class="demo.UserServiceImpl"> </bean> </beans>
persistence.xml(通常放在/src/META-INF/下,因为是通过annotation实现实体的映射,且数据库的连接已定义在spring配置文件中,这里不需要其他设置,但此文件不能少)
<persistence 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" version="1.0"> <persistence-unit name="punit"> </persistence-unit> </persistence>
User.java(实体类)
package demo;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
/**
*
* @author lixc
*/
@Entity
@Table(name="USER_TEST")
public class User implements java.io.Serializable {
@Id
private Integer id;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
}
UserService.java
package demo;
import java.util.List;
/**
*
* @author lixc
*/
public interface UserService {
public List<User> findAll();
}
UserServiceImpl(注意下面的注解1、2不能少,具体可参看JPA相关文档)
package demo;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.transaction.annotation.Transactional;
/**
*
* @author lixc
*/
@Transactional //注解1
public class UserServiceImpl implements UserService {
private EntityManager em;
@PersistenceContext //注解2
public void setEntityManager(EntityManager em) {
this.em = em;
}
public EntityManager getEntityManager() {
return this.em;
}
@Override
public List<User> findAll() {
Query query = em.createQuery("select t from User t");
return query.getResultList();
}
}
UserBean.java
package demo;
import java.util.List;
/**
*
* @author lixc
*/
public class UserBean {
private UserService userService;
private List<User> userList;
public List<User> getUserList() {
userList = userService.findAll();
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
jar包主要包含commons*.jar、jsf*.jar、spring*.jar、hibernate*.jar、ejb3-persistence.jar、javassist.jar
回过头来想想,也确实很简单