============================================================

一、HttpServletResponse接口

p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New Roman"; font-size: 10.5000pt }
h1 { margin-top: 17.0000pt; margin-bottom: 16.5000pt; page-break-after: avoid; text-align: justify; line-height: 240%; font-family: "Times New Roman"; font-weight: bold; font-size: 22.0000pt }
h2 { margin-top: 13.0000pt; margin-bottom: 13.0000pt; page-break-after: avoid; text-align: justify; line-height: 172%; font-family: Arial; font-weight: bold; font-size: 16.0000pt }
h3 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 13.5000pt }
span.10 { font-family: "Times New Roman" }
span.15 { font-family: "Times New Roman"; color: rgb(0,0,255); text-decoration: underline }
span.msoIns { text-decoration: underline; color: blue }
span.msoDel { text-decoration: line-through; color: red }
div.Section0 { }

    学好HttpServletResponseHttpServletRequest的关键是:理解HTTP协议。
 
    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
    (注意:request和response分别表示的是对象名,实际上不是对象)
 
    request和response对象既然代表请求和响应,
    那我们要获取客户端提交过来的数据,只需要找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) 获取相同请求消息头名称的信息值

  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" 最好。
============================================================

day09_request&response学习笔记的更多相关文章

  1. (学习笔记)laravel 中间件

    (学习笔记)laravel 中间件 laravel的请求在进入逻辑处理之前会通过http中间件进行处理. 也就是说http请求的逻辑是这样的: 建立中间件 首先,通过Artisan命令建立一个中间件. ...

  2. ASP.Net开发基础温故知新学习笔记

    申明:本文是学习2014版ASP.Net视频教程的学习笔记,仅供本人复习之用,也没有发布到博客园首页. 一.一般处理程序基础 (1)表单提交注意点: ①GET通过URL,POST通过报文体: ②需在H ...

  3. ASP.Net MVC开发基础学习笔记:一、走向MVC模式

    一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...

  4. Android M Permission 运行时权限 学习笔记

    Android M Permission 运行时权限 学习笔记 从Android 6.0开始, 用户需要在运行时请求权限, 本文对运行时权限的申请和处理进行介绍, 并讨论了使用运行时权限时新老版本的一 ...

  5. 操作系统学习笔记(五)--CPU调度

    由于第四章线程的介绍没有上传视频,故之后看书来补. 最近开始学习操作系统原理这门课程,特将学习笔记整理成技术博客的形式发表,希望能给大家的操作系统学习带来帮助.同时盼望大家能对文章评论,大家一起多多交 ...

  6. 初学c# -- 学习笔记(一)

    初学c# -- 学习笔记(一) 学习C#了,参考许多资料,一步步学习.这一段学习ajax的工作原理,参照其他例子写了web版的群聊小程序,全部文件代码也就不到300行,很简单.使用时先输入用户名,点确 ...

  7. 测试Servlet生命周期学习笔记

    测试环境:windows xp旗舰版 软件环境:myclipse8.5+tomcat7.0 ****************************************************** ...

  8. Rest API 开发 学习笔记(转)

    Rest API 开发 学习笔记 概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着 ...

  9. Python核心编程第三版第二章学习笔记

    第二章 网络编程 1.学习笔记 2.课后习题 答案是按照自己理解和查阅资料来的,不保证正确性.如由错误欢迎指出,谢谢 1. 套接字:A network socket is an endpoint of ...

随机推荐

  1. (NO.00004)iOS实现打砖块游戏(十):砖块!更多的砖块!

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 到目前为止游戏基本可玩,但是砖块数量是不变的,等玩家打光所有的砖 ...

  2. Docker教程:docker machine的配置和命令

    http://blog.csdn.net/pipisorry/article/details/50921335 安装virtualbox 如果要使用virtualbox,首先要安装virtualbox ...

  3. Fresco图片框架内部实现原理探索

    流行的网络框架 目前流行的网络图片框架: Picasso.Universal Image Loader.Volley的(ImageLoader.NetworkImageView).Glide和Fres ...

  4. pig函数以及关键字 的一些实例应用的总结(来自pig笔记)

    http://wenku.baidu.com/link?url=yb7KnpSj9nHxWk_MsEVUezvB24evRf9wR87FX0dTT77pGXNXi6k3o_kTmAkBrpIHTqo6 ...

  5. Integration between SharePoint 2013 and CRM 2013 (On-Premise)

    具体步骤可见下面的链接 https://community.dynamics.com/crm/b/msdynamicscrmtips/archive/2014/01/27/integration- ...

  6. Oracle中使用游标获取指定数据表的所有字段名对应的字符串

    操作步骤:打开PLSQL Developer后,直接执行下面的语句就可以出来 --Oracle中使用游标获取指定数据表的所有字段名对应的字符串 declare mytablename VARCHAR( ...

  7. Socket编程实践(6) --TCP服务端注意事项

    僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...

  8. 数据结构-自平衡二叉查找树(AVL)详解

    介绍: 在计算机科学中,AVL树是最先发明的自平衡二叉查找树. 在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树. 查找.插入和删除在平均和最坏情况下都是O(log n).增 ...

  9. Android 使用com.j256.ormlite

    在web开发中经常采用的hibernate,在android也提供了一个ormlite 导入所需jar包后 /** * SQLiteHelperOrm.java * 版权所有(C) 2014 * 创建 ...

  10. 学习pthreads,管理线程的栈

    进程的地址空间分成代码段,静态数据段,堆和栈段.线程栈的位置和大小是从它所属的进程的栈中切分出来的.每个栈必须足够大,以容纳所有对等线程的函数的执行以及它们将会调用的例程链.或许你会问为什么要进行线程 ...