2014-05-05 140 views
0

我在數據表內部有一個Primefaces命令鏈接,單擊它時會調用託管Bean(ViewScoped)中的一個方法,該方法將重定向到另一個頁面。在這個命令鏈接中,我打電話填寫將在命運頁面中使用的屬性。但是,在這個命運頁面中,該屬性爲空。使用ViewScoped在頁面之間導航

的導航規則:

<navigation-rule> 
    <display-name>pages/proprietario/index.xhtml</display-name> 
    <!-- Origin page --> 
    <from-view-id>/pages/proprietario/index.xhtml</from-view-id> 
    <navigation-case> 
     <!-- Managed bean method -->    
     <from-action>#{proprietarioMB.doPrepareCadastro}</from-action> 
     <from-outcome>cadastro</from-outcome> 
     <!-- Destiny page --> 
     <to-view-id>/pages/proprietario/cadastro.xhtml</to-view-id> 
    </navigation-case> 
</navigation-rule> 

在原始頁的命令鏈接

<p:dataTable id="tblResultados" 
    value="#{proprietarioMB.proprietarios}" var="proprietario"> 

    <p:commandLink id="lnkEditar" value="#{msg['titulo.visualizar']}" 
     title="#{msg['titulo.visualizar']}" 
     action="#{proprietarioMB.doPrepareCadastro}"> 
      <f:setPropertyActionListener 
      target="#{proprietarioMB.proprietario}" value="#{proprietario}" /> 
    </p:commandLink> 

</p:dataTable> 

管理bean

@ManagedBean 
@ViewScoped 
public class ProprietarioMB extends BaseMB { 

    private List<ProprietarioORM> proprietarios; 
    private ProprietarioORM proprietario; 

    public String doPrepareCadastro() { 
     System.out.println("ProprietarioMB.doOpenDialogoProprietario(): " 
       + this.proprietario); 

     return "cadastro"; 
    } 

} 

命運頁

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<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:p="http://primefaces.org/ui"> 

<ui:composition template="/template/template.xhtml"> 
    <ui:define name="header">#{msg['proprietario.titulo.cadastro']}</ui:define> 
    <ui:define name="content"> 
     <h:form id="formPrincipal"> 
      <br /> 
      <h:outputText value="#{proprietarioMB.proprietario}" /> 
     </h:form> 
    </ui:define> 
</ui:composition> 
</html> 

給我的一個替代方法是在commandLink內部使用,並在命運頁面使用。或多或少如ViewParam vs @ManagedProperty(value = "#{param.id}")所示。這樣一來,代碼被更改如下:

在原始頁

<p:dataTable id="tblResultados" 
    value="#{proprietarioMB.proprietarios}" var="proprietario"> 

    <h:link id="lnkEditar" value="#{msg['titulo.visualizar']}" 
     title="#{msg['titulo.visualizar']}" outcome="contrato" > 
      <f:param name="idProprietario" value="#{proprietario.id}" /> 
    </p:commandLink> 

</p:dataTable> 

命運頁

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE html> 
<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:p="http://primefaces.org/ui"> 

<ui:composition template="/template/template.xhtml"> 
    <f:metadata> 
     <f:viewParam name="idProprietario" value="#{proprietarioMB.idProprietario}" /> 
    </f:metadata> 
    <ui:define name="header">#{msg['proprietario.titulo.cadastro']}</ui:define> 
    <ui:define name="content"> 
     <h:form id="formPrincipal"> 
      <br /> 
      <h:outputText value="#{proprietarioMB.proprietario}" /> 
     </h:form> 
    </ui:define> 
</ui:composition> 
</html> 

命令鏈接的託管Bean

@ManagedBean 
@ViewScoped 
public class ProprietarioMB extends BaseMB { 

    private Long idProprietario; 
    private ProprietarioORM proprietario; 

    public setIdProprietario(Long id) { 
     this.idProprietario = id; 
     if(id != null) { 
      // load proprietario 
     } 
    } 

} 

我的問題是如果這是更好的選擇,或者如果有更好的選擇。

感謝,

拉斐爾·阿豐索

+0

感覺難治閱讀代碼。你能解釋更多嗎? –

回答

0

如果您正在導航從一個視圖範圍的網頁到另一個,你想傳遞一些參數,第二頁,最好的辦法就是使用閃光燈(非的Adobe Flash) 。從頁面傳遞flash中的對象,如下所示。

public String cbCallNewPageClicked() { 

     table.getDataTableBinding().reset(); 
     Flash flash = FacesContext.getCurrentInstance().     
       getExternalContext().getFlash();   
     flash.put("tableBind", table.dataTableBinding);    
     flash.put("tableRow", table.dtos);    
     flash.put("tableName", table.tableName); 
     flash.keep("tableBind"); 
     flash.keep("tableRow"); 
     flash.keep("tableName"); 
    JavascriptContext.addJavascriptCall(FacesContext.getCurrentInstance(), "openWindow('page2.jsf')"); 
    return null; 
} 

在目標豆獲取值閃光燈通過如下圖所示

public void setFlash(ComponentSystemEvent event){ 
     Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); 
     DataTable newBinding = (DataTable) flash.get("tableBind"); 
     List newTblRow = (List) flash.get("tableRow"); 
     String tableHead = (String) flash.get("tableName"); 

}

其中setFlash從上prerenderView事件 稱爲(把下面的行中的facelet調用頁面加載時的setFlash方法)

<f:event listener="#{page2Bean.setFlash}" type="preRenderView" /> 
0

Th您首先描述的方式是使用POST請求進行普通頁面到頁面導航。這是特別勸阻。無論如何,您在代碼中使用冗餘導航規則。由於JSF 2允許您使用隱式導航,因此在您的操作方法中返回cadastro結果將引導您在POST之後指向/pages/proprietario/cadastro.xhtml

第二種方式更好,事實上走的路。用h:link a GET對目標頁面執行請求。這樣可以避免在源bean中執行不必要的代碼,同時還指定要在url中使用的視圖參數,從而使您的導航具有書籤功能和可重用性。

參見: