2

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);
}

为什么总是为空?

4

1 回答 1

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对象的使用是完全错误的,它不会给您原始索引,而是一个完整的对象,其中包含所有迭代状态详细信息,其中包括一个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>in或 的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) {
    // ...
}
于 2012-08-14T13:21:34.560 回答