这是我的jsf代码: -
<h:commandButton id="cmdLogin" value="Login" actionListener="#{indexBean.login}">
<f:ajax execute="@form" render="@all" />
</h:commandButton>
这是我的indexBean登录方法: -
public void login(){
HttpServletResponse objHttpServletResponse = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
objHttpServletResponse.sendRedirect("Restricted/Home.jsf");
}
我在javascript emptyResponse: An empty response was received from the server. Check server error logs.
中收到一条提醒。为什么这种重定向不起作用?
编辑: - 有趣的是,当我从faces-config.xml重定向时,它可以工作!
<faces-config version="2.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>Home</from-outcome>
<to-view-id>/Restricted/Home.jsf</to-view-id>
<redirect/>
</navigation-case>
</navigation-rule>
</faces-config>
显然,我将actionListener
命令按钮更改为action
,并将login
的返回类型更改为String
,并从登录方式返回home
。现在有人可以告诉,如果这是JSF中的期望行为吗?如何从faces-config.xml
重定向并且在managedbean中进行简单重定向不会?
答案 0 :(得分:2)
HttpServletResponse objHttpServletResponse = (HttpServletResponse)
FacesContext.getCurrentInstance()
.getExternalContext()
.getResponse();
objHttpServletResponse.sendRedirect("Restricted/Home.jsf");
在这里,您将离开JSF API并转向servlet API,其中JSF将无法处理您执行的任何操作。当您调用此方法时,服务器返回302 response而不是JavaScript API期望的AJAX响应。
在JSF中执行程序化重定向的正确机制是使用ExternalContext:
FacesContext.getCurrentInstance()
.getExternalContext()
.redirect("yourUrl");
如果在JSF 2.0中使用此机制和AJAX调用,服务器将发送如下响应:
<?xml version="1.0" encoding="utf-8"?>
<partial-response><redirect url="yourUrl"></redirect></partial-response>
您可以使用Firebug和Fiddler等工具来检查服务器的响应。
请注意,此方法签名不正确:public void login()
。规范声明动作方法必须声明一个对象返回类型(事实上你的实现不会抛出错误只是意味着你很幸运)。