以前在缝中有一种自然对话的概念。基本上会话ID可以是自定义的,即。 someAction:100,这可能与一个非常类似的网址相关联。因此网址将是这样的:
http:localhost:8080/some_context/someAction:100
我未能在标准JSF中找到替代方案。你是怎么做到的?
请帮助我,因为我处于绝望的境地。至少让我知道是否有任何文献,或者是否可以通过deltaspike实现。
非常感谢
答案 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() {
}
}