[置顶] JAVA Web学习3之request和response

时间:2022-05-15 14:51:38

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+"");将其变为字符串。