zoukankan      html  css  js  c++  java
  • day09_request&response学习笔记

    一、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 + "	" + 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] + "	");
    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对象解决乱码的应用:
          
  • 相关阅读:
    LwIP源代码文件目录解析
    规划2014!
    test
    111
    df
    第一次北京之行
    Android02--debug.keystore的注册信息
    Android01--开发环境搭建
    dfd
    1007
  • 原文地址:https://www.cnblogs.com/chenmingjun/p/8994513.html
Copyright © 2011-2022 走看看