Buenas,
estoy siguiendo un tutorial para integrar Hibernate + Spring + JSF en eclipse. Concretamente es el que está posteado por
long nguyen en los comentarios de
http://www.mkyong.com/jsf2/jsf-2-0-spring-hibernate-integration-example
Aquí tenéis el proyecto subido a mediafire:
http://www.mediafire.com/?nj44qt24ol51nld
Os pego además el:
AccountBean.java
Código:
package vn.loga.bean;
import java.io.Serializable;
import java.util.List;
import vn.loga.bo.AccountBO;
import vn.loga.domain.Account;
public class AccountBean implements Serializable{
private AccountBO accountBO;
private String name;
private String pass;
private String email;
public void setAccountBO(AccountBO accountBO) {
this.accountBO = accountBO;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setPass(String pass) {
this.pass = pass;
}
public String getPass() {
return pass;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
// get all customer data from database
public List<Account> getAccountList() {
System.out.println("get aacount list in accountBean");
return accountBO.findAllAccount();
}
// add a new customer data into database
public String addAccount() {
Account acc = new Account();
acc.setName(name);
acc.setPass(pass);
acc.setEmail(email);
accountBO.addNewAccount(acc);
return "";
}
}
web.xml
Código:
<?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">
<display-name>jsf-spring-hibernate-ex1</display-name>
<!-- Add Support for Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<!--Codigo sacado http://seamframework.org/Community/JavaxfacesapplicationViewExpiredException -->
<context-param>
<param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
<param-value>true</param-value>
</context-param>
<!-- fin de codigo de seamframework.org -->
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>faces/account.xhtml</welcome-file>
</welcome-file-list>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
</web-app>
faces-config.xml
Código:
<?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_2_0.xsd"
version="2.0">
<application>
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
</application>
<managed-bean>
<managed-bean-name>accountBean</managed-bean-name>
<managed-bean-class>vn.loga.bean.AccountBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>accountBO</property-name>
<value>#{accountBO}</value>
</managed-property>
</managed-bean>
</faces-config>
accountlist.xhtml
Código:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
>
<h:head>
<h:outputStylesheet library="css" name="table-style.css" />
</h:head>
<h:body>
<h1>Account List</h1>
<h:dataTable value="#{AccountBean.getAccountList()}" var="acc" styleClass="order-table" headerClass="order-table-header" rowClasses="order-table-odd-row,order-table-even-row">
<h:column>
<f:facet name="header">
accountid
</f:facet>
#{acc.id}
</h:column>
<h:column>
<f:facet name="header">
Name
</f:facet>
#{acc.name}
</h:column>
<h:column>
<f:facet name="header">
email
</f:facet>
#{acc.email}
</h:column>
<h:column>
<f:facet name="header">
Created Date
</f:facet>
#{acc.createdDate}
</h:column>
</h:dataTable>
<h2>Add New account</h2>
<h:form>
<h:panelGrid columns="3">
Name :
<h:inputText id="name" value="#{accountBean.name}"
size="20" required="true"
label="Name" >
</h:inputText>
<h:message for="name" style="color:red" />
Email :
<h:inputTextarea id="email" value="#{accountBean.email}"
cols="30" rows="10" required="true"
label="Email" >
</h:inputTextarea>
<h:message for="email" style="color:red" />
</h:panelGrid>
<h:commandButton value="Submit" action="#{accountBean.addAccount()}" />
</h:form>
</h:body>
</html>
El proyecto lo que hace basicamente, mediante el account-list.xhtml, es insertar una fila en la base de datos, mediante Hibernate, con los campos "Name" y "email" que obtiene del formulario.
Mis dudas son las siguientes:
En el web.xml he tenido que insertar este código
Código:
<!--Codigo sacado http://seamframework.org/Community/JavaxfacesapplicationViewExpiredException -->
<context-param>
<param-name>com.sun.faces.enableRestoreView11Compatibility</param-name>
<param-value>true</param-value>
</context-param>
<!-- fin de codigo de seamframework.org -->
Ya que sin él me daba un error al ejecutar la página, después de insertar en la base de datos, al volver a la página (registrar). El error era similar a
Código:
javax.faces.application.ViewExpiredException: viewId:/accountlist.xhtml - View /login.seam could not be restored.
Sabéis que hace exactamente ese código? Al parecer debe ser algún modo de compatibilidad entre JSF 1.1 y JSF 1.2, pero no se exactamente cual es su cometido.
La otra duda, más importante, es a la hora de crear una regla de navegación entre páginas.
Creo la página
cuentaInsertada.xhtml
Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head></h:head>
<body>
<h:outputText value="Nombre: #{accountBean.name} y tu edad es: #{accountBean.email}" />
</body>
</html>
A continuación, agrego la siguiente regla de navegación en el
faces-config.xml:
Código:
<navigation-rule>
<display-name>insertarCuenta</display-name>
<from-view-id>/accountlist.xhtml</from-view-id>
<navigation-case>
<to-view-id>/cuentaInsertada.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
Sin embargo, la página no me redirige a cuentaInsertada.xhtml después de la inserción en la base de datos.
Se os ocurre alguna idea para resolver estas dos dudas?
Un saludo y muchas gracias