【问题标题】:Spring MVC 3.1 without annotations?没有注释的 Spring MVC 3.1?
【发布时间】:2012-04-03 10:35:30
【问题描述】:

我正在使用 Spring 3.1 开始一个新项目,并且已经深入了解了有关如何使用 @Controller 注释的所有文档和论坛意见。

我个人不喜欢为 MVC 使用注解;我更喜欢使用 SimpleUrlHandlerMapping 将 web 应用程序的所有 URL 放在一个地方。

此外,从之前使用 Spring 2.x 的许多工作中,我非常习惯于 BaseCommandController 层次结构。

我一直很喜欢 Spring,因为它赋予了力量而不受限制。现在我发现 Spring MVC 迫使我将 URL 放入 java 源代码中,这意味着(a)我无法将控制器映射到多个 URL,并且(b)要发现 webapp 中正在使用哪些 URL,我必须扫描通过不同的java源文件,我觉得不切实际。

请问@Controller 与 SimpleUrlHandlerMapping 结合的推荐方式是什么?


更新:

嗨,Dave,您是说可以像这样映射多个 URL(从 petclini.web.ClinicController 更改)?

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

如果这样就很好了。

我的问题仍然存在: 如果我不想在我的 java 源代码中使用 URL,如何最好地将它们与 @Controller 类映射?

问候,

【问题讨论】:

  • 我不知道你不能再映射多个 url,你有文档参考吗?
  • 使用@(用户名)作为评论回复 cmets - 如果您向某人询问嵌入在您原始问题中的问题,他们可能永远不会看到它。我问是否改变了,如果改变了,提供一个文档链接。就我个人而言,我会使用this 之类的东西进行路由;我推出了自己的,但显然其他人也这样做了。
  • @Dave Newton:谢谢你的链接,我会调查的。 (顺便说一句:我在问题中回答了,所以我可以格式化代码)
  • 我理解格式化的必要性,但是如果没有人看到它,它的格式化有多好也没关系:) 此外,对于这么短的东西,@RequestMapping({"/url1", "/url2"}) 可能就足够了。
  • 我现在玩得很好。起初,我认为这是一个好主意,想要提示您将其设为格式答案,但不幸的是,它似乎没有正确处理方法级别 @ModelAttribute,因此我的参考数据没有被填充。耻辱。

标签: spring spring-mvc annotations spring-annotations


【解决方案1】:

这是一个支持注释和非注释控制器的简单设置。

Dispatcher servlet 配置 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 注解使用你自己的处理程序。您可能可以查看ClassPathBeanDefinitionScannerDefaultAnnotationHandlerMapping.determineUrlsForHandlerMethods

【讨论】:

  • 这看起来有效,我想这是一种可行的方法,但我特意询问了 @Controller 与 SimpleUrlHandlerMapping,而不是 Controller 接口 - 特别是现在已弃用此接口的许多实现。
  • 听起来像是子类化的计划:grepcode.com/file/repo1.maven.org/maven2/org.springframework/… 也许这就是 springmvc-router 试图做的?
猜你喜欢
  • 2010-10-04
  • 1970-01-01
  • 2014-11-18
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 2016-12-04
  • 1970-01-01
相关资源
最近更新 更多