URL 模式 servlet 映射

Posted

技术标签:

【中文标题】URL 模式 servlet 映射【英文标题】:URL pattern servlet mapping 【发布时间】:2017-03-27 01:08:05 【问题描述】:

我使用 Spring MVC 创建了 hello world 示例,但是在 servlet URL 映射中有一点我不明白,我在 web.xml 中做了以下操作:

<servlet>
    <servlet-name>HelloWeb</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>HelloWeb</servlet-name>
    <url-pattern>/test/*</url-pattern>
</servlet-mapping>

现在如果我想调用以下控制器:

@Controller
@RequestMapping("/hello")
public class HelloWorld 
    @RequestMapping(method = RequestMethod.GET)
    public String printWelcome(ModelMap model)
        model.addAttribute("message","hello world");
        return "index";
    

它将使用以下链接工作: http://localhost:8080/test/hello

但是当我将 servlet url-pattern 更改为“/*”并尝试: http://localhost:8080/hello

它不起作用,它不应该与我的 servlet 匹配吗?因为 * 匹配所有内容

【问题讨论】:

【参考方案1】:

当您使用“/*”注册 servlet 时,它将覆盖所有 servlet 映射(如果有)。因此应该避免。这也会覆盖默认的 servlet 映射,因此所有默认的 url 处理也会被覆盖,因此任何特定的 url 匹配都会失败。在您的情况下,它是 /hello。

对于您的案例,最初您使用 /test/* 注册,这会将您的所有 URL 注册到 /test,因此它们被识别。

【讨论】:

【参考方案2】:

它不适用于/*,因为您还没有为该模式注册/创建控制器。

它适用于http://localhost:8080/hello,因为你有控制器@RequestMapping("/hello")

只需将 RequestMapping 更改为 @RequestMapping("/") for url-pattern /*

【讨论】:

实际上这个工作“localhost:8080/test/hello”不是你提到的那个。

以上是关于URL 模式 servlet 映射的主要内容,如果未能解决你的问题,请参考以下文章

servlet 映射 url 模式上的双通配符 (*) 是啥意思?

在 Spring MVC 的 servlet 映射中,如何映射 url 模式目录的根目录?

带有 url 模式“/ *”的 servlet 映射中的 ***Error

Java Servlet URL 映射

过滤器映射 URL 模式 *.action 不起作用 struts2

java servlet url patterns 路径匹配