2. Spring MVC处理流程?相关组件(DispacherServlet、HandlerMapping、HandlerAdapter、DispatcherSerlvet)?

目录


Spring MVC专栏目录(点击进入…)


Spring MVC处理流程?相关组件(DispacherServlet、HandlerMapping、HandlerAdapter、DispatcherSerlvet)?

  • 目录
  • Web MVC处理流程
  • Spring MVC处理流程
  • 各类器具(组件)
    • (1)前端控制器(DispacherServlet)
    • (2)处理器映射器(HandlerMapping)
    • (3)处理器适配器(HandlerAdapter)
    • (4)处理器(Handler)
    • (5)视图解析器(View resolver)
    • (6)视图(view)
  • 注解驱动(重点)
    • (1)自动注册(Mapping、Adapter)
    • (2)包扫描(将Bean自定注入容器)
  • DispatcherSerlvet.properties文件
  • 操作步骤:
    • (1)引入jar文件(基础10个)
    • (2)在web.xml中配置Servlet,定义DispatcherServlet
    • (3,4)MVC配置文件和Controller(Handler,三种)
      • 第一种:实现Controller接口
      • 第二种:实现HttpRequestHandler接口
      • 第三种:注解
    • (5)创建View(也就是编写JSP页面等)
    • (6)部署运行


Web MVC处理流程

2. Spring MVC处理流程?相关组件(DispacherServlet、HandlerMapping、HandlerAdapter、DispatcherSerlvet)?_第1张图片


Spring MVC处理流程

Spring MVC框架,与其他很多Web的MVC框架一样:请求驱动。所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器。同时提供其他web应用开发所需要的功能。不过Spring的中央处理器,DispatcherServlet,能做的比这更多。它与Spring IoC容器做到了无缝集成,这意味着,Spring提供的任何特性,在Spring MVC中都可以使用。

2. Spring MVC处理流程?相关组件(DispacherServlet、HandlerMapping、HandlerAdapter、DispatcherSerlvet)?_第2张图片

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格式的数据等。


各类器具(组件)

(1)前端控制器(DispacherServlet)

负责接受用户的请求,转发,处理请求后,将响应返回给客户

配置

URL配置 描述
*.action 访问以.action结尾有DispatcherServlet进行解析
/ 访问地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析使用此种方式可以实现REST风格的URL
/* 配置错误,使用这种配置,最终要转发到一个Jsp页面时,仍然会由DispatcherServlet解析Jsp地址,不能根据Jsp页面找到handler,会报错

(2)处理器映射器(HandlerMapping)

前端控制器把请求转发给处理器映射器。处理器映射器根据请求中的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
		
	

(3)处理器适配器(HandlerAdapter)

前端控制器知道要执行哪个Handler(只是把信息转发给处理器适配器),处理器适配器调用程序写好的Handler(Controller),Handler执行完,返回一个ModelAndView对象给适配器,处理器适配器再把这个对象返回给前端控制器

所有处理器适配器都实现了HandlerAdapter接口

// 此适配器只能执行实现Controller接口的Handler
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
// 要求编写Handler实现HttpRequestHandler接口
org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter

(4)处理器(Handler)

编写handler按照适配器的规则来编写,比如实现哪个接口,这样适配器才可以正确执行handler

(5)视图解析器(View resolver)

前端控制器会把逻辑视图发送给视图解析器请求解析,视图解析器处理后返图逻辑视图给前端控制器(解析JSP,默认使用jstl标签,得有jstl的jar包

org.springframework.web.servlet.view.InternalResourceViewResolver
可通过配置属性prefix(前缀)和suffix(后缀),将视图逻辑名解析为/WEB-INF/jsp.jsp



	
	

(6)视图(view)

前端控制器请求进行视图渲染,把model数据填充到request域,返回物理视图(view)(jsp、html等);前端控制器把视图响应返回给用户


注解驱动(重点)

注解HandlerMapping(处理器映射器)、HandlerAdapter(处理器适配器)
首先更改Spring MVC的处理器映射的配置为支持注解式,配置标签,它是Spring MVC提供的一键式配置方法,配置此标签后Spirng MVC会自动做一些注册组件之类的事情。

这种配置方法非常简单,简单理解就是配置此标签后,可以通过注解的方式,把一个URL映射到Controller上

(1)自动注册(Mapping、Adapter)

(3.1版本之后)
配置该标签会自动注册 RequestMappingHandlerMapping(处理器映射器)
RequestMappingHandlerAdapter(处理器适配器)

(3.1版本之前,需要手动注册)

DefaultAnnotationHandlerMapping(处理器映射)
AnnotationMethodHandlerAdapter(处理器适配器)

Spring MVC需要通过这两个实例来完成对@Controller和@RequestMapping等注解的支持,从而找到URL与handler method的关系并予以关联。

换句话说,完成在Spring容器中这两个Bean的注册是Spring MVC为@Controller分发请求的必要支持。

(2)包扫描(将Bean自定注入容器)


对包进行扫描,实现注解驱动Bean的定义,同时将Bean自动注入容器中使用

即:使标注了Spring MVC注解(@Controller等)的Bean失效。若没有配置此标签,name标注了@Controller的Bean仅仅是一个普通的Java对象,而不是一个可以处理请求的控制器。


DispatcherSerlvet.properties文件

前端控制器从org.springframework.web.servlet下的DispatcherServlet.properties文件中加载默认的处理映射器、适配器、视图解析器等组件,如果不在springmvc-servlet.xml中配置,则使用默认加载的。


操作步骤:

(1)引入jar文件(基础10个)

2. Spring MVC处理流程?相关组件(DispacherServlet、HandlerMapping、HandlerAdapter、DispatcherSerlvet)?_第3张图片


(2)在web.xml中配置Servlet,定义DispatcherServlet

DispatcherServlet其实就是个Servlet(继承自HttpServlet基类),同样也需要在web应用的web.xml配置文件下声明。需要在web.xml文件中把希望DispatcherServlet处理的请求映射到对应的URL上去。

如果init-param不配置,会默认加载WEB-INF下的-servlet.xml配置文件。


	springmvc
	
	
		org.springframework.web.servlet.DispatcherServlet
	
	
	
	
		contextConfigLocation
		classpath:springmvc-servlet.xml
	
	
	1



	springmvc	
	
	/


(3,4)MVC配置文件和Controller(Handler,三种)

第一种:实现Controller接口

Spring MVC配置文件(springmvc-servelt.xml)命名一般以的名字+servlet.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;
	}
}

第二种:实现HttpRequestHandler接口








	
	

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来决定视图。

(5)创建View(也就是编写JSP页面等)

配置视图解析器时,根据定义prefix(前缀)——/WEB-INF/jsp/和suffix(后缀)——.jsp
需要在WEB-INF下创建jsp文件夹,并在文件夹下创建真正的JSP视图——index.jsp,并在该视图上输出

(6)部署运行

主流服务器(Tomcat、Weblogic等)

你可能感兴趣的:(Spring,MVC,spring,mvc,servlet)