一、request概述

  request是Servlet.service()方法的一个参数,类型为javax.servlet.http.HttpServletRequest。在客户端发出每个请求时,服务器都会创建一个request对象,并把请求数据封装到request中,然后在调用Servlet.service()方法时传递给service()方法,这说明在service()方法中可以通过request对象来获取请求数据

  通过抓包工具抓取Http请求

  因为request代表请求,所以我们可以通过该对象分别获得Http请求的请求行,请求头和请求体。

二、request的功能

2.1 获取请求行信息

  • request.getMethod():获取请求方式

  • request.getRemoteAddr():获取客户端IP

  • String getContextPath():获取项目名

  • String getQueryString():获取参数部分(username=xxx&password=yyy),post请求获得的是null

  • String getRequestURL():获取请求URL,等于不包含参数的整个请求路径(http://localhost:8080/day10_2/AServlet)

  • String getRequestURI():获取请求URI,等于项目名+Servlet路径(/day10_2/AServlet)

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 获得请求方式
    String method = request.getMethod();
    System.out.println("method:" + method);
    // 获得请求的资源相关的内容
    String requestURI = request.getRequestURI();
    StringBuffer requestURL = request.getRequestURL();
    System.out.println("uri:" + requestURI); //uri:/Day04/line
    System.out.println("url:" + requestURL); //url:http://localhost:8080/Day04/line
    // 获得web应用的名称
    String contextPath = request.getContextPath(); //web应用:/Day04
    System.out.println("web应用:" + contextPath);
    // 地址后的参数的字符串
    String queryString = request.getQueryString(); //username=zhangsan&password=123
    System.out.println(queryString);
    // 获得客户机的信息——获得访问者IP地址
    String remoteAddr = request.getRemoteAddr();
    System.out.println("IP:" + remoteAddr); //IP:0:0:0:0:0:0:0:1
    }

2.2 获取请求头信息

  • String getHeader(String name):获取指定名称的请求头

    request.getHeader("referer") -->可用于防盗链

  • Enumeration getHeaderNames():获取所有请求头名称

2.3 获取请求体信息

【客户端传递参数的方式】

  • 浏览器地址栏直接输入:一定是GET请求;
  • 超链接:一定是GET请求;
  • 表单:可以是GET,也可以是POST,这取决与<form>的method属性值;

【GET请求和POST请求的区别】

  GET请求:

    • 请求参数会在浏览器的地址栏中显示,所以不安全;
    • 请求参数长度限制长度在1K之内;
    • GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

  POST请求:

    • 请求参数不会显示浏览器的地址栏,相对安全;
    • 请求参数长度没有限制;

【常用API】

  • String getParameter(String name):获取指定名称的请求参数值,适用于单值请求参数

  • String[] getParameterValues(String name):获取指定名称的请求参数值,适用于多值请求参数

  • Enumeration<String> getParameterNames():获取所有请求参数名称

  • Map<String,String[]> getParameterMap():获取所有请求参数,其中key为参数名,value为参数值

【解决中文乱码】

  • post请求:

    request.setCharacterEncoding(“UTF-8”);
  • get请求:

    String name = request.getParameter(“name”)
    name = new String(name.getBytes(“iso-8859-1”), “utf-8”)

2.4 其他功能

【request是一个域对象】(作用范围:一次请求中)

  • void setAttribute(String name, Object value):用来存储一个对象
  • Object getAttribute(String name):用来获取request中的数据
  • void removeAttribute(String name):用来移除request中的域属性
  • Enumeration getAttributeNames():获取所有域属性的名称

【request完成请求转发】

  • 获得请求转发器:RequestDispatcher rd = request.getRequestDispatcher(String path);——path是转发的地址
  • 通过转发器对象转发:rd.forward(request,response)

    请求转发和重定向的区别:

       *请求转发是一个请求一次响应,而重定向是两次请求两次响应

       *转发地址栏不变化,而重定向显示后一个请求的地址

       *转发只能转发到本项目其它servlet,而重定向不只能重定向到本项目的其它servlet,还能定向到其它项目

       *转发是服务器端行为,只需给出转发的servlet路径,而重定向要给出request URI,即包含项目名

       *转发的效率高,因为是一个请求

JavaWeb学习笔记(五)—— request的更多相关文章

  1. JavaWeb学习笔记四 request&response

    HttpServletResponse 我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应res ...

  2. JavaWeb学习笔记五 会话技术Cookie&Session

    什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...

  3. JavaWeb学习笔记总结 目录篇

    JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...

  4. javaweb学习笔记整理补课

    javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ...

  5. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

  6. (转)Qt Model/View 学习笔记 (五)——View 类

    Qt Model/View 学习笔记 (五) View 类 概念 在model/view架构中,view从model中获得数据项然后显示给用户.数据显示的方式不必与model提供的表示方式相同,可以与 ...

  7. java之jvm学习笔记五(实践写自己的类装载器)

    java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(五) indigo computer vision

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Typescript 学习笔记五:类

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  10. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

随机推荐

  1. iPython notebook 安装使用

    pip install jupyter jupyter notebook --allow-root

  2. UML类图介绍及简单用法

    原文链接 一.类的属性的表示方式 在UML类图中,类使用包含类名.属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和em ...

  3. 1-3 并发与高并发基本概念.mkv

  4. google/dense_hash_map

    这个库使用时需要注意的地方: 1.在插入数据之前,需要先调用set_empty_key()设置一个空Key,Key的值可以为任意符合类型的.但请注意之后插入的Key不能和空Key相同,否则会abort ...

  5. 【总结整理】pv、uv

    1.pv的全称是page view,译为页面浏览量或点击量,通常是衡量一个网站甚至一条网络新闻的指标.用户每次对网站中的一个页面的请求或访问均被记录1个PV,用户对同一页面的多次访问,pv累计.例如, ...

  6. Ros学习——移动机器人Ros导航详解及源码解析

    1 执行过程 1.运行仿真机器人fake_turtlebot.launch:加载机器人模型——启动机器人仿真器——发布机器人状态 2.运行amcl节点fake_amcl.launch:加载地图节点ma ...

  7. 在Asp.Net中使用amChart统计图

    怎么在自己的ASP.NET页面插入可动态更新的数据统计图呢?网上的资源倒是不少(Fusioncharts.amCharts……),在这些资源中有一个比较好用:amChart,这个工具很炫,还能与用户交 ...

  8. PHP+SOCKET 模拟HTTP请求

    HTTP消息结构 客户端请求包括四部份:请求行(状态行).请求头.空行.请求主体(数据),如下图: 服务端响应包括四部份:响应行(状态行).响应头.空行.响应主体(数据),如图: HTTP请求方法: ...

  9. App性能测试工具使用说明-MobilePerformance

    一. 环境搭建 安装Android SDK 1.6或者1.7版本均可,建议1.7,环境变量的配置,Java SDK的安装很简单,不赘述了. 安装SDK 1.安装Android SDK: 2.安装完毕后 ...

  10. 获取表中唯一字符串uuid,可用于随机文件名

    在mysql数据库中,可以使用uuid()语句来生成一个UUID:例如:mysql> select uuid();+--------------------------------------+ ...