zoukankan      html  css  js  c++  java
  • 专题——web.xml 中 url-pattern

    一、映射什么?

    一个请求发送到 servlet 容器,servlet 容器会将当前请求的 url 路径减去 协议、端口号、contextPath,剩下 servletPath 就是用来做 url-pattern 映射的部分。

    如:

    http://localhost:8080/myservlet/DisplayHeader?method=show

    http: 传输协议

    localhost: 主机地址

    8080: 端口号

    myservlet: contextPath

    DisplayHeader: servletPath

    method=show: 参数

    所以要做 url-pattern 映射的部分就是 "DisplayHeader" 部分。

    二、映射

    1.映射规则

    (1)精确匹配:在url-pattern标签中指定一个具体的URL地址,其中不使用任何的通配符,例如:/target.jsp

    (2)模糊匹配:在url-pattern标签中指定一个带有通配符的URL地址

      <1>前缀匹配:URL地址前面确定,后面使用通配符,例如:/happy/*

      <2>后缀匹配:URL地址后面确定,前面使用通配符,例如:*.jsp,*.jpg

      <3>注意:不能在URL地址中间使用通配符,例如:/happy/*.jsp是不允许的

    (3)还有一种:"/"

    2.Wrapper :Wrapper 代表一个 Servlet,它负责管理一个 Servlet,包括的 Servlet 的装载、初始化、执行以及资源回收。

    (1)前缀匹配的 servlet 会被丢到 wildcardWrappers 中。

    (2)后缀匹配的 servlet 会被丢到 extensionWrappers 中。

    (3)"/" 会被丢到 defaultWrapper 中。

    (4)其他映射被丢到 exactWrappers 中。

    3.优先级的高低

    (1)精确匹配,使用 contextVersion 的 exactWrappers

    (2)前缀匹配,使用 contextVersion 的 wildcardWrappers

    (3)后缀匹配,使用contextVersion的extensionWrappers(tomcat 自动为我们加入处理 .jsp 和 .jspx 路径)

    (4)使用资源文件来处理servlet,使用contextVersion的welcomeResources属性,这个属性是个字符串数组(servletPath 如果什么都不输入的话,则会先来映射welcomeResources)

    (5)使用默认的servlet,使用contextVersion的defaultWrapper

    简单来说:

    精确匹配的优先级>前缀匹配(/*)>后缀匹配(*.action)> servletPath 为空(默认会访问 welcomeResources) > "/"。

    三、参考资料

    http://www.cnblogs.com/fangjian0423/p/servletContainer-tomcat-urlPattern.html

    四、常见问题

    1.为什么 servlet 的 url-pattern 要配置为 "/",而 filter 的 url-pattern 要配置为 "/*"?

    "/*" 的优先级较高,对于大部分 url 请求都能进行过滤,甚至我们访问 index.jsp 这样的文件都需要走这个映射。对于 servlet 而言,不是希望看到的。

    对于 filter 来说,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一个filter,所以它要拦截绝大部分请求,然后由每个匹配的filter进行自主处理。

    这个解释可能还有点不足,欢迎大家补充。

  • 相关阅读:
    SVG PATH d参数的 ace
    如果你想动态创建一个iframe
    canvas构建一个平面直角坐标系
    JavaScript版几种常见排序算法
    【分享】 Stip,让表单验证轻松愉快。
    【分享】javascript合并混淆压缩
    【分享】页面提示插件更新
    nodejs 的 session 简单实现
    页面模块之间的通信依赖解决方案
    在平面旋转一个点
  • 原文地址:https://www.cnblogs.com/solverpeng/p/5729763.html
Copyright © 2011-2022 走看看