JavaWeb Request简单理解

本文深入讲解Servlet中的Request对象,涵盖其获取请求行、请求头、请求参数的方法,以及如何处理表单请求参数的中文乱码问题。同时,探讨Request域对象的作用范围,请求转发与重定向的区别,并附有代码示例。

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

负责获取客户端的请求数据
request对象是从客户端向服务器发出请求,包括⽤户提交的信息以及客户端的⼀些信息。客户端可通过 HTML 表单或在⽹⻚地址后⾯提供参数的⽅法提交数据,然后服务器通过 request对象的相关⽅法来获取这些数据。
  • 查看Servlet中的service⽅法得知, Servlet中使⽤的ServletRequest接⼝, ⽽我们使⽤的是ServletRequest的⼦接⼝HttpServletRequest, 它继承⾃ServletRequest, 是与HTTP协议相关的Request请求对象
  • 我们使⽤的⼦接⼝HttpServletRequest, 此接⼝对象由Tomcat引擎提供
  • 可以实现客户端向服务器发出请求, 请求内容包括: 请求⾏,请求头,请求体

Request对象获取请求行

API

⽅法
返回值
描述
getMethod()
String
获取提交的⽅式 (GET,POST)
getRequestURI()
String
获取请求的参数 , 请求服务器路径( / 开始 )
getRequestURL()
StringBuffer
获取请求的参数 , 请求服务器路径(http 开始)
getQueryString()
String
获取请求⾏ 问号后⾯的参数 (GET)
getContextPath()
String
获取 WEB 应⽤名称

代码演示

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     //request对象⽅法 getMethod()获取客户端的请求⽅式
     String method = request.getMethod();
     System.out.println(method);
     //⽅法 String getRequestURI() 获取请求服务器路径
     //⽅法 StringBuffer getRequestURL() 获取请求服务器路径
     String URI = request.getRequestURI();
     StringBuffer URL = request.getRequestURL();
     System.out.println("URI=="+URI);// /web03/line
     System.out.println("URL=="+URL);// http://localhost:8080/web03/line
     //⽅法 String getQueryString()获取请求⾏,?后⾯的所有参数
     String query = request.getQueryString();
     System.out.println(query);//user=tom&pass=123
     //获取WEB应⽤名称 String getContextPath()
     String path = request.getContextPath();
     System.out.println(path);// /web03
     //获取WEB应⽤名称, 结合重定向使⽤
     //response.sendRedirect(request.getContextPath()+"/ddd");
}

Request对象获取请求头

请求头数据格式键值对 , k:v
指导性信息 , 指导服务器
⽅法
返回值
描述
getHeader(String name)
String  
获得⼀个key对应⼀个value的请求头
getHeaderNames()
Enumeration
获取所有的请求头的键
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     /*
     * Enumeration getHeaderNames() 获取所有的请求头的键
     * 返回值Enumeration接⼝ (向量枚举)
     * 集合:1.0-1.1 Enumeration 集合1.2 迭代器
     *Iterator迭代器接⼝: hasNext() next()
     * Enumeration接⼝: hasMoreElement() nextElement()
     */
     Enumeration<String> enums = request.getHeaderNames();
     while (enums.hasMoreElements()){
         key = enums.nextElement();
         String value = request.getHeader(key);
         System.out.println(key+"=="+value);
     }
}

Request获取请求参数

⽅法
返回值
描述
getParameter(表单中的name )
String
获得提交的参数(⼀个 name对应⼀个value
getParameterValues(表单中的 name )
String[]
获得提交的参数(⼀个 name对应多个value
getParameterMap()
Map<String,String[]>
获得提交的参数,将提交的参数名称和 对应值存⼊到⼀个 Map 集合中
<body>
     <form action="/param" method="post">
         ⽤户名:<input type="text" name="username"><br/>
         密 码:<input type="password" name="password"><br/>
         爱 好:<input type="checkbox" name="hobby" value="Basketball">篮球
                 <input type="checkbox" name="hobby" value="football">⾜球
                 <input type="checkbox" name="hobby" value="pingpang">乒乒球
         <br/>
         <input type="submit">
     </form>
</body>
@WebServlet(urlPatterns = "/param")
public class ParamServlet extends HttpServlet {
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     //获得提交的参数(⼀个name对应⼀个value)
     String username = request.getParameter("username");
     String password = request.getParameter("password");
     System.out.println(username +" == " +password);
     //获得提交的参数(⼀个name对应多个value)
     String[] hobbies = request.getParameterValues("hobby");
     System.out.println("hobbies = " + Arrays.toString(hobbies));
     //获得提交的参数,将提交的参数名称和对应值存⼊到⼀个Map集合中
     Map<String, String[]> map = request.getParameterMap();
     for(String key : map.keySet()){
         String[] values = map.get(key);
         System.out.println(key + " == " + Arrays.toString(values));
     }
 }

Request对象接收表单请求参数的中文乱码处理

POST ⽅式接收中⽂
产⽣乱码的原因:
  • post⽅式提交的数据是在请求体中,request对象接收到数据之后,放⼊request的缓冲区中。缓冲区就有编码(默认ISO-8859-1:不⽀持中⽂).
解决⽅案:
  • request的缓冲区的编码修改了即可
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     //将request的缓冲区的编码修改
     request.setCharacterEncoding("utf-8");
     //获取请求参数
     String user = request.getParameter("user");
     System.out.println("user = " + user);
}
GET ⽅式接收中⽂
Tomcat8.5 版本之后 , Tomcat ⾃动处理了 get请求的中⽂乱码问题,在 Tomcat8.5 之前的版本中 , get 请求的中⽂乱码需要⾃⾏处理
产⽣乱码原因:
  • get⽅式提交的数据在请求⾏的url后⾯,在地址栏上其实就已经进⾏了⼀次URL的编码了。
解决⽅案 :
  • 将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取到,以UTF-8的⽅式进⾏解码。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     /*
     get⽅式提交的数据在 请求⾏中
     Tomcat8.5之后, Tomcat⾃动处理了get请求的中⽂乱码问题, 但在之前的Tomcat版本    
     中,get请求的中⽂乱码需要⾃⾏处理
     ⽼版本Tomcat中⽂乱码的解决:将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取    
     到,以UTF-8的⽅式进⾏解码。
     */
     String user = request.getParameter("username");
     //将存⼊到request缓冲区中的值以ISO-8859-1的⽅式获取到
     byte[] bytes = user.getBytes("iso-8859-1");
     //以UTF-8的⽅式进⾏解码
     String value = new String(bytes, "utf-8");
     System.out.println("user = " + user);
}

Request域对象

Request 作为域对象的 API
Request 作为域对象作⽤范围
Request 对象其实就是从客户端浏览器向服务器发送的⼀次请求信息的封装。那么实质上向 Request中所保存的数据有效期也是 ⼀次请求范围。
⼀次请求范围:从客户端浏览器向服务器发送⼀次请求,服务器针对这次请求对浏览器作出响应。当服 务器作出响应之后,请求对象就销毁了,保存在其中的数据就⽆效了。
 
API
⽅法
返回值
描述
setAttribute(String name, Object obj)
void
Request 域中保存数据
getAttribute(String name)
Object
Request 域中获取数据
removeAttribute(String name)
void
Request 域中移除数据

代码演示:

servlet1

@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //向request域对象中 存值
         request.setAttribute("code","java");
         //从request域对象中 取值
         Object value = request.getAttribute("code");
         System.out.println("MyServlet1 value = " + value);
     }
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         doGet(request, response);
     }
}
servlet2
@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //从request域对象中 取值
         Object value = request.getAttribute("code");
         System.out.println("MyServlet2 value = " + value);
     }
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         doGet(request, response);
     }
}

请求转发

请求转发的写法

通过ServletRequest对象获得RequestDispatcher对象

方法返回值描述
getRequestDispatcher(String path)
RequestDispatcher
获得 RequestDispatcher 对象

再根据RequestDispatcher中的⽅法进⾏请求转发

⽅法
返回值
描述
forward(ServletRequest request, ServletResponse response)
void
进⾏请求转发
转发的实现步骤
  • request对象⽅法获取转发器 RequestDispatcher getRequestDispatcher("转发地址")返回值就是转发器
  • 使⽤转发器对象的⽅法 forward
代码实现
servlet1
@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //向request域对象中 存值
         request.setAttribute("code","java");
         //从request域对象中 取值
         Object value = request.getAttribute("code");
         System.out.println("MyServlet1 value = " + value);
         //进⾏请求转发
         request.getRequestDispatcher("/my2").forward(request, response);
     }
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         doGet(request, response);
     }
}
servlet2
@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //从request域对象中 取值
         Object value = request.getAttribute("code");
         System.out.println("MyServlet2 value = " + value);
         //响应回浏览器
         response.setContentType("text/html;charset=utf-8");
         response.getWriter().print("我是MyServlet2 ⻚⾯数据");
     }
     protected void doPost(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
         doGet(request, response);
     }
}

请求转发和重定向区别

区别总结
  • 请求转发是⼀次请求⼀次响应,⽽重定向是两次请求两次响应。
  • 请求转发地址栏不会变化的,重定向地址栏发⽣变化。
  • 请求转发路径不带⼯程名,重定向需要带⼯程名路径。
  • 请求转发只能在本⽹站内部,重定向可以定向到任何⽹站。
代码演示
MyServlet1
@WebServlet(urlPatterns = "/my1")
public class MyServlet1 extends HttpServlet {
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //向request域对象中 存值
         request.setAttribute("code'","java");
         //从request域对象中 取值
         Object value = request.getAttribute("code");
         System.out.println("MyServlet1 value = " + value);
         //进⾏请求转发
         //request.getRequestDispatcher("/my2").forward(request, response);
         //进⾏重定向
         response.sendRedirect("/my2");
     }
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         doGet(request, response);
     }
}

MyServlet2

@WebServlet(urlPatterns = "/my2")
public class MyServlet2 extends HttpServlet {
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //从request域对象中 取值
         Object value = request.getAttribute("code");
         System.out.println("MyServlet2 value = " + value);
         //响应回浏览器
         response.setContentType("text/html;charset=utf-8");
         response.getWriter().print("我是MyServlet2 ⻚⾯数据");
     }
     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         doGet(request, response);
     }
}
注意:
  • 如果需要使⽤request进⾏值传递,需要通过请求转发完成。
  • 如果⻚⾯需要跳转到其他⽹站上必须使⽤重定向, 不能使⽤request进⾏值传递。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值