Передача параметра перенаправления в Faces-config в jsf-2.2

В старом jsf работал следующий код

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>true</from-outcome>
        <to-view-id>/page2.xhtml</to-view-id>
        <redirect>
            <view-param>
                <name>id</name>
                <value>#{myBean.id}</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>

код page1.xhtml:

<f:metadata>
    <f:viewParam id="id" name="id" value="#{myBean.id}"  />
    <f:viewAction action="#{myBean.init()}"/>
</f:metadata>

Java-код:

public class MyBean(){
   private double id;

   public boolean init(){
      if(id > 0)
         return true;
      else
         return false;
   }
}

В сценарии успеха, когда page1.xhtml?id=0 страница1 будет открыта при page1.xhtml?id=1 переходе на page2 с параметром id=1.

переход к page2.xhtml?id=1 с параметром нужен, т.к. в page2 по PostConstruct или <f:viewAction> параметр читается и нужен для поиска объекта по этому id

Использование jsf 2.2 с реализацией mojarra javax.faces-2.2.8 в файлеfaces-config.xmlнет <view-param> есть <redirect-param> их изменение не дает сценария успеха, когда навигация без идентификатора, где он будет переходить к page2.xhtml вместо page2.xhtml?id=1


person bob-cac    schedule 26.11.2014    source источник


Ответы (3)


Можно по старинке. Вместо использования <redirect-param> используйте <view-param>. xsd (http://xmlns.jcp.org/xml/ns /javaee/web-facesconfig<view-param>2.xsd) пометит его как ложное, но mojarra javax.faces-2.2.8 будет молча использовать его так, как вам нужно.

Изменить: XSD будет исправлен в выпуске Mojarra 2.3, см. другой «ответ»

Пример:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd" version="2.2">
    <navigation-rule>
        <navigation-case>
            ...
            <redirect>
                <view-param>
                    <name>foo</name>
                    <value>bar</value>
                </view-param>
            </redirect>
        </navigation-case>
    </navigation-rule>
</faces-config>
person Jaxt0r    schedule 13.01.2016

Попробуйте использовать атрибут include-view-params="true" в элементе <redirect> элемента faces-config.xml вместо объявления параметров с помощью тега <view-param>.
Также не забудьте объявить <f:viewParam> на целевой странице (page2.xhtml).
Я думаю, что ваш пример работает так, как вы ожидали, как это:

Правило навигации в Faces-config.xml:

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>true</from-outcome>
        <to-view-id>/page2.xhtml</to-view-id>
        <redirect include-view-params="true" />
    </navigation-case>
</navigation-rule>

Код page1.xhtml (без изменений):

<f:metadata>
    <f:viewParam id="id" name="id" value="#{myBean.id}" />
    <f:viewAction action="#{myBean.init()}"/>
</f:metadata>

Код page2.xhtml:

<f:metadata>
    <f:viewParam id="id" name="id"/>
</f:metadata>

ManagedBean (без изменений):

public class MyBean {
    private double id;

    public boolean init(){
        if(id > 0)
            return true;
        else
            return false;
    }

    // getter & setter for id
}
person Evgeny Kharitonov    schedule 09.03.2017

Используйте старый тег <view-param> в конфигурации, как упоминал Jaxt0r в https://stackoverflow.com/a/34773335/2521247.

Это ошибка JSF, исправленная в версии 2.3. См. https://java.net/jira/browse/JAVASERVERFACES-3399.

person german1410    schedule 10.04.2017