我可以使用不同的参数在不同的Spring控制器中具有相同的映射值吗?

问题描述:

有什么办法来完成这样的事情: 我已经用于导航的一种形式:我可以使用不同的参数在不同的Spring控制器中具有相同的映射值吗?

<form action="mapping.do"> 

    <input type="submit" value="menuOption01" /> 

    <input type="submit" value="menuOption02" /> 

</form> 

PageController类是太大,有太多的依赖关系,我需要添加另一个菜单选项,但不要”不想增加复杂性。我想在另一个处理新菜单选项的控制器中有一个方法。

尝试这给了我一个春天configutation错误(已经有处理程序映射):

@Controller 
@SessionAttributes(types = { Entity.class }) 
class PageController { 

    @RequestMapping(params = "menuOption01", value = "mapping.do") 
    public String viewPage(@ModelAttribute final Entity entity) { 
     ... 
     return "view"; 
    } 

    ... // another 5000 lines of code 

} 


@Controller 
class OtherController { 

    @RequestMapping(params = "menuOption02", value = "mapping.do") 
    public String viewOtherPage(@ModelAttribute final Entity entity) { 
     ... 
     return "otherview"; 
    } 

} 

我遇到了类似的情况,所以我们做了以下默认处理这些类型的方法:

@RequestMapping(method = RequestMethod.POST, params = SIDE_TAB, value = "sideMenuController.xhtml") 
public ModelAndView changeSelectedTab(@RequestParam(SIDE_TAB) String sideTab) { 
    return new ModelAndView("redirect:/location/" + Utils.toCamelCase(sideTab) + ".xhtml"); 
} 

我们的页面,然后有以下几点:

<input type='submit' name='side-tab' value='$value' /> 

当然,这意味着我们必须有自己的文件命名标准,但那是很容易,以确保发生(即“事件历史”将转到eventHistory.xhtml,“创建新实体”将转到“createNewEntity.xhtml”等....)

+1

显然$ value需要被替换为每个元素。 – Scott

不是直接的,而是:

  • 您可以在URL中包含的是PARAM:value=/mapping/parameter//mapping/otherparameter。 (该.do扩展是一个有点过时BTW)

  • 使用的if条款 - 通过两个参数与@RequestParam("param", required=false) String param,并使用if (param != null) viewPage();

  • 你可以有一个方法,它HttpServletRequest并检查是否参数与给定名称存在(使用request.getParameter("foo") != null

+0

谢谢,几件事情...春天2.4&我不能改变映射值。我试图避免将更多的方法添加到已经很大的控制器中。 – blank

+0

然后第二个选项? – Bozho

+0

我不明白第二个选项 - 我的问题在那一刻是春天抱怨在单独的控制器中有两个映射值...我的根本问题是设计错误的菜单系统,它使用参数和表单映射到不同的视图。 – blank

您可以使用每个方法的参数映射。见我的问题和答案:

  • 用在不同类别相同的URL “PARAMS” @RequestMapping导致 “IllegalStateException异常:无法映射处理程序” 中的JUnit与基于SpringJUnit4ClassRunner
  • https://*.com/a/14563228/173149

只要使用这些类:

 
    <bean name="handlerMapping" 
     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/> 
    <bean name="handlerAdapter" 
     class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>