Как структурировать пружинные контроллеры с функциональностью, разделяемой между веб-страницами
Какой хороший способ структурировать весенние веб-контроллеры, когда есть разные веб-страницы, которые имеют общие функции?
Допустим, есть 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";
}
}
пс. Я не заинтересован в асинхронных решениях JavaScipt.
2 ответа
Вы можете использовать функцию 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";
}
}
Если логики больше или точки входа совсем другие, извлеките общий код для сервиса.
Моя мысль: это всего лишь вопрос того, как ваш дизайн и названия контроллеров. В идеале я создаю один контроллер для каждого объекта бизнес-домена. вместо создания контроллеров для каждой страницы. Если мы назовем Controller и Services для каждого объекта бизнес-домена, этого можно избежать. Так что я бы просто имел TaskController и вызывал один и тот же URI независимо от того, где вы вызываете его: со страницы Task, TaskDetail page или TaskReport page.