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 --> ...
随机推荐
- day20200912
连杆通过运动副相对于啮合连杆运动 ! 运动副: 旋转副:仅旋转 滑动副:仅沿直线滑动 柱面副:可旋转可沿直线滑动 其他: 可以设置上限.下限 3D接触 驱动: 简谐驱动 函数驱动 运动函数驱动
- Redis压测
测试命令 这条命令redis自带 redis-benchmark [option] [option value] redis 性能测试工具可选参数如下所示: 序号 选项 描述 默认值 1 -h 指 ...
- 树上染色+可怜与超市(树状DP)
这两道题是学长精心准备的,想了很长时间,比较经典. 第一题 树上染色 有一棵点数为 N的树,树边有边权.给你一个在 0∼N之内的正整数 K,你要在这棵树中选择 K 个点,将其染成黑色,并将其他的 N− ...
- 【题解】coin HDU2884 多重背包
题目 Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- 遇到禁止复制该怎么办?幸好我会Python...
相信大家都有遇到这种情况(无法复制): 或者是这种情况 以上这种情况都是网页无法复制文本的情况.不过这些对于Python来说都不是问题.今天辰哥就叫你们用Python去解决. 思路:利用pdfkit库 ...
- android悬浮窗口
悬浮窗原理 做过悬浮窗功能的人都知道, 要想显示悬浮窗, 要有一个服务运行在后台, 通过getSystemService(Context.WINDOW_SERVICE)拿到WindowManager, ...
- Java基准性能测试--JMH使用介绍
JMH是什么 JMH是Java Microbenchmark Harness的简称,一个针对Java做基准测试的工具,是由开发JVM的那群人开发的.想准确的对一段代码做基准性能测试并不容易,因为JVM ...
- CentOS-Docker搭建Nextcloud
下载镜像 $ docker pull nextcloud 运行镜像 $ docker run -d --restart=unless-stopped --name nextcloud -v /home ...
- JavaScript模块化的演变
自执行函数(IIFE): 作用:马上执行这个函数,自执行函数(IIFE),不易读 (function(x){console.log(x);})(3); 易读版本: (function(x){ retu ...
- 16 shell select in 循环
select in 是 Shell 独有的一种循环,适用于与终端(Terminal)进行交互,在其他编程语言中是没有的. 用法 说明 脚本 select var in val_listdo st ...