一、springMVC原理简介
1、HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI:也就是XXX.action)。然后根据该URI,调用HandlerMapping映射器处理器获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器,可以根据xml配置或者注解进行查找)。
3、处理器映射器HandlerMapping向前端控制器返回一个Handler对象(准确来说是HandlerExecutionChain对象)。
4、DispatherServlet根据获得的Handler对象,就会选择合适的处理器适配器HandlerAdapter(在成功获取HandlerAdapter对象后,会开始执行Handler的拦截器preHandler方法)。
5、提取Request中的模型数据(可能就是为什么要传入一个HttpServletRequest对象),填充Handler入参,然后开始执行Handler(也就是Controller)。在填充Handler入参的时候,处理器适配器(HandlerMapping)就会根据我们的配置,spring会帮我们执行一些数据的适配工作:
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
6、Handler执行完之后,会向前端控制器DispatherServlet返回一个ModelAndView对象。
7、根据返回的ModelAndView对象,前端控制器就会请求调用视图解析器ViewResolver(必须是已经注册到spring容器中的视图解析器),然后按照逻辑视图名去解析成真正的view(jsp)。
8、向前端控制器DisatherServlet返回view视图解析器。
9、前端控制器就会将模型数据(ModelAndView)填充到request域中,利用model进行视图的渲染。
10、最后前端控制器响应到客户端。
二、@Controller的使用、@rewquestMapping的使用
1、DispatcherServlet是Spring MVC的灵魂和心脏,它负责接收HTTP请求并协调Spring MVC的各个组件完成请求处理的工作。
2、和任何Servlet一样,用户必须在web.xml中配置好DispatcherServlet,并且让其接受一 切HTTP请求。
3、当用户的请求被截获时,DispatcherServlet通过HandlerMapping定位到特定的Controller(使用 @Controller注解的普通Java类,此处已经定位到了具体的业务处理方法了,所以我们称其为Handler)。
package ssm.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class ItemsController {
@RequestMapping("/queryItems")
public ModelAndView queryItems(HttpServletRequest request) throws Exception {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("test");
modelAndView.setViewName("items/itemsList");
return modelAndView;
}
}
在POJO类定义处标注@Controller,再通过<context:component-scan/>扫描相应的类包,即可使POJO 成为一个能处理HTTP请求的控制器。一个控制器的每一个方法都可以成为请求处理方法,如何将请求映射到控制器的方法中是Spring MVC框架最重要的任务之一,这项任务由@RequestMapping承担。
1、@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。
2、@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。
3、单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。
这个时候有两种方式可以把Controller 交给Spring 管理,好让它能够识别我们标记的@Controller 。
(1) 第一种方式是在SpringMVC 的配置文件中定义Controller 的bean 对象。
<bean class="ssm.controller.ItemsController"/>
(2) 第二种方式是在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。
<context:component-scan base-package="ssm.controller"></context:component-scan>
---------------------------------------------------------------------------------------------------------------------------------------------------------------