Как выполнить действие по GET-запросу с помощью f: viewParam? - PullRequest
8 голосов
/ 13 апреля 2011

В данный момент я пытаюсь отправить идентификатор записи с одной страницы на другую.

Итак, на странице 1 у меня есть что-то вроде этого:

<p:column>
    <h:link value="#{rpb.map['transNum']}" outcome="TInput.xhtml">
        <f:param name="id" value="#{rpb.map['id']}" />
    </h:link>
</p:column>

ина целевой странице (TInput.xhtml) у меня есть что-то вроде этого, чтобы захватить идентификатор:

....
    xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<f:metadata>
    <f:viewParam name="id" value="#{tInputBean.id}"></f:viewParam>
</f:metadata>

<h:head>
....

Теперь, нажав на ссылку, переходит на страницу 2, и страница 2 обрабатывается одним представлением -боб jsf в области видимостиИ из моей отладки это происходит следующим образом:

  1. выполняется метод @PostConstruct
  2. модель обновляется с идентификатором, полученным из viewParam (после запроса appy + проверки)

Чего я хотел бы добиться, так это: после обновления модели, я хотел бы выполнить запрос для этого идентификатора записи, получить его бин и список деталей от BusinessСлужба.

Интересно, куда я мог бы поместить свой код запроса:

  1. внутри метода @PostConstruct невозможно, поскольку для идентификатора, полученного из viewParam, задано значениемодель после метод @PostConstruct завершает
  2. использовать фазовый прослушиватель после обновления модели?
  3. использовать системное событие?хотя я не могу найти подходящий для этого случая

Пожалуйста, просветите меня:)

Ответы [ 2 ]

8 голосов
/ 13 апреля 2011

Добавьте <f:event type="preRenderView"> к <f:metadata>.

<f:metadata>
    <f:viewParam name="id" value="#{tInputBean.id}" />
    <f:event type="preRenderView" listener="#{tInputBean.init}" />
</f:metadata>

с

public void init(ComponentSystemEvent event) throws AbortProcessingException {
    // ...
}

(кстати, в отличие от документации, аргумент и исключение являются необязательными, по крайней мере во всех версиях Mojarra 2.x, которые я использовал)

4 голосов
/ 04 октября 2011

Я использовал решение BalusC. Спасибо;)

Я просто хочу добавить, если вы используете facelet, вам нужно поставить:

 <f:metadata>

на каждой странице, используя шаблон:

mytemplate.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">

<ui:insert name="meta"/>

mypage.xhtml с использованием mytemplate.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">

<ui:composition template="mytemplate">

 <ui:define name="meta">
    <f:metadata>
       <f:viewParam name="id" value="#{tInputBean.id}" />
       <f:event type="preRenderView" listener="#{tInputBean.init}" />
     </f:metadata>
  </ui:define>
...

Решение найдено по адресу: https://forums.oracle.com/forums/thread.jspa?threadID=2145709

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...