导航到传递参数的其他视图

Ale*_*xSC 2 navigation primefaces jsf-2 viewparams

我目前的环境是JRE 1.7,JSF 2.2,Eclipse Luna.在entity_index.xhtml我的应用程序的某个页面()中,我有以下(PrimeFaces)按钮:

<p:commandButton value="Details" action="entity_details"
                 ajax="false" onclick="this.form.target='_blank'">
    <f:param name="id" value="#{entity.id}" />
</p:commandButton>
Run Code Online (Sandbox Code Playgroud)

我们的想法是提供一个按钮,以便用户可以单击它,当前实体的一些细节将显示在另一个浏览器选项卡(页面entity_details.xhtml)中.这是许多的一个按钮,因此entity_index.xhtml页面显示实体的许多实例,每个实例都有一个详细信息按钮.

按钮的工作方式是新选项卡打开并显示正确的页面(entity_details.xhtml),但实体ID永远不会到达处理详细信息页面的bean(EntityDetailsMB).详情页面如下:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
    xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:dsi="http://www.cce.ufpr.br"
    template="/private/template/sbadmin.xhtml">
<f:metadata>
    <f:viewParam name="id" value="#{entityDetailsMB.id}"/>
</f:metadata>

<ui:define name="content">
<h2 class="page-header">#{entityDetailsMB.entity.name}</h2>
<h:form id="form">
...
</ui:composition>
Run Code Online (Sandbox Code Playgroud)

请注意,有一个<f:metadata/>元素专门用于捕获从索引页面发送的参数并将其转发到id属性中EntityDetailsMB,其中包含以下内容:

public Entity getEntity() {
    return entityById(id);
}

public Long getId() {
    return id;
}

public void setId(Long value) {
    id = value;
}
Run Code Online (Sandbox Code Playgroud)

因为setId()从不调用该方法,所以getEntity()总是返回null.

是什么让它失效?

Xtr*_*ica 5

p:commandButton执行POST请求.您只想使用实体详细信息获取视图,而不是POST服务器,因此您需要h:link:

<h:link value="Details" outcome="entity_details" target="_blank">
    <f:param name="id" value="#{entity.id}" />
</h:link>
Run Code Online (Sandbox Code Playgroud)

然后,f:viewParam目标页面中的将能够处理url参数:

<f:metadata>
    <f:viewParam name="id" value="#{entityDetailsMB.id}"/>
    <f:viewAction action="#{entityDetailsMB.init}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)

使用a f:viewAction初始化您的实体而不是在getter中执行它,这是不鼓励的:

public void init(){
    entity = entityById(id);
}
Run Code Online (Sandbox Code Playgroud)

也可以看看: