Request请求基础知识

本文探讨了Tomcat服务器中处理Request请求的基础知识,包括如何获取请求行、请求头和请求体的数据,特别是POST方式下的请求体。此外,还介绍了通过getParameter系列方法获取请求参数的多种方式,如单个参数、复选框值、所有参数映射以及参数名的枚举。文章还提及了请求转发、数据共享以及如何获取ServletContext等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Tomcat服务器的实际行为:

由于:在浏览器的地址栏输入:localhost:8080/ProjectName/资源路径
其中的资源路径:
	正是 @WebServlet("/demo3") 中的资源路径
1.通过该路径可以加载这个路径指向的类,并创建该类对象,
2.之后再创建Request,Response对象,并传入该类对象的service方法,再执行
   --	其中Request对象中封装了请求数据,Response对象中封装了响应数据,
3.可以使用Request获取请求数据并设置Response响应数据,而浏览器通过Response获取响应数据

ServletResquest -> 
	HttpServletResquest -> 
		ResquestFacad(实现了HttpServletRequest接口)
			:内部持有org.apache.catalina.connector.Request对象
			并执行该对象的一系列方法

package  package org.apache.coyote 
	:此类不适用于用户代码,由 tomcat 在内部使用:final类

package package org.apache.catalina.connector
		:实现了HttpServletRequest接口
		而这个类内部持有org.apache.coyote.Request类对象
		并执行该对象的一系列方法

功能:

1.获取请求数据:
	1.获取请求行数据	
	2.获取请求头数据 
	3.获取请求体数据
2.其他:
	1.获取请求参数通用方式
	2.请求转发
	3.共享数据
	4.获取ServletContext

1.获取请求行数据

获取请求行数据
	请求方式,虚拟目录,Servlet路径,请求参数,
		请求URL,协议和版本,客户机的ip地址

举例:
	//http://localhost:8080/WebServlet/RequestDemo1?age=12

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Method:"+request.getMethod());
				//	:GET
		System.out.println("虚拟目录:"+request.getContextPath());
				//  :/WebServlet
		System.out.println("Servlet路径:"+request.getServletPath());
				//	:/RequestDemo1
		System.out.println("请求参数:"+request.getQueryString()); 
				//	?连接首个参数,&连接其他参数   //age=12
		System.out.println("URL:"+request.getRequestURL());
				//	:http://localhost:8080/WebServlet/RequestDemo1
		System.out.println("协议及版本:"+request.getProtocol());
				//	:HTTP/1.1
		System.out.println("ip地址:"+request.getLocalAddr());
				//	:ip地址:0:0:0:0:0:0:0:1
	}

2.获取请求头数据

获取请求头名称:request.getHeaderNames()
	host
	connection
	upgrade-insecure-requests
	user-agent
	accept
	dnt
	accept-encoding
	accept-language
	cookie
	referer

获取各自请求头信息:request.getHeader(name)

	String referer = request.getHeader("referer");
	String uagent = request.getHeader("user-agent");
	Cookie[] cookies = request.getCookies();
	System.out.println("referer:"+referer);
	System.out.println("user-agent:"+uagent);
	System.out.print("cookies:");
	for(Cookie c:cookies) {
		System.out.print(c);
		if(cookies[cookies.length-1].equals(c)) {
			break;
		}
		System.out.print(",");
	}

3.获取请求体数据 post方式有效

字节流:getInputStream();
字符流:getReader();

username=eeee&password=sdfea

举例:1
	BufferedReader reader = request.getReader();
	String line = null;
	while((line = reader.readLine())!= null){
		System.out.println(line);
	}	
		
	2
	ServletInputStream inputStream = request.getInputStream();
	StringBuffer sBuffer = new StringBuffer();
	byte[] bs = new byte[4096];
	while(inputStream.read(bs) != -1) {
		sBuffer.append(new String(bs));
	}
	System.out.println(sBuffer.toString());

2.其他

1.获取请求参数通用方式
String request.getParameter(name);
String[] request.getParameterValues(name);
//复选框checkbox
Map<String, String[]> request.getParameterMap();
//键值对
Enumeration request.getParameterNames();
//获取名称,返回值类似迭代器

举例:
	request.setCharacterEncoding("utf-8");
	Map<String, String[]> parameterMap = request.getParameterMap();
	Set<String> keySet = parameterMap.keySet();
	for (String string : keySet) {
		System.out.print("key: "+string+" values: ");
		String[] strings = parameterMap.get(string);
		for (String string2 : strings) {
			System.out.print(string2);
			if(string2.equals(strings[strings.length-1])) {
				break;
			}
			System.out.print(",");
		}
		System.out.println();
	}

2.请求转发

1.当前服务器内部资源才可以被转发的 且 多个资源一次性转发的方法 且 地址不会变化:

在方法内,已拥有HttpServletRequest request, HttpServletResponse response 参数
	request.getRequestDispatcher("/demo3").forward(request, response);

	request.getRequestDispatcher("/index.jsp").forward(request, response);
其中:
	"/demo3" : 另一个资源路径		
	request:	请求对象
	response:	响应对象

3.共享数据 (转发到其他servlet获取数据)

传送的相当于是键值对:
	request.setAttribute("name", "libai");  
	request.getAttribute("name")
	request.removeAttribute(name);

4.获取ServletContext

req.getServletContext()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值