HttpServletRequest对象

Posted Vodka~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HttpServletRequest对象相关的知识,希望对你有一定的参考价值。

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

2.HttpServletRequest是ServletRequest的子接口,ServletRequest只有一个子接口,不将两个接口合并的原因是,ServletRequest接口目前支持的是http协议,未来若想支持其他新的协议,该协议再继承ServletRequest接口就行了,面向接口编程,一个接口尽量完成一种功能,提高颗粒度,减少系统的冗余度。

3.接收请求常用的方法:
-getRequestURL(): 获取客户端发出请求时的完整URL
-getRequestURI(): 获取请求行中的资源名称部分(项目名称开始)
-getQueryString(): 获取请求行中的参数部分
-getMethod(): 获取客户端请求方式
-getProtocal(): 获取HTTP版本号
-getContextapp(): 获取webapp名字
-getParameter(name) : 获取指定名称的参数!!!
-getParametervalues(String): 获取指定名称参数的所有值

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author Vodka
 * @date 2021/08//17:42
 */
//@WebServlet(name="web",urlPatterns={"/One","/Two"})
@WebServlet(urlPatterns = {"/One","/Two"})
public class HSR extends HttpServlet {
    @Override
    public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
       res.getWriter().write("恭喜你已连接!");
        //获取请求时的完整路径,从http开始,到“?”前结束
        StringBuffer url = req.getRequestURL() ;
        System.out.println("请求时的完整路径:" + url);

        //获取部分路径 (从项目的站点名开始,到“?”结束)
        String uri = req.getRequestURI() ;
        System.out.println("获取请求时的部分路径:" + uri);

        //获取请求时的参数字符串(从?后面开始,直至最后)
        String QueryContent = req.getQueryString() ;
        System.out.println("获取请求信息携带的参数:" + QueryContent);

        //获取请求方式(get和post)
        String GM = req.getMethod() ;
        System.out.println("获取请求方式:" + GM);

        //获取当前协议版本
        String Edition  = req.getProtocol();
        System.out.println("当前协议版本为:" + Edition);

        //获取项目站点名(项目对外访问路径,即上下文路径)
        String webapp = req.getContextPath();
        System.out.println("项目站点名为:"+ webapp);
       
         // -getParameter(name)   :    获取指定名称的参数
        String Age = req.getParameter("Age");
        System.out.println("年龄是:" + Age +"岁");

        //      -getParametervalues(String):   获取指定名称参数的所有值
        String[] Ages = req.getParameterValues("Age");
        if(Ages !=null && Ages.length > 0)
        System.out.println("Ages的所有值为:" + Arrays.toString(Ages));
    }
}

请求时的完整路径:http://localhost:8080/vodka/One
获取请求时的部分路径:/vodka/One
获取请求信息携带的参数:Name=%E6%9D%8E%E4%BC%9F%E4%BD%B3&Age=21&Age=100&Age=4556
获取请求方式:GET
当前协议版本为:HTTP/1.1
项目站点名为:/vodka
年龄是:21岁
所有值为:[21, 100, 4556]

4.请求乱码问题:
-因为request接收的客户端参数有默认的语言编码,在解析过程中默认使用的编码方式是"ISO-8859-1"(此编码不支持中文),所以解析时一定会出现乱码,要解决乱码问题,需要设置request中的编码方式,告诉服务器以何种方式来解析数据,或者在接收乱码数据后,以何种编码格式还原。
-方式一:
request.setCharacterEncoding(“UTF-8”); (此方式只针对post有效,必须在接收所有数据之前设定)

    -方式二:
              -new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8")l
              ( 借助String对象,对任何请求都通用,但Tomcat8.0以上的版本不用这个方式,会将本来不乱码的数据,转成了乱码)
             -Tomcat8以后的版本,get方式不会出现乱码

5.请求转发跳转:
request.getRequestDispatcher(url).forward(request,response);
特点:
-服务端行为
-地址栏不发生改变
-从始至终只有一个请求
-request数据可以共享 (客户端01发送信息到服务端,服务端将信息可以发到客户端02,03,等等。。。。,除了跳转到指定链接,还可以跳转到jsp页面,和html页面)

//Transport.java
package com.StartSL;

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.io.UnsupportedEncodingException;

/**
 * @author Vodka
 * @date 2021/08//22:23
 */
@WebServlet(name="Vodka",urlPatterns = {"/li","/jia","/login"})
public class Transport extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res){
        //设置请求编码格式,post请求中文会乱码,所以要设置编码方式
        try {
            req.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        String Name = req.getParameter("UName");
        String Age = req.getParameter("UAge");
        System.out.println("Li info : " + Name + " , " + Age);

        //转发跳转到 /wei
        try {
            req.getRequestDispatcher("wei").forward(req, res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

//wei.java
package com.StartSL;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;

/**
 * @author Vodka
 * @date 2021/08//14:18
 */
//@WebServlet(name="Vodka",urlPatterns = {"/li","/wei","/jia","/login"})
    @WebServlet(urlPatterns={"/wei"})
public class MessyCode extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res){
        //设置请求的编码格式
        try {
            req.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
       //获取客户端传递的参数
        String Name = req.getParameter("UName");
        String Age = req.getParameter("UAge");
        String PassWord = req.getParameter("UPassWord");
        System.out.println("WeiInfo , Name:"+ Name + " ,  Age: " + Age  + " , PassWord: " +PassWord );
    }

}


<%--
  Created by IntelliJ IDEA.
  User: 伟神
  Date: 2021/8/6
  Time: 14:34
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8"  language="java" %>
<html>
<head>
    <title>登录</title>
</head>

<body>
     <form method="post" action="login">
         姓名:<input type="text" name="UName">  <br>
         年龄:<input type="text" name="UAge">  <br>
         密码:<input type="password" name="UPassWord">  <br>
         <button>登录</button>
     </form>
</body>

</html>

6.request作用域: 通过该对象可以在一个请求中传递数据(实现不同的客户端数据共享),作用范围是在一次请求中有效,即服务器跳转有效。

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


//SOne.java
package com.StartSL;
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;
import java.util.List;

/**
 * @author Vodka
 * @date 2021/08//0:26
 */
@WebServlet(urlPatterns={"/One"})
public class SOne extends HttpServlet {
 @Override
 protected void service(HttpServletRequest req , HttpServletResponse res){
    //设置域对象内容
     req.setAttribute("UName","Vodka");
     req.setAttribute("UAge",20);
     List<String> Address = new ArrayList<>();
     Address.add("GuangDong Province");
     Address.add("ShenZhen City");
     Address.add("Shangmeilin");
     req.setAttribute("Address",Address);
    System.out.println("准备请求转发跳转到Two");
     //请求转发跳转到 Jump.jsp,并通过域对象传递数据
     try {
         req.getRequestDispatcher("Two").forward(req,res);
     } catch (ServletException e) {
         e.printStackTrace();
     } catch (IOException e) {
         e.printStackTrace();
     }

 }
}


//STwo.java
package com.StartSL;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * @author Vodka
 * @date 2021/08//0:26
 */
@WebServlet(urlPatterns={"/Two"})
public class  STwo extends HttpServlet{
    @Override
        protected void service(HttpServletRequest req,HttpServletResponse res){
            //获取域对象自定义的内容
            String Name = (String) req.getAttribute("UName");
            System.out.println("Name:" + Name);
            Integer Age = (Integer) req.getAttribute("UAge");
            System.out.println("Age:" + Age);
            List<String> Address = (List<String>) req.getAttribute("Address");
            if(Address != null ){
                for(String i : Address){
                    System.out.print(i + ",");
            }
        }
    }
}


以上是关于HttpServletRequest对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 @service 类中获取 HttpServletRequest 对象

为啥 HttpServletRequest 对象在从一个 servlet 转发到另一个 servlet 时会发生变化?

HttpServletRequest对象

HttpServletRequest对象

HttpServletRequest和ServletRequest的区别以及HttpServletRequest对象方法的用法

HttpServletRequest和HttpServletResponse对象