【问题标题】:Spring servlet mapping - no css or jsp!Spring servlet 映射 - 没有 css 或 jsp!
【发布时间】:2011-01-18 22:13:54
【问题描述】:

我阅读了this 的帖子,这与我的问题类似,但没有解决问题:

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

<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>

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

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

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

【问题讨论】:

    标签: java spring servlets url-mapping


    【解决方案1】:

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

    /channel1/{id}/{random_text}
    

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

    【讨论】:

    • 是的,我试过了(只是又试了一次),但在访问 url 时出现“未找到映射...”错误...
    • 那么要么测试/部署不正确,要么映射中有更多的线圈和/或获得优先权。
    • 我的映射与我在问题中发布的完全一样。是否有必要的特定顺序?此外,我不确定部署是否有问题,因为除了我需要的新网址之外,其他所有内容都已正确映射。
    • 也是/url-pattern?这基本上意味着“覆盖一切”。从 Spring 调度程序中删除它。
    • 是的,我只添加了“/”映射作为测试。这是我可以正确映射 url 的唯一方法(副作用是无法访问我的 css、jsp...文件)。我确实尝试过“/channel1/*”(没有“/”映射),但它没有用。我不知道为什么..
    【解决方案2】:

    为 REST 格式做事的最佳做法是将需要由 DispatcherServlet 处理的所有 URL 保存在单独的命名空间中,例如 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>
    

    【讨论】:

    • 以 /app/ 开头的应用程序 URL 也很常见。
    【解决方案3】:

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-02-05
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 2018-05-25
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多