【问题标题】:Spring MVC url-pattern syntaxSpring MVC url-pattern 语法
【发布时间】:2016-03-22 20:43:09
【问题描述】:

尝试向现有 Spring 3.11 MVC 应用程序添加一个 RESTful Web 服务调用,但该应用程序在 web.xml 中有一个用于 spring 的 url 映射,如下所示:

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

所以基本上一切都需要以.html结尾

我希望我的网络服务不必这样做 - 理想情况下,为我的网络服务使用唯一的上下文/子文件夹,例如 /restful。

但我不确定如何让它工作......

如果我的控制器是这样的:

@ResponseBody
    @RequestMapping(value="restful/test/{test}",method = RequestMethod.GET)
    public String test(@PathVariable String test) 
    {   
        return "OK"+test;
    }

我想通过以下方式访问它:localhost/blah/restful/test/text(任何地方都没有 .html,blah 是应用程序上下文)我应该如何处理 web.xml 中的 url-pattern - 没有干扰应用中已经存在的任何内容?

当我添加另一个这样的 url 模式时:

<servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/restful/*</url-pattern>
    </servlet-mapping>

然后尝试访问 localhost/blah/restful/test/text,我得到一个 404 错误。

servlet 的 web-xml 的另一部分如下所示:

<servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring-mvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

spring-mvc.xml 文件中的视图解析器是这样的:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
  </bean>

【问题讨论】:

  • 我意识到它实际上不再与尝试获取多个模式相关 - 它是模式语法本身或此应用配置中的其他内容导致问题
  • 这都是你的 web.xml 我认为你错过了其中的一些东西

标签: java spring spring-mvc


【解决方案1】:

假设您使用的是默认的 MVC 配置,给定

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/restful/*</url-pattern>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

@RequestMapping(value="restful/test/{test}", method = RequestMethod.GET)

您应该尝试访问localhost/blah/restful/restful/test/text(注意双重/restful)。

Spring MVC,在带有路径映射的请求中(参见Servlet Specification 第 12 章),尝试提取与容器匹配的路径段(在这种情况下为第一个 /restful),因此使用其余的 @987654327 @ 找到合适的处理程序(您的@Controller@RequestMapping 注释方法)。

我会简单地从您的@RequestMapping 中删除restful 部分。你会留下

@RequestMapping(value="/test/{test}", method = RequestMethod.GET)

它将能够处理对/localhost/blah/restful/test/text的请求。

【讨论】:

  • 是的,这就是问题所在!
【解决方案2】:

你试过吗?

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.html</url-pattern>
    <url-pattern>/restful/*</url-pattern>
</servlet-mapping>

或者只是像这样以不同的顺序(因为顺序很重要):

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/restful/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.html</url-pattern>
</servlet-mapping>

【讨论】:

  • 第一个例子的顺序也不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多