Spring集成Web

news2024/11/17 13:37:38

目录

1、简介

2、监听器

3、Spring提供的listener

3.1、xml

3.2、配置类

3.3、WebApplicationContextUtils

3.4、说明

4、自己复现的listener

4.1、ContextLoaderListener

4.2、WebApplicationContextUtils

4.3、Web调用


⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:JavaEE、Spring

1、简介

Spring与Web的集成是指将Spring框架与Web开发技术相结合,使得Spring能够更好地支持Web应用的开发。Spring提供了许多功能和特性来简化Web应用的开发,包括Web MVC、Web安全、Web服务等。

以下是Spring与Web集成的主要内容:

  1. Spring Web MVC: Spring提供了一个强大的Web MVC框架,用于构建灵活、可扩展的Web应用程序。通过使用Spring的DispatcherServlet,开发者可以将请求路由到控制器并处理响应。Spring Web MVC支持注解和XML配置两种方式,使得编写控制器和处理请求变得非常简单。
  2. Spring Web 安全: Spring Security是Spring提供的一套安全框架,用于处理Web应用程序的安全需求,如认证、授权、权限管理等。Spring Security可以轻松地与Spring Web应用集成,并提供强大的安全特性,保护应用程序免受各种安全威胁。
  3. Spring Web 服务: Spring支持集成Web服务技术,包括SOAP和RESTful服务。通过使用Spring Web服务,开发者可以轻松地创建和发布Web服务,并与外部系统进行通信。
  4. Spring Web 数据: Spring提供了各种用于处理Web数据的特性,包括数据绑定、表单处理、文件上传等。Spring的数据绑定功能使得处理表单数据非常简单,可以将请求参数绑定到Java对象上。
  5. Spring Web 视图: Spring支持各种视图技术,包括JSP、Thymeleaf、Freemarker等。通过使用Spring的视图技术,开发者可以轻松地渲染模型数据并生成最终的页面输出。
  6. Spring Web 测试: Spring提供了一套用于测试Web应用程序的工具和类库,包括MockMvc、TestRestTemplate等。通过使用Spring Web测试工具,开发者可以编写单元测试和集成测试,验证Web应用的行为和功能。
  7. Spring Boot: Spring Boot是Spring提供的快速构建Web应用的框架。它可以自动配置Spring应用程序,并提供各种现成的依赖库和功能,使得开发者可以更专注于业务逻辑而不用关心繁琐的配置。

综上所述,Spring与Web集成是一套完整的技术解决方案,使得Spring能够更好地支持Web应用的开发,提供了丰富的功能和特性,帮助开发者构建高效、安全、可靠的Web应用程序。

2、监听器

应用上下文对象是通过new ClasspathXmlApplicationContext("applicationContext.xml"); new AnnotationConfigApplicationContext(SpringConfiguration.class);方式获取的,但是每次从容器中获得Bean时都要编写这样的代码 ,这样的弊端是配置文件加载多次,应用上下文对象创建多次。

在Web项目中,可以使用ServletContextListener监听Web应用的启动,我们可以在Web应用启动时,就加 载Spring的配置文件,创建应用上下文对象ApplicationContext,在将其存储到最大的域servletContex中,这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。

3、Spring提供的listener

Spring提供了一个监听器ContextLoaderListener,就是对上述功能的封装。

该监听器内部加载Spring配置文件,创建应用上下文对象,并存储到ServletContext域中,提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。

所以我们需要做的只有两件事:

① 在web.xml中配置ContextLoaderListener监听器(导入spring-web坐标)

② 使用WebApplicationContextUtils获得应用上下文对象ApplicationContext

首先是要配置监听器,自己复现的监听器,则配置自己的监听器类或者在监听器类上声明@WebListener注解:

然后是配置web应用的初始化参数(就是要加载spring配置):

3.1、xml

3.2、配置类

3.3、WebApplicationContextUtils

3.4、说明

按照上面的步骤,配置监听器、加载配置、使用工具类获取ApplicationContext对象,完成之后,Spring项目启动的时候,自动加载spring的监听器,获取web.xml中的初始化参数,即获取相关配置文件。

contextInitialized() 方法中,ContextLoaderListener 创建一个新的 Spring 容器,一般情况下使用的是 XmlWebApplicationContext 或者 AnnotationConfigWebApplicationContext

完成 Spring 容器的初始化后,ContextLoaderListener 将 Spring 容器存储到 ServletContext 域对象中,以便在整个 Web 应用程序中共享。

此时,Spring 容器已经准备好,可以通过 ServletContext 域对象获取并使用其中的 Bean 实例。

4、自己复现的listener

基本工作思路同Spring提供的一样。先编写监听器类,再编写工具类,然后在web.xml配置初始化参数,便于监听器读取。

目录结构如下:

4.1、ContextLoaderListener

这个部分复现ContextLoaderListener的功能。

先声明监听器,然后实现ServletContextListener,重写两个方法。重点是初始化方法。

在初始化方法中,我们需要的就是把上下文对象存入ServletContext域中,以便整个Web应用共享。

这里提供三种方式,一种是直接加载配置文件contextInitialized_commonlyMethod(servletContextEvent);,另外两种是用上下文对象加载web.xml文件中配置的初始值,分别是:

加载xml配置文件:contextInitialized_getXmlConfig_From_WebXml(servletContextEvent);

加载Java配置类:contextInitialized_getSpringConfigurationNoTest_ConfigClass_From_WebXml(servletContextEvent);

代码如下:

package com.xzl.listener;

import com.xzl.config.SpringConfigurationNoTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

/**
 * @author 逐梦苍穹
 * @date 2023/7/22 17:09
 */
@WebListener
public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        //直接加载配置文件
//        contextInitialized_commonlyMethod(servletContextEvent);
        //用上下文对象加载web.xml中的初始值
        //加载xml配置文件
//        contextInitialized_getXmlConfig_From_WebXml(servletContextEvent);
        //加载Java配置类
        contextInitialized_getSpringConfigurationNoTest_ConfigClass_From_WebXml(servletContextEvent);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }

    public void contextInitialized_commonlyMethod(ServletContextEvent servletContextEvent) {
        //加载配置类
        //AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfigurationNoTest.class);
        //加载配置文件applicationContext.xml
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        ServletContext servletContext = servletContextEvent.getServletContext();
        servletContext.setAttribute("applicationContext", applicationContext);
        System.out.println("监听器spring容器创建成功");
    }

    public void contextInitialized_getXmlConfig_From_WebXml(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
        //获取 web.xml 配置文件中设置的初始化参数的值,这里获取到的是配置文件对象(可以是xml也可以是配置Java类)
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        System.out.println(contextConfigLocation);
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(contextConfigLocation);
        //这个地方存入servletContext域对象,当开发人员取对象的时候,也是存在耦合。所以要修改UserServlet.java代码
        servletContext.setAttribute("applicationContext", applicationContext);
        System.out.println("监听器spring容器创建成功");
    }

    public void contextInitialized_getSpringConfigurationNoTest_ConfigClass_From_WebXml(ServletContextEvent servletContextEvent) {
        ServletContext servletContext = servletContextEvent.getServletContext();
        //获取 web.xml 配置文件中设置的初始化参数的值,这里获取到的是配置文件对象(可以是xml也可以是配置Java类)
        String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
        try {
            Class<?> contextConfigLocation_Class = Class.forName(contextConfigLocation);
            System.out.println(contextConfigLocation_Class);
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(contextConfigLocation_Class);
            servletContext.setAttribute("applicationContext", applicationContext);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        System.out.println(contextConfigLocation);
        System.out.println("监听器spring容器创建成功");
    }
}

4.2、WebApplicationContextUtils

当web应用获取的时候,需要:

ServletContext servletContext = req.getServletContext();

ApplicationContext app = (ApplicationContext) servletContext.getAttribute("applicationContext");

可以看到这里存在耦合,每一个web调用的地方,开发者都需要记住当时在监听器中存入的"applicationContext"标识:

所以这里进行解耦合,学spring官方提供一个工具类WebApplicationContextUtils,用于让web层创建ApplicationContext对象:

很明显可以看到,这就是刚刚"每个web层代码需要重复干的事情"。这里直接使用工具类完成然后返回对象,开发者就不需要记住"applicationContext"。

4.3、Web调用

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

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

相关文章

Less is More: Focus Attention for Efficient DETR

摘要 类似detr的模型显著提高了探测器的性能&#xff0c;甚至优于经典的卷积模型。然而&#xff0c;在传统的编码器结构中&#xff0c;所有的标记都带来了冗余的计算负担。最近的稀疏化策略利用了信息标记的一个子集&#xff0c;通过稀疏编码器来降低注意力的复杂性&#xff0…

观测,让运维更简单!龙蜥社区系统运维 MeetUp 等你报名

为了让广大社区用户和开发者近距离感受 Linux 和 eBPF 技术的魅力&#xff0c;龙蜥社区系统运维于 08 月 12 日在杭州举行 MeetUp 。过去&#xff0c;系统运维 SIG 和大家一起交流了 eBPF 在安全和网络的最佳应用和实践&#xff0c;以及 Linux 在手机和服务器上的运维经验等技术…

深度学习训练营之CGAN生成手势图像

深度学习训练营之CGAN生成手势 原文链接CGAN简单介绍环境介绍前置工作数据导入所需的包加载数据创建数据集查看数据集 模型设置初始化模型的权重定义生成器构造判别器 模型训练定义损失函数设置超参数正式开始训练 结果可视化 原文链接 &#x1f368; 本文为&#x1f517;365天…

leetcode 763. 划分字母区间

2023.8.3 本题的关键是要确保同一字母需要在同一片段中&#xff0c;而这就需要关注到每个字母最后一次出现的位置。 思路&#xff1a;用一个哈希表保存每个字母&#xff08;26个&#xff09;最后一次出现的位置。然后从头遍历&#xff0c;不断更新最右边界&#xff0c;直到当前…

LLVM笔记1

参考&#xff1a;https://www.bilibili.com/video/BV1D84y1y73v/?share_sourcecopy_web&vd_sourcefc187607fc6ec6bbd2c74a3d0d7484cf 文章目录 零、入门名词解释1. Compiler & Interpreter2. AOT静态编译和JIT动态解释的编译方式3. Pass4. Intermediate Representatio…

Eureka增加账号密码认证登录

一、业务背景 注册中心Eureka在微服务开发中经常使用到&#xff0c;用来管理发布的微服务&#xff0c;供前端或者外部调用。但是如果放到生产环境&#xff0c;我们直接通过URL访问的话&#xff0c;这显然是不安全的。 所以需要给注册中心加上登录认证。 通过账号和密码认证进行…

openGauss学习笔记-30 openGauss 高级数据管理-别名

文章目录 openGauss学习笔记-30 openGauss 高级数据管理-别名30.1 语法格式30.1.1 列别名语法30.1.2 表别名语法 30.2 参数说明30.3 示例 openGauss学习笔记-30 openGauss 高级数据管理-别名 SQL可以重命名一张表或者一个字段的名称&#xff0c;这个名称为该表或该字段的别名。…

Spring:JDBCTemplate

JDBCTemplate 概述 概述 JDBC&#xff08;Java DataBase Connectivity&#xff0c;Java 数据库连接&#xff09;&#xff0c; 一 种用于执行 SQL 语句的 Java API&#xff08;Application Programming Interface &#xff0c; 应用程序设计接口 &#xff09;&#xff0c;可以为…

【每日一题】—— C. Mocha and Hiking(Codeforces Round 738 (Div. 2))

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

IO流【笔记】

1. IO概述 1.1 什么是IO 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&a…

软件开发过程中前后端联调相关问题

一、接口调用三步曲 1. uniapp接口调用 data中定义 onload中调用 例如&#xff1a;this.getSwiperList()//调用获取轮播图数据的方法 method中定义获取方法 2. 微信小程序接口调用 reques.js中接口封装 如&#xff1a;ScenicspotInfo &#xff08;data&#xff09;> re…

高级web前端开发工程师的岗位职责最新(合集)

高级web前端开发工程师的岗位职责最新1 职责&#xff1a; 1.主导公司前端开发的技术方向&#xff0c;指导其他前端开发人员工作 2.负责产品的Web前端开发及用户交互体验设计; 3.基于HTML、CSS、JavaScript标准进行页面制作&#xff0c;编写界面组件; 4.协同后台开发工程师&…

8.4 day05软件学习

文章目录 微服务的概念微服务的原则微服务的特征&#xff1a;集群介绍 spring aop 在家学习效率真不高&#xff0c;下午好兄弟喊出去玩&#xff0c;一直到晚上才回来&#xff0c;赶紧总结一下早上学习的内容。 继续看java基础进阶的思想&#xff0c;之前学的很多都忘了。 微服…

网工内推 | 实施、售后工程师,厂商认证优先

01 安井食品集团股份有限公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1.负责集团组网的网络规划、实施、维护工作&#xff1b; 2.负责公司局域网的网络规划、实施、维护工作&#xff1b; 3.负责公司企业安全系统规划、实施、维护工作&#xff1b; 4、负责公…

百度UEditor编辑器如何关闭抓取远程图片功能

百度UEditor编辑器如何关闭抓取远程图片功能 这个坑娘的功能&#xff0c;开始时居然不知道如何触发&#xff0c;以为有个按钮&#xff0c;点击一下触发&#xff0c;翻阅了文档&#xff0c;没有发现&#xff0c;然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发&a…

LT6711A 是一款HDMI 2.0转DP 1.2/EDP 1.4的芯片,实用于AR或者PC以及PAD

LT6711A 1.概述&#xff1a; Lontium LT6711A是HDMI2.0到DP1.2转换器&#xff0c;内部有c型替代模式开关和PD控制器。对于HDMI输入&#xff0c;LT6711A具有一个HDMI2.0接收器&#xff0c;有1个时钟通道和3个数据通道&#xff0c;每个数据通道最大运行6Gb/s&#xff0c;最大输…

DAY02_Spring第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

智能汽车驾驶演进:虚拟ECU种类与优劣分析

现代汽车更安全、更舒适、更智能的代价是车载ECU&#xff08;Electronic Control Unit&#xff09;数量的迅速增长&#xff0c;与之相对应的是ECU上规模软件越来越大、软件开发成本在整车制造成本中的占比越来越高。车企可以从规则与方法两个角度入手来解决上述问题&#xff1a…

ES6新增的语法

ES6实际上是一个泛指&#xff0c;泛指 ES2015 及后续的版本 1&#xff0c;let用于声明变量的关键字 let 声明的变量只在所处于的代码块内有效 if (true) { let a 10 } console.log(a) // a is not defined 2, let 不存在变量提升 console.log(a) // a is not deined let a 1…

元素2D转3D 椭圆形旋转实现

椭圆旋转功能展示 transform-style: preserve-3d;&#xff08;主要css代码&#xff09; gif示例&#xff08;背景图可插入透明以此实现边框线的旋转&#xff09; 导致的无法点击遮挡问题可以参考我的另一个文章 穿透属性-----------------------css穿透属性 实时代码展示