每当我进行ajax调用时,我的URL参数就会过期。我所做的变通方法是在每个按钮内传递一个参数请求,如
<p:commandLink value="Submit" actionListener="#{mybean.dosomething}">
<f:param name="foo" value="#{mybean.bar}"/>
</p:commandLink>
然而,在某些情况下,我无法执行上述解决方法。例如,当我使用素数面rowEditEvent:时
<p:ajax event="rowEditCancel" listener="#{mybean.onCancel}"/>
当我进行此ajax调用时,param将过期,并在调用#{mybean.onCance}
之前导致错误,因为我正在从URL中的param读取数据表的数据。
那么,当我进行这样的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
始终为空,并且未传递参数,导致错误
将其注册为<f:viewParam>
<f:viewParam name="foo" value="#{mybean.bar}" />
而不是<h:form>
,使用OmniFaces <o:form>
和includeViewParams="true"
(它使用了一个自定义的ViewHandler
实现,该实现自动收集所有视图参数,并将它们附加到用作表单操作URL的getActionURL()
方法的结果中):
<o:form includeViewParams="true">
...
</o:form>
通过这种方式,所有视图参数都包含在表单的操作URL中,因此将以通常的方式作为请求参数结束,而不需要摆弄<f:param>
,也不需要在<p:ajax>
(和<f:ajax>
)内部一无所知。