本人以前是学Struts的,最近转投JSF的怀抱.做了一个JSF+Spring+Hibernate的例子,绝对能跑起来.(网上好多都是跑不起来的).想去做这样的一个实例,我相信你已经具备了这些知识了,在此我就不论述这些了 .
我的开发环境是 eclipse3.2+myeclipse5.1(包含hibernate3.1,spring1.2,SUN RI JSF1.1)+sqlserver2005
我在调试这个功能的时候,有两个地方出错.找了很就才解决的.我想很都朋友都遇到过这样的问题.一个就是applicationContext.xml 的数据源的配置问题,我用的是sqlserver2005,请注意它的连接URL. 还有一个很重要的错误就是项目做好了,发布到Tomcat的时候,提示是发布成功了,但TOMCAT就是不能它这个项目启动起来,原因是TOMACAT在启动你的项目的时候,不光加载你的WEB.XML文件,它也会加载你的applicationContext.xml文件的信息,如果的applicationContext.xml文件有错误如DATASOURCE配置错误,就会使tomcat无法启动你的项目.
这些都是血的教训,我想写出来就是不想再见到有人在出现这样的问题.因为这样的过程真的很痛苦的.! 我找错误的那两天真的很痛苦!!!!!!!!!!!!!!!!!!!!!!!
代码如下:
domainObject:
LoginUser.java
package com.demo.hi;
/**
* LoginUser generated by MyEclipse - Hibernate Tools
*/
public class LoginUser implements java.io.Serializable {
// Fields
/**
*
*/
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String password;
// Constructors
/** default constructor */
public LoginUser() {
}
/** full constructor */
public LoginUser(String username, String password) {
this.username = username;
this.password = password;
}
// Property accessors
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return this.username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
}
LoginUser.hbm.xml文件
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.demo.hi.LoginUser" table="login_user" schema="dbo" catalog="mydata">
<id name="id" type="java.lang.Long">
<column name="id" />
<generator class="increment" />
</id>
<property name="username" type="java.lang.String">
<column name="username" length="10" not-null="true" />
</property>
<property name="password" type="java.lang.String">
<column name="password" length="10" not-null="true" />
</property>
</class>
</hibernate-mapping>
Service.java
package com.demo.hi;
public interface Service {
public void saveUser(LoginUser user);
public void deleteUser(LoginUser user);
public String validate(LoginUser user);
}
ServiceImpl.java
package com.demo.hi;
import java.util.List;
//import java.util.Iterator;
public class ServiceImpl implements Service{
private LoginUserDAO loginUserDAO;
public void deleteUser(LoginUser user) {
// TODO Auto-generated method stub
loginUserDAO.delete(user);
}
public void saveUser(LoginUser user) {
// TODO Auto-generated method stub
loginUserDAO.save(user);
}
/**
* @return the loginUserDAO
*/
public LoginUserDAO getLoginUserDAO() {
return loginUserDAO;
}
/**
* @param loginUserDAO the loginUserDAO to set
*/
public void setLoginUserDAO(LoginUserDAO loginUserDAO) {
this.loginUserDAO=loginUserDAO;
}
public String validate(LoginUser user) {
// TODO Auto-generated method stub
List list=(List)loginUserDAO.findByExample(user);
if(list.size()!=0)return "success";
//Iterator iterator=list.iterator();
//String str = null;
//while(iterator.hasNext()){
//LoginUser loginUser=(LoginUser)iterator.next();
//if(loginUser.getUsername().equals(user.getUsername())&&loginUser.getPassword().equals(user.getPassword())){
// str=new String("success");
//}
//}
//else
//if(str.isEmpty()){
// str= new String("failure");
//}
else
return "failure";
}
}
LoginUserDAO.java
package com.demo.hi;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.springframework.context.ApplicationContext;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
/**
* Data access object (DAO) for domain model class LoginUser.
* @see com.demo.hi.LoginUser
* @author MyEclipse - Hibernate Tools
*/
public class LoginUserDAO extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(LoginUserDAO.class);
//property constants
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
protected void initDao() {
//do nothing
}
public void save(LoginUser transientInstance) {
log.debug("saving LoginUser instance");
try {
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
} catch (RuntimeException re) {
log.error("save failed", re);
throw re;
}
}
public void delete(LoginUser persistentInstance) {
log.debug("deleting LoginUser instance");
try {
getHibernateTemplate().delete(persistentInstance);
log.debug("delete successful");
} catch (RuntimeException re) {
log.error("delete failed", re);
throw re;
}
}
public LoginUser findById( java.lang.Long id) {
log.debug("getting LoginUser instance with id: " + id);
try {
LoginUser instance = (LoginUser) getHibernateTemplate()
.get("com.demo.hi.LoginUser", id);
return instance;
} catch (RuntimeException re) {
log.error("get failed", re);
throw re;
}
}
public List findByExample(LoginUser instance) {
log.debug("finding LoginUser instance by example");
try {
List results = getHibernateTemplate().findByExample(instance);
log.debug("find by example successful, result size: " + results.size());
return results;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}
public List findByProperty(String propertyName, Object value) {
log.debug("finding LoginUser instance with property: " + propertyName
+ ", value: " + value);
try {
String queryString = "from LoginUser as model where model."
+ propertyName + "= ?";
return getHibernateTemplate().find(queryString, value);
} catch (RuntimeException re) {
log.error("find by property name failed", re);
throw re;
}
}
public List findByUsername(Object username) {
return findByProperty(USERNAME, username);
}
public List findByPassword(Object password) {
return findByProperty(PASSWORD, password);
}
public LoginUser merge(LoginUser detachedInstance) {
log.debug("merging LoginUser instance");
try {
LoginUser result = (LoginUser) getHibernateTemplate()
.merge(detachedInstance);
log.debug("merge successful");
return result;
} catch (RuntimeException re) {
log.error("merge failed", re);
throw re;
}
}
public void attachDirty(LoginUser instance) {
log.debug("attaching dirty LoginUser instance");
try {
getHibernateTemplate().saveOrUpdate(instance);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public void attachClean(LoginUser instance) {
log.debug("attaching clean LoginUser instance");
try {
getHibernateTemplate().lock(instance, LockMode.NONE);
log.debug("attach successful");
} catch (RuntimeException re) {
log.error("attach failed", re);
throw re;
}
}
public static LoginUserDAO getFromApplicationContext(ApplicationContext ctx) {
return (LoginUserDAO) ctx.getBean("LoginUserDAO");
}
}
Login.java
package com.demo.hi;
import javax.faces.context.FacesContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.jsf.FacesContextUtils;
public class Login {
private Service service;
private LoginUser user;
/**
*
*/
public Login() {
ApplicationContext ctx=FacesContextUtils.getWebApplicationContext(FacesContext.getCurrentInstance());
service=(Service)ctx.getBean("service");
// TODO Auto-generated constructor stub
}
public String saveUser(){
service.saveUser(user);
return "success";
}
public String validate(){
String str1=service.validate(user);
return str1;
}
/**
* @return the user
*/
public LoginUser getUser() {
return user;
}
/**
* @param user the user to set
*/
public void setUser(LoginUser user) {
this.user = user;
}
}
messages_zh_CN.properties
namePrompt=/u7528/u6237/u540d/uff1a
passwordPrompt=/u5bc6/u7801/uff1a
login_err=/u60a8/u8f93/u5165/u7684/u7528/u6237/u6216/u5bc6/u7801/u6709/u9519/u8bef/uff0c/u8bf7/u91cd/u65b0/u8f93/u5165/uff01
loginHeader=/u6b22/u8fce/u6765/u5230/u5ba2/u6237/u4fe1/u606f/u67e5/u8be2/u7cfb/u7edf/uff01
buttonTitle_enter=/u767b/u5165
buttonTitle_save=/u6ce8/u518c
customer_name=/u59d3/u540d
customer_career=/u804c/u4e1a
customer_link=/u8054/u7cfb/u65b9/u5f0f
customer_edit=/u7f16/u8f91
customer_delete=/u5220/u9664
customer_tianjia=/u6dfb/u52a0/u5ba2/u6237
只要在每个页面上加上<f:loadBundle basename="messages" var="msg"/>就行了
login.jsp
<%@ page language="java" pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<f:loadBundle basename="messages" var="msg"/>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSF 'login.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<f:view>
<h1>
<h:outputText value="#{msg.loginHeader}"/>
</h1>
<h:form id="loginForm">
<h:outputText value="#{msg.namePrompt}"/>
<h:inputText value="#{loginUserBean.username}"/><br>
<h:outputText value="#{msg.passwordPrompt}"/>
<h:inputText value="#{loginUserBean.password}"/><br>
<h:commandButton action="#{login.validate}" value="#{msg.buttonTitle_enter}"/>
<h:commandButton action="#{login.saveUser}" value="#{msg.buttonTitle_save}"/>
</h:form>
</f:view>
</body>
</html>
faces-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN" "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config >
<application>
<message-bundle>messages_zh_CN</message-bundle>
<locale-config>
<default-locale>zh_CN</default-locale>
</locale-config>
<variable-resolver>
org.springframework.web.jsf.DelegatingVariableResolver
</variable-resolver>
</application>
<managed-bean>
<managed-bean-name>customerBean</managed-bean-name>
<managed-bean-class>com.demo.asdb.Customer</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>customerListBean</managed-bean-name>
<managed-bean-class>
com.demo.asdb.Customerlist
</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/customersList.jsp</from-view-id>
<navigation-case>
<from-outcome>editCustomer</from-outcome>
<to-view-id>/updateCustomer.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/updateCustomer.jsp</from-view-id>
<navigation-case>
<from-outcome>listCustomers</from-outcome>
<to-view-id>/customersList.jsp</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<to-view-id>/login.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/login.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/customersList.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/failure.jsp</to-view-id>
</navigation-case></navigation-rule>
<managed-bean>
<managed-bean-name>login</managed-bean-name>
<managed-bean-class>com.demo.hi.Login</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<!-- <managed-property>
<property-name>service</property-name>
<property-class>com.demo.hi.Service</property-class>
<value>#{service}</value>
</managed-property> -->
<managed-property>
<property-name>user</property-name>
<property-class>com.demo.hi.LoginUser</property-class>
<value>#{loginUserBean}</value>
</managed-property>
</managed-bean>
<managed-bean>
<managed-bean-name>loginUserBean</managed-bean-name>
<managed-bean-class>com.demo.hi.LoginUser</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/failure.jsp</from-view-id>
</navigation-rule></faces-config>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>com.microsoft.sqlserver.jdbc.SQLServerDriver</value>
</property>
<property name="url">
<value>jdbc:sqlserver://127.0.0.1:1433;database=mydata</value>
</property>
<property name="username">
<value>sa</value>
</property>
<property name="password">
<value>123</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="mappingResources">
<list>
<value>com/demo/hi/LoginUser.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.SQLServerDialect
</prop>
</props>
</property>
</bean>
<bean id="LoginUserDAO" class="com.demo.hi.LoginUserDAO">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="service" class="com.demo.hi.ServiceImpl" abstract="false"
singleton="true" lazy-init="default" autowire="default"
dependency-check="default">
<property name="loginUserDAO">
<ref bean="LoginUserDAO" />
</property>
</bean>
</beans>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" 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>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<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>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
</web-app>
PS: 我是截取我的DEMO的一个登入模块的JSF+HIBERNATE+SPRING实现.可能有些配置文件或国际化的源文件中有些其他属性,请读者自己删除!
有什么疑问欢迎和我联系! 我将全力解决,Email: davexie1489@163.com