Spring控制器方法使用不同的参数共享我的多个@RequestMapping url

时间:2013-09-06 19:40:02

标签: java spring jsp spring-mvc

我已将以下方法添加到the Spring PetClinic sample application中的OwnerController类:

//'''''''''CodeMed added this next method
@RequestMapping(value = "/owners/catowners", method = RequestMethod.GET)
public String findOwnersOfPetType(Map<String, Object> model) {
    // find owners of a specific type of pet
    Integer typeID = 1;//this is just a placeholder
    Collection<Owner> results = this.clinicService.findOwnerByPetType(typeID);
    model.put("selections", results);
    return "owners/catowners";
 }
//'''''''''''''''''''

由于petclinic数据库中cat的typeID为1,因此上面返回了cat所有者列表。但我也想在网站上为狗主人,蜥蜴主人,仓鼠主人和任何其他宠物的主人创建单独的页面。我是否需要为每种宠物类型创建一个单独版本的findOwnersOfPetType()?像findDogOwners(),findLizardOwners(),findHamsterOwners()等?或者我可以让findOwnersOfPetType()方法接受一个指示宠物类型的int参数吗?

jsp文件怎么样?我是否需要为catowners.jsp,dogowners.jsp,lizardowners.jsp,hamsterowners.jsp等中的每一个创建单独的jsp文件?或者我可以以某种方式为每种类型的宠物创建一个以相同格式填充不同数据的jsp?

这在代码中看起来如何?

ClinicService和OwnerRepository函数已经一起处理,因为我上面发布的函数使用函数中创建的参数调用ClinicService方法。

2 个答案:

答案 0 :(得分:1)

您可以将RequestMappingPathVariable一起使用。例如:

@RequestMapping(value = "/owners/{petId}", method = RequestMethod.GET)
public String findOwnersOfPetType(Map<String, Object> model,
    @PathVariable int petId) {
    //use id as before
}

如果要在URL中使用字符串而不是整数,可以通过在URL中使用字符串并在这些字符串与其ID之间进行枚举映射,使它们更加用户友好。

答案 1 :(得分:1)

您可以在请求映射中添加类型参数:

@RequestMapping(value = "/owners/{type}", method = RequestMethod.GET)
public String findOwnersOfPetType(@PathVariable("type") it type) {

}

因此,您不需要不同的控制器方法来处理多种类型。

服务方法取决于您对域对象的建模方式。如果您有一个包含Pet的单个班级petType,您可以轻松地执行以下操作:

Collection<Owner> results = this.clinicService.findOwnerByPetType(type);

然后,该服务调用存储库方法findOwnerByPetType(type),该方法返回所有者列表