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

4

我的当前环境是 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>

这个想法是提供一个按钮,让用户点击它,就会在另一个浏览器标签页(页面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>

请注意,有一个<f:metadata/>元素专门用于捕获从索引页面发送的参数并将其转发到EntityDetailsMB中的id属性,其中包括以下内容:
public Entity getEntity() {
    return entityById(id);
}

public Long getId() {
    return id;
}

public void setId(Long value) {
    id = value;
}

由于从未调用 setId() 方法,getEntity() 总是返回 null
缺少什么才能使它正常工作?

你尝试过创建一个结果并添加参数以从第一个JSF页面获取数据吗? - Yagami Light
1个回答

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>

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

<f:metadata>
    <f:viewParam name="id" value="#{entityDetailsMB.id}"/>
    <f:viewAction action="#{entityDetailsMB.init}" />
</f:metadata>

使用f:viewAction来初始化您的实体,而不是在getter中执行此操作,因为这是不建议的。请参考:StackOverflow

public void init(){
    entity = entityById(id);
}

另请参阅:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接