sendRedirect()doens工作

时间:2014-08-05 13:54:06

标签: java jsp servlets

我在这个论坛上寻找解决方案,但我找不到任何适合我的问题。

我有一个非常简化的代码

jsp页面

<html>
<body>
<jsp:include page="/servletName"/>
</body>
</html>

和一个servlet

@WebServlet("/servletName")
public class reindirizzaController extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public reindirizzaController() {
        super();        
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String redirectURL = "http://www.google.it";
      response.sendRedirect(redirectURL);       
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }

}

没有重定向。我被困在jsp页面中,我没有得到任何错误。我还尝试在回复后添加return;

3 个答案:

答案 0 :(得分:3)

由于您通过Include调用servlet,因此不会使您重定向。它完全忽略了。

来自include()

的文档
  

包含响应中的资源(servlet,JSP页面,HTML文件)的内容。实质上,此方法支持程序化服务器端包含。

     

ServletResponse对象的路径元素和参数与调用者保持不变。包含的servlet无法更改响应状态代码或设置标头; 忽略任何进行更改的尝试。

答案 1 :(得分:0)

首先,从jsp调用servlet是不好的做法。当您使用@WebServlet("/servletName")时,可以直接在http://host/context/servletName

上调用它

如果你真的需要从jsp调用它,你必须转发到servlet,而不是像Suresh Atta解释的那样包含它。所以你应该使用:

<jsp:forward page="/servletName"/>

答案 2 :(得分:0)

当你执行JSP include指令时,你基本上就是在页面上包含你所包含的代码。在您的示例中,您将在JSP中执行sendRedirect。即使你让重定向奇迹般地工作,你也会得到一个错误,说你的回复已经提交了。这是因为当您的浏览器加载JSP时,它已经从服务器的响应中读取。当服务器已经向您的浏览器发送响应时,服务器无法发送另一个响应。

解决这个问题的一种方法是,不要使用include指令,而是使用servlet路径作为操作创建表单。类似的东西:

<form name="someForm" action="/servletPath/servletName">
    <!-- some stuff here if you want -->
</form>

然后在您的正文标记中,让它在加载时提交表单:

<body onLoad="document.someForm.submit();">