【问题标题】:Why is the f:param returning null?为什么 f:param 返回 null?
【发布时间】:2012-08-14 12:02:26
【问题描述】:

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

为什么总是null?

【问题讨论】:

  • 我尝试在 f:param 上使用静态值并且它起作用了: 我不明白,我正在使用#{listimages} 在另一个组件 id 上,因此它们是动态的

标签: java jsf richfaces jboss-4.2.x


【解决方案1】:

您使用的是 JSF 1.x,这意味着您使用的是 Facelets 1.x(如 jsf-facelets.jar 文件中所示)。 &lt;ui:repeat&gt; 标签在 Facelets 1.x no varStatus 属性中。在Facelets 2.0中介绍过。

您需要寻找替代方法。例如。 &lt;c:forEach&gt;

<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>

无论哪种方式,只需在faces-config.xml 中使用&lt;managed-property&gt; 并使用#{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) {
    // ...
}

【讨论】:

  • 谢谢,我将使用迭代 Album 对象的 id,但我仍然不明白为什么 eclipse 和 jboss 即使使用 jsf 1.x 和 facelets 1.x 也能识别 varStatus另外,是否可以将 facelets 2.x 与 jsf 1.2 一起使用?
  • 不客气。不,Facelets 2 与 JSF 2 捆绑在一起,不能与 JSF 1.x 独立使用。
猜你喜欢
  • 2022-12-26
  • 1970-01-01
  • 2016-12-28
  • 2015-11-25
  • 2015-07-04
  • 2019-09-29
  • 2015-02-25
  • 2015-10-21
  • 2021-08-12
相关资源
最近更新 更多