HttpServletRequest

shuyepl 2022-06-08 22:34:00
Categories: Tags:

内容简介:HttpServletRequest 相关知识点

这个对接口实现类的对象是什么样子的

我们先在 java 程序中获取这个接口实现类的一个对象,看下这个对象是什么

java 程序代码

package com.shuyepl.javaweb.servlet.httpservlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.print(request);
    }
}

输出结果

org.apache.catalina.connector.RequestFacade@bc5e0e6

结论:WEB 服务器实现了 HttpServletRequest 的接口

HttpServletRequest 对象由 WEB 服务器负责创建,这个对象中封装了 HTTP 的请求协议(用户发送的请求被封装进了这个对象中),这个对象的声明周期很短,只在当前的请求中有效( response 也是如此)

相应的方法

这些方法可以用来获取前端浏览器用户提交的数据

请求域对象

HttpServletRequest 的对象是请求域的对象,一次请求对应一个请求对象,一个请求对象对应一个请求域对象,请求域的对象要比应用域的对象范围小,生命周期短很多,请求域中同样也有应用域中有的方法,所以,在两者都能完成需求的情况下,选择对象范围更小的,节省资源

虽然和应用域的方法一样,但是 ,如果在一个请求域中绑定数据,想在另外一个请求域中获取数据这是不可能的, 因为每一次访问都对应着不同的请求域,不同域中的信息不相通

要是想将不同的 Servlet 对象放到一次请求中,可以使用 Servlet 中的请求转发机制(在一个 Servlet 对象中执行到一半的时候跳转到另外的一个 Servlet 对象中):使用 request 对象的 getRequestDispatcher() 方法,方法中填写的参数是想要转到的 Servlet 对象的路径(就是 web.xml 中配置的 url-pattern 标签中的内容),得到一个转发器对象,然后使用转发器的 forword 方法,将 request 对象和 response 对象发送出去,下面是一个例子

AServlet 类中的内容

+package com.shuyepl.javaweb.servlet.RequestTest;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;

public class AServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        Date newTime = new Date();  // 这个是要添加的参数值
        request.setAttribute("systime", newTime);   // 添加参数
        request.getRequestDispatcher("/b").forward(request,response);   // 将 request 对象转发到 BServlet 对象中
    }
}

BServlet 类中的内容

package com.shuyepl.javaweb.servlet.RequestTest;

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class BServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.print("<h1>hello, this is BServlet<h1>");
        // 在 BServlet 对象中调用转发过来的 Request 对象获取在 AServlet 对象中添加的参数
        Object systime = request.getAttribute("systime");
        out.print(systime); // 打印获取到的对象
    }
}

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
         version="5.0">
    <servlet>
        <servlet-name>a</servlet-name>
        <servlet-class>com.shuyepl.javaweb.servlet.RequestTest.AServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>a</servlet-name>
        <url-pattern>/a</url-pattern>
    </servlet-mapping>
    <servlet>
        <servlet-name>b</servlet-name>
        <servlet-class>com.shuyepl.javaweb.servlet.RequestTest.BServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>b</servlet-name>
        <url-pattern>/b</url-pattern>
    </servlet-mapping>
</web-app>

网页中访问 AServlet 的结果

001

可以看到,这里执行了 BServlet 对象的程序,输出了调用 BServlet 类时才会输出的内容

注意:转发的对象不一定要是 Servlet 对象,只要是 WEB 容器中的合法资源就可以,只是在转发的时候要注意路径不要写错了


参考资料:https://www.bilibili.com/video/BV1Z3411C7NZ?p=27&share_source=copy_web