一直以来都在用java的springmvc,没有深入去探究关于spring以及mvc的一些内在的工作过程,今天利用休息时间,仔细阅读了一下我们的源码,并结合搜索引擎,明白了几个之前解决了问题,还没理解原理的原因所在.
本文将对SpringMVC的理解进行追踪描述,一来希望大家批评指正,纠正错误的理解,二来给自己一个留念,当以后忘记的时候,还有个记录,可以再次回想起来,三来总结技术经验,希望今后的路走的更好.
早两天我部署了一个项目,所有的配置都是从公司项目中抽取出来的.公司项目运行得很好,而我自己的项目却总是404,在这之前,为了看项目是否部署好,做了个html页面做静态资源测试,于是增加了静态资源配置如下:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
项目中有两个配置文件,一个是MyProject-sevlet.xml,另一个是ApplicationContext-Services.xml
在web.xml中配置是这样的
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/ApplicationContext-Services.xml</param-value>
</context-param>
<servlet>
<servlet-name>MyProject</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/conf/MyProject-servlet.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
注解驱动<mvc:annotation-driven/>是写在ApplicationContext-Services.xml,而不是MyProject-sevlet.xml,无论怎么访问jsp页面,都是404 ,后来发现,只要在MyProject-sevlet.xml加上<mvc:annotation-driven/>就能正常访问.猜想应该是没有优先加载ApplicationContext-Services.xml所导致的问题,但奇怪的是,公司项目配置文件就是这么写的,也没有其他特殊的配置,为什么那个项目能优先记载这个配置呢? 查资料说是因为增加了default这个servlet配置,但感觉解释的不够通透,不能完全理解,希望各位大神指点迷津.
另外,从application来说,使用WebApplicationContextUtils对象时,发现它有findWebApplicationContext,getRequiredWebApplicationContext,getWebApplicationContext,initServletPropertySources,registerEnvironmentBeans,registerWebApplicationScopes等方法
通过查阅相关资料,总结如下
findWebApplicationContext实际上最终也是调用getWebApplicationContext方法,来获取webapplicationcontext
initServletPropertySources在spring classloader类初始化的时候被调用,用于初始化servlet配置参数
其他方面的总结后续再补充,敬请期待