一、Response设置响应数据功能介绍
响应数据分为3部分:
1、响应行:HTTP/1.1 200 OK
void set Status(int sc):设置响应状态码
2、响应头:Content-Type:text/html
void setHeater(String name,String value):设置响应头键值对
3、响应体:<html><head></head><body></body></html>
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
二、Response完成重定向
重定向(Redirect):一种资源跳转方式
实现方式:
resp.setStatus(302); resp.setHeader("location","资源B的路径");
代码示例:
ResponseDemo1重定向到ResponseDemo2:
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet("/resp1") public class ResponseDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("demo1..."); //重定向 //1、设置响应状态码 302 response.setStatus(302); //2、设置响应头 Location response.setHeader("Location","/Tomcate-demo2/resp2"); ; } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
ResponseDemo2:
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/resp2") public class ResponseDemo2 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("demo2..."); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
运行结果:
访问resp1重定向到resp2的URL:
控制台:
也可用简化方式完成重定向,内部资源和外部资源均可的一种方式:
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet("/resp1") public class ResponseDemo1 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("demo1..."); //简化方式完成重定向,内部资源和外部资源均可 //动态获取虚拟目录 String contextPath = request.getContextPath(); response.sendRedirect(contextPath + "/resp2"); // response.sendRedirect("https://www.baidu.cn"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
执行结果根上面相似,重定向外部资源的时候会跳转到相应的重定向网址。
重定向特点:
1、浏览器地址栏路径发生变化
2、可以重定向到任意位置的资源(服务器内部、外部均可)
3、两次请求,不能在多个资源使用request共享数据
三、路径问题
浏览器使用:需要假虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录
<a href = "路径"> 加虚拟目录 <form action = "路径"> 加虚拟目录 req.getRequestDispatcher("路径") 不加虚拟目录 resp.sedRedirect("路径") 加虚拟目