Spring MVC中的@RequestMapping注释

时间:2012-01-25 05:48:58

标签: spring-mvc request-mapping

我有一个控制器,请求映射为@RequestMapping("/**") 这是什么意思?

如果我想从上面的映射中排除某些url模式,我该怎么做?

有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:15)

通过使用正则表达式“负向前瞻”构造,我能够实现“网址排除”或“不匹配网址”。

我希望我的处理程序能够处理静态资源以外的所有内容,即CSS / Images / JS和错误页面。

为了防止出现错误页面,即resourceNotFound,你需要

  1. 编辑web.xml / web-app / error-page,在错误网址前加上/ error /
  2. 编辑WEB-INF / spring / webmvc-config.xml / beans / mvc:view-controller / @ path handel your new mappings
  3. 编辑WEB-INF / spring / webmvc-config.xml / beans / bean [@class = ** SimpleMappingExceptionResolver]将所有异常映射到错误/...
  4. 在您的控制器中使用以下

    @Controller
    @RequestMapping(value = { "/" })
    public class CmsFrontendController {
    
      @RequestMapping(value = { "/" }, headers = "Accept=text/html")
      public String index(Model ui) {
          return addMenu(ui, "/");
      }
    
      @RequestMapping(value = { "{path:(?!resources|error).*$}", "{path:(?!resources|error).*$}/**" }, headers = "Accept=text/html")
      public String index(Model ui, @PathVariable(value = "path")String path) {
          try {
              path = (String) request.getAttribute(
                      HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
              return addMenu(ui, path);
          } catch (Exception e) {
              log.error("Failed to render the page. {}", StackTraceUtil.getStackTrace(e));
              return "error/general";
          }
      }
    }
    

答案 1 :(得分:7)

您的网址将拦截所有与'/ **'匹配的请求。根据您定义的位置,我不确定您为什么要这样做。在类级别,这应该定义基本路径,而在方法级别,它应该被细化为特定的函数。

如果您想要排除某个模式,您可以定义另一个控制器,该控制器以更高的优先级排序给控制器,指定'/ **'

以下是来自泉源的两个很好的参考资料:

  1. http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html

  2. http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html