问题
I have a problem implementing a simple CRUD application, I have read nearly all the items found in google, stackoverflow and roseindia, but my problem persists. I made this simple facelet:
<ui:composition template="./../../templates/adminTemplate.xhtml">
<ui:define name="tope">
<h1>Ingreso de Noticias</h1>
</ui:define>
<ui:define name="content">
<h:form id="newsForm">
<h:panelGrid columns="2">
<h:outputLabel value="Lugar: "/>
<h:inputText value="#{noticiasBean.entity.lugar}"/>
<h:outputLabel value="Fecha: "/>
<h:inputText value="#{noticiasBean.entity.fecha}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm"/>
</h:inputText>
<h:outputLabel value="Autor: "/>
<h:inputText value="#{noticiasBean.entity.autor}"/>
<h:outputLabel value="PreTítulo: "/>
<h:inputText value="#{noticiasBean.entity.pretitulo}"/>
<h:outputLabel value="Título: "/>
<h:inputText value="#{noticiasBean.entity.titulo}"/>
<h:outputLabel value="Comentario: "/>
<h:inputText value="#{noticiasBean.entity.comentario}"/>
<h:outputLabel value="Cuerpo: "/>
<h:inputTextarea value="#{noticiasBean.entity.cuerpo}"/>
</h:panelGrid>
<h:commandButton value="Guardar" action="#{noticiasBean.create}"/>
</h:form>
<h:messages style="color: red;"/>
</ui:define>
</ui:composition>
Here is the adminTemplate:
<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:p="http://primefaces.org/ui">
<h:head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="./../resources/css/default.css" rel="stylesheet" type="text/css" />
<link href="./../resources/css/cssLayout.css" rel="stylesheet" type="text/css" />
<h:outputStylesheet name="primeStyles.css" library="css"/>
<title>Facelets Template</title>
</h:head>
<h:body>
<p:layout fullPage="true">
<p:layoutUnit position="north" size="70" resizable="true" closable="true" collapsible="true">
<ui:insert name="tope"> Sección de Administración</ui:insert>
</p:layoutUnit>
<p:layoutUnit position="south" size="70">
<ui:insert> Pie de página </ui:insert>
</p:layoutUnit>
<p:layoutUnit position="west" size="160" header="Menu" resizable="true" collapsible="true">
<h:form id="formMenu">
<p:panelMenu style="width: 158px;">
<p:submenu label="Home">
<p:menuitem value="Admin" action="/admin/admin"/>
<p:menuitem value="Salir" action="#{loginController.logout}"/>
</p:submenu>
<p:submenu label="Contenido">
<p:menuitem value="Cargar Noticia" action="/admin/noticias/Create"/>
</p:submenu>
</p:panelMenu>
</h:form>
</p:layoutUnit>
<p:layoutUnit position="center">
<ui:insert name="content">
Aqui va el contenido
</ui:insert>
</p:layoutUnit>
</p:layout>
</h:body>
Here is the managedBean:
@ManagedBean(name="noticiasBean")
@RequestScoped
public class NoticiasBean {
private NoticiaJpaController jpaController = null;
private DataModel items = null;
private Noticia entity;
/**
* Creates a new instance of NoticiasBean
*/
public NoticiasBean() {
System.out.println("Instanciado el bean");
}
private NoticiaJpaController getJpaController() {
if(jpaController == null){
jpaController = new NoticiaJpaController(Utils.getEntityManagerFactory());
}
return jpaController;
}
public Noticia getEntity() {
if(entity == null){
entity = new Noticia();
}
return entity;
}
public String prepareCreate() {
entity = new Noticia();
return "Create";
}
public String create() {
System.out.println("Llegó al método create");
try {
getJpaController().create(entity);
String mensaje = "Noticia creada exitósamente";
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje, mensaje);
FacesContext.getCurrentInstance().addMessage(null, facesMsg);
return prepareCreate();
} catch (Exception e) {
String mensaje = "Error de Persistencia";
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, mensaje, mensaje);
FacesContext.getCurrentInstance().addMessage(null, facesMsg);
return null;
}
}
public String prepareList() {
recreateModel();
return "List";
}
public DataModel getItems() {
if (items == null) {
items = new ListDataModel(getJpaController().findNoticiaEntities());
}
return items;
}
private void recreateModel() {
items = null;
}
}
and here is the web.xml file:
<?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>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<description>Usado para evitar que ingresen sin estar autenticado</description>
<param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESION</param-name>
<param-value>false</param-value>
</context-param>
<error-page>
<exception-type>javax.faces.application.ViewExpiredException</exception-type>
<location>/faces/index.xhtml</location>
</error-page>
<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>/faces/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>faces/index.xhtml</welcome-file>
</welcome-file-list>
As you can see, there´s nothing special, but every time I press the h:commandButton, to save the data, always returns to the same page Create.xhtml without any error messages nor saves the information in the database, and worse, lose the reference to the style file syle.css.
回答1:
After several readings and investigation, i fixed the problem reading this information of @BalusC. I never use two h:form elements in my facelet, so I dont why now is working. Just I changed the h:commandButton for the Primefaces' p:commandButton and "voila", everyyhing works fine now.
来源:https://stackoverflow.com/questions/12628873/jsf-2-0-commandbutton-do-nothing