我对JSF 2.2 Feature <f:viewAction action="#{...}/>
有问题。
我将此标签放在XHTML-Page中,它称为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-Page,一切正常:调用方法
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">
仅适用于同一视图上的回发。即仅当在完全相同的视图中提交<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