SpringBoot-WEB相关

WEB相关

WebApplicationContextServletContextAwareProcessor用于处理带有WebApplicationContextServletContextAware接口的Bean,该接口的目的是:用于指示 Spring 中的 Bean 希望获取 ServletContext 对象。这个接口不包含任何方法,它仅仅是为了告诉 Spring 容器,实现了这个接口的 Bean 希望在初始化时获取 ServletContext 实例。

该网址中有详细讲解 https://blog.csdn.net/andy_zhang2007/article/details/86289823

注:ServletContextApplicationContext的区别:

  1. 来源:ServletContext 是属于Java Servlet规范的,表示的是整个web应用程序的上下文环境。ApplicationContext是Spring框架中的,用于表示 Spring 应用程序的上下文环境。ApplicationContext 是 Spring 特有的概念,它提供了更加丰富和强大的功能,比如依赖注入、AOP、事件机制等。

  2. 创建时机:ServletContext 对象,它在应用程序启动时由 Servlet 容器(比如 Tomcat、Jetty 等)创建并初始化。ApplicationContext是SpringBoot程序启动时创建的。

  3. 功能:

    1. ServletContext

      可以用来在整个 Web 应用程序范围内共享信息和资源,比如初始化参数、全局配置等。可以用来管理 Web 应用程序中的静态资源,如 HTML 文件、图片、CSS 和 JavaScript 文件等。 具有请求转发和请求包含的功能,允许将请求转发到其他资源或将其他资源包含在当前响应中。 支持监听器,允许注册监听器来监听 Web 应用程序的生命周期事件,如应用程序的启动、关闭等。

    2. ApplicationContext

      • 可以管理 Bean的生命周期,并通过依赖注入将 Bean 注入到其他 Bean 中,在 Bean 初始化和销毁时执行特定的操作,实现组件之间的解耦和灵活性。

      • ApplicationContext 支持 AOP,允许将横切关注点(如日志、事务管理)从主要业务逻辑中分离出来,提高代码的模块化和可维护性。

      • ApplicationContext 提供了事件机制,允许发布和监听事件,实现组件之间的解耦和消息传递。

      • ApplicationContext 支持国际化,允许在应用程序中轻松实现多语言支持。

      • ApplicationContext 管理 Bean 的生命周期,可以在 Bean 初始化和销毁时执行特定的操作。

  4. 使用

    1. 获取信息:

      • 数据源:web.xml文件

        <?xml version="1.0" encoding="UTF-8"?>
        <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
                version="4.0">
        
            <!-- 配置初始化参数 -->
            <context-param>
                <param-name>appName</param-name>
                <param-value>MyApp</param-value>
            </context-param>
            
            <context-param>
                <param-name>appVersion</param-name>
                <param-value>1.0</param-value>
            </context-param>
        
            <!-- 配置 Servlet -->
            <servlet>
                <servlet-name>MyServlet</servlet-name>
                <servlet-class>com.example.MyServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>MyServlet</servlet-name>
                <url-pattern>/myServlet</url-pattern>
            </servlet-mapping>
        </web-app>
        
      • ServletContext获取信息

        import java.io.IOException;
        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 javax.servlet.ServletContext;
        
        @WebServlet("/myServlet")
        public class MyServlet extends HttpServlet {
        
            protected void doGet(HttpServletRequest request, HttpServletResponse response)
                    throws ServletException, IOException {
        
                // 获取 ServletContext 对象
                // 该方法由HttpServlet提供
                ServletContext servletContext = getServletContext();
        
                // 从 ServletContext 中获取初始化参数
                String appName = servletContext.getInitParameter("appName");
                String appVersion = servletContext.getInitParameter("appVersion");
        
                // 设置响应内容类型
                response.setContentType("text/html");
        
                // 输出 HTML 页面
                response.getWriter().println("<html><head><title>Servlet Example</title></head><body>");
                response.getWriter().println("<h1>Application Name: " + appName + "</h1>");
                response.getWriter().println("<h2>Application Version: " + appVersion + "</h2>");
                response.getWriter().println("</body></html>");
            }
        }
        
      • ApplicationContext获取信息

        import org.springframework.context.ApplicationContext;
        import org.springframework.context.support.ClassPathXmlApplicationContext;
        
        public class MyApp {
            public static void main(String[] args) {
                // 创建 Spring 应用程序上下文
                ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        
                // 获取应用程序的环境对象
                org.springframework.core.env.Environment env = context.getEnvironment();
        
                // 获取初始化参数
                String appName = env.getProperty("appName");
                String appVersion = env.getProperty("appVersion");
        
                // 输出参数值
                System.out.println("Application Name: " + appName);
                System.out.println("Application Version: " + appVersion);
            }
        }
        
    2. 请求转发,请求包含等

      请求转发与请求包含,重定向的使用对象是RequestDispatcher,这里使用ServletContext进行获取,不过一般是使用HttpServletRequest直接获取RequestDispatcher对象。

      //通过ServletContext获取RequestDispatcher
      import java.io.IOException;
      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 javax.servlet.RequestDispatcher;
      import javax.servlet.ServletContext;
      
      @WebServlet("/forwardAndIncludeServlet")
      public class ForwardAndIncludeServlet extends HttpServlet {
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
      
              // 获取 ServletContext 对象
              ServletContext servletContext = getServletContext();
      
              // 设置响应内容类型
              response.setContentType("text/html");
      
              // 获取请求转发的目标 Servlet 的路径
              String forwardPath = "/forwardedServlet";
              
              // 获取请求包含的目标 Servlet 的路径
              String includePath = "/includedServlet";
      
              // 请求转发
              RequestDispatcher dispatcher = servletContext.getRequestDispatcher(forwardPath);
              dispatcher.forward(request, response);
      
              // 请求包含
              RequestDispatcher includeDispatcher = servletContext.getRequestDispatcher(includePath);
              includeDispatcher.include(request, response);
          }
      }
      
      //通过HttpServletRequest获取RequestDispatcher对象
      import java.io.IOException;
      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 javax.servlet.RequestDispatcher;
      
      @WebServlet("/forwardAndIncludeServlet")
      public class ForwardAndIncludeServlet extends HttpServlet {
      
          protected void doGet(HttpServletRequest request, HttpServletResponse response)
                  throws ServletException, IOException {
      
              // 设置响应内容类型
              response.setContentType("text/html");
      
              // 获取请求转发的目标 Servlet 的路径
              String forwardPath = "/forwardedServlet";
              
              // 获取请求包含的目标 Servlet 的路径
              String includePath = "/includedServlet";
      
              // 请求转发
              RequestDispatcher dispatcher = request.getRequestDispatcher(forwardPath);
              dispatcher.forward(request, response);
      
              // 请求包含
              RequestDispatcher includeDispatcher = request.getRequestDispatcher(includePath);
              includeDispatcher.include(request, response);
          }
      }
      

注:请求包含,请求转发,重定向的区别:

  1. 请求转发&重定向

    请求转发:是在服务器内部完成的,转发前的 Servlet 将控制权交给转发后的 Servlet,转发后的 Servlet 生成的响应直接返回给客户端,客户端不会感知到转发的过程。

    重定向:是通过向客户端发送一个特殊的响应(HTTP 302 Found 或 HTTP 303 See Other),告诉客户端重新发送一个新的请求到指定的 URL。客户端收到重定向响应后,会发起一个新的请求,服务器接收到新的请求后再返回响应。

    请求转发不会改变客户端的 URL 地址,客户端仍然看到原始请求的 URL 地址。

    重定向会改变客户端的 URL 地址,客户端会收到一个新的 URL 地址,然后发起新的请求。

    请求转发可以访问转发前的 Servlet 的资源路径。

    重定向无法访问原始请求的资源路径,因为它实际上是一个全新的请求。

  2. 请求转发&请求包含

    import java.io.IOException;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/includeServlet")
    public class IncludeServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 设置响应内容类型
            response.setContentType("text/html");
    
            // 生成一些内容
            String content = "<h2>This is IncludeServlet's content</h2>";
    
            // 输出内容到响应
            response.getWriter().println(content);
        }
    }
    
    import java.io.IOException;
    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 javax.servlet.RequestDispatcher;
    
    @WebServlet("/mainServlet")
    public class MainServlet extends HttpServlet {
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            // 设置响应内容类型
            response.setContentType("text/html");
    
            // 输出一些主要内容
            response.getWriter().println("<h1>MainServlet Content</h1>");
            response.getWriter().println("<p>This is the main content of the page.</p>");
    
            // 包含IncludeServlet的响应内容
            RequestDispatcher dispatcher = request.getRequestDispatcher("/includeServlet");
            dispatcher.include(request, response);
    
            // 输出一些其他内容
            response.getWriter().println("<p>This is some additional content.</p>");
        }
    }
    

    最终输出:

    MainServlet Content
    This is the main content of the page.
    This is IncludeServlet's content
    This is some additional content.
    

    这就是请求包含。

相关推荐

  1. SpringBoot-WEB相关

    2024-03-12 23:00:04       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-12 23:00:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-12 23:00:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-12 23:00:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-12 23:00:04       20 阅读

热门阅读

  1. 如何实现单片机与手机的远距离通信

    2024-03-12 23:00:04       19 阅读
  2. DAO模式和三层模式

    2024-03-12 23:00:04       29 阅读
  3. Sklearn交叉验证

    2024-03-12 23:00:04       26 阅读
  4. zookeeper源码(10)node增删改查及监听

    2024-03-12 23:00:04       32 阅读
  5. 使用GitLab Python库判断一个mr是否完全approval

    2024-03-12 23:00:04       22 阅读
  6. 安装 WPS 国际版并汉化

    2024-03-12 23:00:04       77 阅读
  7. 用python实现选择排序

    2024-03-12 23:00:04       30 阅读
  8. 软考笔记--层次式架构之表现层框架设计

    2024-03-12 23:00:04       20 阅读
  9. CSS note

    2024-03-12 23:00:04       27 阅读