Использование ControllerClassNameHandlerMapping с @Controller и расширение AbstractController - PullRequest
1 голос
/ 18 марта 2010

На самом деле я думал, что пытаюсь сделать что-то действительно простое. ControllerClassNameHandlerMapping великолепно звучал для создания небольшого весеннего веб-приложения, использующего очень скудную конфигурацию. Просто аннотируйте контроллер с помощью @Controller, сделайте так, чтобы он расширял AbstractController, и конфигурации не нужно больше, чем эта

<context:component-scan base-package="test.mypackage.controller" />
<bean id="urlMapping" class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

чтобы разрешить мои запросы и сопоставить их с моими контроллерами. Я сопоставил сервлет с "* .spring" и позвонил

<approot>/hello.spring

Все, что я когда-либо получаю, это ошибка, утверждающая, что сопоставление не найдено. Однако, если я расширяю MultiActionController и делаю что-то вроде

<approot>/hello/hello.spring

это работает. Что меня как-то раздражает, так как я подумал бы, что если это работает, то почему я не попробовал в первый раз? У кого-нибудь есть идеи? Два контроллера, которые я использовал, выглядели так:

@Controller
public class HelloController extends AbstractController {
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
    ModelAndView modelAndView = new ModelAndView("hello");
    modelAndView.addObject("message", "Hello World!");
    return modelAndView;
    }
}

и

@Controller
public class HelloController extends MultiActionController {
public ModelAndView hello(HttpServletRequest request, HttpServletResponse response) throws Exception {
    ModelAndView modelAndView = new ModelAndView("hello");
    modelAndView.addObject("message", "Hello World!");
    return modelAndView;
    }
}

Ответы [ 2 ]

2 голосов
/ 19 марта 2010

Начиная с версии 3.0, класс AbstractController и его виды (SimpleFormController, AbstractFormController и т. Д.) Устарели. Так что просто не используйте их больше. Модель @MVC на основе аннотаций гораздо более мощная и гибкая.

2 голосов
/ 18 марта 2010

Не следует использовать @Controller одновременно с расширением от AbstractController. Делай одно или другое.

Также следует использовать @Controller вместе с аннотацией @RequestMapping.

Если вы хотите бережливую конфигурацию, просто поместите это в ваш конфигурационный файл:

<context:component-scan base-package="test.mypackage.controller" />

И используйте этот класс:

@Controller
public class HelloController {

   @RequestMapping("/hello")
   public String handle(ModelMap model) {
      model.addAttribute("message", "Hello World!");
      return "hello";
   }
}

На самом деле, вы, вероятно, можете вообще не указывать возвращаемое значение, Spring должен вывести имя представления "привет" из пути запроса, но я оставил это для ясности.

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