目录
Response响应对象
1.基本功能
2.重定向
3.路径
4.服务器输出数据到浏览器
设置响应行:格式为 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() | 获取字节输出流,用于向客户端发送字节数据。 |
使用输出流将数据输出到客户端浏览器。
重定向通过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");
}
}
response对象重定向的特点(sendRedirect)
- 地址栏会发生变化
- 重定向可以访问其他站点(服务器)的资源
- 重定向是二次请求,但是重定向后不能使用request的共享变量
request对象的请求转发特定(Forward)
- 地址栏不会发生变化
- 转发只能访问当前服务器下的资源
- 转发是一次请求
相对路径(通过访问当前的资源和目标的资源之间的相对位置关系):
特点:无法确定唯一的资源
绝对路径:根据请求对象分类
特点:通过绝对路径可以确定唯一的资源.
注意:但是在重定向时,为了保证跳转的准确性,需要将虚拟目录包含在重定向的路径中。例如: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");
}
}
通过流输出内容,具体方法如下:
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("Hello World
" +
"你好 世界
");
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("Hello World
" +
"你好 世界
");
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);
}
}
如果不了解字符流和字节流和打印流的知识可以在下面的章节中了解更多内容Java IO(File、字节输入输出流、字符输入输出流、打印流)附带相关面试题_Alphamilk的博客-CSDN博客