我刚开始使用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>