如何构建 spring 具有网页间共享功能的控制器

How to structure spring controllers with functionality shared between web pages

当存在共享功能的不同网页时,构建 spring 网络控制器的好方法是什么?

假设有一个 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 解决方案不感兴趣。

您可以在路径变量中使用正则表达式功能,并在另一个变量中获取页面名称。所以,我会通过以下方式解决这个问题:

@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";
    }
}

如果有更多逻辑或入口点完全不同,请将公共代码提取到服务中。

我的想法:这只是您如何设计和命名控制器的问题。理想情况下,我为每个业务域对象创建一个控制器。而不是为每个页面创建控制器。如果我们为每个业务域对象命名控制器和服务,您就可以避免这种情况。所以我只需要 TaskController 并调用相同的 URI,而不管您从任务页面、任务详细信息页面或任务报告页面调用它的位置如何。