Spring集成Web

目录

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调用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Linux运维实战:Docker基础总结》

一、简介 1、docker的基本结构是什么&#xff0c;包含哪些组件&#xff1f; docker的基本机构是c/s模式&#xff0c;即客户端/服务端模式。 由docker客户端和docker守护进程组成。docker客户端通过命令行或其它工具使用docker sdk与docker守护进程通信&#xff0c;发送容器管理…

Add-in Express for Microsoft Office and Delphi Crack

Add-in Express for Microsoft Office and Delphi Crack 适用于Microsoft Office和Delphi VCL的Add-in Express使您能够在几次点击中为Microsoft Office开发专业插件。它生成基于COM的项目&#xff0c;这些项目包含Microsoft Office外接程序或智能标记的所有必要功能&#xff0…

React实现关键字高亮

先看效果&#xff1a; 实现很简单通过以下这个函数&#xff1a; highLight (text, keyword ) > {return text.split(keyword).flatMap(str > [<span style{{ color: red, fontWeight: bold }}>{keyword}</span>, str]).slice(1);}展示某段文本时调用该函数…

Matlab进阶绘图第25期—三维密度散点图

三维密度散点图本质上是一种特征渲染的三维散点图&#xff0c;其颜色表示某一点所在区域的密度信息。 除了作图&#xff0c;三维密度散点图绘制的关键还在于密度的计算。 当然&#xff0c;不管是作图还是密度的计算&#xff0c;这些在《Matlab论文插图绘制模板》和《Matlab点…

k8s资源管理方法详解(陈述式、声明式)

目录 一&#xff1a;陈述式资源管理方法 二&#xff1a; 基本信息查看 1、查看信息 2、创建 3、删除 4、service 的 type 类型 三&#xff1a;项目实例 1、创建 kubectl create命令 2、发布 kubectl expose命令 3、在 node 节点上操作&#xff0c;查看负载均衡端…

Celery嵌入工程的使用

文章目录 1.config 1.1 通过app.conf进行配置1.2 通过app.conf.update进行配置1.3 通过配置文件进行配置1.4 通过配置类的方式进行配置2.任务相关 2.1 任务基类(base)2.2 任务名称(name)2.3 任务请求(request)2.4 任务重试(retry) 2.4.1 指定最大重试次数2.4.2 设置重试间隔时间…

Mac终端利器:Homebrew + iTerm2 + Oh My Zsh 教程

引言 前段时间调整了一下 iTerm2 的环境&#xff0c;感觉比以前好看多了&#xff0c;并且更加高效&#xff0c;这里做一个记录&#xff0c;希望能给大家一些启发。 工具介绍 brew&#xff1a;Mac OS 下强大的包管理工具。iTerm2&#xff1a;iTerm2是 Mac OS 终端的替代品&am…

Detecting Everything in the Open World: Towards Universal Object Detection

1. 论文简介 论文题目《Detecting Everything in the Open World: Towards Universal Object Detection》发表情况&#xff0c;CVPR2023[论文地址][https://arxiv.org/pdf/2303.11749.pdf][代码地址][https://github.com/zhenyuw16/UniDetector] 2.背景与摘要 本文旨在解决通…

Crowd-Robot Interaction 论文阅读

论文信息 题目&#xff1a;Crowd-Robot Interaction:Crowd-aware Robot Navigation with Attention-based Deep Reinforcement Learning 作者&#xff1a;Changan Chen, Y uejiang Liu 代码地址&#xff1a;https://github.com/vita-epfl/CrowdNav 来源&#xff1a;arXiv 时间…

Spring集成Seata

Seata的集成方式有&#xff1a; 1. Seata-All 2. Seata-Spring-Boot-Starter 3. Spring-Cloud-Starter-Seata 本案例使用Seata-All演示&#xff1a; 第一步&#xff1a;下载Seata 第二步&#xff1a;为了更好看到效果&#xff0c;我们将Seata的数据存储改为db 将seata\sc…

【IMX6ULL驱动开发学习】04.应用程序和驱动程序数据传输和交互的4种方式:非阻塞、阻塞、POLL、异步通知

一、数据传输 1.1 APP和驱动 APP和驱动之间的数据访问是不能通过直接访问对方的内存地址来操作的&#xff0c;这里涉及Linux系统中的MMU&#xff08;内存管理单元&#xff09;。在驱动程序中通过这两个函数来获得APP和传给APP数据&#xff1a; copy_to_usercopy_from_user …

电脑自动关机是什么原因?1分钟弄懂!

“好奇怪啊&#xff0c;我在使用电脑时&#xff0c;电脑总是莫名其妙就会自动关机&#xff0c;有时候我文件都来不及保存。这是为什么呢&#xff1f;有什么解决方法吗&#xff1f;” 电脑自动关机是一个令人头疼的问题&#xff0c;可能会对我们的工作和生活带来影响。电脑自动关…

数组相关练习

数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…

电商数据获取:网络爬虫还是付费数据接口?

随着电商行业的迅速发展&#xff0c;对电商数据的需求也越来越大。在获取电商数据时&#xff0c;常常面临一个选择&#xff1a;是自己编写网络爬虫进行数据爬取&#xff0c;还是使用现有的付费数据接口呢&#xff1f;本文将从成本、可靠性、数据质量等多个角度进行分析&#xf…

【果树农药喷洒机器人】Part1:研究现状分析以及技术路线介绍

本专栏介绍&#xff1a;付费专栏&#xff0c;持续更新机器人实战项目&#xff0c;欢迎各位订阅关注。 关注我&#xff0c;带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章&#xff01; 文章目录 一、项目背景二、国内外研究现状2.1 国内研究现状2.2 国外研究现状 三…

C语言内嵌汇编

反编译&#xff08;二进制文件或者so库&#xff09; objdump --help objdump -M intel -j .text -ld -C -S out > out.txt #显示源代码同时显示行号, 代码段反汇编-M intel 英特尔语法-M x86-64-C:将C符号名逆向解析-S 反汇编的同时&#xff0c;将反汇编代码和源代码交替显…

Python自动化测试用例:如何优雅的完成Json格式数据断言

目录 前言 直接使用 优化 封装 小结 进阶 总结 资料获取方法 前言 记录Json断言在工作中的应用进阶。 直接使用 很早以前写过一篇博客&#xff0c;记录当时获取一个多级json中指定key的数据&#xff1a; #! /usr/bin/python # coding:utf-8 """ aut…

3分钟创建新生分班查询二维码,无需技术、0成本

作为教师&#xff0c;我们深知分班是一项极其重要的任务&#xff0c;需要综合考虑学生的性格、能力和兴趣等多个方面&#xff0c;以确保每个学生都能够获得最佳的学习环境和成绩。在本文中&#xff0c;我将分享一种便捷的方式来告知家长有关分班录取情况的方法。 通常&#xf…

2. 软件需求 面向对象分析

目录 1. 软件需求 1.1 需求分类 1.2 需求获取 1.3 需求分析 2. 面向对象分析&#xff08;OOA&#xff09; 2.1 统一建模语言 UML 2.2 用例模型 2.2.1 用例图的元素 2.2.2 识别参与者 2.2.3 合并需求获得用例 2.2.4 细化用例描述 2.3 分析模型 2.3.1 定义概念类 …

深入JVM - JIT分层编译技术与日志详解

深入JVM - JIT分层编译技术与日志详解 文章目录 深入JVM - JIT分层编译技术与日志详解1. 背景简介2. JIT 编译器2.1. 客户端版本的编译器: C12.2. 服务端版本的编译器: C22.3. Graal JIT 编译器 3. 分层编译技术(Tiered Compilation)3.1. 汇聚两种编译器的优点3.2. 精准优化(Ac…