JSF 2.0 commandButton什么都不做

时间:2012-09-27 19:39:53

标签: jsf facelets

我在实现一个简单的CRUD应用程序时遇到问题,我已经阅读了几乎所有在google,stackoverflow和roseindia中找到的项目,但我的问题仍然存在。我做了这个简单的面孔:

<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>

这是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>

这是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;
}

}

这是web.xml文件:

<?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>

正如您所看到的,没有什么特别之处,但每次按h:commandButton来保存数据时,总是返回到同一页面Create.xhtml而没有任何错误消息,也没有将信息保存在数据库中,更糟糕的是,失去了对样式文件syle.css的引用。

1 个答案:

答案 0 :(得分:2)

经过多次阅读和调查后,我解决了阅读@BalusC information的问题。我从不在我的facelet中使用两个h:form元素,所以我不知道为什么现在正在工作。只是我为Primefaces的p:commandButton和“voila”更改了h:commandButton,everyyhing现在工作正常。