2011-06-02 10 views
14

En JSF2, ¿es posible cambiar el valor de src of ui: incluir dinámicamente utilizando la solicitud Ajax (como por ejemplo PrimeFaces p: commandButton)? Gracias.JSF dynamic incluye el uso de la solicitud Ajax

<h:form>       
    <h:commandLink value="Display 2" action="#{fTRNav.doNav()}"> 
     <f:setPropertyActionListener target="#{fTRNav.pageName}" value="/disp2.xhtml" /> 
    </h:commandLink> 
</h:form> 

<ui:include src="#{fTRNav.pageName}"></ui:include> 

Eso es lo que tengo ahora. ¿Es posible hacerlo Ajax (usando p: commandButton)?

Respuesta

16

Las etiquetas JSTL como proponen d en la otra respuesta no son necesarios y no es muy reutilizable.

Aquí hay un ejemplo básico usando pura JSF (suponiendo que se ejecuta Servlet 3.0/EL 2.2, de lo contrario, de hecho, es necesario utilizar <f:setPropertyActionListener> similares como en su pregunta):

<h:form> 
    <f:ajax render=":include"> 
     <h:commandLink value="page1" action="#{bean.setPage('page1')}" /> 
     <h:commandLink value="page2" action="#{bean.setPage('page2')}" /> 
     <h:commandLink value="page3" action="#{bean.setPage('page3')}" /> 
    </f:ajax> 
</h:form> 

<h:panelGroup id="include"> 
    <ui:include src="#{bean.page}.xhtml" /> 
</h:panelGroup> 

con

private String page; 

@PostConstruct 
public void init() { 
    this.page = "page1"; // Ensure that default is been set. 
} 

// Getter + setter. 
+0

Sí, estoy usando servlet 3.0, pero no estoy muy seguro sobre la versión de EL (¿cómo puedo saberlo?). Estaba a punto de hacer esta pregunta, porque definitivamente no quería usar JSTL. Y este se ve mejor. Gracias. –

+1

EL 2.2 viene de la mano con Servlet 3.0. Siempre que su web.xml se declare conforme a Servlet 3.0 (y no tiene 'el-api.jar',' el-impl.jar', etc. propietario en su '/ WEB-INF/lib'), Funcionará – BalusC

1

Debe usar la etiqueta <c:if test="condition"> alrededor de la interfaz de usuario: include y luego, cuando se hace clic en el botón ajax, se actualiza el panel que contiene la interfaz de usuario: include.

Ejemplo:

primer lugar, asegúrese de que el taglib núcleo jstl se incluye insertando el siguiente espacio de nombres en el documento:

<html xmlns:c="http://java.sun.com/jsp/jstl/core>"

A continuación, puede utilizar la etiqueta <c:if> de la siguiente :

<c:if test="#{!logBean.loggedIn}"> 
    <ui:include src="loginpage.xhtml" /> 
</c:if> 
<c:if test="#{logBean.loggedIn}"> 
    <ui:include src="home.xhtml" /> 
</c:if> 
+0

¿Eso funciona con la solicitud de AJAX? –

+1

Gracias. En realidad funciona así. –

3

aquí es cómo renderizo el subcontento dinámicamente usando MnagedBean. En primer lugar me conjunto de páginas en el centro (que serán cambiados por menú disparadores) con private String name="/main_pages/mainpage.xhtml", entonces cada submenú vez que se hace clic en el HelloBean restablece "name" y el contenido se actualiza por update=":content" - a continuación, el nuevo nombre se recupera de Bean:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:p="http://primefaces.org/ui"> 




     <h:head> 
      <f:facet name="first"> 
       <meta content='text/html; charset=UTF-8' http-equiv="Content-Type"/> 

      </f:facet> 
     </h:head> 

     <h:body> 

      <p:layout fullPage="true"> 

       <p:layoutUnit position="north" size="150" resizable="true" closable="true" collapsible="true"> 
        <h1>Madeline<br>shop</br></h1> 
       </p:layoutUnit> 

       <p:layoutUnit position="south" size="100" closable="true" collapsible="true"> 
        Zapraszamy do odwiedzania naszego biura! 
       </p:layoutUnit> 

       <p:layoutUnit position="west" size="175" header="Menu" collapsible="true"> 
        <h:form> 
        <p:menu> 
          <f:ajax render=":content"> 
          <p:menuitem value="O naszej agencji" action="#{helloBean.setName('/main_pages/onas.xhtml')}" update=":content" /> 
          <p:menuitem value="Ubezpieczenia pojazdów" action="#{helloBean.setName('/main_pages/ubpoj.xhtml')}" update=":content" /> 
          <p:menuitem value="Ubezpieczenia majątkowe" action="#{helloBean.setName('/main_pages/ubmaj.xhtml')}" update=":content" /> 
          <p:menuitem value="Ubezpieczenia na życie" action="#{helloBean.setName('/main_pages/ubnaz.xhtml')}" update=":content" /> 
          <p:menuitem value="Zapytaj" action="#{helloBean.setName('/main_pages/zapytaj.xhtml')}" update=":content" /> 
          <p:menuitem value="Kontakt" action="#{helloBean.setName('/main_pages/kontakt.xhtml')}" update=":content" /> 
          </f:ajax> 
        </p:menu> 
        </h:form> 
       </p:layoutUnit> 

       <p:layoutUnit position="center"> 

        <br></br><br></br> 
        <p:panel id="content"> 
             <ui:include src="#{helloBean.name}" /> 
        </p:panel>  

       </p:layoutUnit> 

      </p:layout> 

     </h:body> 



</html> 

mi ManagedBean:

/* 
* To change this template, choose Tools | Templates 
* and open the template in the editor. 
*/ 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import java.io.Serializable; 
/** 
* 
* @author root 
*/ 
@ManagedBean 
@RequestScoped 
public class HelloBean implements Serializable { 

    /** 
    * Creates a new instance of HelloBean 
    */ 
    private static final long serialVersionUID = 1L; 

    private String name="/main_pages/mainpage.xhtml"; 

    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
} 
Cuestiones relacionadas