SpringMVC的核心组件
1、前端控制器DispatcherServlet:负责拦截请求,将请求转发给其他组件进行处理,相当于SpringMVC的控制单元。
2、处理器映射器HandlerMapping:负责查找处理器
3、处理器适配器HandlerAdapter:负责执行处理器(调用处理器的方法)
4、处理器:执行业务逻辑(开发人员自己编写)
5、视图解析器ViewResolver:解析逻辑视图,创建View对象
SpringMVC的执行流程
1、用户发送请求到DispatcherServlet
2、DispatcherServlet请求处理器映射器查找映射器
3、处理器映射器找到处理器后,返回处理器执行链给DispatcherServlet
4、DispatcherServlet请求处理器适配器执行处理器
5、处理器适配器执行处理器
6、处理器执行完后返回一个逻辑视图对象给处理器适配器
7、处理器适配器将逻辑视图对象返回给DispatcherServlet
8、DispatcherServlet请求视图解析器解析逻辑视图
9、视图解析器解析完成之后。返回一个view对象给DispatcherServlet
10、DispatcherServlet使用view视图对象和模型数据渲染页面,响应用户请求
SpringMVC怎么配置一个Servlet
1、web.xml
2、@WebServlet
3、SPI (服务提供者接口)
<mvc:annotation-driven/>包含了哪些内容
1、默认的处理器映射器:RequestMappingHandlerMapping、BeanNameUrlHandlerMapping
2、默认的处理器适配器:RequsetMappingHandlerAdapter、HttpRequestHandlerAdapter
3、异常解析器:ExceptionHandlerExceptionResolver
4、JavaBean校验器
5、一组Http请求和响应报文转换器
名字 | 作用 | 详解 |
---|---|---|
RequestMappingHandlerMapping | 将客户端请求映射到处理该请求的控制器的方法上 | 根据请求的URL和HTTP方法来确定具体的控制器方法,并返回一个HandlerExecutionChain对象。该对象中包含了要执行的控制器方法和拦截器信息。DispatcherServlet根据该对象执行具体的控制器方法,处理请求并生成一个视图对象返回到客户端。 |
BeanNameUrlHandlerMapping | 将请求的URL映射到相应的处理器 | 根据请求的URL查找配置中定义的处理器Bean,并返回其名称。注意:默认情况下只能争取处理".do"和".html"结尾的URL,如果要处理其他的URL需要在配置中做相应设置。DispatcherServlet会找到处理器Bean来处理请求生成响应。 |
RequestMappingHandlerAdapter | 处理映射到@RequestMapping注解的处理程序方法,并准备将响应返回到客户端 | 该适配器会完成请求处理的多个方面,例如解析方法参数、调用处理器方法、以及返回值转换成合适的HTTP响应格式等。它还提供了异常处理和错误响应支持的功能。 |
HttpRequestHandlerAdapter | 实现了HttpRequestHandler接口的处理器对象可使用该适配器进行处理,他将根据请求调用适当的方法,并将响应返回到客户端 | HttpRequestHandlerAdapter中的处理逻辑比较简单,只需要将请求和响应对象作为参数传入处理器方法即可。 |
ExceptionHandlerExceptionResolver | 当控制器方法抛出异常时,ExceptionHandlerExceptionResolve 会根据配置文件中定义的异常处理器来选择合适的异常处理方法,并将异常信息作为参数传入该方法。可以将异常信息转换成相应的错误视图或其他形式的响应。 | 需要注意的是,ExceptionHandlerExceptionResolver优先级较低,只有在其他的异常解析器都无法处理异常情况时才会被调用。因此,建议将该解析器放在其他解析器之后。 |
<mvc:annotation-driven/>跟<context:component-scan/>有什么区别呢?
<context:component-scan/>标签是告诉Spring 来扫描指定包下的类,并注册被@Component,@Controller,@Service,@Repository等注解标记的组件。
而<mvc:annotation-driven/>是告知Spring,我们启用注解驱动。然后Spring会自动为我们注册上面说到的几个Bean到工厂中,来处理我们的请求。
SpringMVC参数传递
类型 | 参数类型 | 备注 |
---|---|---|
请求 | x-www-form-urlencoded | form表单、key/value键值对类型 |
请求 | application/json | json |
请求 | multipart/from-data | 上传文件时使用的类型 |
响应 | text/html | 响应html文件 |
响应 | text/plain | 文本 |
响应 | application/json | 返回json字符串 |
SpringMVC处理静态资源
访问本地文件系统的静态资源
<mvc:resources mapping="/files/**" location="file:d:/upload/et2210/" />
访问Classpath下的静态资源
<mvc:resources mapping="/abc/**" location="classpath:public/" />
访问项目根目录(src/main/webapp)下的静态资源
<mvc:resources mapping="/s/**" location="/static/"/>
<mvc:default-servlet-handler />
SpringMVC异常处理
最常用的:
@ControllerAdvice+@ExceptionHandler、@RestControllerAdvice+@ExceptionHandler
拦截器
创建拦截器:实现HandlerInterceptor
boolean preHandle():在处理器的方法执行前执行,
postHandle():在处理器执行完成之后执行
afterCompletion():在页面渲染完成之后执行