Servlet3.0与springmvc那些事
以前开发web工程:servlet、filter、listener都需要在web.xml进行注册,包括springmvc的前端控制器DispatcherServlet也需要在web.xml进行注册,现在用【注解】方式快速搭建一个web应用:
1、servlet3.0需要tomcat7.0以上版本进行支持
2、创建动态web工程(Dynamic Web Project),领略以下原生版servlet:
步骤如下:
2.1)创建工程

2.2)新建jsp页面

2.3)新增一个请求地址

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

发布到tomcat,然后启动测试

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


可以访问到工程,当然这些注解不是重点,原生的servlet开发很少人用。。
阅读servlet 3.0 API文档
4、Shared libraries(共享库)and runtimes pluggability(运行时插件)的原理,在后面的框架整合里。用的比较多
ServletContainerInitializer初始化web容器:
在web容器启动时为提供给第三方组件机会做一些初始化,例如注册servlet或者filter等,servlet规范(JSR356)中通过ServletContainerInitializer实现此功能。

从上图可以知道,每个框架要使用ServletContainerInitializer就必须:
在对应的jar包的META-INF/services目录下创建一个名为javax.servlet.ServletContainerInitializer的文件,文件内容指定具体的ServletContainerInitializer实现类,那么,当web容器启动时就会运行这个初始化器做一些组件内的初始化工作。
步骤如下:
4.1)创建META-INF/services目录

4.2)创建javax.servlet.ServletContainerInitializer文件

如下

4.3)新建HongServletContainerInitializer实现ServletContainerInitializer

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





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

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

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

这其实就是基于运行时插件的机制,启动并运行这个ServletContainerInitializer,在整合springmvc的时候会用到
4.7)接下来看下ServletContext arg1,使用ServletContext注册web组件(其实就是Servlet,Filter,Listener三大组件),
对于我们自己前面写的HongServlet,我们可以使用@WebServlet注解来加入HOngServlet组件,
但若是我们要导入第三方阿里的连接池或filter,以前的web.xml方式就可通过配置加载就可以了,但现在我们使用ServletContext注入进来;

创建三个组件:
1)新建OrderFilter过滤器

2)新建OrderListener.java监听类

3)新建OrderServlet类

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

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

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

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

做个设置即可

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

5.2)加入依赖jar包

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

打开ServletContainerInitializer这个文件

5.4)打开SpringServletContainerInitializer源码类


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

子类AbstractContextLoaderInitializer作用:

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

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

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

很明显,servlet的容器用来处理@Controller,视图解析,和web相关组件
而root根容器主要针对服务层,和数据源DAO层及事务控制相关处理(图源自spring官网)
接下来我们根据这些来配置操作一下
6.与springmvc的整合流程。
操作步骤
新建HongWebInitializer继承AbstractAnnotationConfigDispatcherServletInitializer类

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


新建控制类

服务类

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

重启tomcat,进行测试

这就使用注解的方式(配置类)来完成配置springmvc的整合
Servlet3.0与springmvc那些事的更多相关文章
- Spring注解驱动开发(七)-----servlet3.0、springmvc
ServletContainerInitializer Shared libraries(共享库) / runtimes pluggability(运行时插件能力) 1.Servlet容器启动会扫描, ...
- Servlet3.0整合Springmvc(注解版)
在创建maven的web工程时候,如果报错缺少web.xml 则在pom添加如下配置 : <build> <plugins> <plugin> <groupI ...
- SpringMVC快速使用——基于XML配置和Servlet3.0
SpringMVC快速使用--基于XML配置和Servlet3.0 1.官方文档 https://docs.spring.io/spring-framework/docs/5.2.8.RELEASE/ ...
- springmvc学习指南 之---第27篇 spring如何实现servlet3.0无web.xml 配置servlet对象的
writedby 张艳涛 基于web.xml配置,有人说麻烦,tomcat给按照servlet3.0,实现了基于注解@WebServlet,有人说springmvc的springmvc.xml配置麻烦 ...
- Servlet3.0的动态
动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用.这也是注解的另外一种替代方式. 动态的添加有两种,一种是基于ContextListener的,另 ...
- Spring MVC3.2 通过Servlet3.0实现文件上传
Servlet3.0规范增加了对文件上传的原生支持,这里记录一下Spring MVC3通过Servlet3上传文件的实现. 配置文件: applicationContext.xml <!-- s ...
- Servlet3.0异步请求
在Servlet3.0之前,Servlet采用Thread-Per-Request的方式处理请求 即每次Http请求都有一个线程从头到尾负责处理 如果一个请求需要进行IO操作,比如访问数据库.调用第三 ...
- DispatcherServlet和ContextLoaderListener,还有spring+servlet3.0 无web.xml启动问题
上篇提到: 关于spring +springmvc中两个spring应用上下文(DispatcherServlet和ContextLoaderListener)的问题,挺让人迷糊的. 他们都是加载Be ...
- 浅尝Spring注解开发_Servlet3.0与SpringMVC
浅尝Spring注解开发_Servlet 3.0 与 SpringMVC 浅尝Spring注解开发,基于Spring 4.3.12 Servlet3.0新增了注解支持.异步处理,可以省去web.xml ...
随机推荐
- Spring Security Session并发控制原理解析
当使用spring security 的标签,如下,其中<sec:session-management>对应的SessionManagementFilter.从名字可以看出,这是一个管理S ...
- PHP 利用CURL(HTTP)实现服务器上传文件至另一服务器
// 上传端 /** * 向目标地址推送xls文件 * @Date 2019/4/29 */ public function putXls() { // 目标接口 $url = "http: ...
- go 学习第一个hello world 遇到的问题
mac:Go安装和配置+GoLand安装和使用之完整教程 https://blog.csdn.net/zxy_666/article/details/80182688 前言作为一个go语言程序员,觉得 ...
- 【Git】修改git远程连接ip
- 2019.4.14 python基础30
前面学习的变量,数据类型(整型,浮点数,布尔),序列(字符串,列表,元祖,字典,集合) ,可以看做是数据的组织方式.数据可以看做是“砖块”! 流程控制语句是代码的组织方式,可以看做是“混凝土” 一个完 ...
- Centos部署PHP项目(安装Apache,PHP)
1.apache安装 [root@tele-2 ~]# yum install httpd 2.外网访问虚拟机中的地址,我们就需要修改一下apache的配置文件 vim /etc/httpd/con ...
- CSAPP:第二章学习笔记:斗之气2段
一.字长:虚拟地址通过一个字来编码,字长为32位,则可以标识2^32个地址空间,每个空间为一个字节,故为4G 二.字节序:当解释多个字节类型时,存在大小端字节序问题 0x1234567,在大小端表示法 ...
- cocos creator 重写源码按钮Button点击音频封装
(function(){ var Super = function(){}; Super.prototype = cc.Button.prototype; //实例化原型 Super.prototyp ...
- ubuntu默认使用python2,更改默认使用python3
直接执行这两个命令即可: sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 100 sudo upd ...
- MailKit使用IMAP读取邮件找不到附件Attachments为空的解决方法
今天发现有些邮件无法读取Attachments,邮件明明有附件,但使用Mailkit读取时,Attachments为空,我用的IMAP协议读取收件箱里的邮件,处理完后移动已删除: foreach (v ...