0

曾经有一个自然对话的概念。基本上对话ID可以是自定义的,即。someAction:100,这可能与会话的 restlike url 相关联。因此网址将类似于:

http:localhost:8080/some_context/someAction:100

我无法在标准 JSF 中找到替代方案。你怎么做呢?

请帮忙,因为我处于绝望的境地。至少让我知道是否有任何文献,或者是否可以通过 deltaspike 实现。

非常感谢

4

1 回答 1

2

您可以使用 DeltaSpike 来完成 - 只需注入 WindowContext 并通过方法 activateWindow 使用/恢复您喜欢的任何窗口 ID。之后,可以使用 DeltaSpike (@GroupedConversationScoped) 提供的对话范围,无需任何进一步的初始化,如文档中所述。

如果您有一个 JSF 应用程序与 DeltaSpike 的 JSF 模块结合使用,它将窗口 ID 呈现为“dswid”,您可以使用以下 Servlet-Filter 为任何基于 Servlet 的技术(如 JAX)恢复和激活相同的窗口-RS,...(不要忘记 Servlet-Filter 的映射)。

使用 JSF 不要忘记将标签添加到您的页面模板(如文档中所述)。如果您需要创建手动链接,您可以通过以下方式获取当前窗口 ID:

dswid=#{dsWindowContext.currentWindowId}

如果您不喜欢使用“dswid”,只需像使用任何其他自定义参数一样使用和提取信息(或使用类似 prettyfaces/rewrite 的库)。

如果您不使用 JSF,则需要自己呈现窗口 ID,并确保将其作为请求参数发送回服务器(与您使用的任何其他参数一样)。

在最终处理请求的代码中,您可以注入任何分组对话范围的 bean(或通过 BeanProvider 进行查找)。

public class WindowIdFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        String windowId = request.getParameter("dswid");

        if (windowId != null) {
            WindowContext windowContext = BeanProvider.getContextualReference(WindowContext.class);
            windowContext.activateWindow(windowId);
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
    }
}
于 2015-10-09T09:05:42.477 回答