转发方法在页面加载时触发,而不是在漂亮的链接点击时间

时间:2018-03-12 13:05:15

标签: jsf prettyfaces

在调试时,我注意到当我转发到包含下面的漂亮链接的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();

  }
}

有人可以解释一下为什么会发生这种情况以及如何避免它(即只有在点击链接时才应该触发该方法)。谢谢。

1 个答案:

答案 0 :(得分:1)

您似乎将JSF ValueExpression绑定到<pretty:link>组件,但是此页面的ValueExpressions在页面呈现时进行评估。

这是因为<pretty:link>组件旨在创建一个在浏览器中呈现的URL,以允许书签,而无需回调到JSF来执行方法。这意味着您无法在运行时动态更改<pretty:link>的值。

最好使用<h:commandLink>(在回发时执行操作方法,在点击时执行,而不是在渲染时执行),然后您可以从操作方法执行服务器端导航,因为它似乎是你期待的行为。

基本上,<pretty:link>旨在与您想要的完全相反。