JSF 2.0 commandButton do nothing

拈花ヽ惹草 提交于 2019-12-10 22:44:25

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!