Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
1.1、负责向客户端(浏览器)发送数据的相关方法
getOutputStream();//字节流
getWriter();//字符流,不要处理图片,视频等数据,否则会出错
注意:1:**在服务器端,数据是以哪个码表输出的,那么就要控制客户端浏览器以相应的码表打开,比如:outputStream.write(“中国”.getBytes(“UTF-8”));使用OutputStream流向客户端浏览器输出中文,以UTF-8的编码进行输出,此时就要控制客户端浏览器以UTF-8的编码打开,否则显示的时候就会出现中文乱码,那么在服务器端如何控制客户端浏览器以以UTF-8的编码显示数据呢?可以通过设置响应头控制浏览器的行为,例如:
response.setHeader(“content-type”, “text/html;charset=UTF-8”);通过设置响应头控制浏览器以UTF-8的编码显示数据**
2:在同一个servlet内,上述方法只能获取一个或者使用完立马关闭,再使用另一个方法,否则会报异常。
3:使用getWriter()获取PrintWriter想浏览器写数据时,一定要先设定字符编码再写数据。
eg:response.setCharacterEncoding(“UTF-8”);//要先进行编码,再输出
PrintWriter out = response.getWriter();
out.wirter(“中文”);
4:*在开发过程中,如果希望服务器输出什么浏览器就能看到什么,那么在服务器端都要以字符串的形式进行输出**
eg:输出数字56
outputStream.write((56+”“).getBytes());
5:使用Response实现中文文件下载
eg:String fileName = “张家界国家森林公园.JPG”;
中文文件名要使用URLEncoder.encode方法进行编码(URLEncoder.encode(fileName, “字符编码”)),否则会出现文件名乱码。
1.2、负责向客户端(浏览器)发送响应头的相关方法
public void setStatus(int statusCode);
这个方法设置了响应的状态码,如果状态码已经被设置,新的值将覆盖当前的值。
public void setHeader(String name, String value);
用一个给定的名称和域设置响应头。如果响应头已经被设置,新的值将覆盖当前的值。
1.3 、一些细节问题
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。