1

在上一个问题中,BalusC 给了我很好的建议,关于如何使用按钮代替命令按钮对非 ajax 导航有用。特别是它会更新 http: 位置中的目标地址,这对于用户为页面添加书签很有用。

我试图利用这些信息来发挥自己的优势,直到遇到问题。在一个按钮中,我尝试使用 result="#{backing.something}" 来发现它给了我一个空结果。这看起来像是一个时间问题,因为仅在按下按钮时才评估 action="#{}" 而结果显然需要一个固定字符串,该字符串在加载页面时被检查。

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

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

4

1 回答 1

3

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

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

例如

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

public String submit() {
    // ...

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

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

或者,如果您需要在最终用户每次重新打开/重新加载 GET 请求时调用该操作,请preRenderView改为在请求/视图范围的后备 bean 的 (post) 构造函数或侦听器方法中执行该工作。

例如

<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}" />

也可以看看:

于 2012-06-03T12:39:51.433 回答