Передайте параметр через h:link, используя bean-компонент с той же областью просмотра (имеет значение null и, следовательно, не будет добавлен в URL-адрес)

У меня есть один bean-компонент с областью просмотра и я хочу передать параметр между двумя разными страницами, а на первой странице перед этой ссылкой у меня есть <p:selectOneMenu/>, где я выбираю тест, какой идентификатор должен быть передан как параметр GET

<p:selectOneMenu value="#{addQuestion.test}" id="tests"
    converter="#{testConverter}" required="true" requiredMessage="Please, choose test">
    <f:selectItem itemLabel="--Select a test--" itemValue="" />
    <f:selectItems value="#{addQuestion.testList}" var="testItem"
        itemValue="#{testItem}" itemLabel="#{testItem.testName}" />
    <p:ajax process="@this"
        listener="#{addQuestion.getQuestionsBySubject()}"
        update="addingQuestionsTable, testId" />
</p:selectOneMenu>
<h:link value="Add new question" outcome="addQuestion">
    <f:param id="testId" name="testId" value="#{addQuestion.test.testIdentifer.testId}"/>
</h:link>

// на второй странице

<f:metadata>
    <f:viewParam name="testId"
        value="#{addQuestion.test.testIdentifer.testId}"
        converter="#{testConverter}" required="true" requiredMessage="Invalid page access. Please use a link from within the system."/>
</f:metadata>

И фасоль

@ManagedBean(name = "addQuestion")
@ViewScoped
public class AddQuestion implements Serializable {
    private Test test;
    //get
    //set
}

Но когда я пытаюсь получить значение на второй странице, мне нечего получить в выражении #{addQuestion.test.testIdentifer.testId}", а также в режиме разработки я получаю

имеет значение null и, следовательно, не будет добавлен к URL-адресу.

Мой #{testConverter} управляется bean-компонентом в области просмотра.

Как я могу передать testId в одном bean-компоненте с областью просмотра и почему я получаю эту ошибку?


person Ray    schedule 12.12.2012    source источник


Ответы (1)


Теги <f:xxx>, такие как <f:param>, не генерируют никакого HTML, и поэтому им нечего обновлять в дереве HTML DOM по запросу ajax. Компоненты <h:xxx> — это те, которые генерируют HTML и могут быть обновлены в дереве HTML DOM по запросу ajax. Вам нужно обновить компонент <h:link> вместо тега <f:param>. Итак, переместите id с <f:param> на <h:link>.

<h:link id="testId" value="Add new question" outcome="addQuestion">
    <f:param name="testId" value="#{addQuestion.test.testIdentifer.testId}"/>
</h:link>
person BalusC    schedule 12.12.2012
comment
А еще у меня есть вопрос. На первой странице я должен отправить только testId в <f:param/>, потому что я не могу установить валидатор в параметр, но на второй странице значение должно быть установлено как объект в <f:viewParam/> или просто как id? - person Ray; 12.12.2012