动力节点Spring框架学习笔记-王鹤(五)Spring与Web

第5章   Spring  Web

  • 官方下载地址

http://www.bjpowernode.com/

  • 视频观看地址

https://www.bilibili.com/video/BV1nz4y1d7uy

 Web 项目中使用 Spring 框架,首先要解决在 web 层(这里指         Servlet)  中获取到 Spring 容器的问题。只要在 web 层获取到了 Spring  器,便可从容器中获取到Service 对象。

5.1   Web 项目使用 Spring 的问题(了解)

举例:  springWeb 项目(在 spring-mybatis 基础上修改)

Step1:新建一个 Maven Project

类型 maven-archetype-webapp

Step2:   复制代码,配置文件,  jar

 spring-mybatis 项目中以下内容复制到当前项目中:

(1)  Service 层、  Dao 层全部代码

(2)配置文件 applicationContext.xml 及jdbc.properties, mybatis.xml

(3)  pom.xml

(4)加入 servlet ,jsp 依赖

在之前原有的 pom.xml 文件中再加入以下的内容

<!-- servlet依赖  -->

<dependency>

<groupId>javax.servlet</groupId>



<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

<scope>provided</scope>

</dependency>



<!-- jsp依赖  -->

<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>2.2.1-b03</version>

<scope>provided</scope>

</dependency>

Step3:定义 index 页面

Step4:定义 RegisterServlet  (重点代码)

Step5:定义 success 页面

Step6:  web.xml 注册 Servlet

Step7:运行结果分析

当表单提交,跳转到 success.jsp 后,多刷新几次页面,查看后台输出,发现每刷新一次页面,就 new 出一个新的 Spring 容器。即,每提交一次请求,   就会创建一个新的 Spring 容器。对于一个应用来说,只需要一个 Spring 容器  即可。所以,将 Spring 容器的创建语句放在 Servlet 的 doGet()或 doPost()方法中是有问题的。

此时,可以考虑,将 Spring 容器的创建放在 Servlet 进行初始化时进行,即执行 init()方法时执行。并且,Servlet 还是单例多线程的,即一个业务只有  一个 Servlet 实例,所有执行该业务的用户执行的都是这一个 Servlet 实例。这 样,Spring 容器就具有了唯一性了。

但是,Servlet 是一个业务一个 Servlet 实例,   LoginServlet 只有一个, 但还会有StudentServlet、 TeacherServlet 等。每个业务都会有一个 Servlet,都会执行自己的 init()方法,也就都会创建一个 Spring 容器了。这样一来,  Spring 容器就又不唯一了。

5.2   使用 Spring 的监听器 ContextLoaderListener(掌握)

举例:  springweb-2 项目(在 spring-web 项目基础上修改)

对于 Web 应用来说,ServletContext 对象是唯一的,一个Web 应用,只有一个ServletContext 对象,该对象是在 Web 应用装载时初始化的。  若将Spring容器的创建时机,放在ServletContext 初始化时,就可以保证 Spring容器的创建只会执行一次,也就保证了 Spring 容器在整个应用中的唯一性。

 Spring 容器创建好后,在整个应用的生命周期过程中,Spring 容器应该是随时可以被访问的。即,Spring 容器应具有全局性。而放入ServletContext 对象的属性,就具有应用的全局性。所以,将创建好的Spring 容器,以属性的形式放入到ServletContext 的空间中,就保证了Spring 容器的全局性。

上述的这些工作,已经被封装在了如下的 Spring的Jar包的相关 API 中: spring-web 5.2.5.RELEASE

Step1:  maven 依赖 pom.xml

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>5.2.5.RELEASE</version>

</dependency>

Step2:注册监听器 ContextLoaderListener

若要在 ServletContext 初始化时创建 Spring 容器,就需要使用监听器接  ServletContextListener  ServletContext 进行监听。 web.xml 中注册该监听器。

Spring 为该监听器接口定义了一个实现类 ContextLoaderListener, 完成 了两个很重要的工作:创建容器对象,并将容器对象放入到了 ServletContext的空间中。

打开 ContextLoaderListener 的源码。看到一共四个方法,两个是构造方法,一个初始化方法,一个销毁方法。

所以,在这四个方法中较重要的方法应该就是 contextInitialized(),context 初始化方法。

跟踪 initWebApplicationContext()方法,可以看到,在其中创建了容器对象。

并且,将创建好的容器对象放入到了 ServletContext 的空间中,  key 为一个常量:

WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE。

Step3:指定 Spring 配置文件的位置<context-param>

ContextLoaderListener在对Spring容器进行创建时,需要加载Spring配置文件。其默认的 Spring配置文件位置与名称为:  WEB-INF/applicationContext.xml。但,一般会将该配置文件放置于项目的classpath 下,即 src 下,所以需要在 web.xml 中对 Spring 配置文件的位置及名称进行指定。

从监听器 ContextLoaderListener 的父类 ContextLoader 的源码中可以看到其要读取的配置文件位置参数名称 contextConfigLocation。

Step4:获取 Spring 容器对象

 Servlet 中获取容器对象的常用方式有两种:

(1)   直接从 ServletContext 中获取

从对监听器 ContextLoaderListener 的源码分析可知,容器对象在 ServletContext 的中存放的 key WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUT E。所以,可以直接通过 ServletContext 的 getAttribute()方法,按照指定的key 将容器对象获取到。

(2)   通过 WebApplicationContextUtils 获取

工具类 WebApplicationContextUtils 有一个方法专门用于从 ServletContext 中获取 Spring容器对象:getRequiredWebApplicationContext(ServletContext sc)

调用 Spring 提供的方法获取容器对象:

查其源码,看其调用关系,就可看到其是从 ServletContext 中读取的属性值,即 Spring 容器。

以上两种方式,无论使用哪种获取容器对象,  刷新 success 页面后,可看到代码中使用的 Spring 容器均为同一个对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值