如果开发者需要获取用户的请求那么请使用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指定的路径继续发送请求以字节流的方式获取图片。
新闻热点
疑难解答