Могу ли я иметь одинаковое значение сопоставления с другим параметром в другом контроллере Spring? - PullRequest
4 голосов
/ 28 сентября 2011

Есть ли способ сделать что-то вроде этого: у меня есть форма, используемая для навигации:

<form action="mapping.do">

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

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

</form>

Класс PageController слишком большой и имеет слишком много зависимостей, мне нужно добавить другое менювариант, но не хочу добавлять к сложности.Я хотел бы иметь метод в другом контроллере, который обрабатывает новый параметр меню.

Попытка этого дает мне ошибку конфигурации Spring (Там уже обработчик сопоставлен):

@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";
    }

}

Ответы [ 3 ]

2 голосов
/ 28 сентября 2011

Я столкнулся с подобной ситуацией, поэтому мы создали следующий обработчик по умолчанию для этих типов методов:

@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 голос
/ 28 января 2013

Вы можете использовать параметр для каждого метода отображения.См. Мой вопрос и ответ:

  • @ RequestMapping с «params» на одном и том же URL в разных классах вызывает «IllegalStateException: невозможно сопоставить обработчик» в JUnit с SpringJUnit4ClassRunner
  • https://stackoverflow.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"/>
1 голос
/ 28 сентября 2011

Не напрямую, но:

  • Вы можете включить этот параметр в URL: value=/mapping/parameter/ и /mapping/otherparameter.(Расширение .do немного устарело)

  • Используйте предложение if - передайте два параметра с помощью @RequestParam("param", required=false) String param и используйте if (param != null) viewPage();

  • У вас может быть один метод, который принимает HttpServletRequest и проверяет, существует ли параметр с данным именем (используя request.getParameter("foo") != null)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...