java - 如何在 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 注释?
解决方案
要从处理程序方法的映射注释构建 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();
推荐阅读
- typescript - 有没有办法跳过类型检查以加快 TypeScript 编译速度?
- javascript - 无法使用 jquery 为特定 H1 标签应用 css
- javascript - 在另一个 JS 文件中调用全局函数。我如何让“这个”工作?
- javascript - 如何使用 html 表单来“修补”数据库?
- machine-learning - 使用标记+预测数据重新训练生产模型?
- android - Firebase 动态链接工作但不显示图像 Android
- javascript - 如何在 React 中包装在 GraphQL 突变组件中的按钮上有多个 onClick 事件
- php - DDD - 聚合 - 真的应该避免 getter 吗?
- python - 从 Morningstar / BeautifulSoup 获取股票价格
- clojure - 如何从列表中删除运算符符号,例如 + - / *