【发布时间】:2015-05-08 23:21:42
【问题描述】:
我对 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> 相关的大量帖子,但没有任何帮助。
【问题讨论】: