3
votes

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
Check your code for NoticiaJpaController as I think create method is throwing an exception in the try/catch block and you are returning a null which will redisplay the same page. - Ravi Kadaboina
Ravi, thanks for your fast answer. I put a "e.printStackTrace()" in the catch line, and the result is the same: no message, no error, and no log. I´ll continue testing and if I found a solution I will notify here - José Castillo
Roseindia.net is world's worst site when it comes to "best practices" shown in the code snippets. Be extremely careful when you copy solutions/examples from there. - BalusC

1 Answers

3
votes

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.