Servlet中request请求

【网络原理】HTTP 请求 (Request)详解 【网络原理】HTTP 请求 (Request)详解,认识URLquery string关于 URL encode, GET方法,POST 方法,GET 和 POST 的区别,User-Agent (简称 UA),Referer,Cookie 阅读详情

请求响应流程图


request请求

request概述

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


request的功能可以分为以下几种:

l  封装了请求头数据;

l  封装了请求正文数据,如果是GET请求,那么就没有正文;

l  request是一个域对象,可以把它当成Map来添加获取数据;

l  request提供了请求转发和请求包含功能。

request域方法

request是域对象!在JavaWeb中一共四个域对象,其中ServletContext就是域对象,它在整个应用中只创建一个ServletContext对象。request其中一个,request可以在一个请求中共享数据。

一个请求会创建一个request对象,如果在一个请求中经历了多个Servlet,那么多个Servlet就可以使用request来共享数据。现在我们还不知道如何在一个请求中经历几个Servlet,后面在学习请求转发和请求包含后就知道了。

下面是request的域方法:


l  void setAttribute(String name, Object value):用来存储一个对象,也可以称之为存储一个域属性,例如:servletContext.setAttribute(“xxx”, “XXX”),在request中保存了一个域属性,域属性名称为xxx,域属性的值为XXX。请注意,如果多次调用该方法,并且使用相同的name,那么会覆盖上一次的值,这一特性与Map相同;

l  Object getAttribute(String name):用来获取request中的数据,当前在获取之前需要先去存储才行,例如:String value = (String)request.getAttribute(“xxx”);,获取名为xxx的域属性;

l  void removeAttribute(String name):用来移除request中的域属性,如果参数name指定的域属性不存在,那么本方法什么都不做;

l  Enumeration getAttributeNames():获取所有域属性的名称;

request获取请求头数据

request与请求头相关的方法有:

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

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

l  int getIntHeader(String name):获取值为int类型的请求头。


request请求相关方法

request中还提供了与请求相关的其他方法,有些方法是为了我们更加便捷的方法请求头数据而设计,有些是与请求URL相关的方法。

l  int getContentLength():获取请求体的字节数,GET请求没有请求体,没有请求体返回-1;

l  String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,表示请求体内容使用了URL编码;

l  String getMethod():返回请求方法,例如:GET

l  Locale getLocale():返回当前客户端浏览器的Locale。java.util.Locale表示国家和言语,这个东西在国际化中很有用;

l  String getCharacterEncoding():获取请求编码,如果没有setCharacterEncoding(),那么返回null,表示使用ISO-8859-1编码;

l  void setCharacterEncoding(String code):设置请求编码,只对请求体有效!注意,对于GET而言,没有请求体!!!所以此方法只能对POST请求中的参数有效!

l  String getContextPath():返回上下文路径,例如:/hello

l  String getQueryString():返回请求URL中的参数,例如:name=zhangSan

l  String getRequestURI():返回请求URI路径,例如:/hello/oneServlet

l  StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息;

l  String getServletPath():返回Servlet路径,例如:/oneServlet

l  String getRemoteAddr():返回当前客户端的IP地址;

l  String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址;

l  String getScheme():返回请求协议,例如:http;

l  String getServerName():返回主机名,例如:localhost

l  int getServerPort():返回服务器端口号,例如:8080


    System.out.println("request.getContentLength(): " + request.getContentLength());

    System.out.println("request.getContentType(): " + request.getContentType());

    System.out.println("request.getContextPath(): " + request.getContextPath());

    System.out.println("request.getMethod(): " + request.getMethod());

    System.out.println("request.getLocale(): " + request.getLocale());

       

    System.out.println("request.getQueryString(): " + request.getQueryString());

    System.out.println("request.getRequestURI(): " + request.getRequestURI());

    System.out.println("request.getRequestURL(): " + request.getRequestURL());

    System.out.println("request.getServletPath(): " + request.getServletPath());

    System.out.println("request.getRemoteAddr(): " + request.getRemoteAddr());

    System.out.println("request.getRemoteHost(): " + request.getRemoteHost());

    System.out.println("request.getRemotePort(): " + request.getRemotePort());

    System.out.println("request.getScheme(): " + request.getScheme());

    System.out.println("request.getServerName(): " + request.getServerName());

    System.out.println("request.getServerPort(): " + request.getServerPort());

 

案例:request.getRemoteAddr():封IP

  可以使用request.getRemoteAddr()方法获取客户端的IP地址,然后判断IP是否为禁用IP。

       String ip = request.getRemoteAddr();

       System.out.println(ip);

       if(ip.equals("127.0.0.1")) {

           response. getWriter().print("您的IP已被禁止!");

       } else {

           response.getWriter().print("Hello!");

       }

 

request获取请求参数

最为常见的客户端传递参数方式有两种:

l  浏览器地址栏直接输入:一定是GET请求;

l  超链接:一定是GET请求;

l  表单:可以是GET,也可以是POST,这取决与<form>的method属性值;

 

GET请求和POST请求的区别:

l  GET请求:

a.请求参数会在浏览器的地址栏中显示,所以不安全;

b.请求参数长度限制长度在1K之内;

c.GET请求没有请求体,无法通过request.setCharacterEncoding()来设置参数的编码;

l  POST请求:

a.请求参数不会显示浏览器的地址栏,相对安全;

b.请求参数长度没有限制;

 

    <a href="/hello/ParamServlet?p1=v1&p2=v2">超链接</a>

    <hr/>

    <form action="/hello/ParamServlet" method="post">

    参数1:<input type="text" name="p1"/><br/>

    参数2:<input type="text" name="p2"/><br/>

    <input type="submit" value="提交"/>

    </form>

 

下面是使用request获取请求参数的API:

l  String getParameter(String name):通过指定名称获取参数值;

 

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       String v1 = request.getParameter("p1");

       String v2 = request.getParameter("p2");

       System.out.println("p1=" + v1);

       System.out.println("p2=" + v2);

    }

   

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       String v1 = request.getParameter("p1");

       String v2 = request.getParameter("p2");

       System.out.println("p1=" + v1);

       System.out.println("p2=" + v2);   

    }

 

l  String[] getParameterValues(String name):当多个参数名称相同时,可以使用方法来获取;

<a href="/hello/ParamServlet?name=zhangSan&name=liSi">超链接</a>

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       String[] names = request.getParameterValues("name");

       System.out.println(Arrays.toString(names));

    }

 

l  Enumeration getParameterNames():获取所有参数的名字;

    <form action="/hello/ParamServlet" method="post">

    参数1:<input type="text" name="p1"/><br/>

    参数2:<input type="text" name="p2"/><br/>

    <input type="submit" value="提交"/>

    </form>

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       Enumeration names = request.getParameterNames();

       while(names.hasMoreElements()) {

           System.out.println(names.nextElement());

       }

    }

 

l  Map getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String。

<a href="/day05_1/ParamServlet?p1=v1&p1=vv1&p2=v2&p2=vv2">超链接</a>

       Map<String,String[]> paramMap = request.getParameterMap();

       for(String name : paramMap.keySet()) {

           String[] values = paramMap.get(name);

           System.out.println(name + ": " + Arrays.toString(values));

       }

p2: [v2, vv2]

p1: [v1, vv1]

 

请求转发和请求包含

无论是请求转发还是请求包含,都表示由多个Servlet共同来处理一个请求。例如Servlet1来处理请求,然后Servlet1又转发给Servlet2来继续处理这个请求。

请求转发

在AServlet中,把请求转发到BServlet:

public class AServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       System.out.println("AServlet");

       RequestDispatcher rd = request.getRequestDispatcher("/BServlet");

       rd.forward(request, response);

    }

}

public class BServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       System.out.println("BServlet");

    }

}

Aservlet

BServlet

 

请求包含

在AServlet中,把请求包含到BServlet:

public class AServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       System.out.println("AServlet");

       RequestDispatcher rd = request.getRequestDispatcher("/BServlet");

       rd.include(request, response);

    }

}

public class BServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       System.out.println("BServlet");

    }

}

Aservlet

BServlet

 

请求转发与请求包含比较

l  如果在AServlet中请求转发到BServlet,那么在AServlet中就不允许再输出响应体,即不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由BServlet来完成;如果是使用请求包含,那么没有这个限制;

l  请求转发虽然不能输出响应体,但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);

l  请求包含大多是应用在JSP页面中,完成多页面的合并;

l  请求请求大多是应用在Servlet中,转发目标大多是JSP页面;

 


请求转发与重定向比较

l  请求转发是一个请求,而重定向是两个请求;

l  请求转发后浏览器地址栏不会有变化,而重定向会有变化,因为重定向是两个请求;

l  请求转发的目标只能是本应用中的资源,重定向的目标可以是其他应用;

l  请求转发对AServlet和BServlet的请求方法是相同的,即要么都是GET,要么都是POST,因为请求转发是一个请求;

重定向的第二个请求一定是GET(超链接都是GET请求);
http请求与Request常用方法 一、http请求 HTTP请求报文由3部分组成(请求行+请求头+请求体): ①是请求方法,GET和POST是最常见的HTTP方法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持GET和POST,Spring 3.0提供了一个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP方法... 阅读详情

相关推荐

servlet中request请求对象常用API

servlet中request请求对象常用API 1、String getRequestURI() 作用:获取请求的URI地址,即:请求资源地址。 URI是资源片段,不包含协议和IP地址。 格式:/工程名称/资源路径。 String uri = request.getRequestURI(); 2、StringBuffer getRequestURL() 作用:获取请求资源的统一定位符。即:请求资源的完整地址(绝对路径)。 URL是资源的绝对路径,包含协议,IP地址,端口,URI

✅ Java 开发工程师 1025

【JavaWeb】七、Request&Response

文章目录参考资料1. Request和Response的概述2. Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式2.3 IDEA快速创建Servlet2.4 请求参数中文乱码问题2.4.1 POST请求解决方案2.4.2 GET请求解决方案2.5 Request请求转发 参考资料 https://www.bilibili.com/video/BV1Qf4y1T7

weixin_42301220的博客 2141

【Servlet篇】Request请求转发详细解读

请求转发是一种在服务器内部的资源跳转方式,如图:上图的大致过程为,浏览器发送请求给服务器,服务器中 a 资源接收到请求,资源 a 处理完请求后将请求发送给资源b,资源b处理完请求以后将结果响应给浏览器。其中请求从资源a到资源b的过程就叫做请求转发。

zhangxia_的博客 3402

Request请求

Request请求,就是客户端希望从服务器端获取资源,向服务器发出询问。在B/S架构中,就是客户浏览器向服务器发出询问。在我们的JavaEE工程中,客户浏览器发出询问,要遵循HTTP协议所规定的。 请求对象,就是在JavaEE工程中,用于发送请求的对象。我们常用的对象就是ServletRequest和HttpServletRequest,它们的区别就是是否和HTTP协议有关。是Servlet四大域之一

itzhuzhu的博客 2510

手把手教你搭建三端口DC-DC变换器(含Boost+Buck电路实战)

本文详细介绍了如何从零开始搭建三端口DC-DC变换器,涵盖Boost和Buck电路的硬件设计、元器件选型、电路板布局、焊接技巧、控制系统设计与调试等关键步骤。通过实战案例和优化建议,帮助工程师避开常见陷阱,提升系统效率和稳定性,适用于光伏、储能等电力电子应用场景。

x8y9z0的博客 929

实战:如何通过修改VTS和HTS调整GC4653 sensor帧率(附完整计算步骤)

本文以GC4653图像传感器为例,详细解析了通过修改VTS和HTS寄存器来精确调整输出帧率的完整流程。文章深入剖析了帧率计算公式FPS = PCLK / (VTS × HTS)的核心原理,并提供了从获取寄存器参数、计算目标VTS值到系统验证的实战步骤,帮助工程师掌握独立优化Sensor性能、提升低照度画质的关键技能。

gin88的博客 338

HttpServletRequest 的几种获取路径的方法

HttpServletRequest 的几种获取路径的方法

底层码农 3万+

ROS2初级面试题汇总

总结和收集了一些关于ros2的问题和解答记录

qq_57633442的博客 5555

JavaWeb《二》Servlet、Request请求

🍎道阻且长,行则将至。🍓!!!本文是javaweb的第二篇,介绍了Servlet,Servlet是JavaWeb最为核心的内容,它是Java提供的一门动态web资源开发技术。概述了Request请求与响应,并且主要分析了Request请求。

Super algorithm 的博客,技术爱好者。 936

Visual Studio Code 打开java项目

在 Visual Studio Code 中打开并运行一个 Java 项目之前,你需要确保你已经完成了一些初始设置。

2674

深入浅出:UE4类型系统完整构建过程详解

UE4的类型系统是一个复杂但设计精巧的架构,它通过静态代码生成和运行时构建的完美配合,实现了强大的反射功能。理解这个过程不仅有助于解决开发中的问题,也能让你更好地利用UE4的各种高级特性。就像建造一栋大楼需要经过设计、备料、框架、装修、验收等多个阶段,UE4类型系统的构建也是一个多阶段、精细化的过程。每个阶段都有其特定的职责,共同协作完成从源代码到运行时对象的转换。

m0_45371381的博客 911

Servlet:request请求

文章目录1.request对象和response对象的原理2. request功能2.1 获取请求消息数据2.2 其他功能 1.request对象和response对象的原理 (1). request和response对象是由服务器创建的。我们来使用它们 (2). request对象是来获取请求消息,response对象是来设置响应消息 代码:request01 package com.R...

JH灰色的博客 318

模拟IC设计避坑:手把手教你用Cadence仿真恒定跨导轨到轨运放(附完整工艺库文件)

本文详细解析了使用Cadence仿真恒定跨导轨到轨运放的全流程,涵盖电路原理、工艺库配置、尺寸设计及仿真分析。通过1:3电流镜补偿技术实现跨导稳定,提供CSMC 0.25um工艺下的实战案例,帮助工程师规避设计陷阱,提升模拟IC设计效率。

weixin_30952535的博客 494

Servlet Request请求转发

Servlet Request请求转发

阿博的博客 487

rk3576 适配摄像头 (mipi 五摄)

在RK3576上实现五路CSI摄像头方案,核心思路是充分复用其视频输入接口,并通过巧妙的软件配置来实现。

weixin_35723192的博客 178

基于STC8G1K08A单片机的7位PWM输出程序(PCA功能实现呼吸灯效果)

摘要:本文展示了基于STC8G单片机的PWM占空比控制实现。通过定时器0中断每5ms调整占空比(0-127范围),实现呼吸灯效果。关键代码包括:1)PWM初始化(7位PWM模式);2)定时器配置(1ms中断);3)主循环根据标志位动态调整占空比。硬件采用P5.4引脚输出PWM信号,通过direction标志实现占空比自动增减循环。该方案适用于LED亮度调节等场景,系统时钟24MHz,采用12T模式。

weixin_74013772的博客 864

Servlet——请求(request)与响应(response)

Servlet——请求(request)与响应(response)

weixin_45554007的博客 4420

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

五、初学servlet之请求Request

暂未添加

focusweb 306

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

浅谈servlet的生命周期 ,以及【Request请求】

 servlet 的生命周期,从创建到销毁; 在接收request的时候Tomcat调用init方法创建servlet,service对request 或response 进行处理,关闭服务器时候调用destory方法,servlet销毁;【多次请求 init()方法仅仅被调用一次】;  request 常用到的方法: // 请求头key 请求头value ...

Syntacticsugar's blog 1343

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Servlet请求处理(request对象)

import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.ser...

mengxianglong123的博客 253

Servlet Request 处理服务器的请求

本文介绍了用 Servlet request 处理服务器的请求的相关内容。。。

Regino的博客 736

request获取请求路径_Servlet的请求处理

我们编写的Servlet 代码是没有对浏览器的请求进行处理的。那么如何使用 Servlet 进行浏览器请求的处理。 Request 对象: 问题: 浏览器发起请求到服务器,会遵循HTTP协议将请求数据发送给服务器。那么服务器接受到请求的数据改怎么存储呢?不但要存,而且要保证完成性。 解决: 使用对象进行存储,服务器每接受一个请求,就创建一个对象专门的存储此次请求的请求数据。 实现: requ...

weixin_39682673的博客 258

学习笔记【JavaWeb-第七节:Servlet之请求消息、Request】

回顾网络通信三要素: IP:电子设备(计算机)在网络中的唯一标识 端口:应用程序在计算机中的唯一标识(0-65536之间) 传输协议:规定了数据传输的规则 基础协议: tcp:安全协议,三次握手。速度稍慢 udp:不安全协议,动作快 Web Web服务器软件: 服务器:安装了服务器软件的计算机 服务器软件:接受用户的请求,处理请求,作出响应。 在web服务器软件中,可以部署web项目,让用户可以通过浏览器来访问这些项目 常见的和java相关的web服务器软件 webLogic:oracle公

qq_53273362的博客 347

(HTTP请求消息)Servlet之Request

Request 请求消息数据格式 请求行 请求方式 请求url 请求协议/版本 eg:Get/hello.html HTTP/1.1 请求方式:HTTP有7种请求方式,常用两种 1. GET:请求参数在请求行种,跟在url后,请求长度有限 2. POST:请求参数在请求体中,长度没有限制 请求头 请求头名称:请求头值 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, li

ccccrj博客 269

【Servlet-0】Request对象获取请求体数据

Request对象获取请求体数据 请求体:只有POST方式,才有请求体,在请求体中封装了POST请求的请求参数 请求体的数据将其封装成流 1.获取流对象  1.获取字符输入流:只能操作字符数据   BufferedReader getReader()   2.获取字节输入流:可以操作所有类型的数据   ServletInoutStream getInputStream() 2.再从流对象中拿数据 ...

你今天真好看呀 1240

【Servlet】request对象获取请求头数据和用户数据

request对象学习 /** * request对象学习: * 作用:request对象中封存了当前请求的所有请求信息 * 使用: * 获取请求头数据 * req.getMethod();//获取请求方式 * req.getRequestURL();//获取请求URL信息 * req.getRequestURI();//获取请求URI信息...

xiaobao1352的博客 942
上一篇: Servlet中的ServletContext
下一篇: Spring中资源文件
午-夜
博客等级 码龄12年 95粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值