springmvc学习指南 之---第27篇 spring如何实现servlet3.0无web.xml 配置servlet对象的
writedby 张艳涛 基于web.xml配置,有人说麻烦,tomcat给按照servlet3.0,实现了基于注解@WebServlet,有人说springmvc的springmvc.xml配置麻烦
于是有了springboot,如果让我问,这好吗? 我是不喜欢的,如果你看了深入刨析tomcat后,你就知道使用注解是多么恶心的事情了,打个比方,如果给你一个
宇宙飞船,你不会开,那么给你两种途经,一个是基于飞船的各个系统部件的说明,告诉你这个是开关,开关在哪里,这个是刹车,刹车在哪里;而另外一种是
给给开关贴一个标签,给刹车一个标签,给飞船一个扫描仪,然后让飞船自己运行;多么只能,问题是飞船坏了不会修呢. 我是不喜欢这种复杂的简单,所以
现在只能从xml的配置来 学习注解,现在开始看spring,被逼的要从spirng2.5开始看,问题是资料太少了....
xml时代,tomcat是如何解析<servlet>标签的呢?
1,先看webrule的解析规则
digester.addRule(prefix + "web-app/servlet",
new WrapperCreateRule(digester));
digester.addSetNext(prefix + "web-app/servlet",
"addChild",
"org.apache.catalina.Container"); digester.addCallMethod(prefix + "web-app/servlet/init-param",
"addInitParameter", 2);
digester.addCallParam(prefix + "web-app/servlet/init-param/param-name",
0);
digester.addCallParam(prefix + "web-app/servlet/init-param/param-value",
1);
分析,先创建一个规则rule,这个规则会在遇到遇到web-app/servlet标签的时候,执行规则的begin,再次遇到的时候会执行end
/**
* A Rule that calls the factory method on the specified Context to
* create the object that is to be added to the stack.
*/ final class WrapperCreateRule extends Rule { public WrapperCreateRule(Digester digester) {
super(digester);
} public void begin(Attributes attributes) throws Exception {
Context context =
(Context) digester.peek(digester.getCount() - 1);
Wrapper wrapper = context.createWrapper();
digester.push(wrapper);
if (digester.getDebug() > 0)
digester.log("new " + wrapper.getClass().getName());
} public void end() throws Exception {
Wrapper wrapper = (Wrapper) digester.pop();
if (digester.getDebug() > 0)
digester.log("pop " + wrapper.getClass().getName());
} }
看到关键代码是创建了standwrapper,推进去了digester栈中,
2,执行standardcontext的addChild方法将wrapper加入其中,接着,将servlet装入context的children成员变量中
上边的解析非常清晰,如果遇到不懂的标签,自己看下webruleset的规则,秒懂了,而现在呢?我想看spring如何实现了servlet3.0的无xml配置dispatcherservlet的?
真是恶心,看了1个小时才看懂点,下面将分析过程说明如下
servlet为了实现无xml,那么就得基于注解,就得在某个类中使用注解,现在是有两种实现方法的
其一是使用@WebServlet(name="xxxx",url="xxx")
其二是使用ServletContainerInitializer 接口,原理是,在tomcat等servlet容器启动的时候,会去lib包下扫描springmvc.x.y.z的jar包内的所有类,如果类是ServletContainerInitializer 接口的实现那么就执行这个实现类的onStartup方法.那么我们来就spirng实现了


那末会有几个实现呢?答案是6个
这些类有的在webmvc,web,security-web,自定义继承AbstractAnnotationConfigDispatcherServletInitializer类,等包中
那么就需要筛选,排除interface 和abstract类,那莫就剩下了自己的自定义类
package org.springframework.samples.mvc.config; import javax.servlet.Filter; import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; /**
* Initialize the Servlet container. This class is detected by the Servlet
* container on startup.
*/
public class MvcShowcaseAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{ @Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { RootConfig.class };
} @Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebMvcConfig.class };
} @Override
protected String[] getServletMappings() {
return new String[] { "/" };
} @Override
protected Filter[] getServletFilters() {
return new Filter[] { new DelegatingFilterProxy("csrfFilter") };
} }
接下来就是执行这个MvcShowcaseAppInitializer,的 initializer.onStartup(servletContext);

他自己没有onstartup方法,看他的父类AbstractDispatcherServletInitializer

那么还是挑重点的讲,进入registerDispatcherServlet

创建了dispatcherServlet对象,然后将对象添加到standardcontext中去,
看这个servletContext.addServlet(),就是tomcat8.5的代码了,

还有

能看到将也是创建wrapper,设置wrapper属性,然后交给stardardcontext.addChild(wrapper)给children的成员变量
至此对象创建完成,还没解析的有servletmaping标签,和初始化参数等吧,
这么看来,其实解析一个无xml配置,真的好费劲呢,所以对能否学好springboot感到迷惑呢
springmvc学习指南 之---第27篇 spring如何实现servlet3.0无web.xml 配置servlet对象的的更多相关文章
- DispatcherServlet和ContextLoaderListener,还有spring+servlet3.0 无web.xml启动问题
上篇提到: 关于spring +springmvc中两个spring应用上下文(DispatcherServlet和ContextLoaderListener)的问题,挺让人迷糊的. 他们都是加载Be ...
- springmvc学习指南 之---第25篇 Spring Bean有三种配置方式
writed by不要张艳涛, 从tomcat转到了springmvc 现在开始有点不知道该看什么书了,看完了springmvc 学习指南之后 又查了一些书,好多都是内容相近,在找书的过程之中,发现s ...
- springMVC WebApplicationInitializer 替代web.xml 配置Servlet 之原理
Servlet 3.0之前 ,xml 配置 在过去搭建spring + springMCV ,首先第一步要做的是什么 ,就是要配置web.xml 文件 ,把springMVC 中的Servlet 加 ...
- springmvc学习指南 之---第24篇 国际化问题
writedby 张艳涛,今天一天就搞了一个这个问题,主要是下路,遇到springmvc-config.web的配置和拦截器的使用问题, 看了几天的spring发现都没讲拦截器,之前看了两天sprin ...
- 又一本springmvc学习指南 之---第22篇 springmvc 加载.xml文件的bean标签的过程
writedby 张艳涛,今天看spring mvc 学习指南的第2章,特意提下这个作者是how tomcat works 俩个作者之一, 喜欢上一本书的风格,使用案例来讲述原理, 在做第一个案例的时 ...
- Spring 及 SpringMVC的web.xml配置详解
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...
- springmvc web.xml配置之 -- SpringMVC IOC容器初始化
SpringMVC IOC容器初始化 首先强调一下SpringMVC IOC容器初始化有些特别,在SpringMVC中除了生成一个全局的spring Ioc容器外,还会为DispatcherServl ...
- Maven-SSM项目pom.xml配置以及springmvc配置以及mybatis配置及web.xml配置
一.Maven本地仓库的pom.xml配置 (全部是mysql数据库) <project xmlns="http://maven.apache.org/POM/4.0.0" ...
- springmvc web.xml配置之 -- DispatcherServlet
springMVC servlet配置与启动 看一下springmvc的web.xml常见配置: <servlet> <!-- 配置DispatcherServlet --> ...
随机推荐
- 与安卓联调,调用安卓那边的方法,获取到安卓传过来的数据,再携带这些数据发送axios请求,获取到用户的信息
第一步:js调用Android方法:接收Android传递过来的数据,并做处理 //参数一:调用java中的方法 submitFromWeb是方法名,必须和Android中注册时候的方法名称保持一 ...
- 「10.12」木板(数学)·打扫卫生(神仙DP)
A. 木板 一个很简单的数学题,简单推一下就好,路丽姐姐教你学数学. 将式子化出我们发现只需求出$i\times i/n$的个数 那么我们将$n$质因数分解,可知因子个数 为了整除$n$,令$i==\ ...
- 万字长文详解HiveSQL执行计划
Hive SQL的执行计划描述SQL实际执行的整体轮廓,通过执行计划能了解SQL程序在转换成相应计算引擎的执行逻辑,掌握了执行逻辑也就能更好地把握程序出现的瓶颈点,从而能够实现更有针对性的优化.此外还 ...
- Linux查看与设定别名
1.alias :查看系统中所有的命令别名 2.设定别名 alias 别名='原命令' 3.删除别名 unalias 别名 4.使别名永久生效 vi ~/.bashrc 写入这个文件中即可永 ...
- NoSql非关系型数据库之MongoDB应用(一):安装MongoDB服务
业精于勤,荒于嬉:行成于思,毁于随. 一.MongoDB服务下载安装(windows环境安装) 1.进入官网:https://www.mongodb.com/,点击右上角的 Try Free , 2 ...
- kubernates 1.20.6安装
kubernates 安装 1. 前置要求 硬件条件 三台主机 1主2从 硬件配置 master 2核4G slave 2核2G 2. 安装 访问GitHub 仓库 https://github.co ...
- CRM软件从哪些方面帮助企业更上一层楼
CRM顾客智能管理系统可以将"以顾客为管理中心"的管理模式与高新科技方式紧密结合,协助公司搭建优良的客户关系管理,改进顾客的消費感受,进而提升顾客的满意率,为公司产生大量的盈利.据 ...
- MinIO关闭公开桶的列表展示(S3 browser)
MinIO通过配置桶策略关闭列表展示,以下为操作教程. 下载:s3browser官网 安装完成S3 browser后,添加账号 修改桶policy,选择桶public右键 删除 s3:ListBuck ...
- pixel的Edxposed刷机过程
1.先解开bl锁 这里的步骤,因为我机子本来就是解过的了,所以简单记录一下过程好了 第一步:确保你的环境变量是否设置好了,判断的标准就是打开终端(我是mac),usb连接上,然后输入 adb devi ...
- ESP-IDF硬件设计相关知识
1.更新ESP-IDF:直接删除您本地的 esp-idf 文件夹,然后克隆新版本:更新完成后,请执行 install.sh (Windows 系统中为 install.bat)脚本,避免新版 ESP- ...