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 以显示<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,它就可以工作。
我正在努力解决这个问题:
JSF-2.2.6 Tomcat-7.0.47 PrimeFaces 5.0我已阅读与<f:viewAction>
相关的大量帖子,但没有任何帮助。
【问题讨论】:
【参考方案1】:<f:viewAction onPostback="true">
仅适用于同一视图的回发。 IE。它仅在提交同一视图中的<h:form>
时运行。 <f:viewAction>
绝不打算在另一个视图的<h:form>
提交触发 POST 导航时执行。此外,属性名称中的术语“回发”也证实了这一点。该术语在 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【讨论】:
以上是关于f:viewAction 被忽略,当 commandButton 导航到页面时的主要内容,如果未能解决你的问题,请参考以下文章
何时使用 f:viewAction / preRenderView 与 PostConstruct?
根据 f:viewParam 有条件地调用 f:viewAction
在使用 p:commandButton 导航时调用 f:viewAction 中的操作