установить свойство BackingBean из представления (нет события действия с компонентами запроса GET) - PullRequest
1 голос
/ 12 июля 2011

представьте, что BeanA привязан к ViewA.xhtml, а BeanB привязан к ViewB.xhtml.BeanA и BeanB поддерживают компоненты с одним атрибутом на один компонент: "Object obj;"с геттерами и сеттерами.

Теперь я в ViewA и делаю следующее:

<ui:repeat value="#{someOtherBean.listOfObjects}" var="objSelected">
    <h:commandLink value="someValue" action="ViewB"> 
        <f:setPropertyActionListener target="#{beanB.obj}" value="#{objSelected}" />
    </h:commandLink>
</ui:repeat>

Это прекрасно работает!Я перебираю List, и объект, по которому я щелкаю (через commandLink), устанавливается в BeanB.

Проблема: мне нужно работать с GET-запросом, поэтому я использую h: link или h: outputLink (кстати, в чем разница?).Но при этом я не могу использовать компонент f: setPropertyActionListener, потому что запрос GET не запускает событие действия.

Поскольку события не существует, я должен использовать запрос GET, давая идентификаторобъект для BeanB в качестве параметра.Затем BeanB использует dao для получения объекта с указанным идентификатором.Но это sux.Я не хочу использовать Дао.Поэтому мой конкретный вопрос:

Что эквивалентно f: setPropertyActionListener для ссылок на запрос GET?Как я могу установить свойство BackingBean, когда я нажимаю на компонент ah: link или h: outputLink?

Надеюсь, что есть решение, заранее спасибо.

1 Ответ

1 голос
/ 12 июля 2011

Передайте его как параметр запроса.Параметры запроса могут быть только строками, поэтому вам нужно сначала преобразовать его (или, лучше сказать, наименьшую возможную часть, которая однозначно идентифицирует рассматриваемый объект) в строку.

Вот пример, в котором для этого используется идентификатор (базы данных) объекта:

<ui:repeat value="#{someOtherBean.listOfObjects}" var="objSelected">
    <h:link outcome="ViewB"> 
        <f:param name="id" value="#{objSelected.id}" />
    </h:link>
</ui:repeat>

И в BeanB добавить:

@ManagedProperty("#{param.id}")
private Long id;
private SomeObject objSelected;

@PostConstruct
public void init {
    objSelected = objService.find(id);
}

// ...
...