Response响应对象
1.基本功能
设置响应行:格式为 HTTP/1.1 200 OK
,可以使用 setStatus(int sc)
方法设置状态码为 200 表示成功。
方法名称 | 描述 |
setStatus(int sc) | 设置状态码为给定的整数值。 |
设置响应头:使用 setHeader(String name, String value)
方法来设置响应头信息,比如 setHeader("Content-Type", "text/html")
设置响应内容类型为 HTML。
方法名称 | 描述 |
setHeader(String name, String value) | 设置指定名称的请求头为给定的值。 |
设置响应体:获取输出流:
方法名称 | 描述 |
getWriter() | 获取字符输出流,用于向客户端发送字符数据。 |
getOutputStream() | 获取字节输出流,用于向客户端发送字节数据。 |
使用输出流将数据输出到客户端浏览器。
2.重定向
重定向通过response对象的sendRedirect("目标地址")进行跳转
方法名称 | 描述 |
sendRedirect(String location) | 通过指定目标地址进行重定向跳转。设置响应的 Location 头,使客户端重新向指定的目标地址发送请求。 |
package com.company; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.concurrent.TimeUnit; @WebServlet("/Demo9") public class Demo9 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { // 等待三秒后跳转回到主页面 TimeUnit.SECONDS.sleep(3); }catch (Exception e){ e.printStackTrace(); } // 本站资源进行跳转 // resp.sendRedirect("/com_alphamilk_war_exploded/Demo8"); // 外部站点资源进行跳转 resp.sendRedirect("https://blog.csdn.net/dogxixi?spm=1000.2115.3001.5343"); } }
编辑
访问后就自动跳转到CSDN中·编辑
response对象重定向的特点(sendRedirect)
- 地址栏会发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是二次请求,但是重定向后不能使用request的共享变量
request对象的请求转发特定(Forward)
- 地址栏不会发生变化
- 转发只能访问当前服务器下的资源
- 转发是一次请求
3.路径
相对路径(通过访问当前的资源和目标的资源之间的相对位置关系):
- 同级目录:. /资源名称
- 后退一个目录: . . /资源名称
特点:无法确定唯一的资源
绝对路径:根据请求对象分类
- 如果是客户端浏览器访问的就需要加上虚拟目录
- 如果是服务器自行使用则不需要加虚拟目录
特点:通过绝对路径可以确定唯一的资源.
注意:但是在重定向时,为了保证跳转的准确性,需要将虚拟目录包含在重定向的路径中。例如:resp.sendRedirect("/context_path/Demo8")
。
问题引出:
由于为了重定向的准确性,一般会在重定向的路径中加入虚拟目录,但是如果虚拟目录经常发生变化,就需要相应的所有有关的路径全部修改,会造成大量的时间浪费,所以引入了动态路径的概念。具体原理是通过request对象的方法的获取路径getContextPath+/资源名。
案例代码:
package com.company; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.concurrent.TimeUnit; @WebServlet("/Demo9") public class Demo9 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { // 等待三秒后跳转回到主页面 TimeUnit.SECONDS.sleep(3); }catch (Exception e){ e.printStackTrace(); } // 本站资源进行跳转(动态路径) resp.sendRedirect(req.getContextPath()+"/Demo5"); } }
4.服务器输出数据到浏览器
通过流输出内容,具体方法如下:
方法名称 | 描述 |
getWriter() | 获取字符输出流,用于向客户端发送字符数据。 |
getOutputStream() | 获取字节输出流,用于向客户端发送字节数据。 |
1.通过字符流实现数据发送
package com.company; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/Demo10") public class writer extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 创建字符流输出对象 PrintWriter writer = resp.getWriter(); // 输出数据 writer.write("<h1>Hello World</h1>" + "<h1>你好 世界</h1>"); writer.close(); } // 统一方法操作 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
编辑
可以发现用了字符流输出中文的时候出现了乱码,原因在于:使用编码的字符集不一致(字符集使用的是GBK 而流使用的是ISO - 8859-1),只需要告诉浏览器服务器用的编码方式,浏览器就会自动进行相应编码转换
修改后代码
package com.company; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/Demo10") public class writer extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 告诉浏览器服务器使用编码方式是utf-8 resp.setHeader("content-type","text/html;charset=utf-8"); // 创建字符流输出对象 PrintWriter writer = resp.getWriter(); // 输出数据 writer.write("<h1>Hello World</h1>" + "<h1>你好 世界</h1>"); writer.close(); } // 统一方法操作 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req, resp); } }
编辑
2.字节流发送数据
原理同上
案例:
package com.company; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.nio.charset.StandardCharsets; @WebServlet("/Demo11") public class writeByte extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 告诉浏览器编码格式为utf-8 resp.setHeader("content-type","text/html;charset=utf-8"); // 创建字节流 ServletOutputStream sos = resp.getOutputStream(); // 使用字节流输出 sos.write("你好啊".getBytes(StandardCharsets.UTF_8)); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } }