首页 > 其他分享 >Servlet p3 HttpServletRequest对象

Servlet p3 HttpServletRequest对象

时间:2023-06-28 22:23:37浏览次数:44  
标签:HttpServletRequest p3 请求 servlet req import Servlet javax String

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>
    

标签:HttpServletRequest,p3,请求,servlet,req,import,Servlet,javax,String
From: https://www.cnblogs.com/zh-Note/p/17512696.html

相关文章

  • esp32运行边界路由与nRF52833作为rcp通过串口通讯组建边界路由步骤
    1、首先搭建esp32开发环境,按照官方指导说明,我这里是建立在linux运行环境下的  Linux和macOS平台工具链的标准设置-ESP32-C6-—ESP-IDF编程指南latest文档(espressif.com)   espressif/esp-idfatv5.2-dev(github.com)   去官网下载最新版的esp-id......
  • esp32 + obd检测第二版
    OBD_detect组件说明利用esp32获得OBD模拟器数据进行车况检测的组件,可以直接获得车速信息组件代码如下:https://github.com/doincli/esp32_obd_blue公共参数说明:定义的参数protocol_t表示协议到种类,有两种ISO15765_11bit和ISO15765_29bitspeed表示CAN总线的速度有两种......
  • CentOS7+java8+hadoop3.3.5环境搭建
    需要的配置文件centos7的镜像centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云(aliyun.com)java8JavaDownloads|Oraclehadoop3.3.5Indexof/dist/hadoop/common/hadoop-3.3.5(apache.org)步骤首先第一步在本地下载好vmware和centos7的镜像 之后的......
  • P3387 【模板】缩点 题解
    一、题目描述:给你一个$n$个点,$m$条边的有向图。点带权。求一条路径经过的所有点的权值和最大是多少。点可以重复经过。数据范围:$1\len\le1\times10^4,1\lem\le1\times10^5$。 二、解题思路:缩点板子题,不需要思路。时间复杂度$O(n+m)$。......
  • P3388 【模板】割点(割顶) 题解
    一、题目描述:给你一个$n$个点,$m$条边的无向图。求出所有割点,按节点编号升序排序。数据范围:$1\len\le2\times10^4,1\lem\le1\times10^5$。 二、解题思路:板子题,不需要思路。时间复杂度$O(n+m)$。 三、完整代码:1#include<iostream>......
  • PPT| 城市大脑驱动的新型智慧城市解决方案 P38
    PPT总共有38页,受篇幅有限,有需要PPT的同学可以关注:智慧城市之家......
  • COMP3350 业务智能
    Assignment2–BusinessIntelligenceSemester1,2023DueDateApr24th5pmAssignment2isdueonApr24th5pm.Eachgroupwill•uploadtheassignmentfilestoCanvasand•presentyourBIreportanddemonstrateyourassignmentontutorialsessiononApr25th......
  • esp32 + OBD实验
    esp32+OBD实验整体的思路是使用esp32+obd模拟器控制can总线实现车况检测代码在hello_world文件夹中esp32_learn/obdatmaster·doincli/esp32_learn·GitHub解决问题1.esp32这端如何自动识别不同的CAN的速率2.对于不同的OBD协议esp32这段如何同时支持思路:对于......
  • 使用libavcodec将mp3音频文件解码为pcm音频采样数据【[mp3float @ 0x561c1ec49940] He
    一.打开和关闭输入文件和输出文件想要解决上面提到的问题,我们需要对mp3文件的格式有个大致了解,为了方便讲解,我这里画了个示意图:ID3V2包含了作者,作曲,专辑等信息,长度不固定,扩展了ID3V1的信息量。Frame一系列的帧,个数由文件大小和帧长决定ID3V1包含了作者,作曲,专......
  • Servlet方法介绍
     publicvoidinit(ServletConfigconfig)throwsServletException{this.config=config;System.out.println("init...");}publicServletConfiggetServletConfig(){returnconfig;} ......