• 0105 springMVC开发基础


    背景

    已经明确了MVC的思想和SpringMVC的基本流程,下面就都具体的mvc开发细节知识了。

    @RequestMapping

    springMVC核心流程中,启动阶段会把注解@RequeestMapping注解所配置的内容保存到HandlerMapping中,然后等待请求到达。

    看一下源码:
    file

    简单分一下类:

    方法 说明
    name,value,path 标识控制器方法的访问url,可以配置多个
    method 处理的方法,http的标准方法,比如get,post等
    params 参数
    headers 请求头
    consumers 接受请求的资源类型
    produces 响应的资源类型

    说明:

    • url在一个系统中应该保持唯一,能正确标明资源的含义;
    • springboot新增了派生的方法注解,@PostMapping @GetMapping等;

    控制器参数 自定义参数转换

    在进入控制器的方法之前,会对http的参数和上下文进行解析,转换为控制器所需的参数;
    自定义参数转换规则:适用于特殊形式的参数解析,比如第三方公司参数使用加密的方式

    处理器转换参数流程:

    WebDataBinder机制:参数的转换,参数的验证;

    file

    接口 说明
    converter 普通的转换
    GenericConverter 数组类型的转换
    formatter 格式化

    springboot的自动注册参数转换:
    WebMvcAutoConfigurationAdapter类中自动注册的代码:所以,只要实现了这三个接口,并被安装到ioc中,就自动注册到了springMVC的参数处理流程中了;

    @Override
    public void addFormatters(FormatterRegistry registry) {
    	for (Converter<?, ?> converter : 
        getBeansOfType(Converter.class)) {
    				registry.addConverter(converter);
    			}
    	for (GenericConverter converter : getBeansOfType(GenericConverter.class)) {
    				registry.addConverter(converter);
    			}
    	for (Formatter<?> formatter : 
        getBeansOfType(Formatter.class)) {
    				registry.addFormatter(formatter);
    			}
    		}
    

    常规参数处理:

    类型 说明
    无注解下获取参数 url中的参数名字跟控制器方法的参数名称一致,并且允许为空
    @RequestParam 可以配置url中参数名称,并设置是否必须,并给出默认值
    传递数组 数组元素通过逗号分隔
    传递json 定义一个对象,并标注为@RequestBody
    url传递参数 url参数用{}包起来,而控制器方法参数标注为@PathVariable
    获取格式化参数 @DateFormate @DateTimeFormate,@NumberFormate可以定义接受参数的格式
    请求头参数 @RequestHeader("x")注解标注控制器方法
    自定义参数解析 实现HttpMessageConverter接口

    说明:

    • springboot中可以通过属性spring.mvc.date-formate来配置

    数据验证

    主要是集成了JSR303验证,采用的是Hibernate-validator机制来验证;

    常见验证注解

    注解 说明
    @NotNull 不能为Null
    @Future 必须是将来的日期
    @Past 必须是过去的日期
    @DecimalMin @Min 最小值
    @DecimalMax @Max 最大值
    @Range 范围
    @Email 必须是邮箱格式
    @Size 字符串的长度范围

    使用方式

    参数方法中,参数对象前标注@Valid ,在对象Errors中可以得到校验失败的信息

    自定义参数校验:

    核心接口:Validator ,自定义数据校验器需要实现该接口;
    使用:注册到WebDataBinder中;
    @InitBinder注解标注的方法会在调用控制器之前执行;

    ModelAndView 视图和视图解析器

    在springmvc的控制器中,如果参数中使用了ModelAndView,Model,ModelMap,会自动创建数据模型


    视图是渲染数据模型展示给用户的组件,分为逻辑视图和非逻辑视图,
    逻辑视图需要视图解析器viewResolver进行进一步的定位,比如jsp视图
    而非逻辑视图不需要进一步的定位,如MappingJacksonJsonView;

    视图接口:两个核心方法
    getContentType();
    reder(model, request ,response);

    自定义pdf的例子:

    TODO

    拦截器

    springMVC的流程中,根据HandlerMapping会得到一个HandlerExecutionChain,这个对象中包含了一个控制器和一个拦截器列表;通过拦截器可以增强处理器的功能;

    拦截器接口代码:

    file

    三个方法的执行时间相对的是控制器;

    自定义拦截器步骤:

    1. 实现HandlerInterceptor类;
    2. 配置类实现 WebMvcConfigurer,注册自定义的拦截器;
    3. 多个拦截器按照注册的先后顺序执行拦截;

    国际化

    不同地区的人,时间和语言不同,springMVC对国际化提供了很好的支持。
    MessageSource来定义的;
    如果resources目录下无messages.properties文件,不启用国际化;

    国际化解析器 说明
    AcceptHeader 通过L浏览器头来实现国际化区域
    Fixed 固定的国际化区域
    Cookie 基于Cookie来确定
    Session 基于Session来确定

    文件上传

    springMVC对文件上传提供了良好的支持。DispatchServlet会把文件上传的请求HttpServletRequest转换为MultipartHttpServletRequest;
    而它需要配置好MultipartResolver,springboot默认提供了StandardServletMultipartResolver,这个只需要依赖servlet-api包;

    配置方式:

    spring.servlet.multipart.enabled=true
    spring.servlet.multipart.max-file-size=1MB
    spring.servlet.multipart.max-request-size=10MB
    
    

    控制器写法:

    @PostMapping("/upload/part")
    @ResponseBody
    public String uplaod(Part file){
        //保存文件到本地或者云服务,返回解析路径
        
    }
    
    

    其它

    不常用的springMVC相关知识点;

    知识点 说明
    重定向 字符串跳转redirect:/xxx , addFlashAttribute(k,v)可以给redirect添加参数
    @ControllerAdvice 定义控制器的增强
    @InitBinder 定义自定义的转换器,校验器,在控制器执行前调用
    @ModelAttribute 增加模型的公共参数,不常用
    @ExceptionHandler 处理控制器的异常

    原创不易,转载请注明出处。

  • 相关阅读:
    你是一直认为 count(1) 比 count(*) 效率高么?
    秒杀系统是如何防止超卖的?
    百亿流量微服务网关的设计与实现
    中台
    Token 、Cookie、Session
    HyperLedger Fabric 1.4 区块链应用场景(3.1)
    HyperLedger Fabric 1.4 区块链工作过程(2.3)
    HyperLedger Fabric 1.4 区块链技术原理(2.2)
    HyperLedger Fabric 1.4 区块链技术定义(2.1)
    HyperLedger Fabric 1.4 区块链技术发展(1.3)
  • 原文地址:https://www.cnblogs.com/snidget/p/12153794.html
Copyright © 2020-2023  润新知