1、概念
Mvc的URL概念与Servlet概念基本没有什么区别,以下是它们的关系
- scheme:协议,在mvc中没有变
- host:主机,没变
- port:没变
- Context Path:mvc 中没有分的很细,是将它归为路径片段(Path Segment)
- Servlet path:mvc 中归与路径片段(path Segement)
- Path info:与Context Path, Servlet path相同
- 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).
相对路径,有以下方法
- fromRequest:将请求的路径作为相对路径,参数为request对象
- fromContextPath:将Context Path作为相对路径,参数为request对象
- 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,这种方式基本不采用,标签库这种技术基本已经过时,没有实践的意义