> 文章列表 > ServletAPI详解(四)-HttpServletResponse

ServletAPI详解(四)-HttpServletResponse

大家好啊,今天咱们来聊聊Servlet中的(HttpServletResponse)那些事儿!作为一名新手,你可能会有疑问,为什么我的页面总是显示乱码?别急,今天我来告诉你答案!

先别急着写代码,你得先明白,HTTPServletResponse就像是一个“快递小哥”,负责把数据送到客户端(比如浏览器)。而字符编码设置就像是快递单上的地址,告诉浏览器怎么读取你的数据。如果你没填地址,或者填错了地址,快递小哥当然不知道该怎么送,结果自然就是乱码!

那怎么设置呢?简单!用setCharacterEncoding("UTF-8")这个方法就行了!就像这样:

resp.setCharacterEncoding("UTF-8");

对了,别忘了还要设置一下内容类型,告诉浏览器这是HTML页面,这样浏览器才知道怎么渲染你的页面。代码是这样的:

resp.setContentType("text/html; charset=UTF-8");

记住,这两个设置必须在你往页面写内容之前就设置好,否则就白忙活了!

还有一个小提示,如果你在用重定向,比如sendRedirect("http://www.baidu.com"),这时候浏览器会自动跳转到新的页面,这中间也会涉及到页面编码的问题,所以同样要注意设置好编码哦!

概括来讲,:编码设置是门艺术,设置的好,页面显示清晰;设置的不好,只能看乱码了。快去试试吧,让浏览器认准你的页面!

最后,别忘了,代码不仅要写得聪明,还得写得优雅!大家有什么问题尽管问,咱们一起解决!

ServletAPI详解(四)-HttpServletResponse

我们来看第三个方法,HttpServletResponse

在servlet运行原理中提到,servlet代码中的doXXX方法的目的就是根据请求计算响应,然后将响应数据设置到HttpServletResponse对象中,然后 Tomcat 就会把这个 HttpServletResponse 对象按照 HTTP 协议的格式, 转成一个字符串, 并通过 Socket 写回给浏览器

下列方法可以设置响应头,这些方法通过HttpServletResponse对象可用

序号 方法 & 描述
1 String encodeRedirectURL(String url)
为 sendRedirect 方法中使用的指定的 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
2 String encodeURL(String url)
对包含 session 会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变。
3 boolean containsHeader(String name)
返回一个布尔值,指示是否已经设置已命名的响应报头
4 boolean isCommitted()
返回一个布尔值,指示响应是否已经提交。
5 void addCookie(Cookie cookie)
把指定的 cookie 添加到响应。
6 void addDateHeader(String name, long date)
添加一个带有给定的名称和日期值的响应报头。
7 void addHeader(String name, String value)
添加一个带有给定的名称和值的响应报头。
8 void addIntHeader(String name, int value)
添加一个带有给定的名称和整数值的响应报头。
9 void flushBuffer()
强制任何在缓冲区中的内容被写入到客户端。
10 void reset()
清除缓冲区中存在的任何数据,包括状态码和头。
11 void resetBuffer()
清除响应中基础缓冲区的内容,不清除状态码和头。
12 void sendError(int sc)
使用指定的状态码发送错误响应到客户端,并清除缓冲区。
13 void sendError(int sc, String msg)
使用指定的状态发送错误响应到客户端。
14 void sendRedirect(String location)
使用指定的重定向位置 URL 发送临时重定向响应到客户端。
15 void setBufferSize(int size)
为响应主体设置首选的缓冲区大小。
16 void setCharacterEncoding(String charset)
设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8。
17 void setContentLength(int len)
设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头。
18 void setContentType(String type)
如果响应还未被提交,设置被发送到客户端的响应的内容类型。
19 void setDateHeader(String name, long date)
设置一个带有给定的名称和日期值的响应报头。
20 void setHeader(String name, String value)
设置一个带有给定的名称和值的响应报头。
21 void setIntHeader(String name, int value)
设置一个带有给定的名称和整数值的响应报头。
22 void setLocale(Locale loc)
如果响应还未被提交,设置响应的区域。
23

void setStatus(int sc)
为该响应设置状态码。

24

void setCharacterEncoding(String charset)

设置被发送到客户端的响应的字符编码(MIME 字符集)例如, UTF-8

25

void sendRedirect(String location)

使用指定的重定向位置 URL 发送临时重定向响应到客户端。

3XX的状态码,浏览器会跳转到新的地址

26

PrintWriter getWriter()

用于往 body 中写入文本格式数据

27

OutputStream getOutputStream()

用于往 body 中写入二进制格式数据

void setCharacterEncoding(String charset)

 重启服务器后输入URL,发现不能正确识别中文 

如果URL中有中文字符,没有设置UTF8,返回的响应就会出现乱码,浏览器默认不知道字符的编码方式,要通过方法显示的告诉浏览器,就可以正确识别了

或者直接和contenttype一起设置

 重启服务后再次刷新页面,就正常了 

注意:设置字符集和contenttype必须要在返回对象的代码上面,必须先被执行,写到下面不会生效

void sendRedirect(String location)我们使用重定向方法

@WebServlet("/redirct")
public class RedirctServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.sendRedirect("http://www.baidu.com");}
}

输入URL(http://127.0.0.1:8080/ServletHelloWorld/redirct)后会直接跳转到百度页面

通过抓包我们可以看到响应中有个Location,这个就代表重定向的地址

keep-Alive是建议浏览器和服务器之间保持长连接,短链接是每个连接只进行一次请求和响应,长连接可以进行多次请求和响应 

我们也可以不用sendRedirect方法,分步进行,可以先设置状态码,再设置Location

 重新启动服务器,输入后发现效果是相同的