在旧的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>
页1.xhtml代码:
<f:metadata>
<f:viewParam id="id" name="id" value="#{myBean.id}" />
<f:viewAction action="#{myBean.init()}"/>
</f:metadata>
爪哇代码:
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
导航到带有参数id=1
的page2
需要使用参数导航到page2.xhtml?id=1
,因为在page2
中读取PostConstruct
或<f:viewAction>
参数,并且需要根据此ID查找对象
在 faces-config 文件中将 jsf 2.2 与 mojarra javax.faces-2.2.8 实现一起使用.xml没有<view-param>
<redirect-param>
更改它们不会提供导航没有 id 的成功方案,它将导航到page2.xhtml
而不是page2.xhtml?id=1
用旧的方式做。而不是使用<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版本中修复,请参阅其他"答案"
例:
<?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>
尝试在faces-config.xml
的元素中使用include-view-params="true"
属性<redirect>
而不是使用<view-param>
标签声明参数。
还要确保在目标页面 ( page2.xhtml
) 中声明<f:viewParam>
。
我相信我让你的例子像你期望的那样工作:
人脸配置中的导航规则.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>
第 1 页.xhtml代码(未更改):
<f:metadata>
<f:viewParam id="id" name="id" value="#{myBean.id}" />
<f:viewAction action="#{myBean.init()}"/>
</f:metadata>
第 2 页.xhtml 代码:
<f:metadata>
<f:viewParam id="id" name="id"/>
</f:metadata>
托管豆(不变):
public class MyBean {
private double id;
public boolean init(){
if(id > 0)
return true;
else
return false;
}
// getter & setter for id
}
在配置上使用旧的<view-param>
标签,正如Jaxt0r在 https://stackoverflow.com/a/34773335/2521247 中提到的那样
这是 JSF 上的一个错误,已在 2.3 中修复。请参阅 https://github.com/eclipse-ee4j/mojarra/issues/3403