zoukankan      html  css  js  c++  java
  • 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  监听器 然后在初始化参数哪里配置点东西进去 然后就一系列的搞搞搞  最终目的还就是:

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

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14932782.html

  • 相关阅读:
    vue-router(路由)详细教程
    vue路由对象($route)参数简介
    this.$router.push相关的vue-router的导航方法
    es6 Promise.reject()方法
    百度阿里网易大疆等大小厂前端校招面筋 | 掘金技术征文
    Vue 脱坑记
    (尚016)Vue指令(11个自带指令+自定义指令)
    (尚015)Vue过滤器(对显示的数据进行格式化)
    (尚014)Vue过渡与动画
    (尚013)Vue的生命周期
  • 原文地址:https://www.cnblogs.com/bi-hu/p/14932782.html
Copyright © 2011-2022 走看看