【重温SSM框架系列】4 - Spring集成web环境(三层结构和配置监听器)

简介: 【重温SSM框架系列】4 - Spring集成web环境(三层结构和配置监听器)

三层架构环境搭建

在前面Spring核心配置文件以及数据源配置的讲解中,主要是在dao层和service层,现在我们就把web层环境也给他集成进来。

目前的项目结构

在这里插入图片描述

搭建web层

1. 引入servlet和jsp依赖

<!-- 引入Servlet和JSP依赖 -->
<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>javax.servlet-api</artifactId>
   <version>3.1.0</version>
   <scope>provided</scope>
</dependency>
<dependency>
   <groupId>javax.servlet.jsp</groupId>
   <artifactId>javax.servlet.jsp-api</artifactId>
   <version>2.2.1</version>
   <scope>provided</scope>
</dependency>

2. 创建UserServlet类

@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) application.getBean("userService");
        userService.save();
    }
}

3. 配置Tomcat并启动测试

在这里插入图片描述
启动Tomcat并访问/UserServlet,控制台打印如下,三层架构基本环境搭建成功。
在这里插入图片描述

三层架构基本项目结构

在这里插入图片描述

设置获取applicationContext.xml的监听器

现在出现了一个问题:每次从容器中获得Bean时,都需要ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml"),当配置文件多次加载时,就会创建很多个ApplicationContext对象,造成资源的浪费。

在Web项目中,我们运用监听器的特性,创建一个配置文件加载的监听器,在应用启动的时候就加载Spring的配置文件,并创建ApplicationContext 对象;当要使用时,直接从域中获取即可,达到一处加载处处使用的效果。

在web.xml中配置核心配置文件的位置

  <context-param>
    <param-name>applicationContextLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>

创建一个ContextLoaderListener类

public class ContextLoaderListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        ServletContextEvent sce;
        ServletContext servletContext = servletContextEvent.getServletContext();

        // 读取web.xml中配置的Spring核心配置文件的位置
        String applicationContextLocation = servletContext.getInitParameter("applicationContextLocation");

        // 创建ApplicationContext上下文对象
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext(applicationContextLocation);

        // 将ApplicationContext对象存到域中
        servletContext.setAttribute("applicationContext",applicationContext);

        System.out.println("创建ApplicationContext对象成功:" + applicationContext);
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}

在web.xml中配置ContextLoaderListener监听器

<listener>
  <listener-class>com.wang.listener.ContextLoaderListener</listener-class>
</listener>

启动Tomcat,查看控制台打印,发现ApplicationContext对象在Tomcat启动时被创建:
在这里插入图片描述

修改UserServlet,使用监听器获取ApplicationContext

@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext application = (ApplicationContext) req.getServletContext().getAttribute("applicationContext");
        UserService userService = (UserService) application.getBean("userService");
        userService.save();
    }
}

使用Spring集成ContextLoaderListener监听器

上面通过自定义监听器的方式实现了在应用启动的时候就加载Spring的配置文件,并创建ApplicationContext 对象。但是这个过程还是比较复杂,可以使用Spring提供获取应用上下文的工具直接获取上下文对象。

引入spring-web包

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>

修改web.xml配置Spring的ContextLoaderListener监听器

<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

使用Spring工具获得应用上下文对象

@WebServlet("/userServlet")
public class UserServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
//        ApplicationContext application = (ApplicationContext) req.getServletContext().getAttribute("applicationContext");
        ApplicationContext application = WebApplicationContextUtils.getWebApplicationContext(req.getServletContext());
        UserService userService = (UserService) application.getBean("userService");
        userService.save();
    }
}
目录
相关文章
|
1月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
140 26
|
3月前
|
Java Spring
【Spring】方法注解@Bean,配置类扫描路径
@Bean方法注解,如何在同一个类下面定义多个Bean对象,配置扫描路径
196 73
|
2月前
|
监控 Java 数据库连接
Spring c3p0配置详解
在Spring项目中配置C3P0数据源,可以显著提高数据库连接的效率和应用程序的性能。通过合理的配置和优化,可以充分发挥C3P0的优势,满足不同应用场景的需求。希望本文的详解和示例代码能为开发者提供清晰的指导,帮助实现高效的数据库连接管理。
127 10
|
2月前
|
Java Spring
Java Spring Boot监听事件和处理事件
通过上述步骤,我们可以在Java Spring Boot应用中实现事件的发布和监听。事件驱动模型可以帮助我们实现组件间的松耦合,提升系统的可维护性和可扩展性。无论是处理业务逻辑还是系统事件,Spring Boot的事件机制都提供了强大的支持和灵活性。希望本文能为您的开发工作提供实用的指导和帮助。
123 15
|
3月前
|
Java Spring
【Spring配置相关】启动类为Current File,如何更改
问题场景:当我们切换类的界面的时候,重新启动的按钮是灰色的,不能使用,并且只有一个Current File 项目,下面介绍两种方法来解决这个问题。
|
3月前
|
Java Spring
【Spring配置】idea编码格式导致注解汉字无法保存
问题一:对于同一个项目,我们在使用idea的过程中,使用汉字注解完后,再打开该项目,汉字变成乱码问题二:本来a项目中,汉字注解调试好了,没有乱码了,但是创建出来的新的项目,写的注解又成乱码了。
|
XML 搜索推荐 Java
Spring源码 --- 监听器的原理 (下)
Spring源码 --- 监听器的原理 (下)
165 0
Spring源码 --- 监听器的原理 (下)
|
设计模式 Java Nacos
Spring源码 --- 监听器的原理 (上)
Spring源码 --- 监听器的原理
392 0
Spring源码 --- 监听器的原理 (上)
|
2天前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
98 79
|
24天前
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
75 12

热门文章

最新文章