2013-10-17 42 views
0

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

}

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

回答

1

通常我使用AdminOwnerController的混合方法,在这种方法中,每个控制器最多有约5-10个方法。

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