• 20200311 12. 映射请求到 Servlet


    12. 映射请求到 Servlet

    Web 容器需要本章描述的映射技术去映射客户端请求到 Servlet(该规范 2.5 以前的版本,使用这些映射技术是作为一个建议而不是要求,允许 servlet 容器各有其不同的 schema 用于映射客户端请求到 servlet)。

    12.1 使用 URL 路径

    在收到客户端请求时, web 容器确定转发到哪一个 Web 应用。选择的 Web 应用必须具有最长的上下文路径匹配请求 URL 的开始。当映射到 Servlet 时, URL 匹配的一部分是上下文。

    Web 容器接下来必须用下面描述的路径匹配步骤找出 servlet 来处理请求。

    用于映射到 Servlet 的路径是请求对象的请求 URL 减去上下文和路径参数部分。下面的 URL 路径映射规则按顺序使用。使用第一个匹配成功的且不会进一步尝试匹配:

    1. 容器将尝试找到一个请求路径到 servlet 路径的精确匹配。成功匹配则选择该 servlet。
    2. 容器将递归地尝试匹配最长路径前缀。这是通过一次一个目录的遍历路径树完成的,使用 / 字符作为路径分隔符。最长匹配确定选择的 servlet。
    3. 如果 URL 最后一部分包含一个扩展名(如 .jsp), servlet 容器将视图匹配为扩展名处理请求的 Servlet。扩展名定义在最后一部分的最后一个 . 字符之后。
    4. 如果前三个规则都没有产生一个 servlet 匹配,容器将试图为请求资源提供相关的内容。如果应用中定义了一个“default” servlet,它将被使用。许多容器提供了一种隐式的 default servlet 用于提供内容。容器必须使用区分大小写字符串比较匹配。

    12.2 映射规范

    在 web 应用部署描述符中,以下语法用于定义映射:

    • / 字符开始、以 /* 后缀结尾的字符串用于路径匹配。
    • *. 开始的字符串用于扩展名映射。
    • 空字符串""是一个特殊的 URL 模式, 其精确映射到应用的上下文根,即,http://host:port/<context-root>/请求形式。在这种情况下,路径信息是 / 且 servlet 路径和上下文路径是空字符串("")。
    • 只包含 / 字符的字符串表示应用的“ default ” servlet。在这种情况下, servlet 路径是请求 URL 减去上下文路径且路径信息是 null
    • 所以其他字符串仅用于精确匹配。

    如果一个有效的 web.xml(在从 fragment 和注解合并了信息后)包含任意的 url-pattern,其映射到多个 servlet,那么部署将失败。

    12.2.1 隐式映射

    如果容器有一个内部的 JSP 容器, *.jsp 扩展名映射到它,允许执行 JSP 页面的要求。该映射被称为隐式映射。如果 Web 应用定义了一个*.jsp 映射,它的优先级高于隐式映射。

    Servlet 容器允许进行其他的隐式映射,只要显示映射的优先。例如,一个*.shtml 隐式映射可以映射到包含在服务器上的功能。

    12.2.2 示例映射集合

    请看下面的一组映射:

    表 12-1 示例映射集合

    Path Pattern Servlet
    /foo/bar/* servlet1
    /baz/* servlet2
    /catalog servlet3
    *.bop servlet4

    将产生以下行为:

    表 12-2 传入路径应用于示例映射

    Incoming Path Servlet Handling Request
    /foo/bar/index.html servlet1
    /foo/bar/index.bop servlet1
    /baz servlet2
    /baz/index.html servlet2
    /catalog servlet3
    /catalog/index.html “ default ” servlet
    /catalog/racecar.bop servlet4
    /index.bop servlet4

    请注意,在/catalog/index.html/catalog/racecar.bop 的情况下,不使用映射到 /catalog 的 servlet,因为不是精确匹配的。

  • 相关阅读:
    SharePoint 2013中Office Web Apps的一次排错
    如何在Ubuntu上让root帐号可以登录SSH
    如何确定自己的SQL Server的实例是32位的还是64位的?
    [ADO.NET] 如何 使用 OLE DB 讀寫 Excel / 建立 Excel 檔案 (一)
    windows使用nginx实现网站负载均衡测试实例
    jqPlot的Option配置对象详解
    Windows Server 2003安装卡巴斯基2010成功
    Log4Net的使用方法
    在ADO.NET中使用参数化SQL语句的大同小异
    ASP.NET安全问题--Froms验证的具体介绍(中篇)
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/12462597.html
Copyright © 2020-2023  润新知