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

时间:2015-03-07 11:15:41

标签: jsf tomcat7 jsf-2.2

我遇到了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和“立即”属性,但没有任何变化。

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

我做错了吗?或者我只是误解了<f:viewAction>?奇怪的是,如果我直接浏览viewActionStart.xhtml它会起作用。

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

  • JS​​F-2.2.6
  • Tomcat的7.0.47
  • PrimeFaces 5.0

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

1 个答案:

答案 0 :(得分:6)

<f:viewAction onPostback="true">仅适用于同一视图上的回发。即它仅在提交了同一视图中的<h:form>时运行。 <f:viewAction>从不打算在提交另一个视图的<h:form>触发的POST导航时执行。此外,术语&#34; postback&#34;在属性名称中也确认了这一点。这个术语在Web开发世界中意味着对页面本身的URL的POST请求&#34;。

您需要通过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。这本身确实是一个强烈的暗示,你是以错误的方式做事;)

另见:

相关问题