entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Menu Dinámico JSF

Buenas noches compañeros, estoy realizando una web en JSF, he abierto otros casos porque voy aprendiendo de vosotros :D

Me ha surgido un problema, tengo este código:

<ui:composition id="content">
        <h:form>
            <nav id="menuWeb">
                <p:dataList value="#{controller.menusSeleccion}" var="ms" pt:data-inset="true" paginator="false">
                    <menu> 
                       <h:link value="#{ms.nombre}" outcome="#{ms.rutaArchivo}" />
                    </menu> 
               </p:dataList>
            </nav>
        </h:form>
    </ui:composition>

Que efectúa una salida para hacer un menú horizontal dinámico cargando los datos desde un controller en la BD. El caso es que quiero como puedo hacer para que, al darle click en una opción del menú, se cargue la vista seleccionada en el body de la web o en un div que indique yo en cuyo caso. Desde JQuery es muy sencillo, pero quiero hacer desde JSF sin llamadas a JQuery.

Había pensado en hacer un h:commandLink y meterle un action, pero para eso, necesitaría recoger el valor del nombre de alguna forma o algo asi, ¿No?

1 Respuesta

2votos

Javi2EE Puntos6630

Buenas Yesod depende mucho de que es lo que quieres que se cargue en el body de la web. En el caso mas general donde cada elemento de menu se corresponda con una página podría resolverse de la siguiente manera;

En el controller

public class Controller{
 //@Getter
 //@Setter
 private String rutaActual;
...
 }

En la vista:

<ui:composition id="content">
      <h:form>
          <nav id="menuWeb">
            <p:dataList value="#{controller.menusSeleccion}" var="ms" pt:data-inset="true" paginator="false">
                    <p:commandLink value="#{ms.nombre}" ajax="true" actionListener="#{controller.setRutaActual(ms.rutaArchivo)} update=":content">
          </p:dataList>
      </nav>
  </h:form>

  <p:outputPanel id="content" >
    <ui:include src="#{controller.rutaActual}" >
  </p:outputPanel>
</ui:composition>

Espero que te ayude, un saludo

1voto

Yesod comentado

Lo hice de la siguiente manera:

---------Layout.xhtml--------

<!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:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
        xmlns:p="http://primefaces.org/ui">
    <!--xmlns:sec="http://www.springframework.org/security/facelets/tags">-->

    <!--<f:loadBundle basename="es.cne.sicbios.layout" var="layoutmsg" />-->

    <h:head>
        <link type="text/css" rel="stylesheet" href="css/estilos.css" />
        <link type="text/css" rel="stylesheet" href="css/common-style.css" />
            <!--<link rel="shortcut icon" type="image/x-icon" href="#{request.contextPath}/img/favicon.ico"/>-->
            <meta content="IE=Edge, IE=9,chrome=1" />
            <meta content='text/html; charset=UTF-8' http-equiv="Content-Type" />
            <title>#{layoutmsg.title_web}</title>
    </h:head>

    <h:body>
        <ui:debug />
        <p:outputPanel id="marcoPagina" layout="block" styleClass="">
            <p:outputPanel id="header">
                <ui:insert name="header">
                    <ui:include src="/header.xhtml" />
                </ui:insert>
            </p:outputPanel>
            <p:outputPanel id="content">
                <p:outputPanel id="cajaCentral">
                    <!--<sec:ifAnyGranted roles="ROLE_USER">-->
                        <p:outputPanel styleClass="cajaMenu">
                            <ui:insert name="menu">
                                <ui:include src="/menuLayout.xhtml"></ui:include>
                            </ui:insert>
                        </p:outputPanel>
                    <!--</sec:ifAnyGranted>-->
                        <p:outputPanel styleClass="cajaContenido ui-widget">
                            <ui:insert name="content"></ui:insert>
                        </p:outputPanel>
                    <!--<sec:isAnonymous>-->
                        <p:outputPanel styleClass="cajaContenido ui-widget sinMargen">
                            <!--<ui:insert name="content"></ui:insert>-->
                        </p:outputPanel>
                    <!--</sec:isAnonymous>-->
                </p:outputPanel>
                </p:outputPanel>
<!--                <p:outputPanel id="footer">
                    <ui:insert name="footer">
                        <ui:include src="/templates/footer.xhtml" />
                    </ui:insert>
                </p:outputPanel>-->
        </p:outputPanel>
        <p:ajaxStatus
            style="width:64px;height:64px;position:fixed;left:5px;bottom:5px;">
            <f:facet name="start">
                    <p:graphicImage value="/img/loading.gif" />
            </f:facet>
            <f:facet name="prestart">
                    <p:graphicImage value="/img/loading.gif" />
            </f:facet>
            <f:facet name="complete">
                    <h:outputText value="" />
            </f:facet>
        </p:ajaxStatus>
    </h:body>

</html>

-------menuLayout.xhtml--------

<!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://xmlns.jcp.org/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui"
        xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
        xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">
    <!--xmlns:s="http://jboss.com/products/seam/taglib">-->
    <ui:composition id="content">
        <h:form>
            <nav id="menuWeb">
                <p:dataList value="#{controller.menusSeleccion}" var="ms" pt:data-inset="true" paginator="false">
                    <menu>
                        <h:commandLink value="#{ms.nombre}" title="#{ms.nombre}" action="#{ms.rutaArchivo}">
                            <!--<h:outputText value="" />-->
                        </h:commandLink>
                    </menu>
                </p:dataList>
            </nav>
        </h:form>
    </ui:composition>
</html>

------------novedades.xhtml--------------

<ui:composition template="/layout.xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
     xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:p="http://primefaces.org/ui">
     <ui:define name="content">
      <p />  
       <font color="RED">
           Contenido de novedades
       </font>
       <p />
     </ui:define>
</ui:composition>

Me estoy encontrando con un problema, que por alguna razón, al poner en el action del menuLayout.xhtml la ruta absoluta action="novedades.xhtml" me carga la web sin problemas en el id="content", pero a la hora de ponerlo action="#{ms.rutaArchivo}" me da este error: javax.el.MethodNotFoundException: /menuLayout.xhtml @15,109 action="#{ms.rutaArchivo}": Method not found: [email protected]()

Hice un debug, y me recoge bien el dato en el arrayList que tengo para guardar la consulta a la BD.

¿Alguna idea? Gracias por todo :D

2votos

Javi2EE comentado

En el caso de que vallas a utilizar un post para realizar una navegación entre páginas deberías hacerlo así action="#{ms.getRutaArchivo}".JSF no espera recibir una propiedad como valor del atributo action, los action se utilizan para realizar acciones de negocio, además no es apropiado para el seo ni cómodo para el usuario hacer navegación mediante POST.
Deberías usar <h:link outcome="#{ms.getRutaArchivo}" para eso.
Saludos

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta