response输出字符到浏览器
# 55.response输出字符到浏览器
本文说明下如何输出字符数据到浏览器上显示
# 入门
输出字符的步骤:
- 获取字符输出流
- 通过流输出数据
使用这个流不用flush,因为Servlet响应后会调用flush并销毁这个流。
package com.peterjxl.response;
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;
import java.io.PrintWriter;
@WebServlet("/responseDemo4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.获取字符输出流
PrintWriter writer = resp.getWriter();
// 2.通过流输出数据
writer.write("Hello Response");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
重启服务器,访问http://localhost:8080/hello/responseDemo4,可以看看浏览器上显示了字符
也可以显示HTML字符串:
// writer.write("Hello Response");
writer.write("<h1>This is HTML</h1>");
1
2
2
# 乱码问题
如果我们输出中文,会发现浏览器上是乱码的:
writer.write("<h1>This is HTML</h1>");
writer.write("<h1>从01开始</h1>");
1
2
2
为什么乱码?
- 客户浏览器使用的编码是自己系统本身的编码,例如在国内,经常是GBK;
- 而服务器使用的是国外的编码(Tomcat是国外的),
PrintWriter pw = response.getWriter();
获取的流的默认编码是ISO-8859-1; - 最后解码失败,导致乱码
解决方法:
- 获取流之前,设置response的默认编码
- 告诉浏览器响应体使用的编码,建议浏览器使用该编码来解析数据
例如,我们设置编码为GBK:
resp.setCharacterEncoding("GBK");
// 1.获取字符输出流
PrintWriter writer = resp.getWriter();
// 2.通过流输出数据
writer.write("<h1>This is HTML</h1>");
writer.write("<h1>从01开始</h1>");
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
重启Tomcat,访问效果如下:
并不推荐设置response对象的编码格式。目前没有乱码是因为我们在国内访问,大部分使用的都是国内的编码;而如果是国外访问,则又会乱码了。
推荐的方式是设置编码并告诉浏览器,服务器用的是什么编码:
resp.setHeader("content-type", "text/html;charset=utf-8");
// 1.获取字符输出流
PrintWriter writer = resp.getWriter();
// 2.通过流输出数据
writer.write("<h1>This is HTML</h1>");
writer.write("<h1>从01开始</h1>");
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
使用setHeader不仅仅告诉浏览器响应消息用的是什么类型,也顺便设置了response的类型,因此我们可以省略设置编码的代码:resp.setCharacterEncoding("GBK");
也可以使用这个写法设置header:
resp.setContentType("text/html;charset=utf-8");
1
上次更新: 2024/5/31 07:54:05