2014-01-28 12 views
0

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

Рабочая:

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

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

ответ

1

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

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

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


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

+0

Что касается '' вещь, см. Также среди других http://stackoverflow.com/q/6377798 и http://stackoverflow.com/a/8464636 – BalusC

+0

Большое спасибо !!! –