您现在的位置是:首页 > 文章详情

day09_request&response学习笔记

日期:2018-05-04点击:339
============================================================
一、HttpServletResponse接口
学好HttpServletResponseHttpServletRequest的关键是:理解HTTP协议。
 
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
(注意:request和response分别表示的是对象名,实际上不是对象)
 
requestresponse对象既然代表请求和响应,
那我们要获取客户端提交过来的数据,只需要找request对象就行了。
要向容器(服务器)输出数据,只需要找response对象就行了。
 
因为每一的请求都会调用一次service(request, response)方法。
方法的形参request和response是由服务器创建的,在service执行之前就已经创建好了,分别是两个对象(是不需要new的,服务器帮你干了)。

1、响应消息行  HTTP/1.1  200 OK

HTTP/1.1 200 OK
协议/版本 响应状态码 对响应码的描述(一切正常)
 
HttpServletResponse接口的方法:
void setStatus(int sc) 设置响应状态码
response.setStatus(302);
response.setHeader("location", "url");
// 上面两句代码等价于下面一句
response .sendRedirect("location");
Location:http://www.it315.org/index.jsp 指示新的资源的位置通常和302/307一起使用,完成请求重定向
 
请求转发和请求重定向图解:

2、响应消息头

HttpServletResponse接口的方法:
void sendRedirect(String location) 请求重定向
void setHeader(String name, String value) 设置响应消息头信息
// 设置客户端(浏览器)使用什么编码(通过响应消息头设置)
response.setHeader("content-type", "text/html; charset=UTF-8");
// 告知客户端不缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);
Referesh 刷新

3、响应正文(主体)

ServletResponse接口的方法:
PrintWriter getWriter() 获取字符输出流
ServletOutputStream getOutputStream() 获取字节输出流
void setCharacterEncoding(String charset) 设置服务器使用什么编码
String setContentType(String type)  设置将发送到客户端的响应的内容类型(同时设置客户端和服务端要使用的编码)
    例如: response.setContentType("text/html; charset=UTF-8");
 
URLEncoder是HTML格式编码的实用工具类,该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。

案例1:向客户端输出中文数据:用PrintWriter(字符流)发送数据

案例2:向客户端输出中文数据:用OutputStream(字节流)发送数据

案例3:客户端下载文件

案例4:自己编写代码实现客户端网页显示验证码

 案例5:通过验证码工具类实现客户端网页显示验证码

 

案例6:实现定时刷新

 

4、response的几处细节

1. getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。

2. getOutputStream和getWriter这两个方法 互相排斥 ,调用了其中的任何一个方法后,就不能再调用另一方法。否则会抛异常。
3. Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,
    Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头 组合 后输出到客户端。
4. Serlvet的service方法结束后,Servlet引擎将检查getOutputStream或getWriter方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
  ( 注:这里的Servlet引擎就是Tomcat服务器
============================================================

二、HttpServletRequest

1、请求消息行  

Get  http://localhost:8080/ day09_01_HttpServletRequest /servlet/req1 ? username=zs&pwd=123  HTTP/1.1
HttpServletRequest接口的方法:
String getMethod()  获取请求行的请求方式
String getRequestURL()  返回客户端发出请求时的完整 URL
String getRequestURI()  返回请求消息行中的资源名部分(8080之后所有的)
String getContextPath() 获取当前应用的虚拟目录 例如:/day09_01_HttpServletRequest
String  getQueryString()  返回请求消息行中的参数部分

2、请求消息头

HttpServletRequest接口的方法:
String getHeader(String name)  根据头名称得到头信息值
Enumeration getHeaderNames() 获取 所有请求消息头的 name
Enumeration getHeaders(String name) 获取 相同请求消息头名称的信息值
 1 package com.itheima.servlet;  2  3 import java.beans.IntrospectionException;  4 import java.beans.PropertyDescriptor;  5 import java.io.IOException;  6 import java.io.UnsupportedEncodingException;  7 import java.lang.reflect.InvocationTargetException;  8 import java.lang.reflect.Method;  9 import java.util.Enumeration;  10 import java.util.Map;  11  12 import javax.servlet.ServletException;  13 import javax.servlet.http.HttpServlet;  14 import javax.servlet.http.HttpServletRequest;  15 import javax.servlet.http.HttpServletResponse;  16  17 import org.apache.commons.beanutils.BeanUtils;  18  19 import com.itheima.entity.User;  20  21 public class ServletDemo3 extends HttpServlet {  22  23 public void doGet(HttpServletRequest request, HttpServletResponse response)  24 throws ServletException, IOException {  25 // 告诉服务器要使用什么码表,注:客户端浏览器使用的是什么码表,传过来给服务器的就该使用什么码表  26 request.setCharacterEncoding("UTF-8"); // 注:只能处理post请求方式  27  28  test1(request);  29  test2(request);  30  test3(request);  31  test4(request);  32  }  33  34 private void test4(HttpServletRequest request) {  35 try {  36 User u = new User();  37 System.out.println("封装数据前:" + u);  38  39  BeanUtils.populate(u, request.getParameterMap());  40  41 System.out.println("封装数据后:" + u);  42 } catch (Exception e) {  43  e.printStackTrace();  44  }  45  }  46  47 private void test3(HttpServletRequest request) {  48 try {  49 User u = new User();  50 System.out.println("封装数据前:" + u);  51 // 获取表单数据  52 Map<String, String[]> map = request.getParameterMap();  53  54 for (Map.Entry<String, String[]> m : map.entrySet()) {  55 String name = m.getKey();  56 String[] value = m.getValue();  57  58 // 反射  59 // 创建一个属性描述器对象  60 PropertyDescriptor pd = new PropertyDescriptor(name, User.class);  61 // 得到setter属性对象  62 Method setter = pd.getWriteMethod();  63  64 if (value.length == 1) {  65 setter.invoke(u, value[0]); // 给只有一个值的变量赋值  66 } else {  67 setter.invoke(u, (Object) value); // 给复选框赋值  68  }  69  }  70  71 System.out.println("封装数据后:" + u);  72  73 } catch (Exception e) {  74  e.printStackTrace();  75  }  76  }  77  78 private void test2(HttpServletRequest request) {  79 // 获取表单提交的所有的name的名称  80 Enumeration names = request.getParameterNames();  81 while (names.hasMoreElements()) {  82 String name = (String) names.nextElement(); // 得到每一个name名称  83 String[] values = request.getParameterValues(name); // 根据name名称,得到value值  84 for (int i = 0; values != null && i < values.length; i++) {  85 System.out.println(name + "\t" + values[i]);  86  }  87  }  88  }  89  90 private void test1(HttpServletRequest request) throws UnsupportedEncodingException {  91 // 获取表单数据  92 // 根据表单中name属性的名,获取value属性的值方法  93 String username = request.getParameter("username");  94 String pwd = request.getParameter("pwd");  95 String sex = request.getParameter("sex");  96 String[] hobbys = request.getParameterValues("hobby");  97 String city = request.getParameter("city");  98  99 // 解决get方式编码 100 username = new String(username.getBytes("iso-8859-1"), "UTF-8"); 101 102  System.out.println(username); 103  System.out.println(pwd); 104  System.out.println(sex); 105 106 for (int i = 0; hobbys != null && i < hobbys.length; i++) { 107 System.out.print(hobbys[i] + "\t"); 108  } 109  System.out.println(); 110 111  System.out.println(city); 112  } 113 114 public void doPost(HttpServletRequest request, HttpServletResponse response) 115 throws ServletException, IOException { 116  doGet(request, response); 117  } 118 119 }

3、请求正文(重要)

与获取表单数据相关的方法:
<input type="text" name="username" />
ServletRequest接口的方法:
String getParameter(String name)  根据表单中 name 属性的名,获取 value 属性的值
String[] getParameterValues( String name)  专为复选框获取值提供的方法
Enumeration getParameterNames() 获取 表单提交的所有的 name名
Map getParameterMap() 获取 表单提交的所有value值  ( 做框架时用,非常实用)
ServletInputStream getInputStream  以字节流的方式得到所有表单数据
 
与操作非表单数据相关的方法:(request也是一个域对象,也维护了一个Map集合,只是作用的范围较小,在当前请求范围内有效)
ServletRequest接口的方法:
void setAttribute(String name, Object value)
Object getAttribute(String name)
void removeAttribute(String name)
 

  与请求转发相关的方法:

    ServletRequest接口的方法:
//  得到请求转发或请求包含的协助对象
RequestDispatcher getRequestDispatcher(String path)
  RequestDispatcher接口的方法:
void forward(ServletRequest request, ServletResponse response) //  转发的方法
void include(ServletRequest request, ServletResponse response) //  请求包含
 
  与请求编码相关的方法:
    ServletRequest接口的方法:
  // 解决post提交方式的编码
  request.setCharacterEncoding("UTF-8"); //  告诉服务器要使用什么码表,注: 只能处理 post 请求方式
  //  解决 get提交 方式的编码(需要一个一个变量的转换,麻烦,用的不多,一般用在地址栏上明文写的链接上,因为明文是get方式提交)
  String name = new String(name.getBytes(" iso-8859-1" ), " UTF-8" );
 
  注:一般而言,默认是get提交方式,所以我们在写表单的html代码时,要立即把表单的属性method="post" 最好。
 
request与response对象解决乱码的应用:
============================================================

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
原文链接:https://yq.aliyun.com/articles/607453
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章