首页 > 学院 > 开发设计 > 正文

java学习笔记—HttpServletResponse和HttpServletRequest(14)

2019-11-14 23:25:52
字体:
来源:转载
供稿:网友
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指定的路径继续发送请求以字节流的方式获取图片。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表