资讯专栏INFORMATION COLUMN

Learn Spring - Spring MVC

DesGemini / 2365人阅读

摘要:例如,将请求信息中的字符串格式参数转换为对应方法中的类类型入参可通过的属性注册自定义转换器。

1. 处理流程

请求提交给DispatchServlet

查找HandlerMapping

调用由HandlerAdapter封装后的Handler

返回ModelAndViewDispatcherServlet

借由ViewResolver完成逻辑视图到真实视图的转换

返回响应

2. 配置DispatcherServlet

web.xml


    
    
        contextConfigLocation
        
            /WEB-INF/applicationServlet.xml,
        
    
    
        org.springframework.web.context.ContextLoaderListener
    

    
    
        app
        org.springframework.web.servlet.DispatcherServlet
        
            logLevel
            FINE
        
        1
    

    
    
        app
        /api/*
    

子容器可以访问父容器的bean,父容器不能访问子容器的bean

默认采用org.springframework.web.context.ContextLoaderListener

默认使用/WEB-INF/{servlet-name}-*.xml加载子容器

3. DispatcherServlet的初始化

DispatcherServlet初始化

protected void initStrategies(ApplicationContext context) {
    initMultipartResolver(context);
    initLocaleResolver(context);
    initThemeResolver(context);
    initHandlerMappings(context);
    initHandlerAdapters(context);
    initHandlerExceptionResolvers(context);
    initRequestToViewNameTranslator(context);
    initViewResolvers(context);
    initFlashMapManager(context);
}

默认配置: DispatcherServlet.properties

# Default implementation classes for DispatcherServlet"s strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.

org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,
    org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
    org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator

org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver

org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
4. Controller注解 4.1 类注解

@Controller(由Spring识别Handler实例)

@RequestMapping(value=, method=, params=)

4.2 方法注解

@RequestMapping(value=, method=, params=)

@PathVariable,配合占位符{parameter}

@RequestParam(value=, required=, defaultValue=)

@CookieValue(value=, required=, defaultValue=)

@RequestHeader(value=, required=, defaultValue=)

5. 封装入参

HttpServletRequest, WebRequest, ServletRequestInputStream / Reader

HttpServeltResponse, ServletResponse的OutputStream / Writer

6. 请求信息和对象的转换 6.1 基本

HttpMessageConverter

使用@RequestBody / @ResponseBody;使用HttpEntity / ResponseEntity

Spring根据HTTP报文头部的Accept指定的MIME类型,查找匹配的HttpMessageConverter

Spring MVC默认装配AnnotationMethodHandlerAdapter,调用HttpMessageConverter

mvc命名空间的标签会创建并注册一个默认的DefaultAnnotationHandlerMapping和一个AnnotationMethodHandlerAdapter实例,如果上下文中存在自定义的对应组件bean,则覆盖默认配置

6.2 样例

app-servlet.xml


    
    
        
            
            
            
                
    



    
        
            
            
                
            
            
            
            
                
                    
                        
                            
                            
                            
                                  
                                      
                                
                            
                        
                    
                
            
        
    
7. 处理模型数据

Spring MVC在调用方法前会创建一个隐含的模型对象

ModelAndView:返回值类型为ModelAndView时,方法体通过该对象添加模型数据

@ModelAttribute:入参对象添加到数据模型中

Map和Model:入参为org.springframework.ui.Modelorg.springframework.ui.ModelMapjava.util.Map时,处理方法返回时,Map中的数据会自动添加到模型中

@SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求共享

8. 数据绑定 8.1 基本

Spring MVC将ServletRequest对象及处理方法的入参实例传递给DataBinder

DataBinder调用ConversionService组件进行数据类型转换、数据格式化等工作,将ServletRequest中的消息填充到入参对象中;

然后再调用Validator组件对已经绑定了请求消息数据的入参对象进行数据合法性校验,并最终生成绑定结果BindingResult对象,其中还包含相应的校验错误对象

抽取BindingResult中的入参对象及校验错误对象,赋给处理方法的相应入参

8.2 数据转换

例如:将请求信息中A类型参数转换并绑定到Controller对应的处理方法的B类型入参中

基于ConversionService接口,Spring将自动识别其实现类,用于入参类型转换,类似于C++中的自定义类型转换。例如,将http请求信息中的字符串格式参数转换为Controller对应方法中的类类型入参

可通过ConversionServiceFactoryBeanconverters属性注册自定义转换器。可接受ConverterConverterFacotoryGenericConverterConditionalConverterFactory的实现类,并统一封装到一个ConversionService的实例(即GenericConversionService)中


    
        
            
        
    

标签还会注册一个默认的ConversionService,即FormattingConversionServiceFactoryBean

8.3 数据格式化

例如:将请求信息中字符串类型参数转换并绑定到Controller对应的处理方法入参中的Date类型属性中

格式化框架定义了Formatter接口,扩展于PrinterParser接口

Srping提供AnnotationFormatterFactory接口及两个实现类:NumberFormatAnnotationFormatterFactoryJodaDateTimeFormatAnnotationFormatterFactory

在入参类属性上使用注解:@DateTimeFormat@NumberFormat

Spring通过标签创建FormattingConversionServiceFactoryBean作为FormattingConversionService的实例,自动装配NumberFormatAnnotationFormatterFactoryJodaDateTimeFormatAnnotationFormatterFactory

8.4 数据验证

标签会默认装配LocalValidatorFactoryBean,实现了Spring的Validator接口,通过在入参上标注@Valid注解即可让Spring在完成数据绑定后执行数据校验

@Valid注解标注的入参和其后的BindingResultErrors入参成对出现,后者保存前者的校验结果

校验结果也保存在MVC的隐含模型中

样例

public Class User {
    private String userId;

    @Pattern(regexp="w{4,30}")
    private String userName;

    @Length(min=2, max=100)
    private String nickName;

    @Past
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    @DecimalMin(value = "1000.00")
    @DecimalMax(value = "10000.00")
    @NumberFormat(pattern = "#,###.##")
    pirvate Long salary;
}


@RequestMapping(value = "/handle")
public void handle(@Valid User uer, BindingResult bindingResult) {
    //do something
}
9. 视图解析 9.1 基本

视图对象是一个bean,由视图解析器负责实例化。

不同的视图实现技术对应于不同的View实现类

所有的视图解析器都实现了ViewResolver接口

9.2 样例

app-servlet.xml



    






    
    
    
    
        text/html; charset=UTF-8
    
    



    
    
        
            UTF-8
            UTF-8
            
            true
            loopCursor
            0
        
    
10. 静态资源处理

需要对项目中的图片、html静态资源等多带带处理

配置后,会装配一个DefaultServletHttpRequestHandler,对静态资源做检查

配置,允许对静态资源文件路径作映射,并提供文件在浏览器端的缓存控制,例如

11. 拦截器 11.1 基本

DispatcherServlet将请求交给处理器映射(HandlerMapping),找到对应的HandlerExecutionChain

找到对应的HandlerExecutionChain包含若干HandlerInterceptor,和一个Handler

HandlerInterceptor接口:

public interface HandlerInterceptor {

  boolean preHandle (HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

  void postHandle (HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception;

  void afterCompletion (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;
}
11.2 样例

app-servlet.xml:


    
      
      
    
12. 异常处理 12.1 基本

Spring MVC通过HandlerExceptionResolver处理异常

HandlerExceptionResolver接口:

public interface HandlerExceptionResolver {
  ModelAndView resolveException (HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}

Spring MVC默认装配了DefaultHandlerExceptionResolver

Spring MVC默认注册了AnnotationMethodHandlerExceptionResolver,允许通过@ExceptionHandler指定处理特定异常

12.2 样例

web.xml


    
    
        404
        /error
    
    
        403
        /error
    
    
        java.lang.Throwable
        /error
    

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/66615.html

相关文章

  • Spring Boot (一)helloworld

    摘要:第二个类级别注解是。将引导应用程序,启动,从而启动自动配置服务器。比如想使用不同版本的,具体如下在标签中还可以指定编译的版本和项目的编码格式指定项目编码为使用插件可以为项目提供的操作方式,的个,默认。 引言 Spring 框架对于很多 Java 开发人员来说都不陌生。Spring 框架包含几十个不同的子项目,涵盖应用开发的不同方面。如此多的子项目和组件,一方面方便了开发人员的使用,另外...

    go4it 评论0 收藏0
  • Spring Boot - 表单校验(JSR303&Hibernate Validator)

    摘要:初步使用主要使用注解的方式对进行校验,第一个例子在需要校验的字段上指定约束条件然后在中可以这样调用,加上注解即可。如果校验失败,默认会返回框架的出错信息。指定到的分组名会全部进行校验,不指定的不校验。 Spring Boot - 表单校验(JSR303&Hibernate Validator) 回顾 Spring Boot - 初识 Hello World Spring Boot -...

    tinyq 评论0 收藏0
  • Spring框架之我见(四)——Spring MVC

    摘要:是结构在框架中的一种表现形式。这句话听起来有点绕,我们可以看一下下面这张图,大家可以吧容器中的理解为全局变量,吧容器中的理解为局部变量。在方法体中可以访问局部变量和全局变量,但是在方法外,就只能访问全局变量,是不能访问局部变量的。 聊完了Spring,我们来看看Spring在web方面的应用Spring MVC。 MVC 首先我们来看什么是mvc? 大家知道在jsp里面也是可以写jav...

    shiina 评论0 收藏0
  • SpringSpring Boot和TestNG测试指南 - 测试Spring MVC

    摘要:地址提供了,能够很方便的来测试。同时也提供了更进一步简化了测试需要的配置工作。本章节将分别举例说明在不使用和使用下如何对进行测试。例子测试的关键是使用对象,利用它我们能够在不需启动容器的情况下测试的行为。 Github地址 Spring Testing Framework提供了Spring MVC Test Framework,能够很方便的来测试Controller。同时Spring...

    andong777 评论0 收藏0
  • Spring Boot支持Crontab任务改造

    摘要:虽然本身支持定时任务,但都是服务一直运行时支持。监听目标对象借助容器刷新事件来监听目标对象即可,可以认为,定时任务其实每次只是执行一种操作而已。 在以往的 Tomcat 项目中,一直习惯用 Ant 打包,使用 build.xml 配置,通过 ant -buildfile 的方式在机器上执行定时任务。虽然 Spring 本身支持定时任务,但都是服务一直运行时支持。其实在项目中,大多数定时...

    fou7 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<