将请求URL与web.xml中的正确URL模式匹配

时间:2014-05-28 00:27:46

标签: java java-ee tomcat servlets web.xml

我正在尝试学习如何将请求URL映射到部署描述符中的url模式。我得到了所有答案,但我不确定思维过程是否正确。 请帮我确认或更改推理。

<servlet>  
        <servlet-name>One</servlet-name>  
        <servlet-class>foo.DeployTestOne</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>One</servlet-name>  
        <url-pattern> *.do </url-pattern>  
    </servlet-mapping>  
    <servlet>  
        <servlet-name>Two</servlet-name>  
        <servlet-class>foo.DeployTestTwo</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>Two</servlet-name>  
        <url-pattern> /fooStuff/bar </url-pattern>  
    </servlet-mapping>  
    <servlet>  
        <servlet-name>Three</servlet-name>  
        <servlet-class>foo.DeployTestThree</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>Three</servlet-name>  
        <url-pattern> /fooStuff/* </url-pattern>  
    </servlet-mapping>  

1)http://localhost:8080/MapTest/blue.do 容器选择:DeployTestOne(与* .do扩展模式匹配)

完全匹配检查:DD中是否存在一个完全= /MapTest/blue.do的URL模式?没有。 目录匹配检查:DD目录/ MapTest中是否有任何URL模式?没有。 扩展匹配:DD中是否有扩展名为.do的文件的模式?是的! 选择DeployTestOne!

问题 - 在进行完全匹配检查时,容器是否在DD中查找blue.do还是在寻找/MapTest/blue.do?

2)http://localhost:8080/MapTest/fooStuff/bar/blue.do 容器选择:DeployTestThree(与/ fooStuff / *目录模式匹配)

完全匹配检查:DD中是否存在一个完全= /MapTest/fooStuff/bar/blue.do的URL模式?没有。 目录匹配检查:DD目录/ MapTest / fooStuff / bar中是否有任何URL模式?是的! 转到最长pat的url模式,即/ fooStuff / *

问题 - 在进行目录匹配检查时,Container是否会查找/ MapTest / fooStuff / bar /或/ fooStuff / bar?

1 个答案:

答案 0 :(得分:3)

网址格式规范:

1 - 以“/”字符开头并以“/ *”后缀结尾的字符串用于路径映射。

2 - 以'*。'前缀开头的字符串用作扩展名映射。

3 - 仅包含'/'字符的字符串表示&#34;默认&#34;应用程序的servlet。在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为空。

4 - 所有其他字符串仅用于完全匹配。

参考:Java Servlet Specification