当存在共享功能的不同网页时,构建弹簧网络控制器的好方法是什么?
假设有一个Tasks
和一个Task
网页。我可以从两个页面开始任务,我希望在这样做时我会保持同一页面。
最好的方法是什么?我被迫按如下方式复制逻辑:
@Controller
@RequestMapping("/tasks")
public class TasksController {
@GetMapping("/{id}/start")
public String start(@PathVariable String id) {
tasks.start(id);
return "redirect:/tasks.html";
}
}
和
@Controller
@RequestMapping("/task")
public class TaskController {
@GetMapping("/{id}/start")
public String start(@PathVariable String id) {
tasks.start(id);
return "redirect:/task.html";
}
}
PS。我对异步JavaScipt解决方案不感兴趣。
答案 0 :(得分:1)
您可以在路径变量中使用Regex功能,并在另一个变量中获取页面名称。所以,我会通过以下方式解决这个问题:
@Controller
public class TaskController {
...
@GetMapping({"/{page:tasks?}/{id}/start")
public String start(@PathVariable String page, @PathVariable String id) {
tasks.start(id);
return "redirect:/" + page + ".html";
}
}
如果有更多逻辑或入口点完全不同,则将公共代码提取到服务中。
答案 1 :(得分:0)
我的想法:这只是你的设计和命名控制器的问题。理想情况下,我为每个业务域对象创建一个控制器。而不是为每个页面创建控制器。如果我们为每个业务域对象命名Controller和Services,则可以避免这种情况。所以我只需要TaskController并调用相同的URI,无论你从Task页面,TaskDetail页面还是TaskReport页面调用它。