SpringMVC执行流程
- 用户在浏览器发送请求;
- 用户请求达到前端控制器DispatcherServlet,DispatcherServlet收到请求调用HandlerMapping处理器映射器;
- 处理器映射器根据XML配置或者注解找到具体的处理器,并将结果返会给前端控制器;
- 前端控制器DispatcherServlet调用HandlerAdapter处理器适配器;
- 处理器适配器再调用后端控制器Controller执行;
- Controller执行并将结果ModelAndView返会给处理器适配器HandlerAdapter;
- HandlerAdapter再将Controller执行结果ModelAndView返回给前端控制器;
- DispatcherServlet将ModelAndView传给视图解析器ViewReslover;
- ViewReslover进行解析并将具体View返回给DispatcherServlet;
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中);
- 将渲染后的视图返会给用户。
SpringMVC的相关组件
组件解析
1. 前端控制器:DispatcherServlet
用户请求到达前端控制器,它就相当于MVC 模式中的C,DispatcherServlet是整个流程控制的中心,由
它调用其它组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
2. 处理器映射器:HandlerMapping
HandlerMapping负责根据用户请求找到Handler 即处理器,SpringMVC提供了不同的映射器实现不同的
映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3. 处理器适配器:HandlerAdapter
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理
器进行执行。
4. 处理器:Handler
它就是我们开发中要编写的具体业务控制器。由DispatcherServlet把用户请求转发到Handler。由
Handler 对具体的用户请求进行处理。
5. 视图解析器:View Resolver
View Resolver 负责将处理结果生成View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名,即具体的页面地址,再生成View 视图对象,最后对View 进行渲染将处理结果通过页面展示给用户。
6. 视图:View
SpringMVC框架提供了很多的View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面
@RequestMapping注解
@RequestMapping注解用于建立请求URL 和处理请求方法之间的对应关系。
就相当于代替了Servlet的配置:
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.java.code.Servlet<servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
<servlet-mapping>
相当于@RequestMapping("/login")
接下来来到@RequestMapping的源码中,如下:
RequestMapping.class
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
@Target具有 ElementType.METHOD 和 ElementType.TYPE 两个属性,表示@RequestMapping可以使用在类和方法上。
- 类上,请求URL 的第一级访问目录。此处不写的话,就相当于应用的根目录;
- 方法上,请求URL 的第二级访问目录,与类上的使用@ReqquestMapping标注的一级目录一起组成访问虚拟路径。
RequestMapping属性解析
- value
用于指定请求的URL。它和path属性的作用是一样的.
- method
用于指定请求的方式,包括GET、POST、PUT、DELETE等。
- params
用于指定限制请求参数的条件。request中必须包含某些参数值时,才让该方法处理。
- headers
用于指定request中必须包含某些指定的header值,才能让该方法处理请求。
- consumes
用于指定处理请求的Content-Type,例如application/json, text/html。
- produces
用于指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。
自定义视图解析器
通过属性注入的方式修改视图的的前后缀。
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
这样在Controller中方法重定向至某个jsp页面是,只需要返回相对于/WEB-INF/views/的相对路径即可,并且不需要再写.jsp后缀名。
例如,一个请求需要重定向至views文件夹中的success.jsp页面,那么就只需要return “success”
若是要重定向至views下的user中的profile.jsp页面,那么就只需要return “user/profile”
。