01、HttpServletResponse
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的response对象。
request和response对象既然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象即可。
HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送响应状态码(即响应行)、发送响应头、发送数据的方法。
查看servlet文档的HttpServletResponse中主要方法有:
setStatus() // 发送状态码
setHeader() //发送响应头
getWriter() //发送字符流数据,从父对象继承的方法,Servlet程序可以按字符形式输出响应正文。
getOutputStream() //发送字节流数据,从父对象继承的方法,字节流可以写任何数据,但是字符流只能写字符串。比如电影只能通过字节流写出。
getWriter()和getOutputStream()方法的区别:
getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。 getOutputStream方法返回的字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。 getWriter方法将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返回,PrintWriter对象可以直接输出字符文本内容。 Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。 Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
02、response的OutputStream输出数据的问题
向客户端输出中文数据
以OutputStream方式向客户端浏览器输出数据:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data="中国";
OutputStream out=response.getOutputStream();
out.write(data.getBytes("UTF-8")); //只能写字节,把data变成字节,采用全球通用的UTF-8方式编码
}
显示结果是乱码!
应为客户端向服务器发送请求,servlet产生数据“中国”,并查询UTF-8,比如说得到中98,国99,然后返回给客户端浏览器,客户端浏览器不知道查那个码表,默认查询GB2312(这个编码方式可以在浏览器端更改,比如IE,可以在查看》编码里更改,若更改为UTF-8,则显示正常!),则会出现显示乱码的问题。
改正方法:程序中发一个头,来控制浏览器的编码方法。
即在上述程序中加入:response.setHeader("Content-type", "text/html;charset=UTF-8"); //程序以什么码表输出,程序就一定要控制浏览器以什么编码方式显示!
OK,显示正常!
注意,如果错写为:response.setHeader("Content-type", "text/html,charset=UTF-8"); 浏览器会提示下载!
html中<meta>标签可以模拟一个http响应头,来控制浏览器!
在实际开发中,也可以不发响应头来控制浏览器,可以在浏览器页面里面写一个<meta>标签,通过<meta>标签来控制浏览器。
即:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String data="这是第一个数据";
OutputStream out=response.getOutputStream();
out.write("<meta http-equiv='content-type' content='text/html;charset=UTF-8'>".getBytes());
out.write(data.getBytes("UTF-8"));
}
注意,如果你想向浏览器输出数字1,
这么写: out.write(1);//服务器直接向浏览器返回1,浏览器查默认码表,生成乱码, 得不到正确的结果,应该写out.write(1+"");将其变为字符串。