f:viewAction 被忽略,当 commandButton 导航到页面时

Posted

技术标签:

【中文标题】f:viewAction 被忽略,当 commandButton 导航到页面时【英文标题】:f:viewAction ignored, when commandButton navigates to page 【发布时间】:2016-03-14 00:46:44 【问题描述】:

我对 JSF 2.2 功能 <f:viewAction action="#.../> 有疑问。 我把这个标签放在我的 Xhtml 页面中,它叫做 viewActionStart.xhtml:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:head />
<h:body>
    <f:view>
        <f:metadata>
            <f:viewAction action="#redirect.getView()" onPostback="true"
                immediate="true" />
        </f:metadata>
    </f:view>
    <h:outputText value="If you see that text, the viewAction was not performed." />
</h:body>
</html>

如果我直接访问这个 XHTML 页面,一切正常:调用方法 redirect.getView() 并执行重定向到另一个页面。

现在我有了我的登录页面,它显示在 viewActionStart-Page 之前。有一个按钮,基本上应该导航到我的 viewActionStart-Page 以显示&lt;f:viewAction&gt; 效果。以下代码来自此登录页面 index.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">
<h:head>
</h:head>
<h:body>
    <f:view>
        <h:form>
            <h:commandButton action="viewActionStart.xhtml"
                value="To f:viewAction Page" />
        </h:form>
    </f:view>
</h:body>
</html>

如果我点击那个命令按钮,viewActionStart.xhtml 的内容就会显示出来。为什么 JSF 会忽略 &lt;f:viewAction&gt;?我不明白为什么viewAction 在每次页面加载时都不起作用。我尝试了那些onPostback 和“立即”属性,但没有任何改变。

另一个奇怪的结果是,在我点击命令按钮并查看 viewActionStart.xhtml 的内容后,URL 仍然保留在 localhost:8080/UIIncludeTest/index.xhtml 上。但是在命令按钮进行导航之后,不应该像 localhost:8080/UIIncludeTest/viewActionStart.xhtml 那样查看这个 URL 吗?

我做错了吗?还是我只是误解了&lt;f:viewAction&gt;?奇怪的是,如果我直接浏览到 viewActionStart.xhtml,它就可以工作。

我正在努力解决这个问题:

JSF-2.2.6 Tomcat-7.0.47 PrimeFaces 5.0

我已阅读与&lt;f:viewAction&gt; 相关的大量帖子,但没有任何帮助。

【问题讨论】:

【参考方案1】:

&lt;f:viewAction onPostback="true"&gt; 仅适用于同一视图的回发。 IE。它仅在提交同一视图中的&lt;h:form&gt; 时运行。 &lt;f:viewAction&gt; 绝不打算在另一个视图的&lt;h:form&gt; 提交触发 POST 导航时执行。此外,属性名称中的术语“回发”也证实了这一点。该术语在 Web 开发世界中的意思是“对页面本身的 URL 的 POST 请求”。

您需要通过 GET 请求而不是 POST 请求打开它。将&lt;h:commandButton&gt; 替换为&lt;h:button&gt;

<h:button outcome="viewActionStart.xhtml" value="To f:viewAction Page" />

(注意:&lt;h:form&gt; 不再需要了)

或者,如果您出于某种不清楚的原因确实打算首先执行 POST 请求(如果您调用 bean 操作方法会更容易理解,但您在这里只是导航,所以整个 POST 请求没有任何意义),然后让它发送重定向:

<h:commandButton action="viewActionStart.xhtml?faces-redirect-true" value="To f:viewAction Page" />

无论哪种方式,URL 现在都应该正确地反映在地址栏中。这本身确实强烈暗示您以错误的方式做事;)

另见:

How to navigate in JSF? How to make URL reflect current page (and not previous one) Difference between h:button and h:commandButton

【讨论】:

以上是关于f:viewAction 被忽略,当 commandButton 导航到页面时的主要内容,如果未能解决你的问题,请参考以下文章

如何显示 f:viewAction 的等待指示器?

何时使用 f:viewAction / preRenderView 与 PostConstruct?

根据 f:viewParam 有条件地调用 f:viewAction

在使用 p:commandButton 导航时调用 f:viewAction 中的操作

当 mouseEnabled 上有多个重叠项目时,MouseInput 被忽略 = false

当语法在 vue 组件中看起来很完美时,“外部根元素将被忽略”错误