ajax重定向无法正常工作

时间:2010-08-01 05:18:08

标签: java redirect jsf-2

这是我的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中进行简单重定向不会?

1 个答案:

答案 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>

您可以使用FirebugFiddler等工具来检查服务器的响应。


请注意,此方法签名不正确:public void login()。规范声明动作方法必须声明一个对象返回类型(事实上你的实现不会抛出错误只是意味着你很幸运)。