• 后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节34(Uri地址)


    1、概念

      Mvc的URL概念与Servlet概念基本没有什么区别,以下是它们的关系

    1. scheme:协议,在mvc中没有变
    2. host:主机,没变
    3. port:没变
    4. Context Path:mvc 中没有分的很细,是将它归为路径片段(Path Segment)
    5. Servlet path:mvc 中归与路径片段(path Segement)
    6. Path info:与Context Path, Servlet path相同
    7. Query String:mvc中称为mvc param。

    2、创建

      mvc 使用UriComponentsBuilder创建URL。它的方式有两种,绝对路径,相对路径。

      绝对路径,构建URL的每个部分 

    /**
    * @Title: buildUri
     * @Description:构建Uri
     * @return
     */
    public static UriComponents buildUri() {
    	// 创建UriComponents
    	UriComponents uri = UriComponentsBuilder.newInstance()
                      .scheme("http")
                      .host("localhost")
                      .port("8080")
                      .pathSegment("ContextPath", "ServletPath", "PathInfo")
                      .queryParam("key", "value").build();
    	// 打印创建的URI对象
    	System.out.println(uri.toString());
    	return uri;
    }
    

      示例中依次构建协议(scheme),主机(host), 端口(port), 路径片段(path segment), 参数(query param).

      相对路径,有以下方法

    1. fromRequest:将请求的路径作为相对路径,参数为request对象
    2. fromContextPath:将Context Path作为相对路径,参数为request对象
    3. fromServletMapping: 将Servlet path作为相对路径,参数为request对象

    3、构建Controller的uri

      在mvc中,负责构建Controller uri功能的是MvcUriComponentBuilder对象。它有以下四个方法。

      第一种方式调用fromMethoName方法

    // 创建UriComponent
    // 第一个参数为Controller的类型
    // 第二个参数为handler方法的名称
    // 第三个参数为handler方法的参数
    UriComponents uriComponents = MvcUriComponentsBuilder.fromMethodName(HelloController.class, "index", "Jack").build();
    

      第二种方式,调用fromMethodCall方法

    // 创建UriComponent
    // 第一个参数为on(ControllerClass)返回Controller的实例
    // index1,调用HelloController实例的index1方法, null 为该方法的参数
    UriComponents uriComponents = MvcUriComponentsBuilder.fromMethodCall(
                                    on(HelloController.class)
                                    .index1(null))
                                    .build();
    

      第三种方式,调用fromController方法,此时获取的URI为Context path加Controller的base path,即在Controller类上@RequestMapping注解的value属性值。

    // 创建UriComponent
    // 只有一个参数为Controller对应的Class
    UriComponents uriComponents = MvcUriComponentsBuilder.fromController(HelloController.class).build();
    

      如果HelloController有@RequestMapping注解,value属性值假设为hello。那么返回的URI为 “context path/hello” (协议,主机,端口的那部分此处省略)

      第四种方式,调用fromMapping方法,此时获取的URI不包含pathVariable 

    // 参数的格式为Controller的名称策略和方法的名称
    // Controller的名称根据HandlerMethodMappingNamingStrategy生成,它是将Controller的每个大写字母提取出来,例如HC表示HelloController
    // 当发生重复时,会抛错。 这种方式基本不用
    String uriComponents = MvcUriComponentsBuilder.fromMappingName("HC#index").build();
    

      注:所有的这些方法都基于Servlet的环境,只能在Handler方法内调用。在其他方法调用时,需要设置相对路径

    / 创建base url
    UriComponentsBuilder base =ServletUriComponentsBuilder.fromCurrentContextPath();
    // 创建MvcUriCOmponentsBuilder
    MvcUriComponentsBuilder builder = MvcUriComponentsBuilder.relativeTo(base);
    

      我个人感觉调用原生的Servlet API会更简单一些。

    4、encode

      待完善

    5、url tag

      在视图中通过spring tag(标签库)获取url,这种方式基本不采用,标签库这种技术基本已经过时,没有实践的意义

  • 相关阅读:
    爬虫示例
    S20_DAY23--课堂笔记
    python--常用模块之正则
    S20_DAY22--课堂笔记
    win10系统重装
    CCF 命令行选项
    CCF 任务调度
    CCF 出现次数最多的数
    CCF ISBN
    CCF 最大的矩形
  • 原文地址:https://www.cnblogs.com/rain144576/p/12902920.html
Copyright © 2020-2023  润新知