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

f:viewAction ignored, when commandButton navigates to page

我对 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 以显示 <f:viewAction> 效果。以下代码来自此着陆页 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 忽略 <f:viewAction>?我不明白为什么 viewAction 在每个页面加载时都不起作用。我尝试了那些 onPostback 和 "immediate" 属性,但没有任何变化。

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

我是不是做错了什么?还是我只是误解了 <f:viewAction>?奇怪的是,如果我直接浏览到 viewActionStart.xhtml.

它会起作用

我正在尝试让它继续工作:

我已经阅读了很多与 <f:viewAction> 相关的帖子,但没有任何帮助。

<f:viewAction onPostback="true"> 仅适用于同一视图的回发。 IE。它仅在提交同一视图中的 <h:form> 时运行。 <f:viewAction> 永远不会在 POST 由另一个视图的 <h:form> 提交触发的导航时执行。而且,属性名称中的“postback”一词也证实了这一点。该术语在 Web 开发世界中表示“对页面本身 URL 的 POST 请求”。

您需要通过 GET 请求而不是 POST 请求来打开它。将 <h:commandButton> 替换为 <h:button>:

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

(注意:<h:form> 不再是必需的)

或者,如果您出于某种不明确的原因确实打算首先执行 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