11. Spring 集成WEB环境

Maven 所以 记得导入依赖

Servlet 和 JSP 的依赖【GAV】:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency> 
   <groupId>javax.servlet.jsp</groupId> 
   <artifactId>jsp-api</artifactId> 
   <version>2.1</version> 
   <scope>provided</scope>
</dependency>

 

因为我们有了Servlet之后 我们每次去执行他 他每次会去 创建 ApplicationContext应用上下文对象,这样很繁琐,如果有100个Servlet 那么要创建100个? 官方点的说法:

 

应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从 容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) ,

这样的弊端是配置 文件加载多次,应用上下文对象创建多次。

 

解决方案:

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

所以大体的监听器代码就是:

ContextListener.java :
package com.bihu.listener;


import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

@WebListener
public class ContextListener implements ServletContextListener {



    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ApplicationContext app = new ClassPathXmlApplicationContext("app.xml");
        ServletContext servletContext = sce.getServletContext();
        //将ApplicationContext 上下文对象装入 servletContext中.
        servletContext.setAttribute("applicationContext",app);

    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println(sce.getServletContext() + "销毁了");
    }

}

如果你要获取上下文对象 直接在Servlet中获取ApplicationContext的那个 getAttribute 即可。

Test.java 【Servlet】

 

package com.bihu.web;

import com.bihu.Service.TestService;
import com.bihu.Service.TestServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "Test", value = "/Test")
public class Test extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ApplicationContext对象:
      ApplicationContext app = (ApplicationContext)request.getServletContext().getAttribute("applicationContext");
      //获取Bean
      TestServiceImpl serviceImpl = (TestServiceImpl)app.getBean("serviceImpl");
        serviceImpl.start();    //执行方法
    }


}

 

其实就是 不要让他太消耗资源的意思 好嘞啊 不想学了 烦...

 

原理都在这,但是这样也很麻烦 都说框架框架 所以我们用框架自带监听器来回去上下文对象的:

Spring提供获取应用上下文的工具:

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

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

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

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

 

1. 导入Spring集成web的坐标 和 配置监听器

gav坐标:

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

配置ContextLoaderListener监听器:[加入到web.xml 即可... 下面的知识点是之前学的Servlet 和 JSP 的原始配置]

  <!--全局参数-->
  <context-param>
    <param-name>contextConfigLocation</param-name>   <!--这个东西是spring-web包的 写死的-->
    <param-value>classpath:app.xml</param-value>  <!--这个东西指的是 你 Spring的配置文件目录-->
  </context-param>
  <!--Spring的监听器 下面也是写死的 spring-web包的东西-->
  <listener>
    <listener-class>
      org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>
</web-app>

 

最后就可以获取 在Spring配置文件夹中 获取 Bean了:

Test.java 【Serclet】

package com.bihu.web;

import com.bihu.Service.TestService;
import com.bihu.Service.TestServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;


import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "Test", value = "/Test")
public class Test extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //注意这里的WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());,参数是这个ServletContext()
        ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
        //获取Spring中的Bean  这里没什么好说的
        TestServiceImpl serviceImpl = (TestServiceImpl)applicationContext.getBean("serviceImpl");
        serviceImpl.start();
    }


}

 

这个方法一般也不用的,其原理就是监听器嘛  内置  ServletContext  监听器 然后在初始化参数哪里配置点东西进去 然后就一系列的搞搞搞  最终目的还就是:

获取上下文对象.....无语子

posted @ 2021-06-25 22:25  咸瑜  阅读(67)  评论(0编辑  收藏  举报