SpringMVC URI解析(五)如何处理链接路径?

2026-05-19 20:381阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1037个文字,预计阅读时间需要5分钟。

SpringMVC URI解析(五)如何处理链接路径?

Spring MVC 提供了 `UriComponentsBuilder` 工具类,用于解析或构建 URL。以下是如何使用该工具类的简单示例:

`UriComponentsBuilder` 可以帮助生成 URL,例如,根据基础 URL 和参数生成 GET 请求的 URL。下面是一个简化的使用示例:

java// 创建 UriComponentsBuilder 实例UriComponentsBuilder builder=UriComponentsBuilder.fromHttpUrl(http://example.com/api/data);

// 添加查询参数builder.queryParam(param1, value1);builder.queryParam(param2, value2);

// 构建完整的 URLUriComponents uriComponents=builder.build();

// 获取 URL 字符串String url=uriComponents.toUriString();

System.out.println(url);

输出结果将类似于:

http://example.com/api/data?param1=value1¶m2=value2

这个例子展示了如何使用 `UriComponentsBuilder` 来构建一个包含查询参数的 URL。通过这种方式,可以避免手动拼接字符串,减少出错的可能性。更多关于 `UriComponentsBuilder` 的使用,可以参考 Spring 官方文档。

URI在网络请求中必不可少,Spring提供了一些工具类用于解析或者生成URL,比如根据参数生成GET的URL等。本文会对Spring MVC中的URI工具进行介绍,本文主要参考Spring官方文档。

工具类UriComponents

UriComponentsBuilder可以用于根据URL和参数来构建路径,比如我们需要一个带GET参数的URL,通常情况下我们需要自己去拼接URL,添加"&"和"?等参数"。UriComponentsBuilder提供一种更简介的方法去构建URL:

UriComponents uriComponents = UriComponentsBuilder .fromUriString("example.com/hotels/{hotel}") .queryParam("q", "{q}") .encode() .build(); // example.com/hotels/Westin?q=123 URI uri = uriComponents.expand("Westin", "123").toUri();

上面的两条语句也可以合并到一个Build链中,用如下方式达到同样的目的:

URI uri = UriComponentsBuilder .fromUriString("example.com/hotels/{hotel}") .queryParam("q", "{q}") .encode() .buildAndExpand("Westin", "123") .toUri(); URI uri = UriComponentsBuilder .fromUriString("example.com/hotels/{hotel}") .queryParam("q", "{q}") .build("Westin", "123"); URI uri = UriComponentsBuilder .fromUriString("example.com/hotels/{hotel}?q={q}") .build("Westin", "123"); 接口UriBuilder

UriComponentsBuilder实现了UriBuilder接口,该接口的主要功能就是构建Uri。Spring中可以通过UriBuilderFactory获取UriBuilder的实例。我们平时使用example.org"; DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl); factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES); RestTemplate restTemplate = new RestTemplate(); restTemplate.setUriTemplateHandler(factory);

// import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode; String baseUrl = "example.org"; DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl); factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES); WebClient client = WebClient.builder().uriBuilderFactory(factory).build();

String baseUrl = "example.com"; DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl); URI uri = uriBuilderFactory.uriString("/hotels/{hotel}") .queryParam("q", "{q}") .build("Westin", "123"); Url的编码

UriComponentsBuilder组件提供了两种类型的编码方式:

  • UriComponentsBuilder#encode():对Url模板和参数分别进行编码之后进行拼接。
  • UriComponents#encode():对拼接后的Url进行编码操作。

大多数情况下适合使用UriComponentsBuilder#encode(),因为它将参数单独进行了编码。但是如果你需要在编码中保留特殊字符,那么最好使用第二种编码方式。

URI uri = UriComponentsBuilder.fromPath("/hotel list/{city}") .queryParam("q", "{q}") .encode() .buildAndExpand("New York", "foo+bar") .toUri(); // Result is "/hotel%20list/New%20York?q=foo%2Bbar" Servlet Uri构建

Spring提供了另一个Uri组件ServletUriComponentsBuilder,该组件可以基于Servlet请求构建新的Uri:

HttpServletRequest request = ... // Re-uses host, scheme, port, path and query string... ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromRequest(request) .replaceQueryParam("accountId", "{id}").build() .expand("123") .encode(); // Re-uses host, port and context path... ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromContextPath(request).path("/accounts").build() // Re-uses host, port, context path, and Servlet prefix... ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromServletMapping(request).path("/accounts").build() Controller Uri

我们知道Spring中可以通过@RequestMapping把一个请求映射到Controller的方法上,那么我们如何获取到Controller方法的请求路径呢?

@Controller @RequestMapping("/hotels/{hotel}") public class BookingController { @GetMapping("/bookings/{booking}") public ModelAndView getBooking(@PathVariable Long booking) { // ... } }

Spring 提供了MvcUriComponentsBuilder工具获取Controller方法对应的路径,其使用示例如下所示:

// 21:指明参数的类型, 42:新的参数类型. UriComponents uriComponents = MvcUriComponentsBuilder .fromMethodName(BookingController.class, "getBooking", 21).buildAndExpand(42); URI uri = uriComponents.encode().toUri(); UriComponents uriComponents = MvcUriComponentsBuilder .fromMethodCall(on(BookingController.class).getBooking(21)).buildAndExpand(42); URI uri = uriComponents.encode().toUri();

Controller方法应该是非Final的,否则Spring可能会获取不到配置的路径信息。

MvcUriComponentsBuilder 还支持指定Context,如域名等信息,示例如下所示:

UriComponentsBuilder base = ServletUriComponentsBuilder.fromCurrentContextPath().path("/en"); MvcUriComponentsBuilder builder = MvcUriComponentsBuilder.relativeTo(base); builder.withMethodCall(on(BookingController.class).getBooking(21)).buildAndExpand(42); URI uri = uriComponents.encode().toUri(); 视图中的URL

在Thymeleaf、FreeMarker和JSP等视图组件中,我们可以通过视图URL组件去拼接URL,示例如下:

SpringMVC URI解析(五)如何处理链接路径?

@RequestMapping("/people/{id}/addresses") public class PersonAddressController { @RequestMapping("/{country}") public HttpEntity<PersonAddress> getAddress(@PathVariable String country) { ... } }

<%@ taglib uri="www.springframework.org/tags" prefix="s" %> ... <a href="${s:mvcUrl('PAC#getAddress').arg(0,'US').buildAndExpand('123')}">Get Address</a>

本文最先发布至微信公众号,版权所有,禁止转载!

本文共计1037个文字,预计阅读时间需要5分钟。

SpringMVC URI解析(五)如何处理链接路径?

Spring MVC 提供了 `UriComponentsBuilder` 工具类,用于解析或构建 URL。以下是如何使用该工具类的简单示例:

`UriComponentsBuilder` 可以帮助生成 URL,例如,根据基础 URL 和参数生成 GET 请求的 URL。下面是一个简化的使用示例:

java// 创建 UriComponentsBuilder 实例UriComponentsBuilder builder=UriComponentsBuilder.fromHttpUrl(http://example.com/api/data);

// 添加查询参数builder.queryParam(param1, value1);builder.queryParam(param2, value2);

// 构建完整的 URLUriComponents uriComponents=builder.build();

// 获取 URL 字符串String url=uriComponents.toUriString();

System.out.println(url);

输出结果将类似于:

http://example.com/api/data?param1=value1¶m2=value2

这个例子展示了如何使用 `UriComponentsBuilder` 来构建一个包含查询参数的 URL。通过这种方式,可以避免手动拼接字符串,减少出错的可能性。更多关于 `UriComponentsBuilder` 的使用,可以参考 Spring 官方文档。

URI在网络请求中必不可少,Spring提供了一些工具类用于解析或者生成URL,比如根据参数生成GET的URL等。本文会对Spring MVC中的URI工具进行介绍,本文主要参考Spring官方文档。

工具类UriComponents

UriComponentsBuilder可以用于根据URL和参数来构建路径,比如我们需要一个带GET参数的URL,通常情况下我们需要自己去拼接URL,添加"&"和"?等参数"。UriComponentsBuilder提供一种更简介的方法去构建URL:

UriComponents uriComponents = UriComponentsBuilder .fromUriString("example.com/hotels/{hotel}") .queryParam("q", "{q}") .encode() .build(); // example.com/hotels/Westin?q=123 URI uri = uriComponents.expand("Westin", "123").toUri();

上面的两条语句也可以合并到一个Build链中,用如下方式达到同样的目的:

URI uri = UriComponentsBuilder .fromUriString("example.com/hotels/{hotel}") .queryParam("q", "{q}") .encode() .buildAndExpand("Westin", "123") .toUri(); URI uri = UriComponentsBuilder .fromUriString("example.com/hotels/{hotel}") .queryParam("q", "{q}") .build("Westin", "123"); URI uri = UriComponentsBuilder .fromUriString("example.com/hotels/{hotel}?q={q}") .build("Westin", "123"); 接口UriBuilder

UriComponentsBuilder实现了UriBuilder接口,该接口的主要功能就是构建Uri。Spring中可以通过UriBuilderFactory获取UriBuilder的实例。我们平时使用example.org"; DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl); factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES); RestTemplate restTemplate = new RestTemplate(); restTemplate.setUriTemplateHandler(factory);

// import org.springframework.web.util.DefaultUriBuilderFactory.EncodingMode; String baseUrl = "example.org"; DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(baseUrl); factory.setEncodingMode(EncodingMode.TEMPLATE_AND_VALUES); WebClient client = WebClient.builder().uriBuilderFactory(factory).build();

String baseUrl = "example.com"; DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl); URI uri = uriBuilderFactory.uriString("/hotels/{hotel}") .queryParam("q", "{q}") .build("Westin", "123"); Url的编码

UriComponentsBuilder组件提供了两种类型的编码方式:

  • UriComponentsBuilder#encode():对Url模板和参数分别进行编码之后进行拼接。
  • UriComponents#encode():对拼接后的Url进行编码操作。

大多数情况下适合使用UriComponentsBuilder#encode(),因为它将参数单独进行了编码。但是如果你需要在编码中保留特殊字符,那么最好使用第二种编码方式。

URI uri = UriComponentsBuilder.fromPath("/hotel list/{city}") .queryParam("q", "{q}") .encode() .buildAndExpand("New York", "foo+bar") .toUri(); // Result is "/hotel%20list/New%20York?q=foo%2Bbar" Servlet Uri构建

Spring提供了另一个Uri组件ServletUriComponentsBuilder,该组件可以基于Servlet请求构建新的Uri:

HttpServletRequest request = ... // Re-uses host, scheme, port, path and query string... ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromRequest(request) .replaceQueryParam("accountId", "{id}").build() .expand("123") .encode(); // Re-uses host, port and context path... ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromContextPath(request).path("/accounts").build() // Re-uses host, port, context path, and Servlet prefix... ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromServletMapping(request).path("/accounts").build() Controller Uri

我们知道Spring中可以通过@RequestMapping把一个请求映射到Controller的方法上,那么我们如何获取到Controller方法的请求路径呢?

@Controller @RequestMapping("/hotels/{hotel}") public class BookingController { @GetMapping("/bookings/{booking}") public ModelAndView getBooking(@PathVariable Long booking) { // ... } }

Spring 提供了MvcUriComponentsBuilder工具获取Controller方法对应的路径,其使用示例如下所示:

// 21:指明参数的类型, 42:新的参数类型. UriComponents uriComponents = MvcUriComponentsBuilder .fromMethodName(BookingController.class, "getBooking", 21).buildAndExpand(42); URI uri = uriComponents.encode().toUri(); UriComponents uriComponents = MvcUriComponentsBuilder .fromMethodCall(on(BookingController.class).getBooking(21)).buildAndExpand(42); URI uri = uriComponents.encode().toUri();

Controller方法应该是非Final的,否则Spring可能会获取不到配置的路径信息。

MvcUriComponentsBuilder 还支持指定Context,如域名等信息,示例如下所示:

UriComponentsBuilder base = ServletUriComponentsBuilder.fromCurrentContextPath().path("/en"); MvcUriComponentsBuilder builder = MvcUriComponentsBuilder.relativeTo(base); builder.withMethodCall(on(BookingController.class).getBooking(21)).buildAndExpand(42); URI uri = uriComponents.encode().toUri(); 视图中的URL

在Thymeleaf、FreeMarker和JSP等视图组件中,我们可以通过视图URL组件去拼接URL,示例如下:

SpringMVC URI解析(五)如何处理链接路径?

@RequestMapping("/people/{id}/addresses") public class PersonAddressController { @RequestMapping("/{country}") public HttpEntity<PersonAddress> getAddress(@PathVariable String country) { ... } }

<%@ taglib uri="www.springframework.org/tags" prefix="s" %> ... <a href="${s:mvcUrl('PAC#getAddress').arg(0,'US').buildAndExpand('123')}">Get Address</a>

本文最先发布至微信公众号,版权所有,禁止转载!