先看几个问题:
1、我们在浏览器的地址栏输入url后是怎么传到springMVC的controller层(控制器类)的?
2、之后又是怎么把页面传回来的?
看了很多springMVC的book还有blog。感觉很多都写得太过官方了,不太适合刚开始学springMVC的同学看。
现对springMVC处理请求的流程做出简单通俗的解释,希望各位刚学的同学少走弯路。有什么不对的地方,也请指正。
1、springMVC处理请求的流程图:
步骤1)、我们在控制台输入url,发送请求后,会被我们在web.xml配置的前端控制器(DispatcherServlet
)拦截,代码如下:
<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:springMVC.xml</param-value>
</init-param>
<!-- 使系统在启动时装在servlet而不是第一个servlet被访问 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
由上面的代码可以知道我们的前端控制器是springMVC.xml。
步骤2)、之后前端控制器把委托请求给页面控制器(controller层),页面控制器的RequestMapping注解能映射我们的对应url请求(至于为什么会能映射到,这个是在我们的springMVC.xml前端控制器配置了扫描controller层的包的注解和开启了注解驱动)。
步骤3、4)、调用业务对象和返回模型数据是我们controller层和service层的交互。
步骤5)、返回ModelAndView,比如return "index";(逻辑视图名)。
步骤6)、由我们在前端控制器配置的视图解析器进行视图解析(View)和视图渲染(Model),代码如下:
<!-- ViewResolver -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/> <!-- 前缀 -->
<property name="suffix" value=".jsp"/> <!-- 后缀 -->
</bean>
比如我们返回来的ModelAndView是index,那么把index进行解析和渲染:
1、视图解析:ViewResolver, ViewResolver将把逻辑视图名index解析为具体的View----/WEB-INF/jsp/index.jsp
2、视图渲染:View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构
步骤7)、解析渲染完毕后,返回控制权给前端控制器(DispatcherServlet)。
步骤8)、返回响应给用户,这时候用户就可以看到浏览器的index.jsp页面和后台传过来的数据。到此一个流程结束。