场景如下 - 我想创建一个 View ,该 View 可以从许多其他 View 中使用来创建和编辑特定类型的对象。
我的应用程序有一个可以在其他实体之间共享的地址实体。 在维护实体的 View 中,我想要一个按钮/链接,它导航到链接到该实体的地址的地址编辑 View 。 处理不同实体的另一个 View 也需要能够使用其地址导航到地址编辑 View 。 一旦编辑完成,地址 View 将导航回调用 View 。
我的问题是我似乎无法找到将地址实体从第一个 View 传递到地址 View 的方法。
我想我想要某种对话范围,但不知道如何在不知道引用它的页面 bean 的情况下获取地址,但显然我的地址 View 只能知道地址。
我正在使用 JSF2.1 (MyFaces/PrimeFaces) 和 CDI (OpenWebBeans) 和 CODI。
我确定我一定遗漏了一些简单的东西。 (相对于 JSF/CDI 术语来说很简单!)
最佳答案
只需将地址 ID 作为请求参数传递,并让目标 View 通过 <f:viewParam>
在 bean 中转换、验证和设置它.
例如
<h:link value="Edit address" outcome="addresses/edit">
<f:param name="id" value="#{address.id}" />
</h:link>
然后在addresses/edit.xhtml
<f:metadata>
<f:viewParam id="id" name="id" value="#{editAddressBacking.address}"
converter="#{addressConverter}" converterMessage="Bad request. Unknown address."
required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>
<h:message for="id" />
<h:form rendered="#{not empty editAddressBacking.address}">
<h:inputText value="#{editAddressBacking.address.street}" />
...
</h:form>
为了导航回原始页面,您可以传递另一个请求参数。
<h:link value="Edit address" outcome="addresses/edit">
<f:param name="id" value="#{address.id}" />
<f:param name="from" value="#{view.viewId}" />
</h:link>
(其中 #{view}
是引用当前 UIViewRoot
的隐式对象)
并通过 <f:viewParam>
设置同样,您可以在编辑地址支持 bean 的提交方法中返回它:
public String save() {
// ...
return from + "?faces-redirect=true";
}
另见:
关于java - 如何使用 JSF 创建可重用 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8855119/