我在數據表內部有一個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
}
}
}
我的問題是如果這是更好的選擇,或者如果有更好的選擇。
感謝,
拉斐爾·阿豐索
感覺難治閱讀代碼。你能解釋更多嗎? –