当启动服务器的时候,就会加载web.xml文件,载入下面这段代码
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
当有load-on-startup标签的时候,1表示servlet会在服务器启动的时候加载,
<load-on-startup>1</load-on-startup>
tomcat中就会有一个dispatcherServlet对象,然后调用init方法,根据name参数名获取value参数值,根据spring的配置路径就会去加载spring的配置文件,同时创建spring核心容器
在配置文件applicationContext.xml中,载入下面这段代码
<!--1.包扫描-->
<context:component-scan base-package="com.**"/>
<!--2.加载注解驱动-->
<mvc:annotation-driven/>
<!--3.导入application-mybatis.xml-->
<import resource="application-mybatis.xml"/>
根据component-scan标签,去扫描base-package路径下的所有的类和其中的类上的注解,比如Controller类中的@Controller或@RestController,Service类中的@Service注解,并进行IOC控制反转和DI依赖注入,生成对应的对象,存储在spring核心容器中.
而导入application-mybatis.xml则是为了整合mybatis
如果需要使用视图解析器时,也会在spring核心容器中生成视图解析器对象
<!--4.创建视图解析器对象-->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"/>
<property name="suffix" value=".jsp"/>
</bean>
此时第一部分结束了,而在我们的spring核心容器中生成了3个对象.分别是controller对象,scervice对象,viewResolver对象
http://localhost:8080/aaa/bbb.do
还记得web.xml文件中的servlet-mapping标签吗,当url-pattern为*.do时,映射路径则以.do后缀,
当url-pattern为 / 时,则表示没有后缀
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
回到客户端发送请求上面,这段请求会被dispatcherServlet对象接收并分发.它会截取.do之前的/aaa/bbb部分,并去Controller类中匹配对应@RequestMapping注解的值.找到对应的方法.
执行方法,如果需要请求转发跳转页面,则会在spring核心容器中找到视图解析器对象,配置前后缀,并找到对应的页面进行跳转.显示最终的网页数据.
本案例为简单程序的springMVC流程分析,具体的springmvc请求响应执行流程中,除了前端控制器DispatcherServlet,视图解析器ViewResolver外,还有处理器映射器HandlerMapping,处理器适配器HandlerAdapter分别执行程序,显示出最终的视图.
最后,感谢您的阅读,若文中有谬误的地方,敬请指出.大家一起交流学习,共同进步!