1. 首先利用IDE建立一个Web项目 (IDE为eclipse,项目名称为joindemo)
2. Lib中导入spring,openjpa,jsf2.0,richface及其它必需的jar包;
3. Web项目加入jsf支持
Web.xml
<?xml version="1.0"?>
<web-app
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/javaeehttp://www.java.net/external?url=http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<description>XX应用开发平台</description>
<display-name>joindemo</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name>
<param-value>2</param-value>
</context-param>
<context-param>
<param-name>facelets.DEVELOPMENT</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>
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.enableControlSkinning</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.enableControlSkinningClasses</param-name>
<param-value>false</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.skin</param-name>
<param-value>blueSky</param-value>
</context-param>
<context-param>
<param-name>org.richfaces.push.jms.enabled</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.expressionFactory</param-name>
<param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>
<!--JSF2.0的模式配置,开发模式下会在调试时报更加详细的错误-->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<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>
<session-config>
<session-timeout>300</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<!-- <context-param>
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
-->
</web-app>
4. jsf配置,在WEB-INF下新建faces-config.xml
<?xml version="1.0"?>
<faces-configxmlns="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_2_0.xsd"
version="2.0">
<application>
<message-bundle>common</message-bundle>
<locale-config>
<default-locale>zh_CN</default-locale>
</locale-config>
<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
<!--
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
-->
</application>
</faces-config>
5. openjpa配置,在META-INF下面新建persistence.xml
<?xml version="1.0"encoding="UTF-8"?>
<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="jyt" transaction-type="RESOURCE_LOCAL">
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<properties>
<!--
<propertyname="openjpa.QueryCache" value="true(CacheSize=1000,SoftReferenceSize=100)"/>
<propertyname="openjpa.RemoteCommitProvider" value="sjvm"/>
-->
<property name="openjpa.RuntimeUnenhancedClasses" value="supported"/>
</properties>
</persistence-unit>
</persistence>
6. spring配置,在WEB-INF下新建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:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop"
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.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-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/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<bean id="propertyConfigure"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>/WEB-INF/join.properties</value>
</list>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
</bean>
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
scope="singleton">
<property name="persistenceUnitName"value="jyt" />
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter">
<property name="showSql"value="${jpa.showSql}" /> <!--是否显示SQL -->
<property name="generateDdl"value="${jpa.generateDdl}" /> <!--是否自动生成DDL-->
</bean>
</property>
<property name="loadTimeWeaver">
<bean
class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
scope="singleton">
<property name="entityManagerFactory"ref="entityManagerFactory" />
</bean>
<bean
class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean id="loginservice" class="com.join.user.service.LoginService"/>
</beans>
7. 配置文件,在WEB-INF下新建join.properties
#########################JDBC ##################################
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://127.0.0.1\:3306/join?autoReconnect\=true&failOverReadOnly\=false&useServerPreparedStmts\=true
jdbc.username=root
jdbc.password=root
######################### JPA #################################
jpa.showSql=true
jpa.generateDdl=true
实例:实现了简单的登陆验证:
User.java
package com.join.user.domain;
import java.io.Serializable;
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.TableGenerator;
@Entity
@Table(name = "user")
public class User implements Serializable {
privatestatic final long serialVersionUID = 7208006970679143294L;
private int id;
publicvoid setId(int id) {
this.id= id;
}
privateString username;
privateString password;
publicUser(){}
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
@Column(name= "id")
publicint getId() {
returnid;
}
@Column(name= "username",length=50)
publicString getUsername() {
returnusername;
}
@Column(name= "password",length=50)
publicString getPassword() {
returnpassword;
}
publicvoid setUsername(String username) {
this.username= username;
}
publicvoid setPassword(String password) {
this.password= password;
}
}
loginMBan.java
package com.join.user.mbean;
import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import com.join.user.domain.User;
import com.join.user.service.LoginService;
@ManagedBean(name="loginMBean")
@SessionScoped
public class LoginMBean implements Serializable{
privatestatic final long serialVersionUID = -4256633943098961672L;
@ManagedProperty(value= "#{loginservice}")
privateLoginService loginservice;
privateString userName;
private String userPwd;
public String login(){
//userName="jyt";
//userPwd="jyt";
User user=null;
user=getLoginservice().queryByUsernameAndPwd(userName,userPwd);
if(user.getUsername().equals(userName)&&user.getPassword().equals(userPwd)){
//return "index";
return "Mainframe";
}else{
return null;}
}
publicString getUserName() {
returnuserName;
}
publicvoid setUserName(String userName) {
this.userName= userName;
}
publicString getUserPwd() {
returnuserPwd;
}
publicvoid setUserPwd(String userPwd) {
this.userPwd= userPwd;
}
publicLoginService getLoginservice() {
returnloginservice;
}
publicvoid setLoginservice(LoginService loginservice) {
this.loginservice= loginservice;
}
}
Loginservice.java
package com.join.user.service;
import javax.persistence.EntityManager;
importjavax.persistence.PersistenceContext;
import javax.persistence.Query;
import com.join.user.domain.User;
public class LoginService {
@PersistenceContext
privateEntityManager entityManager;
publicUser queryByUsernameAndPwd(String username,String password){
System.out.println("=="+username+"g"+password);
Stringsql="select entity from User entity where entity.username='"+username+"'" +
"and entity.password= '"+password+"' ";
Queryquery = getEntityManager().createQuery(sql);
Useruser=(User) query.getSingleResult();
returnuser;
}
publicEntityManager getEntityManager() {
returnentityManager;
}
publicvoid setEntityManager(EntityManager entityManager) {
this.entityManager= entityManager;
}
}
Login.xhtml
<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<f:view>
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>5555</title>
</h:head>
<body id="body">
<div class="popup">
<h:form id="loginForm"prependId="false">
<table width="250"height="180" border="0"cellpadding="0" cellspacing="0">
<tr>
<td align="right">
<h:outputText value="用户名"/>
<h:inputText id="userName"value="#{loginMBean.userName}" maxlength="32" tabindex="1"styleClass="input_143_out yonghu" /></td>
</tr>
<tr>
<td align="right">
<h:outputText value="密码"/>
<h:inputText id="userPwd" value="#{loginMBean.userPwd}"/>
</td>
</tr>
<tr>
<td align="center" class="red"></td>
</tr>
<tr>
<td class="text">
<h:commandLink id="login"value="登陆" action="#{loginMBean.login}"tabindex="3">
</h:commandLink>
</td>
</tr>
</table></h:form>
</div>
</body>
</f:view>
</html>
Index.xhhtml
<!DOCTYPE html PUBLIC "-//W3C//DTDXHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<f:view>
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>d</title>
</h:head>
<body id="body">
hello world!
</body>
</f:view>
</html>
数据库join下User表:
访问:http://localhost:8080/joindemo/login.jsf
注意不能用login.xhtml
8. 配置过程中出现的错误
环境搭建过程中所遇到的问题:
1.tomcat在eclipse里面能正常启动,而在浏览器中访问http://localhost:8080/不能访问,且报404错误。同时其他项目页面也不能访问。关闭eclipse里面的tomcat,在tomcat安装目录下双击startup.bat手动启动tomcat服务器。访问htt://localhost:8080/能正常访问tomcat管理页面。
原因:
eclipse将tomcat的项目发布目录(tomcat 目录中的webapp)重定向了,所以你会发现在tomcat安装目录下的webapp目录里面找不到你的项目文件。
解决办法:查看后面的备注3.1
2 The APR based Apache Tomcat Native librarywhich allows optimal performance in production environments
was not found on the java.library.path:D:\Program Files\Java\jdk1.7.0_55\bin;C:…
启动的时候出现的这个信息,不是错误,程序也可以正常的运行,刚开始可能以为是环境变量配置错误,然后重复的去配置环境变量,结果可想而知。Tomcat 可以使用 apr(Apache Portable Runtime) 来提供更好的伸缩性、性能和集成到本地服务器技术.
解决办法:
下载http://tomcat.heanet.ie/native/1.1.1/binaries/win32/tcnative-1.dll将这个文件复制到tomcat的bin目录下面。不管用的话可以放到jdk的bin下面。或者直接放在c 盘system下,也有可能还是解决不了,就不用管了。
3 CONFIGURATIONFAILED! duplicate key: classjavax.faces.validator.RequiredValidator
或类似的xconfig.init()错误等等,这是因为facelets或richfaces 的jar包冲突了,导进去了两次或者tomcat下面本身就有,跟程序里的重复了。
解决办法:
不要重复导jar包或删掉tomcat lib下其他jar包,只保留本身自带的或者换干净的tomcat试试
4 join WARN [main] openjpa.Runtime - An error occurred while registering aClassTransformer with PersistenceUnitInfo: name 'join', root URL[file:/F:/tomcat/webapps/joindemo/WEB-INF/classes/]. The error has beenconsumed. To see it, set your openjpa.Runtime log level to TRACE. Load-timeclass transformation will not be available.
貌似spring里注册不到persistence.xml啥的,但程序能照常运行,就不用管了。
5 java.lang.NullPointerException
报空指针异常,是因为service类没有在applicationcontext里注册,把该类注册到bean里。
备注3.1
重新配置下tomcat服务器:
在eclipse中的server页面,双击tomcat服务,会看到如图所示的配置页面:
可以看到红圈中选择的是 Use workspace metadata(does not modify Tomcat installion)
如果该tomcat中部署了项目的话,这红圈中的选项会灰掉不能修改,要修改必须得先把tomcat中的部署的服务都移除。
如图:
通过右键单击tomcat服务器选择 Add and Remove,在弹出的对话框中移除已部署的项目。移除完确定后,将看到上面的选项面板部分可编辑了。
选择Use tomcat installation(Task control of Tomcat installation) 即选择tomcat的安装目录来作为项目的发布目录。
然后,下来四行,看到"DeployPath"了没?它后面的值默认是"wtpwebapps",把它改成"webapps",也就是tomcat中发布项目所在的文件夹名字。修改后关掉该页面,保存配置。这样就将项目部署到了tomcat安装目录下的webapp,重启tomcat服务器,访问http://localhost:8080则能正常访问了,自己部署的项目也能正常访问了。