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

标签 jsf primefaces jsf-2.2

我正在开发一个 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/

相关文章:

java - 内容流不显示图像(src ="RES_NOT_FOUND")

jsf-2 - JSF双重提交表单数据

jsf - component.clientId 和 p :component() 生成的客户端 id 之间的差异

eclipse - 当下载用于JSF的Mojarra库时,它在Eclipse中显示错误 "zip file is empty"

在通过 Ajax 更新 JSF 组件后,JavaScript/jQuery 事件监听器不起作用

jsf - f :param in JSF的条件渲染

jsf - 'update'属性可以同时更新两个组件吗?

jsf - p :button example doesn't read the parameter passed as in the example

java - 如何集成 Spring 和 JSF

java - Primefaces SelectCheckboxMenu 空值