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对象的的更多相关文章

  1. DispatcherServlet和ContextLoaderListener,还有spring+servlet3.0 无web.xml启动问题

    上篇提到: 关于spring +springmvc中两个spring应用上下文(DispatcherServlet和ContextLoaderListener)的问题,挺让人迷糊的. 他们都是加载Be ...

  2. springmvc学习指南 之---第25篇 Spring Bean有三种配置方式

    writed by不要张艳涛, 从tomcat转到了springmvc 现在开始有点不知道该看什么书了,看完了springmvc 学习指南之后 又查了一些书,好多都是内容相近,在找书的过程之中,发现s ...

  3. springMVC WebApplicationInitializer 替代web.xml 配置Servlet 之原理

    Servlet 3.0之前 ,xml  配置 在过去搭建spring + springMCV ,首先第一步要做的是什么 ,就是要配置web.xml 文件 ,把springMVC 中的Servlet 加 ...

  4. springmvc学习指南 之---第24篇 国际化问题

    writedby 张艳涛,今天一天就搞了一个这个问题,主要是下路,遇到springmvc-config.web的配置和拦截器的使用问题, 看了几天的spring发现都没讲拦截器,之前看了两天sprin ...

  5. 又一本springmvc学习指南 之---第22篇 springmvc 加载.xml文件的bean标签的过程

    writedby 张艳涛,今天看spring mvc 学习指南的第2章,特意提下这个作者是how tomcat works 俩个作者之一, 喜欢上一本书的风格,使用案例来讲述原理, 在做第一个案例的时 ...

  6. Spring 及 SpringMVC的web.xml配置详解

    出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...

  7. springmvc web.xml配置之 -- SpringMVC IOC容器初始化

    SpringMVC IOC容器初始化 首先强调一下SpringMVC IOC容器初始化有些特别,在SpringMVC中除了生成一个全局的spring Ioc容器外,还会为DispatcherServl ...

  8. Maven-SSM项目pom.xml配置以及springmvc配置以及mybatis配置及web.xml配置

    一.Maven本地仓库的pom.xml配置 (全部是mysql数据库) <project xmlns="http://maven.apache.org/POM/4.0.0" ...

  9. springmvc web.xml配置之 -- DispatcherServlet

    springMVC servlet配置与启动 看一下springmvc的web.xml常见配置: <servlet> <!-- 配置DispatcherServlet --> ...

随机推荐

  1. Go语言深度比较值是否相等

    Go语言深度比较值是否相等 需求描述: 我们在开发过程中经常会遇到一些需要比较值是否相等的场景,例如比较两个数组.结构体.Map.等,自己写这些代码比较繁琐,大部分时候这里都可以使用到反射reflec ...

  2. excel VBA中正则模块vbscript.regexp的用法

    一.是一个对象,用于执行 正则表达式! 二.有三个属性:      1. Global属性: True or False, 指明模式是匹配整个字符串中所有与之相符的地方还是只匹配第一次出现的地方.默认 ...

  3. 11、mysql索引详解

    1.索引介绍: 2.建立索引的方法: 注意:索引名称不要相同: (1)在建表的时候,可以增加主键索引的语句如下: 1)例一: create table student1 ( id int(4) not ...

  4. 在windows的情况下面右键添加vim

    1, 首先打开注册表,然后打开下面路径: HKEY_CLASSES_ROOT\*\Shell 2, 右键新建项(也就是右键的文字):  用vim编辑 3, 在"用vim编辑"下面再 ...

  5. JS刷新窗口的几种方式

    浮层内嵌iframe及frame集合窗口,刷新父页面的多种方法   <script language=JavaScript>       parent.location.reload(); ...

  6. 为什么要鼓励小型企业使用CRM系统

    如果你是一家小公司的管理者,我相信你必须对工作流程.客户.市场销售.市场营销推广等业务流程进行总体规划和管理方法,这往往会使你的心有馀而力不足,引起 繁忙.心有馀而力不足.交流受到阻碍.管理方法和这样 ...

  7. Java:Java多线程实现性能测试

    创建多线程和线程池 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import ...

  8. 基于redis的分布式锁防止高并发重复请求

    需求: 我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统)(1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致.(2)A渠道系统再调用外部厂商C系统.(3)A ...

  9. PHP递归创建多级目录(一道面试题的解题过程)(转)

      今天看到一道面试题,要写出一个可以创建多级目录的函数: 我的第一个感觉就是用递归创建,具体思路如下: function Directory($dir){ if(is_dir($dir) || @m ...

  10. Android常用开源库(转)

    一 .基本控件 TextView HTextView 一款支持TextView文字动画效果的Android组件库. ScrollNumber 滚动数字控件 ticker 滚动数字控件 ReadMore ...