Управляемое свойство от одного компонента к другому

Может кто-нибудь из вас объяснить мне, почему первый код работает, а другой нет?

Работает:

<h:commandButton value="#{settingsBean.tmp}" action="editverteilerliste">
    <f:setPropertyActionListener target="#{settingsEditVerteilerlisteBean.aktuelleVerteilerliste}" value="#{settingsBean.tmp}" />
</h:commandButton>

Не работает:

<p:commandLink action="editverteilerliste">
    <f:param name="aktuelleVerteilerliste" value="#{settingsBean.tmp}" />
    <h:outputText value="asdf"/>
</p:commandLink>

settingsBean.tmp — это экземпляр Verteilerliste.

Действие editverteilerliste ведет на другую страницу, которая использует settingsEditVerteilerlisteBean:

@ManagedBean
@RequestScoped
public class settingsEditVerteilerlisteBean implements Serializable {

  private Logger logger = Logger.getLogger(settingsEditVerteilerlisteBean.class);

  public settingsEditVerteilerlisteBean() {
  }

  @PostConstruct
  public void init() {
    logger.info("Postconstructor invoked!");
  }

  @ManagedProperty(value = "#{aktuelleVerteilerliste}")
  private Verteilerliste aktuelleVerteilerliste;

  [Getter and Setter...]
}

Вторая страница:

<h:body>
    <ui:composition template="../template/mainlayout.xhtml">
        <ui:define name="content">
            <h3>Verteilerliste <h:outputText value="#{settingsEditVerteilerlisteBean.aktuelleVerteilerliste.name}"/></h3>
        </ui:define>
    </ui:composition>
</h:body>

Я знаю, что мог бы использовать только рабочий, но я хочу понять, почему второй не работает!


person Maximilian Schmidt    schedule 28.01.2014    source источник


Ответы (1)


Второй не работает, потому что ваша привязка управляемого свойства разрешается в null, поскольку, скорее всего, нет элемента для ключа aktuelleVerteilerliste ни в одной из карт с областью действия JSF.

Чтобы второй вариант работал, вам нужно указать JSF просмотреть параметры данного запроса, т. е. изменить на @ManagedProperty(value = "#{param['aktuelleVerteilerliste']}").

Чтобы сделать различие более ясным, <f:setPropertyActionListener> просто приравнивает target объект к value на этапе вызова приложения жизненного цикла JSF, в то время как последний подход просто добавляет определенный параметр к компоненту JSF, который в вашем случае является компонентом команды, и параметры компонента команды могут быть доступны. через объект EL param, который представляет собой карту текущих параметров запроса.


Тем не менее, использование командных ссылок считается плохой практикой. Они используются для вызова некоторой логики на стороне сервера, когда форма отправляется для выполнения какой-либо бизнес-задачи. В вашем случае вы используете их для простой навигации. Для этого вам лучше использовать <h:link> компоненты для создания простых a элементов. Таким образом, если вы прикрепите параметр, вы получите параметр запроса, такой как editverteilerliste?aktuelleVerteilerliste=something, который вы можете получить в представлении через <f:viewParam>. Таким образом, вы получите URL-адреса с закладками и четкую навигацию в своем приложении.

person skuntsel    schedule 28.01.2014
comment
Что касается <f:viewParam>, см. также среди прочего stackoverflow.com/q/6377798 и stackoverflow.com/a/8464636 - person BalusC; 28.01.2014