Spring MVC,控制器设计
问题描述:
我在Spring MVC中用Spring Security的组合构建了一个web应用程序。我的问题涉及应用程序的内部设计。更具体地说 - 如何设置控制器。我得到了Pet Clinic很多启发,例如每个域对象有一个控制器(所有者控制器,宠物控制器,兽医控制器等)。Spring MVC,控制器设计
我想介绍一个管理后台接口到我的应用程序。这意味着要在每个控制器中创建特定于管理员的方法和@RequestMappings。请求映射路径通过拦截URL模式进行保护,因此我不必关心它们在哪里。不过,我觉得这个解决方案有点不雅。
在宠物诊所的例子就是它看起来像:
@Controller
@SessionAttributes(types = Owner.class)
public class OwnerController {
private final ClinicService clinicService;
// Front end method
@RequestMapping(value = "/owners/find", method = RequestMethod.GET)
public String initFindForm(Map<String, Object> model) {
model.put("owner", new Owner());
return "owners/findOwners";
}
// Admin method
@RequestMapping(value = "/admin/owners/find", method = RequestMethod.GET)
public String initFindForm(Map<String, Object> model) {
model.put("owner", new Owner());
//Admin view
return "admin/owners/findOwners";
}
}
另一种选择是有一个控制器,用于每个@RequestMapping(或每行动)
@Controller
@RequestMapping(value = "/admin", method = RequestMethod.GET)
public class AdminController {
private final ClinicService clinicService;
// Admin method
@RequestMapping(value = "/owners/find", method = RequestMethod.GET)
public String initFindForm(Map<String, Object> model) {
model.put("owner", new Owner());
//Admin specific view
return "admin/owners/findOwners";
}
}
这在我看来,导致有很多方法的控制器非常强大。
第三种选择是将这些组合起来。
@Controller
@SessionAttributes(types = Owner.class)
public class AdminOwnerController {
private final ClinicService clinicService;
// Admin method
@RequestMapping(value = "/admin/owners/find", method = RequestMethod.GET)
public String initFindForm(Map<String, Object> model) {
model.put("owner", new Owner());
//Admin view
return "admin/owners/findOwners";
}
}
我的问题是什么是一个标准的方法吗?
答
通常我使用AdminOwnerController的混合方法,在这种方法中,每个控制器最多有约5-10个方法。
如果最终每个控制器有1-2个方法。我会考虑根据管理域将它们分组在一起。