5.spring篇-web

7 篇文章 0 订阅

1 spring web提供web支持

2 spring web MVC 工作流

  • 1、用户发送请求至前端控制器DispatcherServlet。
  • 2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  • 3、处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
  • 4、DispatcherServlet调用HandlerAdapter处理器适配器。
  • 5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
  • 6、Controller执行完成返回ModelAndView。
  • 7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
  • 8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
  • 9、ViewReslover解析后返回具体View.
  • 10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
  • 11、DispatcherServlet响应用户。

2.1 初始化过程

1、入口从servlet的init方法,以下初始化各种组件

		initMultipartResolver(context);             //multipartResolver初始化上传组件
		initLocaleResolver(context);                //国际化语言处理
		initThemeResolver(context);                 //themeResolver主题处理
		initHandlerMappings(context);               //获取注册到bean中的HandlerMapping类
		initHandlerAdapters(context);               //获取注册到bean工厂的HandlerAdapter类
		initHandlerExceptionResolvers(context);     //HandlerExceptionResolver异常处理器
		initRequestToViewNameTranslator(context);   //RequestToViewNameTranslator视图名字转换
		initViewResolvers(context);                 //从bean工厂获取ViewResolver视图处理器
		initFlashMapManager(context);               //

2、处理流程

  • 1、DispatcherServlet请求访问的是doservice

  • 2、doDispatch(各种拦截器在这个方法执行)

  • 3、转化文件处理request

  • 4、让HandlerMapping处理,找到适合的HandlerMapping返回,HandlerExecutionChain(包含handler(Object类型,RequestMapping方法返回HandlerMethod)
    和HandlerInterceptor拦截器),找到实际的处理方法

  • 5、找到(Object类型)handler的适配器,HandlerAdapter的support找到匹配的适配器,(RequestMapping方法适配到RequestMappingHandlerAdapter),适配器处理handler方法执行,并且处理返回结果,提交给线程池等处理等。

  • 6、这里讲RequestMapping方法的RequestMappingHandlerAdapter,处理方法并且返回结果

  • 7、先交给HandlerMethodReturnValueHandlerComposite(返回结果处理器组合,组合模式)处理,找到适合的HandlerMethodReturnValueHandler处理返回结果,
    (ResponseBody会给RequestResponseBodyMethodProcessor处理了,并且把结果交给处理器HttpMessageConverter消息转化器写入到response中)

  • 8、如果在(7中没有处理返回给HttpResponse),判断ModelAndViewContainer.isRequestHandled()是否被处理请求,没有被处理,就会通过getModelAndView获取ModelAndView交给后面的ViewResolver视图解析器处理,

借用一张图:

在这里插入图片描述

3 请求参数绑定

还是用组合模式:HandlerMethodArgumentResolverComposite储存的所有参数处理器,处理并且返回实际的参数类型填充。

  • RequestParamMapMethodArgumentResolver map参 数接收形式 @RequestParam() Map<String, Object> maps
  • ErrorsMethodArgumentResolver 绑定异常,参数org.springframework.validation.Errors ,BindingResult
  • ExpressionValueMethodArgumentResolver(表达式) 参数 org.springframework.beans.factory.annotation.Value 使用spring的配置数据
  • HateoasPageableHandlerMethodArgumentResolver 参数 org.springframework.data.domain.Pageable SpringData的分页功能参数
  • HttpEntityMethodProcessor 参数HttpEntity或RequestEntity,
  • MatrixVariableMapMethodArgumentResolver 参数MatrixVariable ,路径变量分隔符的方式获取参数
  • MatrixVariableMethodArgumentResolver 同上

3.1 异常处理,加入异常处理

  • 异常处理,MethodArgumentTypeMismatchException,加入HandlerExceptionResolver

4 restful风格请求支持

PathVariableMethodArgumentResolver处理路径变量,PathVariable 在handlerMapping中处理了url的路径变量,将其存入request的attribute中(参数名:) ,

String URI_TEMPLATE_VARIABLES_ATTRIBUTE = HandlerMapping.class.getName() + ".uriTemplateVariables";  

5 ajax json交互

6 拦截器(inteceptor)

HandlerExecutionChain中的HandlerInterceptor,拦截器处理

7 spring自定义DispatcherServlet配置

使用servlet的初始化的继承类,Servlet
3.0环境中,web容器会初始化ServletContainerInitializer,(SpringServletContainerInitializer实现ServletContainerInitializer)
SpringServletContainerInitializer会初始化继承AbstractAnnotationConfigDispatcherServletInitializer ,WebMvcConfigurerAdapter

public class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
  @Override  //用来配置ContextLoaderListener创建的应用上下文中的bean。
  protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { RootConfig.class };
  }
  @Override  //用于定义DispatcherServlet应用上下文中的bean
  protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { WebConfig.class };
  }
  @Override
  protected String[] getServletMappings() {
    return new String[] { "/" };
  }
}
@Configuration
@EnableWebMvc   //启动Spring MVC
@ComponentScan("spittr.web")  //启动组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
  @Bean  //启动JSP视图解析器
  public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
  }
  //配置静态资源处理,
  // 我们要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,
  // 而不是使用DispatcherServlet本身来处理此类请求。
  @Override  
  public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    configurer.enable();
  }
  @Override
  public void addResourceHandlers(ResourceHandlerRegistry registry) {
    // TODO Auto-generated method stub
    super.addResourceHandlers(registry);
  }
}

8 添加其他的servlet和Filter

9 处理multipart形式的数据

使用默认处理器CommonsMultipartResolver,使用ServletFileUpload处理上传的文件,得到FileItem

10 在控制器中处理异常

使用异常处理器:HandlerExceptionResolverComposite(组合模式)转发到ExceptionHandlerExceptionResolver
将ControllerAdvice的bean注册成ExceptionHandlerMethodResolver

11 基于Flash属性的跨重定向请求数据传递

12 DispatcherServlet的初始化流程

  • 1、DispatcherServlet是一个Servlet
  • 2、initServletBean,如果spring容器未初始化,则初始化spring容器WebApplicationContext,
  • 3、通过构造函数等加入的属性webApplicationContext作为容器
  • 4、ServletContext查找WebApplicationContext容器
  • 5、servlet的默认初始化容器是XmlWebApplicationContext,
  • 6、onRefresh有了容器后初始化DispatcherServlet的一些映射器等信息

配置

<mvc:annotation-driven/>

作用是初始化注解处理的一些适配器和映射器
mvc标签处理MvcNamespaceHandler中注册了AnnotationDrivenBeanDefinitionParser会自动注册一些bean
注册Bean注解处理器,RequestMappingHandlerMapping,RequestMappingHandlerAdapter适配器(处理执行handler,并且处理返回,拦截器等),

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值