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

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

4 голосов
/ 03 апреля 2012

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

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

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

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

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


Обновление:

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

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

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

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

С уважением,

1 Ответ

3 голосов
/ 05 июля 2012

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

Конфигурация сервлет-диспетчера 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.

...