如何在Ajax请求中使用@ConversationScoped?

时间:2013-04-25 15:38:33

标签: ajax jsf-2 primefaces cdi conversation-scope

我正在使用JSF2和PrimeFaces,每次我发出Ajax请求并检查当前conversation是否是暂时的,它不是,并且会启动新的会话。

当我禁用Ajax请求时,表单会自动传递cid并恢复对话,但是当这是Ajax请求时,cid不会自动传递。

cid使用Ajax请求时,如何正确传递@ConversationScoped?为什么不自动传递此参数?

1 个答案:

答案 0 :(得分:1)

我不清楚你的用例是什么;但理论上,您可以使用任何给定组件上的<f:attribute/>标记传递参数。

  1. <f:attribute/>标记添加到启动AJAX调用的组件

    <p:commandLink id="aComponent" value="#{bean.val}" action="#{bean.doSomething}">
       <f:attribute name="conversationId" value="#{param['cid']}"/>           
    </p:commandLink>
    
  2. 您可以从辅助bean中的组件参数映射中提取参数:

    FacesContext context = FacesContext.getCurrentInstance();
    UIViewRoot theView = context.getViewRoot();
    UIComponent component = theView.findComponent("aComponent");
    Integer theConversationId =(Integer) component.getAttributes().get("cid");
    
  3. 这里的关键点是该参数在#{param}地图中可用(与任何其他GET参数一样)。它不能通过ajax自动传输的原因只是:GET参数需要传输完整的HTTP请求。 AJAX的重点在于您可以选择要发送到服务器的内容。