我在这个论坛上寻找解决方案,但我找不到任何适合我的问题。
我有一个非常简化的代码
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;
。
答案 0 :(得分:3)
由于您通过Include
调用servlet,因此不会使您重定向。它完全忽略了。
包含响应中的资源(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();">