Почему f:param возвращает значение null?

jsf 1.2, jboss 4.2.3 и ричфейс 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);
}

Почему всегда ноль?


person Community    schedule 14.08.2012    source источник
comment
Я попытался использовать статическое значение для f:param, и это сработало: ‹f:param name=fotoid value=2/> я не понимаю, я использую #{listimages} для идентификатора другого компонента, поэтому они динамичный   -  person    schedule 14.08.2012


Ответы (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

<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) {
    // ...
}
person BalusC    schedule 14.08.2012
comment
Спасибо, я собираюсь использовать идентификатор повторного объекта альбома, но я до сих пор не понимаю, почему eclipse и jboss распознают varStatus даже с использованием jsf 1.x и facelets 1.x, возможно ли использовать facelets 2.x с jsf 1.2? - person ; 14.08.2012
comment
Пожалуйста. Нет, Facelets 2 связан с JSF 2 и не может использоваться отдельно с JSF 1.x. - person BalusC; 14.08.2012