JavaWeb-HttpServletRequest请求域接口
文章目录
- HttpServletRequest请求域接口
- HttpServletRequest请求域接口简介
- 关于请求域和应用域的区别
- 请求域接口中的相关方法
- 获取前端请求参数(getParameter系列方法)
- 存储请求域名参数(Attribute系列方法)
- 关于转发和重定向的细致剖析
HttpServletRequest请求域接口
HttpServletRequest请求域接口简介
其实关于请求域这个词也蛮熟悉的, 因为我们之前学习过 应用域
这一概念, 应用域的生命周期很长, 伴随这服务器的启动和终止, 作用范围也很广, 对所有的处于当前 webapp
也就是 web 应用的所有Servlet对象都生效
-
HttpServletRequest
是位于jakarta.servlet.http.*
包下面的一个接口 -
继承了
ServletRequest接口
public interface HttpServletRequest extends ServletRequest
-
之前我们学习过HTTP协议的相关内容, 这个对象中封装的其实就是网络传输的时候, 发送的HTTP请求(Request)中封装的相关参数内容信息
-
实现这个接口是Tomcat服务器实现的, 传递对象封装参数也是Tomcat服务器完成好的内容, 我们作为Java程序员, 只需要学习获取其中封装的相关参数即可
关于请求域和应用域的区别
- 生命周期不同, 应用域伴随着Tomcat的生命周期 而 请求域 只作用域这一次请求之内, 而且http协议的特点就是, 一次请求一次创建一次请求域对象
请求域接口中的相关方法
上面都说了, 请求域是封装了相关的http协议的参数信息, 所以必定提供了一些方法来让我们程序员获取到这些参数的信息…
获取前端请求参数(getParameter系列方法)
首先我们思考, 前端传递过来的参数应该采用什么数据结构来组织比较好
我们从下面的前端的页面中获取信息
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='UTF-8'>
<meta name='viewport' content='width=device-width, initial-scale=1.0'>
<title>个人信息</title>
</head>
<body>
<h2>个人信息</h2>
<form action="" method="get">
姓名:<input type="text" name="name" value=""><br>
年龄:<input type="text" name="age" value=""><br>
性别:<input type="radio" name="sex" value="男">
<input type="radio" name="sex" value="女"><br>
爱好:<input type="checkbox" name="hobby" value="吃饭">
<input type="checkbox" name="hobby" value="睡觉">
<input type="checkbox" name="hobby" value="打游戏"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
我们执行 http://127.0.0.1:8080/servlet08/test.html
我们对URL拆解如下(涉及URLEncoding)
我们可以发现, 前端向后端提交数据的格式其实并不是单纯的键值对的结构存储的, 因为如果是键值对结构存储的话, 一个key只能对应一个value, 但是复选框这种提交信息的结构, 一个key可以对应多个value信息
所以实际上, 我们的前端发来的数据存储格式是一个特殊的map集合
Map<String, String[]> map = new HashMap<>();
一个String类型的key可以对应一个String[] 数组, 也就是多个value(前端传递参数都是String类型)
上面是一个html页面, 其中包含test类型文本, 单选框, 复选框
上面的方法的解释:
- String getParameter(String name): 根据key返回String数组中的第一个参数
- String[] getParameterValues(String name): 根据key返回完整的String[]数组
- Enumeration< String > getParameterNames(): 返回一个由所有key组成的集合
- Map<String, String[]> getParameterMap(): 返回一个key和value组成的完整的集合
还拿我们上面写的那个html页面进行测试(设置一下传递的Servlet路径地址)
(注意, 我们下面的method其实写错了, 实际上是post请求)
Servlet对象的源码如下
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Enumeration;
import java.util.Map;
@WebServlet(urlPatterns = "/getparameter")
public class GetParameterServlet extends HttpServlet {
// 由于是form表单提交的数据, 我们尽量采用重写doPost的方式进行测试
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 最好还是设置一下字符集, 防止出现乱码
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 1. 使用getParameterMap获取整个的map形式参数集合
out.print("<h3>使用getParameterMap获取整个集合</h3>");
Map<String, String[]> parameterMap = request.getParameterMap();
for(Map.Entry<String, String[]> entry : parameterMap.entrySet()){
out.print(entry.getKey() + "=");
for(String value : entry.getValue()){
out.print(value + " ");
}
}
out.print("<br>");
out.print("====================================<br>");
// 2. 使用getParameterNames获取整个参数集合的key
out.print("<h3>使用getParameterNames获取整个集合中的key</h3>");
Enumeration<String> parameterNames = request.getParameterNames();
while(parameterNames.hasMoreElements()){
String name = parameterNames.nextElement();
out.print(name + " ");
}
out.print("<br>");
out.print("====================================<br>");
// 3. 使用getParameterValues, 根据key获取参数集合的value数组
String[] hobbys = request.getParameterValues("hobby");
out.print("hobby=");
for(String hobby : hobbys){
out.print(hobby + " ");
}
out.print("<br>");
out.print("====================================<br>");
// 4. 使用getParameter, 根据key获取到value数组中的第一个值
String name = request.getParameter("name");
out.print("name=" + name);
out.print("<br>");
out.print("====================================<br>");
}
}
测试:
下面是form表单中提交的数据信息
下面是在浏览器中输出的内容
存储请求域名参数(Attribute系列方法)
Attribute
这个词其实我们很熟悉了, 因为之前学习ServletContext
就出现过这个词, 也出现了和下面一模一样的一系列方法, 当时是设置应用域对象, 但是现在是设置请求域对象
- void setAttribute(String name, Object o): 设置请求域参数
- Object getAttribute(String name): 获取请求域参数
- Enumeration< String > getAttributeNames(): 获取所有请求域的key组成的集合
- void removeAttribute(String name): 移除 key 为参数的请求域信息
没啥可说的, 直接上测试代码
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Enumeration;
// 使用注解来配置Servlet
@WebServlet("/attribute")
public class AttributeInfoServlet extends HttpServlet {
// 重写doGet方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
// 1. 使用 void setAttribute(String name, Object o) 设置请求域参数
request.setAttribute("name", "Jack");
request.setAttribute("age", 18);
// 2. 使用 Object getAttribute(String name) 获取请求域参数
Object name = request.getAttribute("name");
Object age = request.getAttribute("age");
out.print("<h3>" + name + " " + age + "</h3>");
out.print("<br>========================================<br>");
// 3. 使用 Enumeration< String > getAttributeNames() 获取所有的请求域参数key集合
Enumeration<String> attributeNames = request.getAttributeNames();
while (attributeNames.hasMoreElements()) {
String attributeName = attributeNames.nextElement();
out.print("<h3>" + attributeName + "</h3>");
}
out.print("<br>========================================<br>");
// 4. 使用 void removeAttribute(String name) 移除参数
request.removeAttribute("name");
Object name1 = request.getAttribute("name");
out.print("<h3>" + name1 + "</h3>");
}
}
测试结果如下