1、查看当前项目,因此配置文件如上图所示:
html
启动项目就进行初始化:java
在启动Web项目时,容器(好比Tomcat)会读web.xml配置文件中的两个节点<listener>和<contex-param>。web
接着容器会建立一个ServletContext(上下文),应用范围内即整个WEB项目都能使用这个上下文。spring
接着容器会将读取到<context-param>转化为键值对,并交给ServletContext。数据库
容器建立<listener></listener>中的类实例,即建立监听(备注:listener定义的类能够是自定义的类但必须须要继承ServletContextListener)。express
在 监听的类中会有一个contextInitialized(ServletContextEvent event)初始化方法,在这个方法中能够经过 event.getServletContext().getInitParameter("contextConfigLocation") 来获得context-param 设定的值。在这个类中还必须有一个contextDestroyed(ServletContextEvent event) 销毁方法.用于关闭应用前释放资源,好比说数据库链接的关闭。
api
获得这个context-param的值以后,你就能够作一些操做了.注意,这个时候你的WEB项目尚未彻底启动完成.这个动做会比全部的Servlet都要早。tomcat
由上面的初始化过程可知容器对于web.xml的加载过程是context-param >> listener >> fileter >> servletmybatis
<> <>log4jConfigLocation</> 参数 <>classpath:log4j.properties</> 参数值 </> <listener> <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> </listener> 根据参数名进入java源文件,找到对应的执行过程 进入源文件有两个方法,一个是容器会在应用程序初始化期间调用 contextInitialized() 方法 其实有一个initLogging()方法,在根据参数名找到对应的属性()。该过程在程序启动时,就能够 根据参数名得到你所配置的classpath:log4j.properties值。 另外一个方法contextDestroyed()是当tomcat关闭shutdown的时候调用(简单的说就是不打印日志!)
<> <>contextConfigLocation</> 参数名 <> classpath*:spring/applicationContext.xml, classpath:mybatis/mybatis-spring/spring-mybatis.xml, classpath*:spring/applicationContext-ehcache.xml, classpath:captcha/captcha-context.xml </> </> <listener> <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> servlet上下文须要加载的配置文件,对应的根据参数名能够在对应的java源文件中找到对应的原理。
<> <>admin</> <>org.springframework.web.servlet.DispatcherServlet</> <> <>contextConfigLocation</> <>/WEB-INF/springMVC-servlet.xml</> </> <>1</> </> <> <>admin</> <>/admin/*</>这里配置了路径,点击请求就加载springMVC -servlet.xml配置文件 </> 是一个程序的入口,用户发送请求Dispatcher servlet映射处理器而后调用配置文件中的拦截器, 调用处理器相应功能处理方法到Handler好比userController。而后在进行视图解析、视图渲染对应 至springMVC-servlet的viewResolver(视图解析)与viewClass(视图渲染)
springMVC-servlet.xml配置文件剖析:mvc
<context:component-scan base-package="com.maiqianweng"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> </context:component-scan>
上图的配置,简单的说是为了能够在controller层与service层使用注解的方式直接调用;
</> </>
<mvc:annotation-driven/>至关于注册了DefaultAnnotationHandlerMapping和 AnnotationMethodHandlerAdapter两个bean,配置一些messageconverter。即解决了 @Controller注解的使用前提配置。
<mvc:default-servlet-handler/>servlet在找页面时,走的是dispatcherServlet路线。找不到的时候会报404
加上这个默认的servlet时候,servlet在找不到的时候会去找静态的内容。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> </bean>
如图所示,该段配置是对模型视图名称的解析,(简单的说就是在控制层中,须要跳转的页面的时候只须要直接写页面名称便可,不须要后缀jsp)
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!--<mvc:exclude-mapping path="/admin/login.html"/>--> <!--<mvc:exclude-mapping path="/admin/user/loginHtml.html"/>--> <mvc:exclude-mapping path="/api/vehicle/"/> <bean class="com.maiqianweng.common.interceptor.AdminContextInterceptor"/> </mvc:interceptor> </mvc:interceptors>
如图所示,该项目中使用了MVC拦截器,并无拦截静态资源
Spring没有总的拦截器。<mvc:interceptors/>会为每个HandlerMapping,注入一个拦截器。总有一个HandlerMapping是能够找处处理器的,最多也只找到一个处理器,因此这个拦截器总会被执行的。起到了总拦截器的做用。
<mvc:mapping path="/**"/>
该段是匹配全部路径被拦截,
<mvc:exclude-mapping path="/api/vehicle/"/> <bean class="com.maiqianweng.common.interceptor.AdminContextInterceptor"/>
该段代码是不拦截的,<bean>标签中写了后台代码,具体拦截的内容;当前url等于登陆url是返回true不拦截,反之拦截
未完待续......