Защо f:param връща нула?

jsf 1.2, jboss 4.2.3 и richfaces 3.3.3

Опитвам се да изпратя индекса на a като , но той продължава да връща нула:

<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} на друг id на компоненти, така че те са динамичен   -  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 също, възможно ли е да се използват faceleti 2.x с jsf 1.2? - person ; 14.08.2012
comment
Моля. Не, Facelets 2 е в комплект с JSF 2 и не може да се използва самостоятелно с JSF 1.x. - person BalusC; 14.08.2012