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.
    

    这就是请求包含。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/732129.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

技术小知识:云计算服务下的IaaS,PaaS,SaaS⑥

一、云计算 云计算起源仿照天空的云朵聚集&#xff0c;意为对大量服务器的远程管理。以便能对服务器做空间、资源的最大动态协调利用和降低操作执行命令的复杂度。 二、云计算衍生下的服务 在服务器以一种云的形式存在&#xff0c;衍生除了很多服务提供&#xff0c;以便用户可以…

七、MySQL配置文件及常用参数

目录 一、配置文件 二、MySQL参数 一、配置文件 配置文件目录&#xff1a;/etc 注意&#xff1a;首行缩进的均为示例&#xff0c;主要参数不能作为生产环境依据&#xff0c;建议在DBA指导下配置。更新中 [rootrabbitmq_1 etc]# vim my.cnf //因为mysql在启动时候&#xff0…

295.【华为OD机试】智能驾驶( 广度优先搜索(BFS)JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

crossover2023激活码分享crossover免费升级2024 crossover24更新内容

CrossOver是一款功能强大的系统兼容软件&#xff0c;它能够让Mac和Linux用户在不安装Windows操作系统的情况下直接运行Windows应用程序。以下是关于CrossOver的更多信息&#xff1a; 一、工作原理 CrossOver的工作原理是通过在Mac或Linux系统上模拟Windows应用程序所需的运行…

循序渐进丨MogDB 数据库新特性之SQL PATCH绑定执行计划

1 SQL PATCH 熟悉 Oracle 的DBA都知道&#xff0c;生产系统出现性能问题时&#xff0c;往往是SQL走错了执行计划&#xff0c;紧急情况下&#xff0c;无法及时修改应用代码&#xff0c;DBA可以采用多种方式针对于某类SQL进行执行计划绑定&#xff0c;比如SQL Profile、SPM、SQL …

Python基础三

一、模块&#xff08;model&#xff09; 1、定义 以.py 结尾的文件&#xff0c;包含了Python对象定义和Python语句 如下&#xff1a;包含了两个模块&#xff0c;分别为 main.py 和 model.py 2、特点 模块让你能够有逻辑地组织你的Python 代码段。把相关的代码分配到一个模块…

封装数据请求方法与接口方法

src\libs\http.js 封装 get、post 请求 import axios from axios import qs from qsimport { JUHE_APPKEY } from /configs/keysfunction axiosPost(options) {axios({url: options.url,method: post,header: {Content-Type: application/x-www-form-urlencoded,},data: qs.st…

协程简单介绍

协程&#xff08;Coroutine&#xff09;是一种用户态的轻量级线程&#xff0c;它可以在单线程内实现多个执行线程的切换和调度&#xff0c;而无需依赖操作系统的线程管理机制&#xff08;简单来说可以认为协程是线程里不同的函数&#xff0c;这些函数之间可以相互快速切换&…

Linux: 预备

计算机结构基础 操作系统: 内核 (管理软硬件) shell(给用户使用操作系统的方式) 操作系统的目标 对硬件抽象 原因:操作系统是对软硬件资源管理的应用软件抽象:内存管理, 进程管理, 文件管理, 驱动管理软件:驱动程序(给软件提供访问硬件的软件)硬件:磁盘(对应文件), 网卡等隔离…

基于SpringBoot的医疗资源共享平台设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 相关技术 3 1.1 SpringBoot框架 3 1.2 MyBatis框架 3 1.3 WebSocket技术 4 1.4 Selenium技术 5 1.5 EL-ADMIN技术 5 1.6 Ajax技术 5 1.7 本章小结 6 2 系统分析 7 2.1 功能需求分析 7 2.2 非功能需求 9 2.3 本章小结 10 3 系统设计 11 3.…

解锁安卓开发利器:深度探析ADB【安卓开发】

引言 在安卓开发与维护过程中&#xff0c;我们经常会遇到一些限制&#xff0c;比如无法直接访问某些系统功能&#xff0c;或者在某些定制系统中 受到限制 。为了解决这些问题&#xff0c;我们需要一种有效的工具来管理和调试安卓设备&#xff0c;而这时候ADB&#xff08;Andro…

poetry库:依赖管理和打包工具

这个工具是在群里看见别人说好用的&#xff0c;所以了解一下。 1.poetry初始 官网&#xff1a;https://python-poetry.org/ 项目仓库&#xff1a;https://github.com/python-poetry 或 https://github.com/python-poetry/poetry 教程&#xff1a;https://python-poetry.org/…

二、NLP中的序列标注(分词、主体识别)

一般来说&#xff0c;一个序列指的是一个句子&#xff0c;而一个元素指的是句子中的一个词。在序列标注中&#xff0c;我们想对一个序列的每一个元素标注一个分类标签。比如信息提取问题可以认为是一个序列标注问题&#xff0c;如提取出会议时间、地点等。 常见的应用场景&…

css学习心得

css 通过内嵌样式表来选择文本字体的大小和颜色 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><style>p{font-size:16px;color: blue;}</style></head><body><!-- px 像素…

如何在Linux系统安装SVN并配置固定公网地址远程访问【内网穿透】

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

牛客小白月赛88

E.多重映射 解题思路 对集合进行整体操作&#xff0c;集合大小只增不减&#xff0c;问最后集合标号维护集合&#xff0c;考虑并查集但直接用并差集维护会有以下问题&#xff1a;当前集合变标号&#xff0c;可能会和之前标号相同&#xff0c;则进行并查集操作时&#xff0c;会接…

ai语音克隆:用AI大模型开发点亮你的创作天地!

在当今快速发展的科技时代&#xff0c;人工智能技术已经深入到我们生活的方方面面。AI语音克隆作为其中的一种应用&#xff0c;正在逐渐走进人们的视野&#xff0c;为人们的创作提供了全新的可能性。 人类创作的过程往往是一个灵感迸发、思绪飞扬的过程。但有时候&#xff0c;…

数据结构——堆的应用 堆排序详解

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

网上近来都有哪些有关李小璐及其女儿甜馨的恶评?作为网民应怎样规避恶语中伤或网暴?

网上近来都有哪些有关李小璐及其女儿甜馨的恶评&#xff1f;作为网民应怎样规避恶语中伤或网暴&#xff1f; 近日&#xff0c;#李小璐发文鼓励女儿甜馨不要受恶评影响#登上热搜&#xff0c;网上都有哪些关于李小璐及其女儿的恶评&#xff1f;作为普通网民应怎样规避恶评或网暴&…

JVM——执行引擎

文章目录 1、概述2、计算机语言的发展史2.1、机器码2.2、汇编语言2.3、高级语言2.4、字节码 3、Java代码编译和执行过程4、解释器5、JIT编译器5.1、为什么HotSpot VM同时存在JIT编译器和解释器5.2、热点代码探测确定何时JIT5.3、设置执行模式5.4、C1编译器和C2编译器 6、AOT编译…