servlet的url-pattern匹配规则,包括/和/*区别

9. servlet的url-pattern匹配规则

9.1 首先声明混淆的规则

① servlet容器中的匹配规则既不是简单的通配,也不是正则表达式,而是特定的规则

② Servlet 2.5开始,一个servlet可以使用多个url-pattern规则

③ 当servlet容器接收到一个url请求后,容器会用url减去当前应用的上下文路径,以剩余的字符串作为servlet映射

④ url-pattern映射匹配过程是有优先顺序的

⑤ 而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了

⑥ 匹配url实质是找到这个servlet,而servlet一般使用的都是优先级最高的精准匹配

⑦ 如果一个请求没有被任何servlet容器拦截,那么它就不需要交给servlet处理,直接可以访问资源

9.2 匹配规则

①精确路径匹配:指定一个具体处理方法的请求路径,优先级最高

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/user/users.html</url-pattern>
    <url-pattern>/index.html</url-pattern>
    <url-pattern>/user/addUser.action</url-pattern>
</servlet-mapping>

②路径匹配:以“/”字符开头,并以“/*”结尾的字符串用于路径匹配,/*就属于路径匹配特殊的一种。优先级第二

【注意】
1.在正则表达式里面, /*代表他前面的字符/有一个或者多个

2.在写切入点表达式的时候,.*代表当前层级下的任意对象

3.url-pattern里面,*就代表任意内容

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/user/*</url-pattern>
</servlet-mapping>

③扩展名匹配:以“*.”开头的字符串被用于扩展名匹配,优先级第三

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>*.jsp</url-pattern>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>

④缺省匹配:以上都找不到servlet,就用默认的servlet,配置为/,优先级最低

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

9.3 注意事项

  1. 路径匹配和扩展名匹配无法同时设置,如/user/*.action是非法的
  2. "/“和”/"含义并不相同 :
    “/
    ” 属于路径匹配,并且可以匹配所有request,由于路径匹配的优先级仅次于精确匹配,所以“/”会覆盖所有的扩展名匹配,很多404错误均由此引起,所以这是一种特别恶劣的匹配模式,一般只用于filter的url-pattern
    “/”是servlet中缺省模式,且该模式有且仅有一个实例,优先级最低,不会覆盖其他任何url-pattern,只是会替换servlet容器的内建default servlet ,该模式同样会匹配所有request。
    配置“/”后,一种可能的现象是myServlet会拦截诸如http://localhost:8080/appDemo/user/addUser.action、http://localhost:8080/appDemo/user/updateUser的格式的请求,但是并不会拦截http://localhost:8080/appDemo/user/users.jsp、http://localhost:8080/appDemo/index.jsp,这是因为servlet容器有内置的“
    .jsp”匹配器,而扩展名匹配的优先级高于缺省匹配,所以才会有上述现象。

9.4 tomcat默认servlet配置

Tomcat在conf\web.xml文件中配置了默认的Servlet,主要是给jsp后缀结尾的文件即扩展名匹配规则,配置代码如下。

<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>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
<servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
 </servlet>
<servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
</servlet-mapping>
    <!-- The mappings for the JSP servlet -->
<servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
        <url-pattern>*.jspx</url-pattern>
</servlet-mapping>

``
“/* ”和“/ ”均会拦截静态资源的加载,需要特别注意,其中"/* “会拦截jsp文件的加载,因为路径匹配优先级大于.jsp后缀匹配,也就是说默认的jsp扩展名匹配就会失效,失效会怎么样?就不会拦截。但是,我配置的/*代表路径匹配,匹配的是根径路下的所有请求,也就是这个servlet会拦截所有请求,包括jsp结尾的请求。”/ "则不会拦截jsp文件请求,不是他不会拦截,而是有优先级高于他的扩展名匹配先拦截了。但是缺省匹配能够拦截.html,.css等静态资源,因为没有给这些静态资源配置扩展名规则。

注意这里配置的是servlet,也就是说,只要拦截到了,就执行servlet的service方法进行处理。但是在springmvc里面,通过一个dispacherServlet拦截所有请求,然后匹配到具体的方法上。方法映射一般都是写的精确匹配,然后把请求交给他来执行。DispacherServlet只是负责拦截请求,如果没有找到响应的映射,如果配置了处理默认请求的servlet控制器就把请求交给它处理,它也没有响应的映射就报404.这个默认控制器它会先判断后缀是否符合我的映射规则(映射规则要么是路径匹配要么是扩展名匹配),如果匹配上了就会根据传来的路径来找对应的资源,找到就读取返回给前端,没找到就快乐的404

<mvc:default-servlet-handler/>

JspServlet类是tamcat为当前网站所有以jsp结尾的请求配置的默认servlet,它请求可以被服务器拦截到,然后根据传来的具体路径找到对应的jsp返回,就是一个专门为访问jsp请求的默认控制器。在springMVC中,还要专门为访问网站静态资源的请求配置servlet进行处理,配置如下,可以直接使用默认请求控制器处理。

<mvc:resources mapping="/css/**" location="/css/"/> 
<mvc:resources mapping="/js/**" location="/js/"/>
<mvc:resources mapping="/images/**" location="/images/"/>

也可以在原生的web.xml中配置,把所有默认请求都交给tomcat的org.apache.catalina.servlets.DefaultServlet来处理,只需要做如下配置:

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

猜你喜欢

转载自blog.csdn.net/superyayaya/article/details/93397812