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:
faces-config.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"> <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>
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:
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.<?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>
Mis dudas son las siguientes:
En el web.xml he tenido que insertar este código
Código:
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 <!--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 -->
Código:
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.javax.faces.application.ViewExpiredException: viewId:/accountlist.xhtml - View /login.seam could not be restored.
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:
A continuación, agrego la siguiente regla de navegación en el faces-config.xml:<!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>
Código:
Sin embargo, la página no me redirige a cuentaInsertada.xhtml después de la inserción en la base de datos.<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>
Se os ocurre alguna idea para resolver estas dos dudas?
Un saludo y muchas gracias