• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

ServletHttpServletRequest

武飞扬头像
外太空的莫扎特
帮助1

HttpServletRequest对象简介

HttpServletRequest对象:主要作用是用来接受客户端发送来的请求信息,例如:请求的参数,发送的头信息等,都属于客户端发送来的信息,service方法中形参接受的是HttpServlet接口的实例化对象,表示该对象主要应用在HTTP协议上,该对象是由Tomact封装好传递过来。

HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,就是HttpServletRequest接口,既然只有一个子接口为什么不合并呢?

从长远上讲,现在使用的协议大多是Http协议,但以后可能会出来更多新的协议,若以后想要支持新的协议就只需要继承ServletRequest接口就可以了。

在HttpServletRequest接口中,定义的方法有很多,但都是围绕接受客户端参数的,但是怎么拿到该对象呢?不需要,直接Service方法中由容器传入过来,而我们需要做的就是提取对象中的数据进行分析处理。

接受请求常用方法

学新通

获取请求参数

学新通

  1.  
    package com.classStudy.servlet;
  2.  
     
  3.  
    import jakarta.servlet.ServletException;
  4.  
    import jakarta.servlet.annotation.WebServlet;
  5.  
    import jakarta.servlet.http.HttpServlet;
  6.  
    import jakarta.servlet.http.HttpServletRequest;
  7.  
    import jakarta.servlet.http.HttpServletResponse;
  8.  
    import java.io.IOException;
  9.  
    @WebServlet("/s01")
  10.  
    public class ServletClass01 extends HttpServlet {
  11.  
    @Override
  12.  
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  13.  
    /**
  14.  
    * 常用方法
  15.  
    */
  16.  
    //1.获取请求时的完整路径,从http开始到?前面结束
  17.  
    String url=request.getRequestURI().toString();//StringBuffer类型需要toString转换
  18.  
    System.out.println("获取请求的完整路径:" url);
  19.  
    //2.获取请求时的部分路径,从项目的站点名开始到?前面结束
  20.  
    String uri=request.getRequestURI();
  21.  
    System.out.println("获取部分路径:" uri);
  22.  
    //3.获取请求时的参数字符串,从?后面开始,到最后的字符串
  23.  
    String queryString=request.getQueryString();
  24.  
    System.out.println("获取请求时的参数字符串" queryString);
  25.  
    //4.获取请求方式,(Get,Post)
  26.  
    String method=request.getMethod();
  27.  
    System.out.println("获取请求方式:" method);
  28.  
    //5.获取当前协议版本(Http1.1)
  29.  
    String protocol=request.getProtocol();
  30.  
    System.out.println("获取当前的协议版本" protocol);
  31.  
    //6.获取项目的站点名(项目的对外访问路径)
  32.  
    String webapp=request.getContextPath();//上下文路径,其实就是项目名
  33.  
    System.out.println("获取站点名:" webapp);
  34.  
    /**
  35.  
    * 获取请求的参数
  36.  
    */
  37.  
    //1.获取指定名称的参数值(重点!!!!!!)返回字符串
  38.  
    String uname=request.getParameter("uname");//不管那边传过来的是什么数据类型,到这边都是一个字符串。
  39.  
    String upwd=request.getParameter("upwd");
  40.  
    System.out.println(uname upwd);
  41.  
    //2.获取指定名称的参数的全部参数值(用于复选框传值)返回字符串数组
  42.  
    String[] hobbys=request.getParameterValues("hobby");
  43.  
    //做遍历前做非空判断,养成这个好习惯。判断数组是否为空
  44.  
    if (hobbys!=null&&hobbys.length>0){
  45.  
    for (String hobby:hobbys) {
  46.  
    System.out.println("爱好" hobby);
  47.  
    }
  48.  
    }
  49.  
    }
  50.  
    }
学新通

请求乱码问题

学新通

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

方法1:

乱码原因是因为request的默认编码不支持中文,Tomact10及以上版本不会乱码。

改变解析编码后就不会乱码了

设置服务器的编码request.setCharacterEncoding("UTF-8");必须在获取之前设置。这个方法只针对Post请求。

Tomact8以下版本会出现问题。

方乱码原因是因为request的默认编码不支持中文,Tomact10及以上版本不会乱码。

改变解析编码后就不会乱码了。

设置服务器的编码request.setCharacterEncoding("UTF-8");必须在获取之前设置。这个方法只对Post请求有用,其他请求还是会乱码。

方法2:

new String的方式,先得到你乱码的再给你还原。

解决Tomcat7及以下版本的Get请求乱码 。 String name=new String(request.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
new String 不能随便用,在Tomcat8及以上版本用回出现新的乱码问题 。 new String 主要是用在Tomcat7及以下版本用于解决get请求的问题。

如果数据本身不乱码,还使用new String 会出现新的乱码问题。

  1.  
    package com.classStudy.servlet;
  2.  
     
  3.  
    import jakarta.servlet.ServletException;
  4.  
    import jakarta.servlet.annotation.WebServlet;
  5.  
    import jakarta.servlet.http.HttpServlet;
  6.  
    import jakarta.servlet.http.HttpServletRequest;
  7.  
    import jakarta.servlet.http.HttpServletResponse;
  8.  
     
  9.  
    import java.io.IOException;
  10.  
     
  11.  
    /**
  12.  
    * 请求乱码问题
  13.  
    * 只有中文会出现乱码英文不会的
  14.  
    * Tomcat8以上版本Get请求不会乱码Post请求会乱码
  15.  
    * Tomcat10及以上版本都不会乱码
  16.  
    * 从地址栏直接访问就是Get请求
  17.  
    *
  18.  
    * 乱码原因是因为request的默认编码不支持中文,Tomact10及以上版本不会乱码。
  19.  
    *
  20.  
    * 改变解析编码后就不会乱码了
  21.  
    *
  22.  
    * 设置服务器的编码request.setCharacterEncoding("UTF-8");必须在获取之前设置。
  23.  
    *
  24.  
    */
  25.  
    @WebServlet("/s02")
  26.  
    public class ServletClass02 extends HttpServlet {
  27.  
    @Override
  28.  
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  29.  
    //设置请求的编码格式
  30.  
    request.setCharacterEncoding("UTF-8");//这个方法只针对Post请求其他请求没用
  31.  
    //获取客户端传递的参数
  32.  
    String uname=request.getParameter("uname");
  33.  
    String upwd=request.getParameter("upwd");
  34.  
    System.out.println("姓名:" uname);
  35.  
    System.out.println("密码:" upwd);
  36.  
    //解决Tomcat7及以下版本的Get请求乱码
  37.  
    //String name=new String(request.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
  38.  
    //new String 不能随便用,在Tomcat8及以上版本用回出现新的乱码问题
  39.  
    //new String 主要是用在Tomcat7及以下版本用于解决get请求的问题
  40.  
     
  41.  
     
  42.  
    }
  43.  
    }
学新通

请求转发

请求转发是一种服务器行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会改变,得到响应后服务器端再将响应发送给客户端,从始至终只有一个请求发出。实现方式如下,达到多个资源协同响应的效果。

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

请求转发就是让我们能够从后台跳转到前台,可以进行后台Servlet的跳转,也可以进行后台跳转到jsp和html页面等。

特点:

  • 1.地址栏不发生改变。
  • 2.服务端行为。
  • 3.从始至终只有一个请求也就是04当中用的就是03的请求
  • 4.request数据可以共享。
  1.  
    package com.classStudy.servlet;
  2.  
     
  3.  
    import jakarta.servlet.ServletException;
  4.  
    import jakarta.servlet.annotation.WebServlet;
  5.  
    import jakarta.servlet.http.HttpServlet;
  6.  
    import jakarta.servlet.http.HttpServletRequest;
  7.  
    import jakarta.servlet.http.HttpServletResponse;
  8.  
     
  9.  
    import java.io.IOException;
  10.  
     
  11.  
    /**
  12.  
    * 请求转发 跳转
  13.  
    * request.getRequestDispatcher(url).forward(request,response);
  14.  
    * 可以让请求从服务端跳转到我们的客户端
  15.  
    * 或者跳转到指定的servlet
  16.  
    * 服务端行为
  17.  
    * 特点:
  18.  
    * 1.地址栏不发生改变。
  19.  
    * 2.服务端行为。
  20.  
    * 3.从始至终只有一个请求也就是04当中用的就是03的请求
  21.  
    * 4.request数据可以共享。
  22.  
    *
  23.  
    */
  24.  
    @WebServlet("/s03")
  25.  
    public class ServletClass03 extends HttpServlet {
  26.  
    @Override
  27.  
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  28.  
    //接受客户端请求的参数
  29.  
    String uname=request.getParameter("uname");
  30.  
    System.out.println("ServletClass03 uname" uname);
  31.  
    //从03跳转到04
  32.  
    //请求转发跳转到ServletClass04
  33.  
    //request.getRequestDispatcher("s04").forward(request,response);
  34.  
    //请求转发跳转到jsp页面
  35.  
    // request.getRequestDispatcher("login.jsp").forward(request,response);
  36.  
    //请求跳转到HTML页面
  37.  
    request.getRequestDispatcher("login.html").forward(request,response);
  38.  
     
  39.  
    }
  40.  
    }
学新通

request作用域

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

域对象,就是一个对象放到了一个特殊的作用域里面。这个域的特点在于,它的数据可以被我们的客户端获取。我们写的变量和对象浏览器或者说客户端拿不到,只有java代码可以拿到,客户端想要拿到就必须在一个特殊的作用域里面。

通过request作用域在一个请求中传递数据,想要有数据传递给客户端,我们就通过域对象来传递。只会在请求转发中有效。

  1.  
    //设置域对象
  2.  
    request.setAttribute(String name,String value);
  3.  
    //获取域对象内容
  4.  
    request.getAttribute(String name);
  5.  
    //删除域对象内容
  6.  
    request.removeAttribute(String name);

Servlet代码:

  1.  
    package com.classStudy.servlet;
  2.  
     
  3.  
    import jakarta.servlet.ServletException;
  4.  
    import jakarta.servlet.annotation.WebServlet;
  5.  
    import jakarta.servlet.http.HttpServlet;
  6.  
    import jakarta.servlet.http.HttpServletRequest;
  7.  
    import jakarta.servlet.http.HttpServletResponse;
  8.  
     
  9.  
    import java.io.IOException;
  10.  
    import java.util.ArrayList;
  11.  
    import java.util.List;
  12.  
     
  13.  
    /**
  14.  
    * request作用域
  15.  
    * 通过该对象可以在一个请求中传递数据
  16.  
    * 作用范围:在一次请求中有效,即服务器跳转有效,也就是跳转时有效
  17.  
    */
  18.  
    @WebServlet("/s05")
  19.  
    public class ServletClass05 extends HttpServlet {
  20.  
    @Override
  21.  
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  22.  
    System.out.println("Servlet05..................");
  23.  
    //设置域对象
  24.  
    request.setAttribute("name","admin");
  25.  
    request.setAttribute("age",18);
  26.  
    List<String> list=new ArrayList<>();
  27.  
    list.add("aaa");
  28.  
    list.add("bbb");
  29.  
    request.setAttribute("list",list);
  30.  
    //请求转发跳转到Servlet06
  31.  
    // request.getRequestDispatcher("/s06").forward(request,response);
  32.  
    //请求转发跳转到jsp并通过域对象传输数据,因为html是一个静态页面无法来操作后台数据
  33.  
    request.getRequestDispatcher("index.jsp").forward(request,response);
  34.  
     
  35.  
     
  36.  
    }
  37.  
    }
学新通

jsp代码:

  1.  
    <%@ page import="java.util.List" %><%--
  2.  
    Created by IntelliJ IDEA.
  3.  
    User: 28246
  4.  
    Date: 2023/2/4
  5.  
    Time: 15:38
  6.  
    To change this template use File | Settings | File Templates.
  7.  
    --%>
  8.  
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  9.  
    <html>
  10.  
    <head>
  11.  
    <title>$Title$</title>
  12.  
    </head>
  13.  
    <body>
  14.  
    <h2>index页面</h2>
  15.  
    <%--如果要在jsp中写java代码,需要写在脚本段中--%>
  16.  
    <%
  17.  
    //获取域对象,这里用来写java代码
  18.  
    String name= (String) request.getAttribute("name");
  19.  
    System.out.println("name:" name);
  20.  
    Integer age= (Integer) request.getAttribute("age");
  21.  
    System.out.println("age:" age);
  22.  
    List<String> list= (List<String>) request.getAttribute("list");
  23.  
    System.out.println(list.get(0));
  24.  
    %>
  25.  
    </body>
  26.  
    <h1>name</h1>
  27.  
    </html>
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgcceef
系列文章
更多 icon
同类精品
更多 icon
继续加载