gpt4 book ai didi

jsf - f :viewAction ignored, 当 commandButton 导航到页面时

转载 作者:行者123 更新时间:2023-12-01 18:58:03 25 4
gpt4 key购买 nike

我对 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 上。但在命令按钮进行导航后,这个 URL 不应该看起来像 localhost:8080/UIIncludeTest/viewActionStart.xhtml 吗?

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

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

  • JSF-2.2.6
  • Tomcat-7.0.47
  • PrimeFaces 5.0

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

最佳答案

<f:viewAction onPostback="true">仅适用于同一 View 的回发。 IE。它仅在 <h:form> 时运行已提交了完全相同的观点。 <f:viewAction>绝不会在由提交 <h:form> 触发的 POST 导航时执行另一种观点。而且,属性名称中的术语“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 现在都应该正确反射(reflect)在地址栏中。这本身确实是一个强烈的暗示,表明你做事的方式是错误的;)

另请参阅:

关于jsf - f :viewAction ignored, 当 commandButton 导航到页面时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28914293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com