在jsf-2.2中的faces-config中传递redirect-param

时间:2014-11-26 12:54:13

标签: navigation jsf-2.2 glassfish-4 mojarra faces-config

在旧的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找到对象

在faces-config.xml文件中使用jsf 2.2和mojarra javax.faces-2.2.8实现没有<view-param><redirect-param>更改它们没有给出导航没有id的成功场景它会导航到page2.xhtml而不是page2.xhtml?id=1

3 个答案:

答案 0 :(得分:3)

你可以用旧的方式做到这一点。而不是使用<redirect-param>使用<view-param>。 xsd(http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd)会将其标记为false,但是mojarra javax.faces-2.2.8将以您想要的正确方式默默使用它。

编辑:XSD将在Mojarra 2.3版本中修复,请参阅其他答案&#39;

示例:

<?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>

答案 1 :(得分:0)

尝试使用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
}

答案 2 :(得分:0)

在配置上使用旧<view-param>标记,如https://stackoverflow.com/a/34773335/2521247上提到的Jaxt0r

这是针对2.3修复的JSF错误。见https://java.net/jira/browse/JAVASERVERFACES-3399