首页 > 解决方案 > 如何在 Spring MVC 中使用带有属性名称的 Spring @RequestMapping 注解

问题描述

正如我所知,在 Django 框架中提供了一种命名 URL 的方法,因此很容易在视图方法和模板中引用它们。

例如:

# Definition in coffeehouse/urls.py
path('',TemplateView.as_view(template_name='homepage.html'),name="homepage")

# Definition in view method
from django.http import HttpResponsePermanentRedirect
from django.urls import reverse

def method(request):
    ....
    return HttpResponsePermanentRedirect(reverse('homepage'))

# Definition in template
<a href="{% url 'homepage' %}">Back to home page</a>

Spring @RequestMapping 注解中的 name 属性是什么?

和 Django 框架中的名称 URL 是一样的吗?

如何在 Spring MVC 中使用带有属性名称的 @RequestMapping 注释?

标签: javadjangospringspring-bootspring-mvc

解决方案


要从处理程序方法的映射注释构建 URL,请使用:

  • 来自 JSP:请参阅从视图构建 URI 到控制器和方法

    从 4.1 开始,每个@RequestMapping都根据类的大写字母和完整的方法名称分配了一个默认名称。例如,getFoo类中的方法FooController被分配了名称“FC#getFoo”。

    [...]

    Spring JSP 标记库提供了一个名为的函数,该函数mvcUrl可用于基于此机制准备指向控制器方法的链接。

    例如给出:

    @RequestMapping("/people/{id}/addresses")
    public class MyController {
    
        @RequestMapping("/{country}")
        public HttpEntity getAddress(@PathVariable String country) { ... }
    }
    

    下面的 JSP 代码可以准备一个链接:

    <%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
    ...
    <a href="${s:mvcUrl('PC#getPerson').arg(0,'US').buildAndExpand('123')}">Get Person</a>
    
  • 来自 Thymeleaf:请参阅Building URIs to controllers

    从 4.1 版开始,Spring 允许直接从视图构建到带注释的控制器的链接,而无需知道这些控制器映射到的 URI。

    在 Thymeleaf 中,这可以通过#mvc.url(...)表达式对象方法来实现,它允许通过它们所在的控制器类的大写字母以及方法本身的名称来指定控制器方法。这相当于 JSP 的spring:mvcUrl(...)自定义函数。

    例如,对于:

    public class ExampleController {
    
        @RequestMapping("/data")
        public String getData(Model model) { ... return "template" }
    
        @RequestMapping("/data")
        public String getDataParam(@RequestParam String type) { ... return "template" }
    
    }
    

    以下代码将创建一个指向它的链接:

    <a th:href="${(#mvc.url('EC#getData')).build()}">Get Data Param</a>
    <a th:href="${(#mvc.url('EC#getDataParam').arg(0,'internal')).build()}">Get Data Param</a>
    
  • 从另一个处理程序重定向:请参阅MvcUriComponentsBuilder.fromMappingName(String mappingName).

    从 Spring MVC 控制器方法的请求映射的名称创建一个 URL。

    配置HandlerMethodMappingNamingStrategy在启动时确定控制器方法请求映射的名称。默认情况下,所有映射都根据类名的大写字母分配一个名称,后跟“#”作为分隔符,然后是方法名称。例如,“PC#getPerson”用于名为 PersonController 的类,其方法为 getPerson。如果命名约定不产生唯一的结果,则可以通过@RequestMapping注释的 name 属性分配显式名称。

    这主要用于视图渲染技术和 EL 表达式。Spring URL 标记库将此方法注册为一个名为“mvcUrl”的函数。

    例如,给定这个控制器:

    @RequestMapping("/people")
    class PersonController {
    
        @RequestMapping("/{id}")
        public HttpEntity<Void> getPerson(@PathVariable String id) { ... }
    
    }
    

    JSP 可以为控制器方法准备一个 URL,如下所示:

    <%@ taglib uri="http://www.springframework.org/tags" prefix="s" %>
    
    <a href="${s:mvcUrl('PC#getPerson').arg(0,"123").build()}">Get Person</a>
    

    请注意,不必指定所有参数。只有那些需要准备 URL 的,主要是@RequestParam@PathVariable)。

    要使用它,您可以执行以下操作:

    return "redirect:" + MvcUriComponentsBuilder.fromMappingName("PC#getPerson")
                                                .arg(0,"123")
                                                .build();
    

推荐阅读