导航到传递参数的其他视图
Navigate to other view passing a parameter
我目前的环境是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/>
元素,专门用来捕获index页面传来的参数,转发给EntityDetailsMB
中的id
属性,那里有如下:
public Entity getEntity() {
return entityById(id);
}
public Long getId() {
return id;
}
public void setId(Long value) {
id = value;
}
因为永远不会调用 setId()
方法,所以 getEntity()
总是 returns null
.
让它发挥作用还缺少什么?
p:commandButton
执行 POST 请求。您只想 GET 包含实体详细信息的视图,而不是 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 中进行初始化,which is discouraged:
public void init(){
entity = entityById(id);
}
另请参阅:
- Choosing how to pass parameters to a target bean/page using JSF
- When to use f:viewAction / preRenderView versus PostConstruct?
我目前的环境是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/>
元素,专门用来捕获index页面传来的参数,转发给EntityDetailsMB
中的id
属性,那里有如下:
public Entity getEntity() {
return entityById(id);
}
public Long getId() {
return id;
}
public void setId(Long value) {
id = value;
}
因为永远不会调用 setId()
方法,所以 getEntity()
总是 returns null
.
让它发挥作用还缺少什么?
p:commandButton
执行 POST 请求。您只想 GET 包含实体详细信息的视图,而不是 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 中进行初始化,which is discouraged:
public void init(){
entity = entityById(id);
}
另请参阅:
- Choosing how to pass parameters to a target bean/page using JSF
- When to use f:viewAction / preRenderView versus PostConstruct?