Servlet3.0与springmvc那些事

摘要:
更多的ServletContainerInitializer用于初始化web容器:当web容器启动时,它为第三方组件提供了一些初始化的机会,例如注册servlet或过滤器。在servlet规范中,ServletContainerInitializer实现了这个函数。从上图可以看出,要使用ServletContainerInitializer,每个框架必须创建一个名为javax.servlet的文件。对应jar包的META-INF/services目录中的ServletContainerInitializer。文件内容指定特定的ServletContainerInitializer实现类。然后,当web容器启动时,初始化器将运行以在组件中进行一些初始化。

 官方文档:https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.html#mvc-servlet-context-hierarchy

以前开发web工程:servlet、filter、listener都需要在web.xml进行注册,包括springmvc的前端控制器DispatcherServlet也需要在web.xml进行注册,现在用【注解】方式快速搭建一个web应用:

1、servlet3.0需要tomcat7.0以上版本进行支持

2、创建动态web工程(Dynamic Web Project),领略以下原生版servlet:

步骤如下:

2.1)创建工程

Servlet3.0与springmvc那些事第1张  Servlet3.0与springmvc那些事第2张

2.2)新建jsp页面

Servlet3.0与springmvc那些事第3张

2.3)新增一个请求地址

Servlet3.0与springmvc那些事第4张

2.4)新增一个原生servlet来处理order请求

Servlet3.0与springmvc那些事第5张

Servlet3.0与springmvc那些事第6张发布到tomcat,然后启动测试

Servlet3.0与springmvc那些事第7张

浏览器访问jsp或者直接访问:

Servlet3.0与springmvc那些事第8张

Servlet3.0与springmvc那些事第9张

可以访问到工程,当然这些注解不是重点,原生的servlet开发很少人用。。

阅读servlet 3.0 API文档

4、Shared libraries(共享库)and runtimes pluggability(运行时插件)的原理,在后面的框架整合里。用的比较多

ServletContainerInitializer初始化web容器:

在web容器启动时为提供给第三方组件机会做一些初始化,例如注册servlet或者filter等,servlet规范(JSR356)中通过ServletContainerInitializer实现此功能。

Servlet3.0与springmvc那些事第10张

从上图可以知道,每个框架要使用ServletContainerInitializer就必须:

在对应的jar包的META-INF/services目录下创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作。

步骤如下:

4.1)创建META-INF/services目录

Servlet3.0与springmvc那些事第11张

 4.2)创建javax.servlet.ServletContainerInitializer文件

Servlet3.0与springmvc那些事第12张

如下

Servlet3.0与springmvc那些事第13张

4.3)新建HongServletContainerInitializer实现ServletContainerInitializer

Servlet3.0与springmvc那些事第14张

创建感兴趣的类型及其子类

Servlet3.0与springmvc那些事第15张

Servlet3.0与springmvc那些事第16张

Servlet3.0与springmvc那些事第17张

Servlet3.0与springmvc那些事第18张

Servlet3.0与springmvc那些事第19张

4.4)编辑javax.servlet.ServletContainerInitializer文件内容

 Servlet3.0与springmvc那些事第20张

 4.5)一般伴随着ServletContainerInitializer一起使用的还有HandlesTypes注解,通过HandlesTypes可以将感兴趣的一些类注入到ServletContainerInitializeronStartup方法作为参数传入

Servlet3.0与springmvc那些事第21张

 4.6)启动tomcat测试,看打印日志,不难发现,都拿到了,可以根据需要来反射创建对象

 Servlet3.0与springmvc那些事第22张

这其实就是基于运行时插件的机制,启动并运行这个ServletContainerInitializer,在整合springmvc的时候会用到

4.7)接下来看下ServletContext arg1,使用ServletContext注册web组件(其实就是Servlet,Filter,Listener三大组件),

对于我们自己前面写的HongServlet,我们可以使用@WebServlet注解来加入HOngServlet组件,

但若是我们要导入第三方阿里的连接池或filter,以前的web.xml方式就可通过配置加载就可以了,但现在我们使用ServletContext注入进来;

Servlet3.0与springmvc那些事第23张

创建三个组件:

1)新建OrderFilter过滤器

Servlet3.0与springmvc那些事第24张

2)新建OrderListener.java监听类

 Servlet3.0与springmvc那些事第25张

3)新建OrderServlet类

Servlet3.0与springmvc那些事第26张

4)使用ServletContext来注册上面新建的三个组件

 Servlet3.0与springmvc那些事第27张

注意:在运行的过程中,是不可以注册组件, IOC道理一样,出于安全考虑

 运行tomcat

Servlet3.0与springmvc那些事第28张

 5)利用以上机制来整合springmvc;创建一个新的maven工程,springmvc注解版

Servlet3.0与springmvc那些事第29张       Servlet3.0与springmvc那些事第30张

5.1)创建完工程后,pom.xml会报错,老铁们,怎么办???不要慌,哈哈看下面吧

Servlet3.0与springmvc那些事第31张

做个设置即可

Servlet3.0与springmvc那些事第32张

再右键工程名,update更新一下maven配置就不会有错

 Servlet3.0与springmvc那些事第33张

5.2)加入依赖jar包

Servlet3.0与springmvc那些事第34张

 5.3)导入依赖包后,查看maven的一个spring-web.jar

 Servlet3.0与springmvc那些事第35张

打开ServletContainerInitializer这个文件

Servlet3.0与springmvc那些事第36张

5.4)打开SpringServletContainerInitializer源码类

 Servlet3.0与springmvc那些事第37张

Servlet3.0与springmvc那些事第38张

 5.5)打开WebApplicationInitializer源码看看组件及实现(ctrl+t

 Servlet3.0与springmvc那些事第39张

子类AbstractContextLoaderInitializer作用:

Servlet3.0与springmvc那些事第40张

子类AbstractDispatcherServletInitializer的作用:从名字来看可知是DispatcherServlet初始化

Servlet3.0与springmvc那些事第41张

子类AbstractAnnotationConfigDispatcherServletInitializer:注解方式配置的dispatcherServlet初始化器

Servlet3.0与springmvc那些事第42张

root根容器与servlet容器的区别在哪呢?父子容器

Servlet3.0与springmvc那些事第43张

很明显,servlet的容器用来处理@Controller,视图解析,和web相关组件

root根容器主要针对服务层,和数据源DAO层及事务控制相关处理(图源自spring官网)

https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.html#mvc-servlet-context-hierarchy

接下来我们根据这些来配置操作一下

 6.与springmvc的整合流程。

操作步骤

新建HongWebInitializer继承AbstractAnnotationConfigDispatcherServletInitializer

Servlet3.0与springmvc那些事第44张

新建两个配置类HongRootConfigHongAppConfig,形成父子容器的效果

 Servlet3.0与springmvc那些事第45张

Servlet3.0与springmvc那些事第46张

新建控制类

Servlet3.0与springmvc那些事第47张

服务类

Servlet3.0与springmvc那些事第48张

注意:JamesWebAppInitializer还需要指定配置类(配置文件)位置,修改以下返回

 Servlet3.0与springmvc那些事第49张

重启tomcat,进行测试

 Servlet3.0与springmvc那些事第50张

这就使用注解的方式(配置类)来完成配置springmvc的整合

免责声明:文章转载自《Servlet3.0与springmvc那些事》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇amcharts使用心得Android应用更换package name以及ui refactoring error问题的有效解决下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ubuntu1604系统初始化

1.初始化网络配置 1.1.创建工作目录 生产环境下必须有个固定的目录存放一些安装软件和调试工具, 否则每个管理员都随意存放软件工具,服务器的环境可以想而知 mkdir -p /opt/{tools,scripts} mkdir -p /data/backup cd /opt/tools/ 安装常用软件工具 apt-get update apt-ge...

扫雷思想及主函数

1.建雷盘(9*9雷盘) 2.初始化雷盘,雷盘1每个位置初始化为字符0,雷盘2每个位置初始化为字符*。 3.为了检验,输出我们初始化好的雷盘。 4.向棋盘放雷,这块我们可以以雷数设计难度。摆雷是以随机数放入的,下面会附上代码,详见代码 5.扫雷。 详细说明一下扫雷的思想: 5.1.先定义int win = 0(用来判断结束的条件)当我们向控制台输入坐标后,...

转载:嵌入式C语言面试题(二)

BSS段 是“Block Started by Symbol”的缩写,意为“以符号开始的块”。   BSS是Unix链接器产生的未初始化数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名称和大小却没有值。此名后来被许多文件格式使用,包括PE。“以符号开始的块”指的是编译器处理未初始化数据的地方。BS...

stm32基本定时器timer6的原理与使用

/********************基本定时器 TIM 参数定义,只限 TIM6、7************/ /* 一、定时器分类 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部 IO。通用定...

12.bss段的初始化

12.bss段的初始化 在C代码:有初始化全局的数据段,局部的栈,malloc部分的堆,未初始化的全局的bss段。 从上面的编译的信息知道: Bss段的起始地址:0001052c Bss段的结束地址:00010534 我们的hello变量的地址:00010530是落在bss段里的地址的。所以是存在bss段的。这就是未初始化的全局变量存放在bss段...

SpringMVC 使用验证框架 Bean Validation(上)

SpringMVC 使用验证框架 Bean Validation(上) 对于任何一个应用而言在客户端做的数据有效性验证都不是安全有效的,这时候就要求我们在开发的时候在服务端也对数据的有效性进行验证。 SpringMVC 自身对数据在服务端的校验(Hibernate Validator)有一个比较好的支持,它能将我们提交到服务端的数据按照我们事先的约定进行数...