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 {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {//直接加载配置文件
//        contextInitialized_commonlyMethod(servletContextEvent);//用上下文对象加载web.xml中的初始值//加载xml配置文件
//        contextInitialized_getXmlConfig_From_WebXml(servletContextEvent);//加载Java配置类contextInitialized_getSpringConfigurationNoTest_ConfigClass_From_WebXml(servletContextEvent);}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {}public void contextInitialized_commonlyMethod(ServletContextEvent servletContextEvent) {//加载配置类//AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfigurationNoTest.class);//加载配置文件applicationContext.xmlClassPathXmlApplicationContext 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.hqwc.cn/news/52520.html

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

相关文章

JVM相关知识

JVM主要有堆、方法区、虚拟机栈、本地方法栈、程序计数器组成 线程私有区域&#xff1a; 程序计数器&#xff1a;字节码执行的都有一个编号&#xff0c;就是程序计数器&#xff0c;解释器按这个计数器执行字码&#xff0c;将字节码转换为机器码给cpu运行。其二就是多线程中&a…

【C++】开源:ncurses终端TUI文本界面库

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍ncurses终端文本界面库。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下…

【计算机视觉】干货分享:Segmentation model PyTorch(快速搭建图像分割网络)

一、前言 如何快速搭建图像分割网络&#xff1f; 要手写把backbone &#xff0c;手写decoder 吗&#xff1f; 介绍一个分割神器&#xff0c;分分钟搭建一个分割网络。 仓库的地址&#xff1a; https://github.com/qubvel/segmentation_models.pytorch该库的主要特点是&#…

运输层---概述

目录 运输层主要内容一.概述和传输层服务1.1 概述1.2 传输服务和协议1.3 传输层 vs. 网络层1.4 Internet传输层协议 二. 多路复用与多路分解&#xff08;解复用&#xff09;2.1 概述2.2 无连接与面向连接的多路分解&#xff08;解复用&#xff09;2.3面向连接的多路复用*2.4 We…

STM32刷Micropython固件参考指南

STM32刷Micropython固件指南 其实刷固件和普通的程序下载烧录无多大的差异&#xff0c;主要是其他因数的影响导致刷固件或刷完固件无法运行的情况和相关问题。 &#x1f4d1;刷固件教程 固件下载。目前所支持的stm32型号有这些&#xff1a; stm32f0, stm32f4, stm32f7, stm32g…

基于C#的窗体阴影效果方案 - 开源研究系列文章

最近在研究C#的Winform窗体的效果&#xff0c;上次介绍了窗体动画效果的博文( 基于C#的无边框窗体动画效果的完美解决方案 - 开源研究系列文章 )&#xff0c;这次将窗体阴影效果的方案进行一个介绍。 找了一下度娘&#xff0c;具体窗体阴影效果就两种方法&#xff1a;直接绘制和…

Spring:JDBCTemplate

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

数学知识(二)

一、裴蜀定理 对于任意整数a,b&#xff0c;一定存在非零整数x,y&#xff0c;使得 ax by gcd(a,b) #include<iostream> #include<algorithm>using namespace std;int exgcd(int a,int b,int &x,int &y) {if(!b){x 1,y 0;return a;}int d exgcd(b,a %…

大数据Flink(五十五):Flink架构体系

文章目录 Flink架构体系 一、 Flink中的重要角色 二、Flink数据流编程模型 三、Libraries支持

落地数字化管理,提升企业市场竞争力

数字化企业管理方案是一种利用数字技术和信息系统来提升企业管理效率和运营效果的策略。 潜在的数字化企业管理方案 1、企业资源规划&#xff08;ERP&#xff09;系统&#xff1a;建立一个集成的ERP系统来统一管理企业的各项业务流程&#xff0c;包括采购、销售、库存管理、财…

Webpack开启本地服务器;HMR热模块替换;devServer配置;开发与生成环境的区分与配置

目录 1_开启本地服务器1.1_开启本地服务器原因1.2_webpack-dev-server 2_HMR热模块替换2.1_认识2.2_开启HMR2.3_框架的HMR 3_devServer配置3.1_host配置3.2_port、open、compress 4_开发与生成环境4.1_如何区分开发环境4.2_入口文件解析4.3_区分开发和生成环境配置 1_开启本地服…

【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT

1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨&#xff0c;在1995年出版的《未来之路》一书中&#xff0c;提及“物物互联”。1998年麻省理工学院提出&#xff0c;当时被称作EPC系统的物联网构想。2005年11月&#xff0c;国际电信联盟发布《ITU互联网…