一.如何实现重定向
1.重定向的概念
重定向相当于访问这个页面,跳转到另一个页面,状态码是302
2.实现重定向
第一步:在classes建立一个RedirectServlet.class
package com.java;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RedirectServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setStatus(302);
resp.setHeader("Location", "/Day04/index.jsp");
//也可以这样子简写
//resp.sendRedirect("/Day04/index.jsp");
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
第二步:在web.xml设置路径(有什么方法是不用每次在classes新建一个class,不用设置路径就能访问?)
<servlet>
<servlet-name>RedirectServlet</servlet-name>
<servlet-class>com.java.RedirectServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RedirectServlet</servlet-name>
<url-pattern>/java/RedirectServlet</url-pattern>
</servlet-mapping>
二、Response需要注意的问题
*getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。
*response中获取的输出流,在service方法结束后服务器会帮我们关闭,所以一般不要自己在Servlet中关闭这个流.
如何知道这是排斥的?
写一个class在classes测试一下:
package com.java;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo1 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getOutputStream();
resp.getWriter();
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
这是在浏览器中访问会报错
如果去掉resp.getOutputStream()或resp.getWriter()就不会报错
看另一个例子:
看看Demo1如何跳转到Demo2
Demo1的代码:
package com.java;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo1 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getWriter();
//这个是转发,一次请求一次响应,因为Demo2是getOutputStream(),所以跳转失败;
//this.getServletContext().getRequestDispatcher("/java/Demo2").forward(req, resp);
//这个是重定向,两次请求两次响应,所以无论Demo2是什么,跳转都不会失败
resp.sendRedirect("Day04/java/Demo2");
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}
Demo2的代码:
package com.java;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo2 extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.getOutputStream();
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doGet(req, resp);
}
}