request
request概述:
request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据
response
response概述:
response是Servlet.service方法的一个参数,类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时,服务器都会创建一个response对象,并传入给Servlet.service()方法。response对象是用来对客户端进行响应的,这说明在service()方法中使用response对象可以完成对客户端的响应工作
HttpServletResponse的应用
调用getOutputStream()方法向浏览器输出数据
调用getOutputStream()方法向浏览器输出数据,getOutputStream()方法可以使用print()也可以使用write(),它们有什么区别呢?
使用servletOutputStream.print()
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletOutputStream流对象
ServletOutputStream servletOutputStream = resp.getOutputStream();
//输出到浏览器
servletOutputStream.print("Hello,World");
}
}
可以输出
试着输出中文,却出现异常了
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取ServletOutputStream流对象
ServletOutputStream servletOutputStream = resp.getOutputStream();
//输出到浏览器
servletOutputStream.print("你好,世界");
}
}
异常信息如下:
<h1>HTTP Status 500 - Not an ISO 8859-1 character: 你</h1>
为什么会出现异常呢?在io中我们学过,outputStream是输出二进制数据的,print()方法接收了一个字符串,print()方法要把“中国”改成二进制数据,Tomcat使用IOS 8859-1编码对其进行转换,“你好,世界”根本对ISO 8859-1编码不支持。所以出现了异常。
使用servletOutputStream.write()
response.getOutputStream().write("Hello,World".getBytes());
没有问题,再测试输出中文
resp.getOutputStream().write("你好,世界".getBytes());
也没有问题
为什么使用write()方法能够正常向浏览器输出中文呢?"你好,世界".getBytes()这句代码在转成byte[]数组的时候默认查的是gb2312编码,而"你好,世界"支持gb2312编码,所以可以正常显示出来。
但是,程序要实现通用性,应该使用的是UTF-8编码,我们在字符串转换成字节数组时指定UTF-8编码,看看会怎么样。
resp.getOutputStream().write("你好,世界".getBytes("UTF-8"));
发现也是乱码
为什么它变成了乱码呢?
原因是这样的:我在向服务器输出的中文是UTF-8编码的,而浏览器采用的是GBK,GBK显示UTF-8的中文数据?没告诉浏览器你要显示UTF-8编码时,你要输出UTF-8不乱码才怪。既然这这样.
1、我可以修改代码设置输出编码是GBK
resp.getOutputStream().write("你好,世界".getBytes("GBK"));
2、也可以去修改浏览器的编码,同样可以正常显示中文。
乱码问题又解决了。可是,很多时候我们都是使用UTF-8的编码格式,使用UTF-8程序时都要去网页上改编码格式吗?这样明显不可能的。
既然HTTP响应有对浏览器说明回送数据是什么类型的消息头,那么HttpServletResponse对象就应该有相对应的方法告诉浏览器回送的数据编码格式是什么。浏览器在显示数据时,自动把页面的编码格式置换成UTF-8,乱码问题也解决了。
resp.setHeader("Content-Type","text/html;charset=UTF-8");
resp.getOutputStream().write("你好,世界".getBytes("UTF-8"));
Servlet有那么多方法解决乱码问题,是不是有一种是最简便的呢?没错!下面这个方法是最简便的,它不仅设置浏览器用UTF-8显示数据,内部还把中文转码的码表设置成UTF-8了,也就是说,response.setContentType("text/html;charset=UTF-8");把response.setCharacterEncoding("UTF-8")的事情也干了!
使用getWriter()显示中文数据,设置resp.setContentType("text/html;charset=UTF-8");就可以了。
resp.setContentType("text/html;charset=UTF-8");
//获取printWriter对象
PrintWriter printWriter = resp.getWriter();
printWriter.write("看完记得点个赞吧");