Java web----Request

本文深入探讨了HTTP请求在Servlet中的处理流程,包括request对象的功能、如何存储和获取请求参数,以及请求转发与请求包含的区别。同时,通过示例展示了如何在Servlet中接收和处理GET和POST请求。

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

1 Request的功能

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

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

1)封装了请求头数据;

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

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

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

2 request域方法

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

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

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

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

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

3 request获取请求参数

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

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

超链接:一定是GET请求;

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

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="/request01/AServlet?xxx=XXX&yyy=YYY">点击这里</a> 
	<form action="/request01/AServlet" method="post">
		用户名:<input type="text" name="username"/><br/>
		密码:<input type="password" name="password"/><br/>
		爱好:<input type="checkbox" name="hobby" value="sj"/>睡觉
			<input type="checkbox" name="hobby" value="cf"/>吃饭
			<input type="checkbox" name="hobby" value="dq"/>打球
		<br/>
		<input type="submit" value="提交"/>
	</form>
</body>
</html>

package com.cug.request;

import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

public class AServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("Get:"+req.getParameter("xxx"));
		System.out.println("Get:"+req.getParameter("yyy"));
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String name = req.getParameter("username");
		String password = req.getParameter("password");
		String[] hobbys = req.getParameterValues("hobby");
		System.out.println(name+":"+password);
		System.out.println(Arrays.toString(hobbys));
		
		//获取请求参数的名称
		Enumeration<String> en = req.getParameterNames();
		while(en.hasMoreElements()){
			System.out.println(en.nextElement());
		}
		
		Map<String,String[]> mstr = req.getParameterMap();
		for(String key:mstr.keySet()){
			String[] values = mstr.get(key);
			System.out.println(key+":"+Arrays.toString(values));
		}
	}
	
}

4 请求转发和请求包含

package com.cug.servlet.forward;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class OneServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("OneServlet...");
		resp.setHeader("aaa", "AAA");
		
//		for(int i=0;i<1024*24+1;++i){
//			resp.getWriter().print("a");
//		}
		
		req.setAttribute("username", "zhangsan");
		//等同调用了TwoServlet的service方法
//		req.getRequestDispatcher("/TwoServlet").forward(req, resp);//请求转发
		req.getRequestDispatcher("/TwoServlet").include(req, resp);//请求转发
	}
}

package com.cug.servlet.forward;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TwoServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println(req.getAttribute("username"));
		System.out.println("TwoServlet");
		resp.getWriter().print("Hello TwoServlet!!!");//设置响应体
	}
}

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

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

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

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



5 请求转发与重定向的比较

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

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

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

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

5)重定向的第二个请求一定是GET;




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值