在调试时,我注意到当我转发到包含下面的漂亮链接的home.xhtml页面时,方法myBean.forward()
被触发,甚至在点击漂亮链接之前(即产品标签) ):
home.xhtml
<pretty:link target="_self" mappingId="#{myBean.forward(product, true)}" >
<f:param value="#{vo.product.hash }" />
<ice:outputText value="#{vo.product.label}"/>
</pretty:link>
漂亮-config.xml中
<url-mapping id="myApp/seller/addProduct">
<pattern value="/myApp/seller/addProduct/#{fooBean.productHash}" />
<view-id value="/pages/seller/products/addProduct.xhtml" />
<action>#{myBean.myMethod}</action>
</url-mapping>
MyBean.java
public class MyBean{
//source code omitted
public String forward(Product p, boolean pretty){
if(prettyLink)
return "myApp/seller/addProduct";
else
return fooBean.getContextService().getBaseURL()+"/myApp/seller/addProduct/"+p.getHash();
}
}
有人可以解释一下为什么会发生这种情况以及如何避免它(即只有在点击链接时才应该触发该方法)。谢谢。
答案 0 :(得分:1)
您似乎将JSF ValueExpression绑定到<pretty:link>
组件,但是此页面的ValueExpressions在页面呈现时进行评估。
这是因为<pretty:link>
组件旨在创建一个在浏览器中呈现的URL,以允许书签,而无需回调到JSF来执行方法。这意味着您无法在运行时动态更改<pretty:link>
的值。
最好使用<h:commandLink>
(在回发时执行操作方法,在点击时执行,而不是在渲染时执行),然后您可以从操作方法执行服务器端导航,因为它似乎是你期待的行为。
基本上,<pretty:link>
旨在与您想要的完全相反。