目录
一.Response设置响应数据功能介绍
响应数据分为3部分:
1.响应行:HTTP/1.1 200 OKvoid setStatus(int sc):设置响应状态码
2.响应头:Content-Type: text/htmlvoid setHeader(String name, String value):设置响应头键值对
3.响应体:<html><head></head><body></body></html>PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
二.Response完成重定向
重定向(Redirect): —种资源跳转方式。
重定向特点:
①浏览器地址栏路径发生变化
②可以重定向到任意位置的资源(服务器内部、外部均可)
③两次请求,不能在多个资源使用request共享数据实现方式:
//重定向 resp.setStatus(302); resp.setHeader("location","资源B的路径"); //简化方式,代替上面两行代码 resp.sendRedirect("资源B的路径");
resp.sendRedirect("资源B的路径");
示例代码:ServletDemo7.java
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet("/demo7") public class ServletDemo7 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("demo7"); //重定向 //1.设置响应状态码302 //response.setStatus(302); //2.设置响应头Location //response.setHeader("Location","/Web_demo1/demo8"); //简化方式 resp.sendRedirect("/Web_demo1/demo8"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
ServletDemo8.java
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.annotation.*; import java.io.IOException; @WebServlet("/demo8") public class ServletDemo8 extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("demo8"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }
访问demo7,看变化,看控制台。
👇
控制台:
资源路径问题
明确路径谁使用?
浏览器使用:需要加虚拟目录(项目访问路径)
服务端使用:不需要加虚拟目录
练习:
<a href=‘'路径’> 加虚拟目录
<form action=‘路径’> 加虚拟目录
req.getRequestDispatcher(“路径") 不加虚拟目录
resp.sendRedirect(“路径") 加虚拟目录动态获取虚拟目录
String contextPath = req.getContextPath(); resp.sendRedirect( contextPath+"/demo8");
三.Response响应数据
1.字符
使用:
①通过Response对象获取字符输出流(注:该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭)
PrintWriter writer = resp.getWriter();
②写数据
writer.write("XXX");传送html数据
PrintWriter writer = resp.getWriter(); //设置内容格式 resp.setHeader( "content-type", "text/html"); //响应数据 writer.write("<h1>XXX</h1>");
传送中文乱码问题:
原因:通过Response获取的字符输出流默认编码:ISO-8859-1
解决方案:
//setContentType可替代setHeader(),还可以设置更多,比如编码 resp.setContentType("text/html;charset=utf-8"); PrintWriter writer = resp.getWriter(); writer.write("冲冲冲!!");
2. 字节
使用:
1.通过Response对象获取字符输出流
ServletOutputStream outputStream = resp.getOutputStream();2.写数据
outputStream.write(字节数据);
IOUtils工具类使用
1.导入坐标
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
2.使用
IOUtils.copy(输入流,输出流);