一、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. lazyload is not a function解决方式

    使用jQuery图片延迟加载插件时,可能会报出$("img").lazyload is not a function的错误.(关于如何使用lazyload插件,请看另外一篇文章:j ...

  2. LoadRunner 脚本开发和常用函数

    开发性能测试脚本原则.简单 正确 高效 在lr中,脚本运行是解释执行的.所以在运行时,需要先编译. 局部变量和全局变量 1.在init.action.end中定义的变量就是局部变量 2.在global ...

  3. 面试题: java多线程 背1

    如果对什么是线程.什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内. 用多线程只有一个目的,那就是更好的利用cpu的资源,因为所有的多线程代码都可以用单线程来实现.说这个话其 ...

  4. 新浪SAE高级开发者认证通过

    如题,新浪SAE高级开发者认证通过,申请的方式为提交开源项目地址,用的是如下的项目 http://jqext.sinaapp.com/ 之前该项目是部署在 mopaas 上的,在拿到高级开发者资格后迁 ...

  5. 性能优化之_android内存

    优化内存使用主要是三个原则: CPU如何操纵特定的数据类型 数据和指令需要占用多少存储空间 数据在内存中的布局方式 处理大量数据时,使用可以满足要求的最小字节数据类型,能用short就不用int,能用 ...

  6. win32多线程 (一) 线程创建与结束等待

    #include "stdafx.h"#include <Windows.h>#include <iostream> using namespace std ...

  7. pymysql模块使用---Python连接MySQL数据库

    pymysql模块使用---Python连接MySQL数据库 浏览目录 pymysql介绍 连接数据库 execute( ) 之 sql 注入 增删改查操作 进阶用法 一.pymysql介绍 1.介绍 ...

  8. 黑盒测试实践--Day1 11.25

    黑盒测试实践--Day1 今天完成任务情况: 晚上得到老师布置的本周小组作业--黑盒测试的基本要求,然后小组在上周作业建立的微信群里开了个在线的短会,主要内容如下: 组长小靳带领大家学习了这个要求 计 ...

  9. python核心编程第4章课后题答案(第二版75页)

    4-1Python objects All Python objects have three attributes:type,ID,and value. All are readonly with ...

  10. Linux下ffmpeg安装与开发配置

    Linux下ffmpeg安装与开发配置   1. ffmpeg安装 安装环境: ubuntu 12.04 (1)删除已安装的文件,避免冲突 sudo apt-get remove ffmpeg x26 ...