你的位置:首页 > Java教程

[Java教程]java学习笔记—HttpServletResponse和HttpServletRequest(14)


如果开发者需要获取用户的请求那么请使用HttpServletRequest接口的对象。

如果开发者需要响应用户的请求那么请使用HttpServletResponse接口的对象。

HttpServletResponse接口

该接口默认继承ServletResponse接口。该接口的主要任务是处理响应头信息、以及处理客户端请求的响应体数据和Cookie的数据传输。

ServletResponse接口中常用的方法

核心的方法是给Response对象进行数据的输出。

ServletOutputStream getOutputStream()    获取响应对象的字节输出流PrintWriter getWriter()           获取响应对象的字符流对象setContentType(String type)         指定响应的数据的内容类型setCharacterEncoding(String charset)     指定响应数据的编码方式

HttpServletResponse接口中常用的方法

设置响应状态码和响应头信息setStatus(int sc) setHeader(String name, String value)
进行请求的重定向sendRedirect(String location)
进行Cookie数据传输void addCookie(Cookie cookie)
使用URL ReWritting技术实现会话String encodeURL(String url) String encodeRedirectURL(String url)

控制响应状态码和响应头

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {     // 设置响应状态码     response.setStatus(302); // 资源临时转移     // 设置响应头信息指定资源目前的最新地址     response.setHeader("location", "/day06/index.jsp");  }

问题: 对于一个不懂HTTP协议的人而言,以上的代码是写不出来的。

可以使用以下的语句进行替换:

response.sendRedirect("/day06/index.jsp");

字节流做响应体的输出

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    // 通知浏览器以UTF-8的方式进行解码    response.setHeader("content-type", "text/html;charset=utf-8");    // 获取字节流对象    ServletOutputStream out = response.getOutputStream();    // 定义要输出的数据    String data = "hello<br/>";    // 输出数据    out.write(data.getBytes());    data = "<font color=\"blue\">this is a blue color!</font><br/>";    out.write(data.getBytes());    // 输出中文数据    data = "中国";    // 获取中文数据的UTF-8编码    out.write(data.getBytes("UTF-8")); // UTF-8  }

以上的代码中使用协议的语句可以使用以下的代码进行简化:

response.setContentType("text/html;charset=utf-8");   

以上的代码可以使用模拟HTTP协议的meta标签进行简化:

out.write("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">".getBytes());

如果使用字节流直接输出数字会怎样?

// 输出int数据int num = 65;out.write(num);

由于浏览器是一个文本软件,那么在解析数字的时候都会默认的进行字符的转换,因此以上的代码显示的是A。如果要强行的输出65,那么需要使用out.write(“65”.getBytes());

1 使用字节流输出图片

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {    // 获取网站对象    ServletContext context = this.getServletContext();    // 获取网站资源    String path = context.getRealPath("/imgs/美女.jpg");    File file = new File(path);    System.out.println(file);    // 设置响应头通知浏览器数据的处理方式    response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(file.getName(),"utf-8")); // 处理文件名乱码    // 指定字节输入流对象    FileInputStream in = new FileInputStream(file);    // 获取字节输出流对象    ServletOutputStream out = response.getOutputStream();    // 边读边写    byte [] b = new byte[1024];    int len = 0;    while((len = in.read(b)) != -1){      out.write(b, 0, len);    }    // 释放资源    in.close();  }

如果一个网站中既有图片又有文本,那么需要使用什么流?

Repsonse不可能同时获取字节流和字符流,对于以上的问题是由于HTTP通信原理没有掌握清楚才导致。浏览器发送请求处理的一定是页面,但是页面中的图片表现的形式不是字节流的方式而是<img serc=”url”/>直接发送给浏览器即可,浏览器会检索该src指定的路径继续发送请求以字节流的方式获取图片。