f:viewAction 忽略,当 commandButton 导航到页面时
f:viewAction ignored, when commandButton navigates to page
我对 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
和 "immediate" 属性,但没有任何变化。
另一个奇怪的结果是,在我点击命令按钮并看到 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>
相关的帖子,但没有任何帮助。
<f:viewAction onPostback="true">
仅适用于同一视图的回发。 IE。它仅在提交同一视图中的 <h:form>
时运行。 <f:viewAction>
永远不会在 POST 由另一个视图的 <h:form>
提交触发的导航时执行。而且,属性名称中的“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 现在应该正确反映在地址栏中。这本身就是一个强烈的暗示,表明你以错误的方式做事 ;)
另请参阅:
- How to navigate in JSF? How to make URL reflect current page (and not previous one)
- Difference between h:button and h:commandButton
我对 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
和 "immediate" 属性,但没有任何变化。
另一个奇怪的结果是,在我点击命令按钮并看到 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>
相关的帖子,但没有任何帮助。
<f:viewAction onPostback="true">
仅适用于同一视图的回发。 IE。它仅在提交同一视图中的 <h:form>
时运行。 <f:viewAction>
永远不会在 POST 由另一个视图的 <h:form>
提交触发的导航时执行。而且,属性名称中的“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 现在应该正确反映在地址栏中。这本身就是一个强烈的暗示,表明你以错误的方式做事 ;)
另请参阅:
- How to navigate in JSF? How to make URL reflect current page (and not previous one)
- Difference between h:button and h:commandButton