JSF — Нулевые значения из параметров — FacesContext

Я пытаюсь получить несколько параметров (сейчас их два, но на другом xhtml, вероятно, мне понадобится больше).

На странице index.html у меня есть ссылка на страницу Threads.xhtml с параметрами user_id и section_id:

<h:dataTable value="#{Sections.sections}" var="Section">
    <h:column>
        <h:form>
            <h:link value="#{Section.section_label}" outcome="Threads">
                <f:param name="user_id" value="#{LoginIn.user_id}"/>
                <f:param name="section_id" value="#{Section.section_id}"/>
            </h:link>
        </h:form>
    </h:column>
</h:dataTable>

Когда я нажимаю на одну из ссылок, она переходит, например:

Project/faces/Threads.xhtml?user_id=5&section_id=2

Так что это хорошо :).

Теперь на странице Threads.xhtml у меня есть ссылка (одна ссылка, а не dataTable, как на index.xhtml - для создания нового раздела), на страницу NewThread.xhtml, с параметрами user_id и section_id:

<h:form>
    <h:link value="#{msg.create_new_thread}" outcome="NewThread">
        <f:param name="user_id" value="#{param.user_id}"/>
        <f:param name="section_id" value="#{param.section_id}"/>
    </h:link>
</h:form>

Когда я нажимаю на одну из ссылок, она переходит, например..:

Project/faces/NewThread.xhtml?user_id=5&section_id=2

Так что тоже приятно :).

Теперь я проверяю на странице NewThread.xhtml значения user_id и section_id следующим образом:

<h:outputText value="User_id: #{param.user_id}"/><br/>
<h:outputText value="Section_id: #{param.section_id}"/><br/>

И я вижу на странице значения:

User_id: 5
Section_id: 2

Так ок :). Но теперь, когда я пытаюсь получить эти значения в Java-коде NewThread.java, они возвращают только null:

FacesContext facesContext = FacesContext.getCurrentInstance();
String user_id = (String) facesContext.getExternalContext().getRequestParameterMap().get("user_id");
String section_id= (String) facesContext.getExternalContext().getRequestParameterMap().get("section_id");
//For test:
System.out.println("User_id: " + user_id);
System.out.println("Section_id: " + section_id);

И в консоли у меня есть:

User_id: null
Section_id: null

Я также пробовал использовать метод toString(), но это не помогло.

Возвращаясь к index.xhtml, когда я нажимаю ссылку на один из разделов, например. второй раздел (любым пользователем, например, user_id=5), он переходит в Threads.xhtml:

Project/faces/Threads.xhtml?user_id=5&section_id=2

И в Threads.xhtml у меня есть список потоков второго раздела (но эта часть кода xhtml не имеет значения):

<h:dataTable value="#{Threads.threads}" var="Thread">
    <h:column>
        <h:link value="#{Thread.thread_label}" outcome="Threads">
            <f:param name="thread_id" value="#{Thread.thread_id}"/>
        </h:link>
    </h:column>
</h:dataTable>

А в Java-коде Threads.java у меня есть:

FacesContext facesContext = FacesContext.getCurrentInstance();
String section_id = (String) facesContext.getExternalContext().getRequestParameterMap().get("section_id");
System.out.println("Section_id: " + section_id);

И в консоли у меня есть:

Section_id: 2

Так ВТФ? Один раз работает, а в другой раз нет.

РЕДАКТИРОВАТЬ:

Извините я забыл. Я получаю доступ к NewThread.java с помощью commandButton в NewThread.xhtml:

<h:commandButton value="#{msg.add_thread}" action="#{NewThread.AddThread}"/>

и он вызывает метод AddThread в NewThread.java; и в попытке (из try-catch) метода AddThread я пытаюсь получить параметры.

Я также уже добавил в Faces-config.xml:

<managed-bean>
    <managed-bean-name>Threads</managed-bean-name>
    <managed-bean-class>forum.Threads</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
<managed-bean>
    <managed-bean-name>NewThread</managed-bean-name>
    <managed-bean-class>forum.NewThread</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

person Namek    schedule 06.01.2013    source источник
comment
Предполагая, что NewThread.java является вспомогательным компонентом, какова область действия?   -  person Elias Dorneles    schedule 06.01.2013


Ответы (2)


Когда вы нажимаете h:commandButton, создается новый запрос. Проблема в том, что в этот запрос не передаются параметры.

Таким образом, если вы хотите, чтобы ваш компонент области запроса NewThread получал данные из параметров запроса, вы также должны включить параметры в запрос, сделанный из h:commandButton. Попробуй это:

<h:commandButton value="#{msg.add_thread}" action="#{NewThread.AddThread}">
    <f:param name="user_id" value="#{param.user_id}"/>
    <f:param name="section_id" value="#{param.section_id}"/>
</h:commandButton>

Поскольку вы используете JSF 2, вам может оказаться полезным использовать f:metadata с f:viewParam вместе с трюком includeViewParameters=true для навигации между страницами, проверьте эти вопросы:

person Elias Dorneles    schedule 06.01.2013

Как говорит Элиас, когда вы нажимаете кнопку команды, появляется новый запрос (сообщение), и он не будет включать параметры получения из предыдущего запроса.

Альтернативным решением является использование упомянутых параметров представления в сочетании с компонентом o:form из OmniFaces, у которого есть атрибут, который автоматически сохраняет все параметры просмотра как параметры GET:

<o:form includeViewParams="true">

У этого есть дополнительное преимущество, заключающееся в том, что пользователи продолжают видеть эти параметры в URL-адресе, поэтому, если они скопируют его или обновят страницу, нажав Enter в адресной строке своего браузера, все будет работать так, как ожидалось.

person Mike Braun    schedule 06.01.2013