gpt4 book ai didi

java - 如何在 JSF2.0 中使用 ExternalContext.redirect()?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:17:37 25 4
gpt4 key购买 nike

考虑一个页面webapp/myPage.xhtml:

...
<h:form id="myForm">
...
<h:selectOneMenu id="..." required="true" value="#{myController.aValue}">
<f:selectItems value="#{...}" var="..." itemValue="#{...}" itemLabel="#{...}"/>
</h:selectOneMenu>
...
<h:commandButton value="Go for it!" action="#{myController.goForIt(...)}"/>
...
</h:form>
...

按钮 Action 绑定(bind)到 Controller 方法MyController.goForIt():

@ManagedBean(name = "myController")
@RequestScoped
public class MyController {
public String goForIt(...){
if (myCondition){
try {
FacesContext.getCurrentInstance().getExternalContext()
.redirect("http://www.myTarget.com/thePage.html");
} catch (IOException e) {
...
}
}
return "myPage.xhtml"
}
}

我的第一个问题是:上述是否有意义?这是使用 redirect() 的正确方法吗?

如果 myCondition 为真,我想将用户重定向到 http://www.myTarget.com/thePage.html。如果 myCondition 为假,他将不得不留在 myPage.xhtml 上。

如果是这样,我想更好地了解会发生什么...使用 Live HTTP Headers 时在 Firefox 中,我观察到单击按钮时

  1. 发生对 webapp/myPage.xhtml 的 POST
  2. 服务器回复 302 Moved Temporarily - Location: www.myTarget.com/thePage.html
  3. 浏览器 GET 的 www.myTarget.com/thePage.html

到目前为止,这是预期的行为吗?

我现在觉得烦人的是 webapp/myPage.xhtml 被调用了。更具体地说,这里再次调用了 preRenderView 事件。 (我在 preRenderView-listener 中有一些代码应该只执行一次。)

上面说的有道理吗?有没有人看到改善这一点的方法?

谢谢! J.

最佳答案

So far, Is this the expected behaviour?

重定向基本上指示客户端在 Location 响应 header 中指定的 URL 上触发一个 HTTP 请求。所以是的,您看到的行为是正确的。

但是,您的网址是错误的。它是相对于当前请求 URL 的。因此,如果当前 URL 是例如 http://example.com/context/page.jsf , 那么这个重定向基本上会指向 http://example.com/context/www.myTarget.com/thePage.html这显然是错误的。当新 URL 涉及不同的域时,您应该重定向到一个绝对 URL。换句话说,在它前面加上 http://方案。

What I find annoying now is that webapp/myPage.xhtml is called.

这在理论上应该不会在重定向发生时发生。尝试将 return null 添加到 try block 。

关于java - 如何在 JSF2.0 中使用 ExternalContext.redirect()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3727110/

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