Spring MVC 3.1 без аннотаций?

Я начинаю новый проект с Spring 3.1 и внимательно изучил всю документацию и мнения на форуме о том, как использовать аннотацию @Controller.

Мне лично не нравится использовать аннотации для MVC; Я предпочитаю, чтобы все URL-адреса веб-приложения были доступны в одном месте, используя SimpleUrlHandlerMapping.

Кроме того, из многих предыдущих работ с использованием Spring 2.x я очень привык к иерархии BaseCommandController.

Я всегда любил Spring, потому что он расширяет возможности, но не ограничивает. Теперь я обнаружил, что Spring MVC заставляет меня помещать URL-адреса в источник Java, что означает (а) я не могу сопоставить контроллер с несколькими URL-адресами и (б) чтобы узнать, какие URL-адреса используются в веб-приложении, я должен сканировать через разные исходные файлы Java, что я считаю нецелесообразным.

Каков рекомендуемый способ объединения @Controller с SimpleUrlHandlerMapping, пожалуйста?


Обновлять:

Привет, Дэйв, вы говорите, что можете сопоставлять несколько URL-адресов, подобных этому (изменено из petclini.web.ClinicController)?

@RequestMapping({"/vets", "/another"})
public ModelMap vetsHandler() {

Если это работает, то хорошо.

Однако мой вопрос остается в силе: если мне не нужны URL-адреса в моем источнике Java, как лучше всего сопоставить их с классами @Controller?

С уважением,


person Stewart    schedule 03.04.2012    source источник
comment
Я не знаю, что вы больше не можете сопоставлять несколько URL-адресов, у вас есть ссылка на документ для этого?   -  person Dave Newton    schedule 03.04.2012
comment
Отвечайте на комментарии, используя @(имя пользователя) в качестве комментария. Если вы зададите кому-то вопрос, встроенный в исходный вопрос, он может никогда его не увидеть. Я спрашиваю вас, изменилось ли оно, и если да, дайте ссылку на документацию. Лично я бы использовал что-то вроде это для маршрутизации; Я свой накатил, но видимо и кто-то другой тоже.   -  person Dave Newton    schedule 03.04.2012
comment
@Dave Newton: спасибо за ссылку, я посмотрю на это. (Кстати: я ответил на вопрос, чтобы отформатировать код)   -  person Stewart    schedule 03.04.2012
comment
Я понимаю необходимость форматирования, но если его никто не видит, неважно, насколько красиво оно отформатировано :) Кроме того, для чего-то такого короткого, вероятно, достаточно @RequestMapping({"/url1", "/url2"}).   -  person Dave Newton    schedule 03.04.2012
comment
Я хорошо поиграл с этой библиотекой. Сначала я подумал, что это отличная идея, вплоть до того, что я хотел предложить вам сделать ответ в формате, но, к сожалению, он, похоже, неправильно обрабатывает уровень метода @ModelAttribute, и поэтому мои справочные данные не заполняются. Стыд.   -  person Stewart    schedule 05.04.2012
comment
Стюард, проблема @ModelAttribute была исправлена: github.com/resthub/springmvc-router/ вопросы/6 . У меня все еще есть небольшая проблема ( github.com/resthub/springmvc-router/issues/14 ), но мне это не мешает. Обратите внимание, что я отправил запрос на вытягивание, чтобы разрешить маршрутизацию на основе параметров строки запроса ( github.com/bclozel /springmvc-router/pull/1 ), если вам нужна эта функция.   -  person electrotype    schedule 05.07.2012


Ответы (1)


Вот простая настройка для поддержки аннотированных и неаннотированных контроллеров.

Конфигурация сервлета диспетчера xml

<mvc:annotation-driven/>
<bean id="testController" class="com.test.web.TestController"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
      <value>
      /test=testController
      </value>
  </property>
  <property name="order" value="0"/>
</bean>

Простой контроллер с сопоставлением URL

public class TestController implements Controller {

    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        PrintWriter responseWriter = response.getWriter();
        responseWriter.write("test");
        responseWriter.flush();
        responseWriter.close();
        return null;
    }
}

Контроллер для mvc annotation-config

@Controller
@RequestMapping("/home")
public class HomeController {

    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public String dashboard(Model model, HttpServletRequest request) {
        return "home";
    }
}

Если вы хотите использовать свои собственные обработчики для аннотации @Controller. вы, вероятно, можете заглянуть в ClassPathBeanDefinitionScanner и DefaultAnnotationHandlerMapping.determineUrlsForHandlerMethods.

person skipy    schedule 05.07.2012
comment
Это выглядит правильно, и я думаю, что это один из способов, но я специально спрашивал о @Controller с SimpleUrlHandlerMapping, а не об интерфейсе контроллера, тем более что многие реализации этого интерфейса теперь устарели. - person Stewart; 05.07.2012
comment
Звучит как план создания подкласса: grepcode.com/file/repo1.maven.org/maven2/org.springframework/ Возможно, это то, что пытался сделать springmvc-router? - person Stewart; 05.07.2012