博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day09_request&response学习笔记
阅读量:7110 次
发布时间:2019-06-28

本文共 8816 字,大约阅读时间需要 29 分钟。

============================================================
一、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 
day09_01_HttpServletRequest
?
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
map = request.getParameterMap(); 53 54 for (Map.Entry
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地址:
我的博客园地址:
我的蚂蚁笔记博客地址:
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
你可能感兴趣的文章
读《美丽新世界》
查看>>
第三章 spring-bean之DefaultListableBeanFactory(7)
查看>>
netty http2设计深入讲解
查看>>
一、RabbitMQ核心概念
查看>>
SQL2008导入数据库,标识规范 都否的解决办法
查看>>
learning
查看>>
kafka 基础01
查看>>
UIScrollView实现图片循环滚动
查看>>
我的友情链接
查看>>
王垠:怎样写一个解释器
查看>>
解决unicodedecodeerror ascii codec can’t decode byte 0xd7 in position 9 ordinal not in range(128)...
查看>>
Redis和Memcached的区别
查看>>
Mysql 5.7.20 源码安装笔记
查看>>
CSS选择器种类及介绍
查看>>
struts2 + form 表单上传文件
查看>>
探索网络安全管理
查看>>
dedecms 模板中解析php代码
查看>>
Mysql数据库的安全配置、实用技巧
查看>>
UML用例图
查看>>
raid原理及软raid实现
查看>>