Spring MVC,控制器设计

时间:2013-10-17 13:13:08

标签: spring spring-mvc spring-security

我正在使用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";
}

}

我的问题是什么是标准方法?

1 个答案:

答案 0 :(得分:1)

通常我使用AdminOwnerController的混合方法,其中每个Controller最多有大约5-10个方法。

如果每个控制器最终有1-2个方法。我会考虑根据管理域将它们组合在一起。