【问题标题】:How to using Spring @RequestMapping annotation with attribute name in Spring MVC如何在 Spring MVC 中使用带有属性名称的 Spring @RequestMapping 注解
【发布时间】:2019-08-12 17:03:41
【问题描述】:

据我所知,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框架中的name URL是一样的吗?

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

【问题讨论】:

标签: java django spring spring-boot spring-mvc


【解决方案1】:

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

  • 来自 JSP:Building URIs to Controllers and methods from views

    从 4.1 开始,每个 @RequestMapping 都根据类的大写字母和完整的方法名称分配了一个默认名称。例如,FooController 类中的方法getFoo 被分配了名称“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 注释的名称属性分配显式名称。

    这主要用于视图渲染技术和 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();
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 2014-11-20
    • 1970-01-01
    • 2021-10-24
    • 2014-07-11
    相关资源
    最近更新 更多