我有两个JSF页面:A.xhtml和B.xhml。
A.xhtml:
<html ...>
<h:body>
<h:form>
<h:commandLink value="To B page" action="#{bean.goToB}">
<f:param name="aURL" value="A.xhtml"/>
</h:commandLink>
</h:form>
</h:body>
</html>
with bean:
@ManagedBean
@ViewScoped
public class Bean {
public String goToB(){
//some logic...
return "B.xhtml"?faces-redirect=true";
}
}
和B.xhtml:
<html ...>
<h:body>
<f:metadata>
<f:viewParam name="aURL"/>
</f:metadata>
<h:link value="To A page" outcome="#{aURL}"/> <----- this link is disabled
</h:body>
</html>
上面标记的链接处于非活动状态,已禁用。这是一个简单的标签。为什么我不能从B.xhtml返回到A.xhtml?错误在哪里?
答案 0 :(得分:2)
基本上是因为你没有传递有效的结果,所以首先尝试将一些有效的结果放在没有xhtml扩展名的页面名称上,你会看到它呈现为链接。
首先,返回动作方法的页面名称或h:link
中的结果必须不具有xhtml扩展名,因此有一个Page1.xhtml的动作是Page1。删除xhtml扩展名。
第二,当您在命令链接中使用f:param
时,它将成为请求中的参数,因此如果您使用faces-redirect
重定向到另一个页面,它的值将会丢失,因为浏览器将创建一个新请求,请删除faces-redirect。
最后从f:param
获取发送的值使用预定义的bean param
所以:
<h:link value="To A page" outcome="#{param.aURL}"/>
然后移除f:metadata
答案 1 :(得分:0)
对不起,我在JSF页面上犯了这么大的错误(我写了page.xhtml.xhtml)。
我不必在link
的结果中删除xhtml扩展名,我不必删除f:metadata
而我不必使用#{param.aURL}
(我可以使用#{aURL}
)
感谢大家的帮助(尤其是CésarLoachamin和kolossus)。