进一步继续双重印刷

时间:2012-06-03 09:23:15

标签: jsf primefaces

在之前的question中,BalusC给了我很好的建议,一个按钮代替commandButton对非ajax导航有用。特别是它更新http:位置中的目标地址,这对用户为页面添加书签很有用。

在我遇到问题之前,我试图利用这些信息。在一个按钮中我试图使用outcome =“#{backing.something}”来找出它给我一个null结果。这看起来像一个计时问题,因为action =“#{}”仅在按下按钮时被评估,而结果显然需要一个固定的字符串,在页面加载时会被检查。

所以我用ajax =“false”回到commandButton。这有一个问题,我的导航地址是我来自的页面,而不是我导航到的页面。这是用户的错误书签。

我感谢我在学习练习中获得的所有帮助。 伊兰

1 个答案:

答案 0 :(得分:3)

<h/p:button outcome>不是要调用bean操作方法,而是直接包含结果字符串。其中的任何EL都会立即作为值表达式进行评估。因此,当您打开包含<h/p:button>

的页面时,将立即调用其背后的方法

在您的特定情况下,基本上有两种方法可以在导航上调用bean操作方法。如果您需要在之前调用导航,并且每次最终用户重新打开/重新加载GET请求时都不想重新调用该操作,那么将其设置为POST-Redirect-GET请求。这是在查询字符串语法中将faces-redirect=true添加到结果值的问题。

E.g。

<p:commandButton action="#{bean.submit}" ... />

public String submit() {
    // ...

    return "nextpage?faces-redirect=true";
}

这样,POST后浏览器将被重定向到目标页面,因此最终用户将看到目标URL反映在地址栏中。

或者,如果您需要在每次最终用户重新打开/重新加载GET请求时调用操作,请在(post)构造函数或请求/视图作用域支持bean的preRenderView侦听器方法中执行该作业。 / p>

E.g。

<p:button outcome="nextpage" ... />

@ManagedBean
@RequestScoped
public class NextpageBacking {

    public NextpageBacking() {
        // In constructor.
    }

    @PostConstruct
    public void onPostConstruct() {
        // Or in postconstructor (will be invoked after construction AND injection).
    }

    public void onPreRenderView() {
        // Or before rendering the view (will be invoked after all view params are set).
    }

    // ...
}

需要在nextpage

中按如下方式定义预渲染视图侦听器方法
<f:event type="preRenderView" listener="#{nextpageBacking.onPreRenderView}" />

另见: