Spring MVC专栏目录(点击进入…)
Spring MVC框架,与其他很多Web的MVC框架一样:请求驱动。所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器。同时提供其他web应用开发所需要的功能。不过Spring的中央处理器,DispatcherServlet,能做的比这更多。它与Spring IoC容器做到了无缝集成,这意味着,Spring提供的任何特性,在Spring MVC中都可以使用。
Spring MVC处理请求的流程,每个组件具体负责的工作内容:
(1)客户端发出HTTP请求,Web应用服务器接收此请求。若匹配DispatcherServlet的请求映射路径(在web.xml指定),则Web容器将该请求转交给DispatcherServlet处理。
(2)DispatcherServlet接收到该请求后,将根据请求的信息(包括URL、请求参数、HTTP方法等),然后在HandlerMapping的配置(在-servlet.xml中配置)找到处理请求的处理器(Handler)。
(3)当DispatcherServlet根据HandlerMapping找到对应当前请求的Handler之后,通过处理器适配器HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。
HandlerAdapter可以理解为指挥Handler来干活的人;HandlerAdapter接口里一共有三个方法:
方法 | 描述 |
---|---|
supports(Object) | 判断是否可以使用某个Handler |
handle(HttpServletRequest, HttpServletResponse, Object) | 具体使用Handler干活 |
getLastModified(HttpServletRequest,Object) | 获取资源的Last-Modified |
(4)在请求信息到达真正调用Handler的处理方法之前的这段时间内,Spring MVC还完成了很多工作,它会将请求信息一定的方式转换绑定到请求方法的入参中,对于入参的对象会进行数据转换、数据格式化以及数据校验等。最后才真正地调用Handler的处理方法进行相应的业务逻辑处理。
(5)处理器完成业务逻辑处理之后将返回一个ModelAndView对象给DispatcherServlet,ModelAndView对象包含了逻辑视图名和模型数据信息。
(6)ModelAndView对象中包含的是“逻辑视图名”,而非真正的视图对象。DispatcherServlet会通过ViewResoler将逻辑视图名解析为真正的视图对象View。
(7)当得到真实的视图对象View后,DispatcherServlet会使用ModelAndView对象中的模型数据对View进行视图渲染。
(8)最终客户端获得响应消息,根据配置,可以是普通的HTML页面,也可以是一个XML或者JSON格式的数据等。
负责接受用户的请求,转发,处理请求后,将响应返回给客户
配置
URL配置 | 描述 |
---|---|
*.action | 访问以.action结尾有DispatcherServlet进行解析 |
/ | 访问地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析使用此种方式可以实现REST风格的URL |
/* | 配置错误,使用这种配置,最终要转发到一个Jsp页面时,仍然会由DispatcherServlet解析Jsp地址,不能根据Jsp页面找到handler,会报错 |
前端控制器把请求转发给处理器映射器。处理器映射器根据请求中的URL,找到对应的Handler(相当于struts2的Action),返回给前端控制器。
多个处理器映射器可以共存:
org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
若没有明确声明任何处理器映射,Spring会默认使用BeanNameUrlHandlerMapping,即在Spring容器中查找与请求URL同名的Bean。这个映射器不需要配置,根据请求的URL路径映射到控制器Bean的名称(name);即在配置Handler的Bean的时候指定name属性。
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
one
one
前端控制器知道要执行哪个Handler(只是把信息转发给处理器适配器),处理器适配器调用程序写好的Handler(Controller),Handler执行完,返回一个ModelAndView对象给适配器,处理器适配器再把这个对象返回给前端控制器
所有处理器适配器都实现了HandlerAdapter接口
// 此适配器只能执行实现Controller接口的Handler
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
// 要求编写Handler实现HttpRequestHandler接口
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter
编写handler按照适配器的规则来编写,比如实现哪个接口,这样适配器才可以正确执行handler
前端控制器会把逻辑视图发送给视图解析器请求解析,视图解析器处理后返图逻辑视图给前端控制器(解析JSP,默认使用jstl标签,得有jstl的jar包)
org.springframework.web.servlet.view.InternalResourceViewResolver
可通过配置属性prefix(前缀)和suffix(后缀),将视图逻辑名解析为/WEB-INF/jsp
前端控制器请求进行视图渲染,把model数据填充到request域,返回物理视图(view)(jsp、html等);前端控制器把视图响应返回给用户
注解HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)
首先更改Spring MVC的处理器映射的配置为支持注解式,配置
这种配置方法非常简单,简单理解就是配置此标签后,可以通过注解的方式,把一个URL映射到Controller上
配置该标签会自动注册 RequestMappingHandlerMapping(处理器映射器)
RequestMappingHandlerAdapter(处理器适配器)
(3.1版本之前,需要手动注册)
DefaultAnnotationHandlerMapping(处理器映射)
AnnotationMethodHandlerAdapter(处理器适配器)
Spring MVC需要通过这两个实例来完成对@Controller和@RequestMapping等注解的支持,从而找到URL与handler method的关系并予以关联。
换句话说,完成在Spring容器中这两个Bean的注册是Spring MVC为@Controller分发请求的必要支持。
对包进行扫描,实现注解驱动Bean的定义,同时将Bean自动注入容器中使用
即:使标注了Spring MVC注解(@Controller等)的Bean失效。若没有配置此标签,name标注了@Controller的Bean仅仅是一个普通的Java对象,而不是一个可以处理请求的控制器。
前端控制器从org.springframework.web.servlet下的DispatcherServlet.properties文件中加载默认的处理映射器、适配器、视图解析器等组件,如果不在springmvc-servlet.xml中配置,则使用默认加载的。
DispatcherServlet其实就是个Servlet(继承自HttpServlet基类),同样也需要在web应用的web.xml配置文件下声明。需要在web.xml文件中把希望DispatcherServlet处理的请求映射到对应的URL上去。
如果init-param不配置,会默认加载WEB-INF下的
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springmvc-servlet.xml
1
springmvc
/
Spring MVC配置文件(springmvc-servelt.xml)命名一般以
Controller(Handler)
public class ItemsController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest req,
HttpServletResponse resp) throws Exception {
System.out.println("进来了!!");
List list = new ArrayList();
list.add(new Items(1001, "访问", 1221.5, "家园"));
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/WEB-INF/index.jsp");
modelAndView.addObject("list", list);
return modelAndView;
}
}
public class IbdexController implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
}
}
@Controller
public class IndexController {
@RequestMapping(value = "/user",method = RequestMethod.GET)
public String Index() {
System.out.println("get请求:可以到这里");
return "one";
}
}
控制器方法的返回值为ModelAndView对象。该对象包含视图信息,也包含模型数据信息,这样Spring MVC就可以使用视图对模型数据进行渲染。
// 其中index就是逻辑视图名称
return new ModelAnView(“index”);
ModelAndView对象,正如其名所示,它代表Spring MVC中呈现视图界面是所使用的Model(模型数据)和View(逻辑视图名称)。
由于Java一次只能返回一个对象,所以ModelAndView的作用就是封装这两个对象,以便一次返回我们所需的Model和View。当然,返回的模型和视图也都是可选的,在一些情况下的,模型中没有任何数据,那么只返回视图即可,或者只返回模型,让Spring MVC根据请求URL来决定视图。
配置视图解析器时,根据定义prefix(前缀)——/WEB-INF/jsp/和suffix(后缀)——.jsp
需要在WEB-INF下创建jsp文件夹,并在文件夹下创建真正的JSP视图——index.jsp,并在该视图上输出
主流服务器(Tomcat、Weblogic等)