gpt4 book ai didi

jsf - 在 View 之间共享组件 - 如何改进我的设计?

转载 作者:行者123 更新时间:2023-12-02 13:45:05 25 4
gpt4 key购买 nike

我正在开发一个 JSF Web 应用程序,其目的是包装命令行程序。其主要功能之一是能够在用户之间共享 session (例如出于类(class)目的),以便当输入发送到应用程序的实例时,输出会发送到该 session 的每个订阅者。

由于这种设计,Web 应用程序主要由 View 范围的 bean 组成,它将请求命令行应用程序的 Controller 。它还被选择用 URL 片段(例如 mydomain/myapp/#SESSIONID)来标识 session ,以便使用具有相同片段的 URL 的任何人都将共享输入和输出,使用自己的 View 实例-scoped bean 但共享相同的 Controller

为了将结果推送给所有订阅者,我正在使用 Primefaces Push。结果主要是必须附加到 web 应用程序终端的文本,但某些命令会导致以编程方式创建 JSF 组件。为了处理这个问题,我只需将这些组件呈现为发送给所有订阅者的字符串。

然后,我意识到,为了处理来自组件(以及每个订阅者)的 ajax 请求,需要将关联的 UIComponent 添加到 UIViewRoot 上下文中(不知道如何为了表达这一点)每个 View 范围 bean。

事实上,我首先尝试将“公共(public)容器”(UIForm)绑定(bind)到 View 作用域 bean 的属性,在其中放置以编程方式创建的组件,但我显然不得不面对鸡/egg问题@BalusC talks about in his blog ,因为该组件会在每个 ajax 请求上再次添加。将 javax.faces.PARTIAL_STATE_SAVING 设置为 false 也没有帮助(我正在使用 MyFaces 2.2.5)

因此,作为某种解决方法,当 Controller 需要创建新组件时,它基本上将组件的 id 添加到推送的数据中(在转换为 Json 的 HashMap 中),并且所有订阅者都会触发(返回)一个remoteCommand到它自己的 View 范围bean的实例,以便从它自己的UIViewRoot更新“公共(public)容器”。

这确实有效,但我不喜欢这种方式!

所以:

  1. 是否可以处理存储在不同 HTTP session 中的 View 范围 bean(具有相同名称)之间的这种共享?我指的是this answer来自 @BalusC...也许可以使用 javax.faces.ViewState - 这可能吗?

  2. 我当前的 View 范围 bean 是否有一个可以使用的“神奇”范围?

  3. 我应该使用完全不同的设计吗?

谢谢!

最佳答案

如果您希望在所有应用程序用户之间共享数据,您可以使用应用程序范围。

如果您仍然想使用 View 范围,您可以将您的 View 范围与另一个应用程序范围连接,如下所示:

ApplicationView appView = BeanUtil.findBean("applicationView", FacesContext.getCurrentInstance());

import javax.faces.context.FacesContext;

公共(public)类 BeanUtil {

@SuppressWarnings("unchecked")
public static <T> T findBean(String beanName, FacesContext context) {
return (T) context.getApplication().evaluateExpressionGet(context,
"#{" + beanName + "}", Object.class);
}

}

关于jsf - 在 View 之间共享组件 - 如何改进我的设计?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com