Servlet中HttpServletRequest介绍

文章详细介绍了HttpServletRequest对象在JavaServlet中的作用,包括获取请求参数、请求路径、请求方式、协议版本等信息。同时,讨论了处理请求乱码问题的两种方法,以及请求转发的概念和特点。此外,还提到了request作用域,用于在一次请求中传递数据。
摘要由CSDN通过智能技术生成

HttpServletRequest对象简介

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

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

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

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

接受请求常用方法

获取请求参数

package com.classStudy.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.IOException;
@WebServlet("/s01")
public class ServletClass01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /**
         * 常用方法
         */
        //1.获取请求时的完整路径,从http开始到?前面结束
        String url=request.getRequestURI().toString();//StringBuffer类型需要toString转换
        System.out.println("获取请求的完整路径:"+url);
        //2.获取请求时的部分路径,从项目的站点名开始到?前面结束
        String uri=request.getRequestURI();
        System.out.println("获取部分路径:"+uri);
        //3.获取请求时的参数字符串,从?后面开始,到最后的字符串
        String queryString=request.getQueryString();
        System.out.println("获取请求时的参数字符串"+queryString);
        //4.获取请求方式,(Get,Post)
        String method=request.getMethod();
        System.out.println("获取请求方式:"+method);
        //5.获取当前协议版本(Http1.1)
        String protocol=request.getProtocol();
        System.out.println("获取当前的协议版本"+protocol);
        //6.获取项目的站点名(项目的对外访问路径)
        String webapp=request.getContextPath();//上下文路径,其实就是项目名
        System.out.println("获取站点名:"+webapp);
        /**
         * 获取请求的参数
         */
        //1.获取指定名称的参数值(重点!!!!!!)返回字符串
        String uname=request.getParameter("uname");//不管那边传过来的是什么数据类型,到这边都是一个字符串。
        String upwd=request.getParameter("upwd");
        System.out.println(uname+upwd);
        //2.获取指定名称的参数的全部参数值(用于复选框传值)返回字符串数组
        String[] hobbys=request.getParameterValues("hobby");
        //做遍历前做非空判断,养成这个好习惯。判断数组是否为空
        if (hobbys!=null&&hobbys.length>0){
            for (String hobby:hobbys) {
                System.out.println("爱好"+hobby);
            }
        }
    }
}

请求乱码问题

由于现在的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 会出现新的乱码问题。

package com.classStudy.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.IOException;

/**
 * 请求乱码问题
 * 只有中文会出现乱码英文不会的
 * Tomcat8以上版本Get请求不会乱码Post请求会乱码
 * Tomcat10及以上版本都不会乱码
 * 从地址栏直接访问就是Get请求
 *
 * 乱码原因是因为request的默认编码不支持中文,Tomact10及以上版本不会乱码。
 *
 * 改变解析编码后就不会乱码了
 *
 * 设置服务器的编码request.setCharacterEncoding("UTF-8");必须在获取之前设置。
 *
 */
@WebServlet("/s02")
public class ServletClass02 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置请求的编码格式
        request.setCharacterEncoding("UTF-8");//这个方法只针对Post请求其他请求没用
        //获取客户端传递的参数
        String uname=request.getParameter("uname");
        String upwd=request.getParameter("upwd");
        System.out.println("姓名:"+uname);
        System.out.println("密码:"+upwd);
        //解决Tomcat7及以下版本的Get请求乱码
        //String name=new String(request.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
        //new String 不能随便用,在Tomcat8及以上版本用回出现新的乱码问题
        //new String 主要是用在Tomcat7及以下版本用于解决get请求的问题


    }
}

请求转发

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

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

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

特点:

  • 1.地址栏不发生改变。
  • 2.服务端行为。
  • 3.从始至终只有一个请求也就是04当中用的就是03的请求
  • 4.request数据可以共享。
package com.classStudy.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.IOException;

/**
 * 请求转发 跳转
 *   request.getRequestDispatcher(url).forward(request,response);
 * 可以让请求从服务端跳转到我们的客户端
 * 或者跳转到指定的servlet
 * 服务端行为
 * 特点:
 * 1.地址栏不发生改变。
 * 2.服务端行为。
 * 3.从始至终只有一个请求也就是04当中用的就是03的请求
 * 4.request数据可以共享。
 *
 */
@WebServlet("/s03")
public class ServletClass03 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //接受客户端请求的参数
        String uname=request.getParameter("uname");
        System.out.println("ServletClass03 uname"+uname);
        //从03跳转到04
        //请求转发跳转到ServletClass04
        //request.getRequestDispatcher("s04").forward(request,response);
        //请求转发跳转到jsp页面
       // request.getRequestDispatcher("login.jsp").forward(request,response);
        //请求跳转到HTML页面
        request.getRequestDispatcher("login.html").forward(request,response);

    }
}

request作用域

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

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

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

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

Servlet代码:

package com.classStudy.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.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * request作用域
 * 通过该对象可以在一个请求中传递数据
 * 作用范围:在一次请求中有效,即服务器跳转有效,也就是跳转时有效
 */
@WebServlet("/s05")
public class ServletClass05 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Servlet05..................");
        //设置域对象
        request.setAttribute("name","admin");
        request.setAttribute("age",18);
        List<String> list=new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        request.setAttribute("list",list);
        //请求转发跳转到Servlet06
       // request.getRequestDispatcher("/s06").forward(request,response);
        //请求转发跳转到jsp并通过域对象传输数据,因为html是一个静态页面无法来操作后台数据
        request.getRequestDispatcher("index.jsp").forward(request,response);


    }
}

jsp代码:

<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: 28246
  Date: 2023/2/4
  Time: 15:38
  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代码,需要写在脚本段中--%>
  <%
    //获取域对象,这里用来写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.get(0));
  %>
  </body>
<h1>name</h1>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

外太空的莫扎特

在校生穷逼一个,呜呜呜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值