首页 > 其他分享 >HttpServletRequest请求对象详解(一篇就够了!!!)

HttpServletRequest请求对象详解(一篇就够了!!!)

时间:2025-01-08 16:00:03浏览次数:3  
标签:HttpServletRequest username 请求 request 就够 name 获取 详解 String

前言

        本章节主要学习HttpServletRequest请求对象、HttpServletResponse响应对象相关方法,收录于JavaWeb基础专栏,该专栏主要学习JavaWeb开发原生框架、Servlet、JSP、请求对象、响应对象、Session会话对象、Filter过滤器、三层开发等知识点,欢迎童鞋们互相交流。觉得不错可以三连订阅喔。 

目标

一、概念

二、HttpServletRequest请求

1. 获取请求行信息

1.1 代码案例 

2. 获取请求头信息

2.1 代码案例 

2.2 执行效果 

3. 获取请求正文信息

3.1 代码案例 

4. 请求转发

4.1 请求转发与重定向

5. 作用域 

5.1 生命周期

5.2 常用方法 

5.3 代码案例 


内容

一、概念

        在之前的文章中,我们学习了Servlet相关知识点,了解了Servlet运行流程和原理。

         当我们需要在Servlet中获取HTTP请求的相关信息时,需要使用HttpServletRequest接口,该接口定义的方法可以获取请求中的信息(请求头信息、请求行信息、请求正文信息)。

        每个Servlet在接收到请求后,都会产生对应的请求对象和响应对象,request表示当前请求对象,我们可以使用该对象的方法获取请求中的信息。

二、HttpServletRequest请求

1. 获取请求行信息

        以下方法可以获取web客户端发送的请求行信息,包括 URL、协议、请求格式、端口等。

API功能解释
String getMethod()获取请求的 HTTP 方法(如 GET、POST)。
StringBuffer getRequestURL()获取客户端请求的完整 URL。
String getRequestURI()获取客户端请求的项目目录的具体资源。
int getServerPort()获取客户端发送请求时使用的服务器端口。
int getLocalPort()获取应用程序所在容器的端口。
int getRemotePort()获取客户端程序所使用的端口。
String getScheme()获取请求的协议(如 HTTP、HTTPS)。
String getProtocol()获取请求使用的协议及版本号(如 HTTP/1.1)。
1.1 代码案例 
@WebServlet("/demo")
public class RequestDemo extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//使用request对象,获取本次请求的请求行信息
		//本次请求:Get http://localhost:8080/ServletDemo2/demo?id=1 http/1.1
		//获取本次请求的请求格式
		String method = request.getMethod();
		System.out.println("本次请求的请求格式为:" + method);
		//本次请求的请求格式为:GET
		
		//获取本次请求的URL
		StringBuffer url = request.getRequestURL();
		System.out.println("本次请求的请求地址为:" + url);
		//本次请求的请求地址为:http://localhost:8080/ServletDemo2/demo
		
		//获取本次请求的URI
		String uri = request.getRequestURI();
		System.out.println("本次请求的资源地址为:" + uri);
		//本次请求的资源地址为:/ServletDemo2/demo
	}
	
}

2. 获取请求头信息

        以下方法可以获取web客户端发送的请求头信息。

API功能解释
String getHeader(String headerName)根据头名称获取请求头的值。
Enumeration getHeaderNames()获取所有的请求头名称。
String getContentType()获取 Content-Type 请求头。
2.1 代码案例 
@WebServlet("/demo")
public class RequestDemo extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//本次请求:Get http://localhost:8080/ServletDemo2/demo?id=1 http/1.1

		//使用request对象,获取本次请求头信息
        //获取所有请求头信息
		Enumeration<String> names = request.getHeaderNames();

        //遍历
		while (names.hasMoreElements()) {
		    String name = names.nextElement();
		    String value = request.getHeader(name);
		    System.out.println(name + ": " + value);
		}
	}
}
2.2 执行效果 

3. 获取请求正文信息

        以下方法可以获取web客户端发送的请求正文信息,请求正文中包含客户数据。这些数据通常通过 URL、表单提交或查询字符串的形式发送。

API功能解释
String getParameter(String parameterName)

根据请求参数名获取请求单个参数值。

根据表单中name属性的名,获取value属性值

String[] getParameterValues(String parameterName)

根据请求参数名获取请求多个参数值数组。

获取表单中复选框的数据

Enumeration getParameterNames()

获取所有请求参数名。

获取表单提交的所有name

Map<String, String[]> getParameterMap()

获取所有请求参数的键值对集合。

获取表单提交的所有值

BufferedReader getReader() throws IOException获取读取请求体的字符输入流。(JSON串)
ServletInputStream getInputStream() throws IOException

获取读取请求体的字节输入流。(读文件)

以字节流的方式得到表单所有数据

int getContentLength()获取请求体长度的字节数。
3.1 代码案例 
@WebServlet("/demo")
public class RequestDemo extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//本次请求:Get http://localhost:8080/ServletDemo2/demo?id=1&username='123' http/1.1
		
		//使用request对象,获取本次请求的请求正文信息
		//获取请求正文中的数据,通过key获取value
		String id = request.getParameter("id");
		System.out.println("本次请求正文中的id值为:" + id);
		//本次请求正文中的id值为:1
		
		//获取表单中的数据,通过name属性名获取name属性值
		String username = request.getParameter("username");
		System.out.println("本次请求表单中username值为:" + username);
        //本次请求表单中username值为:123

        //获取表单中的多选框数据
        String[] hobbies = req.getParameterValues("hobby");
        System.out.println(Arrays.toString(hobbies));
 
        //获取所有的参数名
        Enumeration<String> pnames = req.getParameterNames();
        //遍历
        while(pnames.hasMoreElements()){
            String pname = pnames.nextElement();
            String[]  values = req.getParameterValues(pname);
            if(values.length > 1){
                System.out.println(Arrays.toString(values));
            }else System.out.println(pname + " =  " + values[0]);
        }
	}
}

4. 请求转发

        请求转发是指将一个HTTP请求从一个Servlet转发到另一个Servlet或其他web资源的过程。它允许在Web应用程序中的不同web资源之间共享请求和响应对象。

API功能解释
getRequestDispatche(String path)该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发,将本次请求转发到其他web资源中。

request.getRequestDispatcher("/Servlet/demo").forward(request, response);

请求转发

request.getRequestDispatcher("/Servlet/demo").include(request, response);

请求包含

4.1 请求转发与重定向

蓝色为请求转发: 客户端只发送一次请求,业务逻辑由一个或多个Servlet处理

红色为重定向: 客户端发送两次请求,第一次请求Servlet未果,Servlet响应客户端重定向一个连接地址,客户端再次请求该连接地址,得到处理结果。

5. 作用域 

        request对象也叫“请求域”对象,web客户端发送请求时,创建请求对象开启请求域,请求域的生命周期只在一次请求内有效, 一次请求结束之后请求域就销毁了。

5.1 生命周期

        创建:客户端向服务器发送一次请求,服务器就会创建request对象

        销毁:服务器对这次请求作出响应后就会销毁request对象

        有效:仅在当前请求中有效,如果web资源之间需要共享同一个请求中的数据,只能使用请求转发

5.2 常用方法 
API功能解释

request.getAttribute(String name);

获取名字为name的属性值
request.setAttribute(String name,Object object);在请求中保存名称为name的属性
request.removeAttribute(String name);清除请求中名字为name的属性
request.getParameter(String name);返回指定请求参数的值
5.3 代码案例 
//在 ServeltA 中向请求域中存储数据
@WebServlet("/a")
public class ServletA extends HttpServlet{
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{

		// 获取用户数据
     String username = request.getParameter("username");

		// 存入request请求域中
		request.setAttribute("username", username);
    
		//将请求转发至ServletB
		request.getRequestDispatcher("/b").forward(request, response);
	}
}

//在 SevletB 取出请求域中存储的数据 
@WebServlet("/b")
public class ServletB extends HttpServlet{
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException,ServletException{

		// 从request域中取出数据
		String username = request.getAttribute("username");
		
		// 输出
		System.out.println(username);
	}
}

标签:HttpServletRequest,username,请求,request,就够,name,获取,详解,String
From: https://blog.csdn.net/weixin_55584739/article/details/145000451

相关文章

  • 【网络安全】基础知识详解(非常详细)零基础入门到精通,收藏这一篇就够了_网络安全的入门
    一、什么是网络安全?百度上对“网络安全”是这么介绍的:“网络安全是指网络系统的硬件、软件及其系统中的数据受到保护,不因偶然的或者恶意的原因而遭受到破坏、更改、泄露、系统连续可靠正常地运行,网络服务不中断。”嗯…是不是感觉有点抽象。那么我们再换一种表述:网络安......
  • 【Web安全】SQL 注入攻击技巧详解:UNION 注入(UNION SQL Injection)
    【Web安全】SQL注入攻击技巧详解:UNION注入(UNIONSQLInjection)引言UNION注入是一种利用SQL的UNION操作符进行注入攻击的技术。攻击者通过合并两个或多个SELECT语句的结果集,可以获取数据库中未授权的数据。这种注入技术要求攻击者对数据库的结构有一定的了解,尤其是列的数......
  • 【Web安全】SQL 注入攻击技巧详解:ORDER BY 注入(ORDER BY SQL Injection)
    【Web安全】SQL注入攻击技巧详解:ORDERBY注入(ORDERBYSQLInjection)引言ORDERBY注入是一种利用SQL查询中的ORDERBY子句进行注入攻击的技术。攻击者通过修改ORDERBY子句中的参数,可以获取数据库表的结构信息,如列数,为进一步的攻击提供依据。原理在SQL查询中,ORDERBY......
  • Tomcat详解
    架构图核心功能Tomcat是Apache开源的轻量级JavaServlet容器,其中一个Server(Tomcat实例)可以管理多个Service(服务),一个Service包含多个Connector和一个Engine,负责管理请求到应用的整个流程。Tomcat要实现的两个核心功能:处理Socket连接,负责网络字节流与Request、Response请求的......
  • SpringMVC详解(全网最全)
    起源1.三层架构:一个Servlet只能处理一个请求,耦合度高,复用性差,整页刷新用户体验差2.MVC模式:部分解耦但后端仍负责View层,高并发有限3.前后端分离:异步调用,复用性强,支持复杂交互,用户体验性强概念SpringMVC是Spring框架中的一个模块,用于构建Web的MVC架构,提供了......
  • JuiceFS 详解:一款为云原生设计的高性能分布式文件系统
    JuiceFS详解:一款为云原生设计的高性能分布式文件系统1.什么是JuiceFS?JuiceFS(JuicedFileSystem)是一款高性能、POSIX兼容的云原生分布式文件系统。它采用对象存储作为底层存储,支持多种元数据引擎,如Redis、MySQL、PostgreSQL等,通过强大的缓存机制提供快速的数据访问,具有......
  • VSCode 远程开发环境中的 Python 虚拟环境切换详解
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......
  • Java实现《七星传说》游戏开发详解
    哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者......
  • JavaWeb—Servlet详解
    前言:        本章节主要学习Servlet基础知识点,收录于JavaWeb系列,该系列主要讲解Servlet、JSP、Filter过滤器、Session、分层开发概念等知识点,欢迎童鞋们互相交流。觉得不错可以三连订阅喔。 目标:一、概念二、入门程序        1.创建Servlet类    ......
  • Linux(Centos 7.6)命令详解:mkdir
    1.命令作用如果目录还不存在,则创建目录(CreatetheDIRECTORY,iftheydonotalreadyexist.)2.命令语法Usage:mkdir[OPTION]...DIRECTORY...3.参数详解OPTION:-m,--mode=MODE,创建新目录同时设置权限模式-p,--parents,创建多层目录,如上层目录不存在会自动创建-v,-......