当前位置: 首页 > news >正文

03:Spring之Web

一:Spring整合web环境

1:web的三大组件

  • Servlet:核心组件,负责处理请求和生成响应。

  • Filter:用于请求和响应的预处理和后处理,增强功能。

  • Listener:用于监听 Web 应用中的事件,实现事件驱动的功能。

2:Spring整合Web的思路与具体实现

Spring 整合 Web 应用的思路是通过将 Spring 框架与 Java Web 技术(如 Servlet、Filter 等)结合,利用 Spring 的 IoC(控制反转)和 AOP(面向切面编程)等特性,简化 Web 开发的复杂性,并提供更强大的功能支持。

2.1:思路

  1. 核心思想

    • 将 Spring 容器与 Web 应用的生命周期绑定,确保 Spring 管理的 Bean 可以在 Web 应用中使用。

    • 使用 Spring MVC 框架处理 Web 请求,替代传统的 Servlet 开发模式。

    • 通过配置或注解的方式,简化 Web 组件的开发和依赖注入。

  2. 关键点

    • Spring 容器的初始化:在 Web 应用启动时初始化 Spring 容器,并将其存储到 ServletContext 中。

    • DispatcherServlet:作为 Spring MVC 的核心组件,负责接收所有请求并将其分发给对应的控制器(Controller)。

    • 依赖注入:通过 Spring 的 IoC 容器管理 Web 层、服务层和数据层的 Bean,实现松耦合。

    • AOP 支持:通过 AOP 实现日志、事务、权限等横切关注点的统一管理。

2.2:具体实现步骤

1:引入依赖

在 Maven 或 Gradle 项目中引入 Spring 和 Spring MVC 的相关依赖:

xml

<!-- Spring Web MVC -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.23</version>
</dependency>

<!-- Servlet API -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>

2:配置 Spring 容器

Spring 容器需要在 Web 应用启动时初始化。可以通过以下两种方式实现:

方式 1:基于 web.xml 配置

在 web.xml 中配置 ContextLoaderListener 和 DispatcherServlet

<!-- 初始化 Spring 容器 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<!-- 监听器:启动时加载 Spring 容器 -->
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 配置 DispatcherServlet -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

方式 2:基于 Java 配置(无 web.xml

public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        // 创建 Spring 根容器
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(AppConfig.class); // 注册 Spring 配置类
        servletContext.addListener(new ContextLoaderListener(rootContext));

        // 创建 Spring MVC 容器
        AnnotationConfigWebApplicationContext mvcContext = new AnnotationConfigWebApplicationContext();
        mvcContext.register(WebConfig.class); // 注册 Spring MVC 配置类

        // 配置 DispatcherServlet
        DispatcherServlet dispatcherServlet = new DispatcherServlet(mvcContext);
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", dispatcherServlet);
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}
package com.zgs.web.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

import java.util.List;

/**
 * @author guisong.zhang
 * @date 2025/2/12 23:50
 * @description 类描述
 */
@Configuration // 标记为配置类
@EnableWebMvc  // 启用 Spring MVC
@ComponentScan(basePackages = "com.zgs.controller") // 扫描控制器所在的包
public class WebConfig implements WebMvcConfigurer {
    // 配置视图解析器
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/"); // 视图文件的前缀
        resolver.setSuffix(".jsp");            // 视图文件的后缀
        registry.viewResolver(resolver);
    }

    // 配置静态资源处理
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**") // 静态资源的 URL 路径
                .addResourceLocations("/static/"); // 静态资源的实际存放位置
    }

    // 配置消息转换器
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 添加 JSON 消息转换器
        converters.add(new MappingJackson2HttpMessageConverter());
    }
}

3. 配置 Spring MVC

在 Spring MVC 配置文件中(如 spring-mvc.xml 或 Java 配置类),配置视图解析器、静态资源处理、注解驱动等:

<!-- 启用注解驱动 -->
<mvc:annotation-driven />

<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

<!-- 静态资源处理 -->
<mvc:resources mapping="/static/**" location="/static/" />

或者使用 Java 配置:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.zgs.controller")
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }
}

4. 编写 Controller

使用 @Controller 注解定义控制器,处理请求并返回视图或数据

@Controller
public class HomeController {

    @RequestMapping("/")
    public String home(Model model) {
        model.addAttribute("message", "Hello, Spring MVC!");
        return "home"; // 返回视图名称
    }

    @GetMapping("/api/data")
    @ResponseBody
    public String getData() {
        return "This is a JSON response";
    }
}

5. 部署和运行

将应用打包为 WAR 文件并部署到 Tomcat 或其他 Servlet 容器中,访问 / 路径即可看到效果。

2.3:Spring 整合 Web 的优势

  1. 松耦合:通过依赖注入管理 Bean,降低组件之间的耦合度。

  2. 简化开发:注解驱动和自动配置减少了 XML 配置的复杂性。

  3. 强大的功能支持:Spring MVC 提供了数据绑定、表单处理、文件上传、国际化等功能。

  4. 易于测试:Spring 的依赖注入使得单元测试和集成测试更加方便。

  5. 扩展性强:可以轻松集成其他 Spring 生态组件(如 Spring Security、Spring Data 等)。

通过以上步骤,Spring 可以很好地与 Web 应用整合。

2.4:其他方式创建servlet

可以直接在页面访问这个servlet来执行对应的业务,但是这样有一个弊端就是每个业务都需要对应的servlet,增加代码量且每次都创建容器浪费资源。

@WebServlet(urlPatterns = "/accountServlet")
public class AccountServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
        AccountService accountService = applicationContext.getBean(AccountService.class);
        accountService.transBalance("zgs", "yh", 500);
    }
}
所以,我们现在需要做如下优化
ApplicationContext创建一次,配置类加载一次;
最好web服务器启动时,就执行第1步操作,后续直接从容器中获取Bean使用即可;
ApplicationContext的引用需要在web层任何位置都可以获取到。
优化方法如下
1:在ServletContextListener的contextInitialized方法中执行ApplicationContext的创建。或在Servlet的init 方法中执行ApplicationContext的创建,并给Servlet的load-on-startup属性一个数字值,确保服务器启动 Servlet就创建;
2:将创建好的ApplicationContext存储到ServletContext域中,这样整个web层任何位置就都可以获取到了。

二:MVC的框架思想与设计思路

相关文章:

  • this.globalThis || (this.globalThis = this)
  • Android中获取so文件来源于哪个库
  • SQL Server STUFF 函数的用法及应用场景
  • MATLAB图像处理:几何变换详解(裁剪、旋转、缩放)
  • C++ 设计模式-抽象工厂
  • Vision Transformer:打破CNN垄断,全局注意力机制重塑计算机视觉范式
  • 网络安全防范课后参考答案
  • Python爬虫实战:股票分时数据抓取与存储 (1)
  • 设计模式-模版方法
  • 【stm32f407hal库】定时器定时功能
  • web自动化-浏览器驱动下载
  • Linux Mem -- Where the mte store and check in the real hardware platform
  • html css js网页制作成品——HTML+CSS+js茉酸奶的茶网页设计(5页)附源码
  • C++基础知识(三)之结构体、共同体、枚举、引用、函数重载
  • MS08067练武场--WP
  • GBD研究——美国州级地图(附资源)
  • TDengine 客户端连接工具 taos-Cli
  • 盛铂科技 SMF106 低相位噪声贴片式频率综合器模块
  • xfeat paper笔记
  • 国自然专项项目申请:AI赋能的急性心肌梗死预警研究|基金申请·25-02-14
  • 国防部:赖清德歪曲二战历史,背叛民族令人不齿
  • 株洲一重病妇女被要求本人到银行取款时去世?当地警方:正在处理
  • 鄂州交警通报致1死2伤车祸:女子操作不当引发,已被刑拘
  • 为何选择上海?两家外企提到营商环境、人才资源……
  • 世界期待中美对话合作带来更多确定性和稳定性
  • 这一次,又被南昌“秀”到了