如何使用Thymeleaf在HTML页面上引用/构建(命名)Spring Web @RequestMapping的URL



我刚开始使用Spring Web &用于开发一个简单的web应用程序。这是相当顺利,但到目前为止,我无法找出如何防止重复的代码为hrefs和各种路径/路由。

示例Spring get映射:

...
@GetMapping(path="/hello")
public String hello(){
return "hello";
}
...

第一个包含href到'/hello'的HTML页面(index.html),使用Thymeleaf:

...
<a th:href="@{/hello}">Hello</a>
...

第二个包含href到'/hello'的HTML页面(home.html),使用Thymeleaf:

...
<a th:href="@{/hello}">Hello</a>
...

我如何安排我的代码,使我不必手动更新每个HTML页面上的href当我改变@GetMapping的路径?

基本上,我想将路径'/hello'分配给一个变量,然后我可以在每个href和getmapping

中引用它BR, Kazi

我一直在谷歌几个小时,但无法找到任何有用的信息,我的问题。我注意到Spring的"@GetMapping"注释的"name"属性,但不知道这是否提供了一个解决方案,或者它应该如何与Thymeleaf一起工作。我还知道Django框架为基于Python的web应用程序提供了命名路由的能力(使用url模式),并从它的模板语言中引用这些路由。我希望Spring框架也能有类似的解决方案。

我设法找到两个解决方案:

解决方案1

使用控制器名称的大写字母与请求方法的名称相结合,如官方Thymeleaf文档Thymeleaf教程:Thymeleaf + Spring的第11.1节"构建uri到控制器"所述。控制器名和请求方法名的大写字母用"#"隔开。

重要@RequestMapping的'name'属性不能被使用,否则Thymeleaf将无法解析视图!

注意:如果必须在url中添加路径变量或请求参数,则可能优先使用此解决方案。(我没有调查过这个)

控制器例子

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>

解决方案2

使用@RequestMapping的'name'属性。正如以下对Stackoverflow问题的回答所描述的那样,通过@RequestMapping名称构建Url不能像预期的那样使用自定义名称

第一个例子只使用了方法级@RequestMapping中的'name'属性。

示例控制器1

@Controller
public class ExampleController {
@RequestMapping(value="/", method=RequestMethod.GET, name="home")
public String index(Model model) { 
return "index" 
}  
}

示例link 1

<a th:href="${(#mvc.url('home')).build()}">Home</a>

第二个例子在方法级和类型级使用了@RequestMapping中的'name'属性。

示例控制器2

@Controller
@RequestMapping(value="/information", name="info")
public class ExampleController {
@RequestMapping(value="/organisation", method=RequestMethod.GET, 
name="org")
public String contact(Model model) {
return "organisation" 
}  
}

示例link 2

<a th:href="${(#mvc.url('info#org')).build()}">Contact</a>

最新更新