Servlet p3 HttpServletRequest对象

发布时间 2023-06-28 22:14:42作者: 凉白茶

HttpServletRequest对象

基本介绍

HttpServletRequest对象:HttpServletRequest 对象专门用于封装 HTTP 请求消息,简称 request 对象。主要作用是用来接收客户端发送过来的请求信息,该对象是由Tomcat封装好传递过来。

​ HttpServletRequest接口是ServletRequest的子接口。HTTP 请求消息分为请求行、请求消息头和请求消息体三部分,所以 HttpServletRequest 接口中定义了获取请求行、请求头和请求消息体的相关方法。

在HttpServletRequest对象在Service方法中由容器传入过来,无需自己创建。

接收请求

常用方法

返回值类型 方法声明 描述
StringBuffer getRequestURL() 返回客服端发出请求时的完整URL
String getRequestURI() 该方法用于获取请求行中的资源名称部分,即位于 URL 的主机和端口之后,参数部分之(URL 中“?”以前)的部分。
String getQueryString() 该方法用于获取请求行中的参数部分,也就是 URL 中“?”以后的所有内容。
String getMethod() 该方法用于获取 HTTP 请求方式(如 GET、POST 等)。
String getProtocol() 返回HTTP版本号。
String getContextPath() 返回当前 Servlet 所在的应用的名字(上下文)。对于默认(ROOT)上下文中的 Servlet,此方法返回空字符串""。

代码演示:

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/s01")
public class servlet01 extends HttpServlet  {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*常用方法*/
        //输入的地址:http://localhost:8080/ser02/s01
        //获取请求时的完整路径(从http开始,到 "?" 前面结束)
        String url = req.getRequestURL() + "";
        System.out.println("请求时的完整路径:" + url);//请求时的完整路径:http://localhost:8080/ser02/s01
        //获取请求时的部分路径(从项目的站点名开始,到 "?" 前面结束)
        String uri = req.getRequestURI();
        System.out.println("请求时的部分路径:" + uri);//请求时的部分路径:/ser02/s01
        //获取请求时的参数字符串(从 "?" 后面开始,到最后的字符串)
        String queryString = req.getQueryString();
        System.out.println("请求时的参数字符串(从 \"?\" 后面开始,到最后的字符串):" + queryString);//请求时的参数字符串(从 "?" 后面开始,到最后的字符串):null
        //获取请求方式(GET和POST)
        String method = req.getMethod();
        System.out.println("获取请求方式(GET和POST):" + method);//获取请求方式(GET和POST):GET
        //获取当前的协议版本
        String protocol = req.getProtocol();
        System.out.println("当前的协议版本:" + protocol);//当前的协议版本:HTTP/1.1
        //获取项目的站点名(项目的对外访问路径)
        String contextPath = req.getContextPath();//上下文路径
        System.out.println("项目的站点名(项目的对外访问路径):" + contextPath);//项目的站点名(项目的对外访问路径):/ser02
    }
}

获取请求参数

返回值类型 方法声明 描述
String getParameter(String name) 以字符串形式返回指定的请求参数的值,或者如果参数不存在则返回 null。
String[] getParameterValues(String name) 返回一个字符串对象的数组,包含所有指定的请求参数的值,如果参数不存在则返回 null。

代码演示:

package com.xxxx.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/s01")
public class servlet01 extends HttpServlet  {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*获取请求参数*/
        //输入的地址:http://localhost:8080/ser02/s01?uname=abc&upwd=123&hobby=sing&hobby=dance&hobby=rap
        // 获取指定名称的参数值(重点!!!)
        String uname = req.getParameter("uname");
        String upwd = req.getParameter("upwd");
        System.out.println("uname:" + uname + "upwd:" + upwd);//uname:abcupwd:123
        //获取指定名称参数的所有参数值(通常用于复选框)

        String[] hobbies = req.getParameterValues("hobby");
        //判断数组是否为空
        if (hobbies != null && hobbies.length > 0){
            for (String hobby : hobbies) {
                System.out.println("爱好:" + hobby);
            }
        }
        /*
        爱好:sing
        爱好:dance
        爱好:rap
         */
    }
}

请求乱码问题

  • 基本介绍

    由于现在的request属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编码方式为ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。要想解决这种乱码问题,需要设置request中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。

  • 实现方式

    • 方式一:
      request.setcharacterEncoding("UTF-8");
      这种方式只针对POST有效(必须在接收所有的数据之前设定)
    • 方式二:
      new string(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
      借助了String对象的方法,该种方式对任何请求有效,是通用的。

Tomcat8起,以后的GET方式请求是不会出现乱码的。

请求转发

  • 基本介绍

    请求转发,是一种服务器行为,当客户端请求达到后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会改变,得到响应后,服务器端再将响应发送个客服端,从始至终只有一个请求发出

  • 特点

    1. 服务器行为
    2. 地址栏不发生改变
    3. 从始至终只有一个请求发出
    4. request数据可以共享
  • 实现方式

    req.getRequestDispatcher(url).forward(request, response);

  • 代码演示:

    package com.xxxx.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * @author: 86199
     * @date: 2023/6/16 9:00
     * Description: 请求转发,可以让请求从服务端跳转到客户端(或则跳转到指定Servlet)
     *
     * 特点:
     *  1. 服务端行为
     *  2. 地址栏不发生改变
     *  3. 从始至终都只有一个请求,s03的请求
     *  4. req数据可以共享
     */
    @WebServlet("/s03")
    public class Servlet03 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //接收客户端请求的参数
            String uname = req.getParameter("uname");
            System.out.println("Servlet03 uname = " + uname);
    
            //请求转发跳转到Servlet04(另一个Servlet对象)
    //        req.getRequestDispatcher("s04").forward(req, resp);
    
            //请求转发跳转到jsp页面
            req.getRequestDispatcher("login.jsp").forward(req, resp);
    
            //请求转发跳转到html页面
            req.getRequestDispatcher("login.html").forward(req, resp);
        }
    }
    
    

request作用域

  • 基本介绍

    通过该对象可以在请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。

  • 实现方式

    //设置域对象内容
    request.setAttribute(String name, Object o);
    //获取域对象内容
    request.getAttribute(String name);
    //删除域对象内容
    request.removeAttribute(String name);
    

    request 域对象中的数据在一次请求中有效,经过请求转发,request域中的数据依然存在,即在请求转发的过程中可以通过 request 来传输/共享数据。

  • 代码演示

    package com.xxxx.servlet;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    
    @WebServlet("/s05")
    public class Servlet05 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("Servlet05...");
    
            //设置域对象内容
            req.setAttribute("name", "admin");
            req.setAttribute("age", 18);
            ArrayList<String> list = new ArrayList<>();
            list.add("aaa");
            list.add("bbb");
            req.setAttribute("list", list);
    
            //请求转发
    //        req.getRequestDispatcher("s06").forward(req, resp);//共用一个req对象,这里只能有一个请求转发
    
            //请求转发跳转到jsp,并通过域对象传递数据
            req.getRequestDispatcher("index.jsp").forward(req, resp);
    
        }
    }
    
    

    index.jsp文件代码:

    <%@ page import="java.util.List" %><%--
      Created by IntelliJ IDEA.
      User: 86199
      Date: 2023/6/12
      Time: 11:28
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
        <h2>index页面</h2>
        <%-- 如果要在jsp中写Java代码,需要写在脚本段中--%>
        <%
          //获取域对象内容
          String name = (String) request.getAttribute("name");
          System.out.println("name = " + name);
          Integer age = (Integer) request.getAttribute("age");
          System.out.println("age = " + age);
          List<String> list = (List<String>) request.getAttribute("list");
          System.out.println("list = " + list);
        %>
      </body>
    </html>