zoukankan      html  css  js  c++  java
  • Servlet路径映射

    Serlvlet路径映射

    当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url。

    容器默认请求的是一个Servlet,所以不会直接根据路径从文件夹中查找文件,而是先从web.xml中根据<url-pattern>查找对应的Servlet文件,匹配成功后就停止继续匹配;如果没有找到,才会从文件夹中找。都没有,则返回404。

    匹配规则

    url-pattern匹配规则只有以下五种(*为通配符):
    ■ 以“/”字符开头,并以“/*”结尾的字符串用于路径映射

    <url-pattern>/user/*</url-pattern>

      http://localhost:5555/ myapp /user      (也可以匹配到,*通配符相当于空)

      http://localhost:5555/ myapp /user/addUser.action

      http://localhost:5555/ myapp /user/updateUser.action

    ■ 以“*.”开头的字符串被用于扩展名映射

    <url-pattern>*do</url-pattern>

      http://localhost:5555/myapp/item/order.do

      http://localhost:5555/myapp/user/test.do

    ■ 空字符串("")是用于指定精确映射应用程序 context root 的 URL 模式,比如从 http://host:port/<contextroot>/ 来的请求。在这种情况下路径信息是“/”,servlet 路径和 context 路径是一个空的字符串("")。
    ■ 字符串中仅有“/”字符时,表示应用容器提供的默认servlet。在这种情况下 servlet 路径是请求 URI 去掉 context 路径且路径信息为 null。

    ■ 其他类型的字符串都属于精确匹配。url必须与<url-pattern>中的配置完全匹配。

    <url-pattern>/user</url-pattern> <!—没有/*结尾,属于精确匹配规则->

    匹配顺序(匹配优先级):

    精确匹配>路径匹配(长路径>短路径)>扩展名匹配>default Servlet(/)

    Tomcat按照上述顺序依次将请求url和web.xml中的url-pattern进行匹配。

    注意:

    1.各匹配规则不能组合使用,以下同时设置路径匹配和扩展名匹配都不正确:

      <url-pattern>/kata/*.jsp</url-pattern>

      <url-pattern>/*.jsp</url-pattern>

      <url-pattern>he*.jsp</url-pattern>

      <url-pattern>/user/*.action</url-pattern>

    2. “/*”属于路径匹配,路径就是/,可以匹配所有request。如果存在和请求对应的.jsp/.html文件,依然将请求发送给对应的servlet,导致404错误。url-pattern一般只用于filter

    静态资源处理

    tomcat在${tomcat_home}/conf/web.xml中配置了default servlet,对静态资源的请求容器会返回相应的资源文件:

    <servlet> 
            <servlet-name>default</servlet-name> 
            <servlet-class> org.apache.catalina.servlets.DefaultServlet 
            </servlet-class> 
            <init-param> 
                <param-name>debug</param-name> 
                <param-value>0</param-value>  
            </init-param> 
            <init-param> 
                <param-name>listings</param-name> 
                <param-value>true</param-value> 
            </init-param> 
            <load-on-startup>1</load-on-startup> 
        </servlet> 
    
    ... 
    
    
        <servlet-mapping> 
            <servlet-name>default</servlet-name> 
            <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    如果开发者在web应用的web.xml中使用了<url-pattern>/</url-pattern>,会优先于tomcat内置的default servlet生效。该url-pattern匹配所有request,但优先级最低,用于处理其他Servlet都不处理的请求。即使存在和请求对应的静态资源(.jsp除外),服务器仍然不会返回该静态资源,而是将该请求转给对应的Serlvet处理。

    tomcat除了配置了default serlvlet,还内置了专门处理url-pattern为*.jspx和*.jsp的servlet,所以对.jsp的请求会返回对应的文件,除非出现优先级更高的url-pattern。

    所以,为了使用SpringMVC而在web.xml中配置<url-pattern>/</url-pattern>,会导致静态资源的404错误。可以用如下方式解决:

    1.为静态资源指定路径匹配或扩展匹配以重新利用tomcat的default servlet返回静态资源

    <!--使用路径匹配规则为整个静态资源目录映射-->
    <servlet-mapping> 
        <servlet-name>default</servlet-name> 
        <url-pattern>/static/*</url-pattern> 
    </servlet-mapping> 
    
    <!--或者使用扩展名匹配规则-->
    <servlet-mapping> 
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>   
    </servlet-mapping>  
    <servlet-mapping>     
        <servlet-name>default</servlet-name>  
        <url-pattern>*.js</url-pattern>  
    </servlet-mapping>  
    <servlet-mapping>      
        <servlet-name>default</servlet-name>     
        <url-pattern>*.css</url-pattern>    
    </servlet-mapping>

    这种方法不能访问WEB-INF目录下的静态资源,静态资源必须放在web应用的根目录下和WEB-INF目录平级,如上述的static目录。

    2.使用spring 3.0.4的新特性,在springmvc.xml中添加<mvc:resource>元素:

    <mvc:resources location="/static/js/" mapping="/js/**" />
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

    这种方式可以引用WEB-INF目录下的静态资源。

    3.在Springmvc.xml中配置<mvc:default-serlvet-handler>使用容器的default servlet,该标签只对匹配规则为"/"的DispatcherServlet才生效。Springmvc会将请求转发给default servlet,多一个流程,性能不如方法1。

    <mvc:default-servlet-handler default-servlet-name = "default_servlet_name" />  
    以上皆为个人理解,如有错误之处,欢迎留言指正。
  • 相关阅读:
    Webpack 入门学习
    如何把百度地图引入自己的网页中
    哗啦啦Python之路 Day 1 数据类型,运算符和表达式
    哗啦啦python之路 Day 2 程序控制结构
    找个轻量级的Log库还挺难
    W32.Downadup.autorun病毒的清除
    一个VxWorks源代码网站
    VisualSVNServer无法卸载也无法安装,报告不是有效的MOF文件(0x8004401e)错误
    如何用Visual Studio 2005编译Wireshark的插件
    TAU G2中的BitString和OctetString
  • 原文地址:https://www.cnblogs.com/kevin2chen/p/6541264.html
Copyright © 2011-2022 走看看