如何将ViewScoped ManagedBean中的对象传递给另一个?

时间:2015-05-13 21:17:53

标签: jsf primefaces parameter-passing view-scope

我开始使用PrimeFaces 5.2,我的IDE是Eclipse Luna 4.4.2,Java 1.7和JSF 2.1。

我有一个带有 DataTable 的视图,其中一个名称包含两个 CommandButtons ,一个用于编辑,另一个用于删除。按下编辑按钮时,我会显示一个模态对话框,其中包含一个外部xhtml文件,该文件也有自己的 ManagedBean

我想将所选对象从DataTable传递到外部xhtml的 ManagedBean ,以便其字段填充其中的信息。

我的 Excepciones.xhtml 如下所示:

<ui:composition 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"
    template="/WEB-INF/facelets/templates/plantillaPrincipal.xhtml">
    <ui:define name="mainBody">
        <h:form id="form">
            <p:dataTable var="excepcion" value="#{excepcionesView.lazyModel}"
                paginator="true" rows="10" paginatorPosition="bottom"
                paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
                rowsPerPageTemplate="5,10,15" selectionMode="single"
                selection="#{excepcionesView.selectedExcepcion}" id="excepcionTable"
                lazy="true">
                <p:ajax event="rowSelect" listener="#{excepcionesView.onRowSelect}"
                    update=":form:excepcionDetail"
                    oncomplete="PF('excepcionDialog').show()" />
                <p:column headerText="Id" sortBy="#{excepcion.id}">
                    <h:outputText value="#{excepcion.id}" />
                </p:column>
                ....
                <p:column headerText="Acciones">
                    <p:commandButton icon="ui-icon-pencil" action="#{excepcionesView.viewExcepcionEditar}" >
                        <f:setPropertyActionListener value="#{excepcion}"
                                        target="#{excepcionesView.selectedExcepcion}" />
                    </p:commandButton>
                    ...
                </p:column>
            </p:dataTable>
            ...
        </h:form>
    </ui:define>
</ui:composition>

ManagedBean

@ManagedBean(name="excepcionesView")
@ViewScoped
public class ExcepcionesView  implements Serializable{

    private LazyDataModel<Excepcion> lazyModel;

    private Excepcion selectedExcepcion;

    @ManagedProperty("#{excepcionService}")
    private ExcepcionService service;

    @PostConstruct
    public void init() {
        lazyModel = new ExcepcionDataModel(service.createExcepciones(200));
    }

    public void viewExcepcionEditar() {     
        FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("selectedExcepcion", selectedExcepcion);

        Map<String,Object> options = new HashMap<String, Object>();
        options.put("modal", true);
        options.put("draggable", false);
        options.put("resizable", false);
        options.put("contentHeight", 320);

        RequestContext.getCurrentInstance().openDialog("ExcepcionEdicion", options, null);
    } 
     ...
}

如您所见,我调用方法 viewExcepcionEditar 来存储所选行并显示一个对话框,该对话框将加载我的 ExcepcionEdicion.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:p="http://primefaces.org/ui"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html">
<h:head>
        <h:outputStylesheet library="theme" name="css/style.css" />
</h:head>
<h:body>
    <h:form id="productoEditarForm">
            <p:panelGrid id="productoEditarGrid" styleClass="tablaSinBorde" columns="2" >
                <p:outputLabel for="nombreTxt"  value="Nombre: "/>
                <h:inputText id="nombreTxt" value="#{editarExcepcionView.excepcion.nombre}" />
                <p:outputLabel for="ldcTxt" value="Línea de Crédito: "/>
                <h:inputText id="ldcTxt" value="#{editarExcepcionView.excepcion.lineaCredito}"/>
            </p:panelGrid>

            <p:commandButton id="aceptarBtn"    value="Aceptar" />
            <p:commandButton id="cancelarBtn"   value="Cancelar" />
    </h:form>
</h:body>
</html>

它的bean包含:

@ManagedBean(name="editarExcepcionView")
@ViewScoped
public class EditarExcepcionView implements Serializable{
    private String excepcionId;
    private Excepcion excepcion;

    public EditarExcepcionView(){

        System.out.println("hey");
        excepcion = (Excepcion) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("selectedExcepcion");
        System.out.println("excepcion " + excepcion.getNombre());
    }
    ....
}

在它的构造函数中,我尝试读取我放置的参数,但它总是为空。

如何在这些bean之间传递此对象,以便可以在我的模态对话框中读取和显示来自所述对象的信息?

0 个答案:

没有答案