java - 如何使用 JSF 创建可重用 View

标签 java jsf-2 cdi

场景如下 - 我想创建一个 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/

相关文章:

java.lang.IllegalAccessError : cannot access its superinterface 错误

jsf - Primefaces - 如何以相同的形式在不同的消息组件中显示不同的消息

java - jsf 中的文件保存对话框

jsf-2 - PrimeFaces p :ajax 无法识别 Facelet 标记参数

java - 从文件中读取大(450000+ 个字符)字符串

java - 使用 Java 8 从 "Map<String, Collection<String>>"到 "Map<String, List<String>>"

java - 检测 java.io.FileNotFoundException 的根本原因

jakarta-ee - 从可以在请求外调用的代码中使用 CDI 注入(inject)/检查是否存在 HttpServletRequest 的干净方法?

JSF 2.3 具有泛型的自定义转换器

cdi - Weld CDI 自定义范围中的种子值