为什么f:param返回null?

时间:2012-08-14 12:02:26

标签: java jsf richfaces jboss-4.2.x

jsf 1.2,jboss 4.2.3和richfaces 3.3.3

我正在尝试将a的索引发送为a,但它一直返回null:

<ui:repeat id="al11" var="albumslistvalue1" value="#{AlbumDetailBean.getAlbumImagesList()}" varStatus="listimages">
  <h:form>
    <h:commandLink value="proxima" id="next" action="#{AlbumDetailBean.escreveparam()}">
      <f:param name="fotoid" value="#{listimages}" />
    </h:commandLink>
  </h:form>
</ui:repeat>

escreveparam()方法只写入参数:

public void escreveparam(){
    String fotoid = ((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getParameter("fotoid");
    System.out.println("Teste:" + fotoid);
}

为什么它总是为空?

1 个答案:

答案 0 :(得分:1)

您正在使用JSF 1.x,这意味着您正在使用Facelets 1.x(如jsf-facelets.jar文件中所示)。 <ui:repeat>标记位于Facelets 1.x varStatus属性中。它已在Facelets 2.0中引入。

您需要寻找替代方法。例如。 <c:forEach>

<c:forEach value="#{bean.albums}" var="album" varStatus="loop">
  <h:form>
    <h:commandLink id="next" value="proxima" action="#{bean.next}">
      <f:param name="id" value="#{loop.index}" />
    </h:commandLink>
  </h:form>
</c:forEach>

(请注意,您对varStatus对象的初始使用是完全错误的,它不会返回原始索引,而是complete object保存所有迭代状态详细信息,以及其他一个getIndex()方法,你实际上应该使用#{listimages.index}或其他东西 - 提供你正在使用Facelets 2.x)

或只是迭代的Album对象本身的ID

<ui:repeat value="#{bean.albums}" var="album">
  <h:form>
    <h:commandLink id="next" value="proxima" action="#{bean.next}">
      <f:param name="id" value="#{album.id}" />
    </h:commandLink>
  </h:form>
</ui:repeat>

无论哪种方式,只需使用<managed-property>中的faces-config.xml#{param.id}ExternalContext#getRequestParameterMap()来检索它:

public void next() {
    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
    // ...
}

顺便说一下,由于您的环境似乎支持JBoss EL(通过在EL中使用带括号的完整方法名称表示),您也可以将整个Album作为操作方法参数传递

<ui:repeat value="#{bean.albums}" var="album">
  <h:form>
    <h:commandLink id="next" value="proxima" action="#{bean.next(album)}" />
  </h:form>
</ui:repeat>

public void next(Album album) {
    // ...
}