类似REST的URL重写与自然对话概念

时间:2015-10-05 15:22:54

标签: jsf jsf-2 url-rewriting deltaspike

以前在缝中有一种自然对话的概念。基本上会话ID可以是自定义的,即。 someAction:100,这可能与一个非常类似的网址相关联。因此网址将是这样的:

http:localhost:8080/some_context/someAction:100

我未能在标准JSF中找到替代方案。你是怎么做到的?

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

非常感谢

1 个答案:

答案 0 :(得分:1)

您可以使用DeltaSpike进行操作 - 只需注入WindowContext并通过activateWindow方法使用/恢复您喜欢的任何window-id。之后,DeltaSpike(@GroupedConversationScoped)提供的会话范围可以在没有任何进一步初始化的情况下使用,如文档中所述。

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

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

dswid=#{dsWindowContext.currentWindowId}

如果您不想使用' dswid',只需使用和提取信息,就像使用任何其他自定义参数一样(或使用像prettyfaces / rewrite这样的lib)。

如果您不使用JSF,则需要自行呈现window-id并确保将其作为request-parameter(与您正在使用的任何其他参数一样)发送回服务器。 / p>

在最终处理请求的代码中,您可以注入任何分组对话范围的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() {
    }
}
相关问题