我正在结合 Spring Security 在 Spring MVC 中构建一个 Web 应用程序。我的问题是关于应用程序的内部设计。更具体地说 - 如何设置控制器。Pet Clinic 示例给我很大启发,其中每个域对象(所有者控制器、宠物控制器、兽医控制器等)都有一个控制器。
我想为我的应用程序引入一个管理后端界面。这意味着在每个控制器中创建特定于管理员的方法和 @RequestMappings。请求映射路径由intercept-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";
}
}
我的问题是什么是标准方法?