如何在ajax调用上维护参数?

时间:2013-02-06 17:59:08

标签: jsf primefaces

每当我进行ajax调用时,我的URL参数都会过期。我所做的解决方法是在每个按钮内传递一个param请求,如:

<p:commandLink value="Submit" actionListener="#{mybean.dosomething}">
   <f:param name="foo" value="#{mybean.bar}"/>
</p:commandLink>

但是,在某些情况下,我无法执行上述解决方法。例如,当我使用primefaces rowEditEvent:

<p:ajax event="rowEditCancel" listener="#{mybean.onCancel}"/>

当我在调用#{mybean.onCance}时,当我从URL中的param读取数据表的数据时,param在进行此ajax调用并导致错误时到期。

那么当我进行这样的ajax调用时,如何保持param值呢?

PS:mybean是ViewScoped

问题扩展:

<o:form>解决了部分问题,但现在我无法在表格中发送params以便在表格内部进行动态图像流式传输。请参阅以下内容:

<p:dataTable value="#{mybean.data}" var="var">
    <p:column headerText="Thumbnail">
        <p:graphicImage value="#{streamer.thumbnail}">
            <f:param name="id" value="#{var.id}"/>
        </p:graphicImage>
    </p:column>
</p:dataTable>

Streamer Bean(RequestScoped):

 public StreamedContent getThumbnail() throws IOException {
      FacesContext context = FacesContext.getCurrentInstance();
      if (context.getRenderResponse()) {
          return new DefaultStreamedContent();
      }
      else {
         String string = context.getExternalContext().getRequestParameterMap().get("id");
        Long id = Long.parseLong(idString);
        MyImage img = (MyImage) service.find(MyImage.class, id);//get resource
        StreamedContent sc = new DefaultStreamedContent(img.getInputStream(), "image/jpg", img.getName());
        return sc;
        }
 }

此处string始终为null且未传递参数,从而导致错误

1 个答案:

答案 0 :(得分:4)

将其注册为<f:viewParam>

<f:viewParam name="foo" value="#{mybean.bar}" />

而不是<h:form>,将OmniFaces <o:form>includeViewParams="true"一起使用(它使用自定义ViewHandler自定义getActionURL()实现,自动收集所有视图参数和将它们附加到<o:form includeViewParams="true"> ... </o:form> 方法的结果,该方法用作表单操作URL:

<f:param>

通过这种方式,所有视图参数都包含在表单的操作网址中,因此最终会以通常的方式结束为请求参数,而无需在<p:ajax>内使用<f:ajax>并且在{{1}}内{和} { 1}})。