1

我阅读了这篇文章,这与我的问题类似,但没有解决问题:

基本上,我曾经在我的 中有以下 servlet 映射web.xml

<servlet-mapping>
  <servlet-name>myServlet</servlet-name>
  <url-pattern>/index.html</url-pattern>
  <url-pattern>/channel1</url-pattern>
  <url-pattern>/channel2</url-pattern>
</servlet-mapping>

在我需要映射以下网址之前,这非常有效:

/channel1/{id}/{random_text}

其中 {id} 是我的对象的数字 ID 值,而 {random_text} 仅用于“友好的 url”。我设法使用@RequestMapping我的控制器中的 以及@PathVariable从 URL 中提取变量来使其工作。

但是,我设法使新 URL 成功映射的唯一方法是添加

<url-pattern>/</url-pattern>

在我web.xml的 servlet 映射的底部。但是,当我这样做时,我的所有其他页面(/channel1, /channel2)都会显示而无法访问静态内容(css、jsp 等);我得到一个No mapping found for HTTP request with URI静态文件。我按照我发布的链接中的建议尝试了各种映射组合,但没有任何效果。任何帮助都会很棒!!!

更新:我在控制器中的 RequestMapping 如下所示(如果它有助于解决问题..):

@RequestMapping(value = { "/channel1/{id}", "/channel1/{id}/{text}" })
4

3 回答 3

3

在我需要映射以下网址之前,这非常有效:

/channel1/{id}/{random_text}

这将由url-patternof覆盖/channel1/*。注意尾随/*. url-patternof不接受后面的 pathinfo 中的/channel1任何内容,它只接受确切的 URL 和可选的查询参数。

于 2010-02-19T19:18:05.617 回答
3

为 rest 格式做事的最佳实践是将所有需要由 处理的 URL 保留DispatcherServlet在一个单独的命名空间中,例如web,以便直接提供静态资源,并且所有控制器 url 将通过 Dispatcher 传递,这里是一个例子。。

<servlet>
    <servlet-name>web</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>namespace</param-name>
        <param-value>web</param-value>
    </init-param>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/web-servlet.xml</param-value>
    </init-param>

    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>web</servlet-name>
    <url-pattern>/web/*</url-pattern>
</servlet-mapping>
于 2010-02-19T19:19:12.900 回答
0

我意识到问题出在哪里(可能是我之前没有详细说明控制器中的@RequestMapping 设置的错):

在我的web.xml我有一个 url 模式:

<url-pattern>/channel/*</url-pattern>

此外,在我的控制器中,我使用了以下映射:

@RequestMapping(value = { "/channel1/{id}", "/channel1/{id}/{text}" })

问题是我在复制这/channel1部分。我随机(幸运地)看到这篇解释这个问题的帖子。

长话短说,当我将控制器中的映射更改为以下内容时,它可以完美运行:

@RequestMapping(value = { "/{id}", "/{id}/{text}" })
于 2010-02-19T21:05:37.497 回答