大家都知道,Servlet有个配置:

<servlet>
  <servlet-name>zolltyMVC</servlet-name>
  <servlet-class>org.zollty.framework.mvc.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>zolltyMVC</servlet-name>
  <url-pattern>/</url-pattern>
</servlet-mapping>

对于<url-pattern>/</url-pattern>这一项,有时候会 带有 “*” 这种写法,这和没有 "*" 号时有什么差别呢?

首先来看一下,通过 HttpServletRequest request 我们能取到哪些重要参数:

System.out.println("getServerName" + request.getServerName());
System.out.println("getLocalName" + request.getLocalName());
System.out.println("------------------------------------");
System.out.println("getPathInfo" + request.getPathInfo());
System.out.println("getPathTranslated" + request.getPathTranslated());
System.out.println("------------------------------------");
System.out.println("getRemoteHost" + request.getRemoteHost());
System.out.println("getRemoteAddr" + request.getRemoteAddr());
System.out.println("getLocalAddr" + request.getLocalAddr());
System.out.println("------------------------------------");
System.out.println("getRequestURI" + request.getRequestURI());
System.out.println("getServletPath" + request.getServletPath());
System.out.println("getContextPath" + request.getContextPath());
System.out.println("------------------------------------");
System.out.println("getScheme" + request.getScheme());
System.out.println("getLocale" + request.getLocale().getLanguage());
System.out.println("------------------------------------");
System.out.println("getServerPort" + request.getServerPort());
System.out.println("getLocalPort" + request.getLocalPort());
System.out.println("getRemotePort" + request.getRemotePort());
System.out.println("------------------------------------");
System.out.println("getMethod" + request.getMethod());
System.out.println("getProtocol" + request.getProtocol());
System.out.println("getRemoteUser" + request.getRemoteUser());
System.out.println("getRequestedSessionId" + request.getRequestedSessionId());
System.out.println("getCharacterEncoding" + request.getCharacterEncoding());
System.out.println("getContentType" + request.getContentType());

当配置为 <url-pattern>/</url-pattern>时,打印的结果如下:

getServerNamelocalhost
getLocalName0.0.0.0
------------------------------------
getPathInfonull
getPathTranslatednull
------------------------------------
getRemoteHost0:0:0:0:0:0:0:1
getRemoteAddr0:0:0:0:0:0:0:1
getLocalAddr0.0.0.0
------------------------------------
getRequestURI/sss/sd/ds
getServletPath/sd/ds
getContextPath/sss
------------------------------------
getSchemehttp
getLocalezh
------------------------------------
getServerPort8081
getLocalPort8081
getRemotePort65281
------------------------------------
getMethodGET
getProtocolHTTP/1.1
getRemoteUsernull
getRequestedSessionIdE6CED285C020625E0D6531BBBD25033A
getCharacterEncodingnull
getContentTypenull

当配置为 <url-pattern>/*</url-pattern> 时,打印的结果如下:

getServerNamelocalhost
getLocalName0.0.0.0
------------------------------------
getPathInfo/sd/ds
getPathTranslatedD:\C\Java\apache-tomcat-7.0.23\webapps\sss\sd\ds
------------------------------------
getRemoteHost0:0:0:0:0:0:0:1
getRemoteAddr0:0:0:0:0:0:0:1
getLocalAddr0.0.0.0
------------------------------------
getRequestURI/sss/sd/ds
getServletPath
getContextPath/sss
------------------------------------
getSchemehttp
getLocalezh
------------------------------------
getServerPort8081
getLocalPort8081
getRemotePort65388
------------------------------------
getMethodGET
getProtocolHTTP/1.1
getRemoteUsernull
getRequestedSessionIdE6CED285C020625E0D6531BBBD25033A
getCharacterEncodingnull
getContentTypenull

区别在如下几个地方:

// ------------------------------------
// getPathInfo/
// getPathTranslatedD:\C\Java\apache-tomcat-7.0.23\webapps\sss\
// ------------------------------------
// getRequestURI/sss/p/
// getServletPath/p

对于"/"形式,得到的getPathInfo和getPathTranslated都为null;

对于"/*"形式,则能得到 "/" 和 项目的所在磁盘上的绝对路径

而对于ServletPath 和 RequestURI ,分析如下:

// ServletPath = 不含项目名称的访问地址 -- 如果是/p/*方式配置,则访问地址为/p,如果是/*则是""(空); 如果是/方式配置,则访问地址是全路径(包括斜杠)
// RequestURI = 包含项目名称的访问地址 -- 不管是/或者/*或者/p/*方式配置,访问地址都为/{项目名}+全路径(包括斜杠)

也就是说,带"*"时,ServletPath 获取的是"/*"前面的内容(没有斜杠),不带"*"时,获取的是全部内容(有没有斜杠取决于输入的URL)。

RequestURI 则比较统一,都等于: /{项目名}+全路径(有没有斜杠取决于输入的URL),例如

输入的是:

http://localhost:8081/zollty/ds,则为/zollty/ds(不带斜杠)

输入的是:

http://localhost:8081/zollty/ds/,则为/zollty/ds/(带斜杠)

另外,getContextPath等于 "/" + 项目名称 ,即: /{项目名},也比较常用,但是每次都去取,比较麻烦,还不如把项目名称作为一个静态常量。

另外,servlet url的解析顺序如下:

准则1、   在servlet-mapping配置中,带"*"的优先级,大于不带"*"的;

准则2、   系统自带的servlet,比如default Servlet、jsp Servlet,优先级高于自定义的servelt的(将优先处理),但是这些servlet如果处理不了,会把请求转发到后续的servelt去处理。

准则3、   同一文件中的配置,前面的servlet-mapping配置,优先级高于后面的servlet-mapping配置。

另外,说明一点:

带"*"的配置方式,是强行拦截,只要匹配上,请求都会被拦截(比如,/*会拦截所有请求,*.jsp 会拦截所有 以.jsp结尾的请求。

不带"*"的配置方式,理论上是“精确拦截”,只会拦截和设置的url精确匹配的那一个请求的url,比如/prog,则只有http://...{项目名}/prog请求才会被拦截,

其他比如http://...{项目名}/prog/、http://...{项目名}/prog/abc等,都不会被拦截。但是设置成 "/" 时,是个例外,它会拦截所有请求(进一步说,"/"的拦截范围和"/*"的拦截范围其实是一样的,只不过"/*"不仅仅是拦截范围广,更重要的是它的优先级高,比没有设置"/*"的系统自带的servlet优先级还高)。

以下是本人亲自测试多次的结果:

优先级从高到低,依次为:

<servlet-name>default</servlet-name>

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

<servlet-name>jsp</servlet-name>

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

<servlet-name>{自定义的servlet}</servlet-name>

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

<servlet-name>jsp</servlet-name>

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

<servlet-name>default</servlet-name>

<url-pattern>/</url-pattern>

<servlet-name>{自定义的servlet}</servlet-name>

<url-pattern>/</url-pattern>

Servlet各种路径、URL配置分析的更多相关文章

  1. Servlet学习第一天--Servlet开发映射URL配置

    基础不扎实,从头学,认真记录笔记. 感谢@孤傲苍狼:http://www.cnblogs.com/xdp-gacl/p/3760336.html -为什么要配置? 由于客户端是通过URL访问web服务 ...

  2. Servlet学习笔记(二)之Servlet路径映射配置、Servlet接口、ServletConfig、ServletContext

    Servlet路径映射配置 要使Servlet对象正常的运行,需要进行适当的配置,以告诉Web容器哪个请求调用哪个Servlet对象处理,对Servlet起到一个注册的作用.Servlet的配置信息包 ...

  3. JavaWeb_通过xml配置文件配置servlet访问路径

    Servlet两种访问路径 一.在Servlet类中通过设置@WebServlet标注访问 二.在web.xml中编写配置文件 第一种能比较直观看到Servlet路径,但当项目发布后不好再对Servl ...

  4. JAVA 取得当前目录的路径/Servlet/class/文件路径/web路径/url地址

    在写java程序时不可避免要获取文件的路径...总结一下,遗漏的随时补上 1.可以在servlet的init方法里 String path = getServletContext().getRealP ...

  5. 使用任意的输入流(InputStream)实例,包括字符串形式的文件路径或者 file:// 的 URL 形式的文件路径来配置

    mybatis – MyBatis 3 | 入门 http://www.mybatis.org/mybatis-3/zh/getting-started.html 从 XML 中构建 SqlSessi ...

  6. 访问servlet的路径问题

    一.url-pattern的三种配置 在web.xml配置文件中配置有关Servlet的时候,<url-pattern>标签是用于配置当前Servlet拦截的路径,也就是说,客户端浏览器访 ...

  7. Servlet中路径信息总结

    ./ 当前目录 ../ 父级目录 / 根目录 资源寻找都是依靠路径,资源存储方式是按照哈希表运算的,所以路径的计算其实就是哈希值的计算. servlet中,所有路径的配置都要用绝对路径. 什么是绝对路 ...

  8. 视图和URL配置

    视图和URL配置 实验简介 上一章里我们介绍了如何创建一个Django项目并启动Django的开发服务器.本章你将学到用Django创建动态网页的基本知识. 同时,也教会大家怎么在本地机器上建立一个独 ...

  9. servlet(3):servlet和filter<url-pattern>配置

    一,servlet容器对url的匹配过程: 当 一个请求发送到servlet容器的时候,容器先会将请求的url减去tomcat的上下文路径(配置的访问系统的基础路径例如intellij idea配置的 ...

随机推荐

  1. hdu-1041(大数模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1041 题意:电脑中存在数字1,进行扩展操作,如果遇到1变为“01”,如果遇到0,变为“10”,经过一次 ...

  2. Educational Codeforces Round 60 C 思维 + 二分

    https://codeforces.com/contest/1117/problem/C 题意 在一个二维坐标轴上给你一个起点一个终点(x,y<=1e9),然后给你一串字符串代表每一秒的风向, ...

  3. 第15章:MongoDB-聚合操作--聚合管道--$match

    ①$match 用于对文档集合进行筛选,里面可以使用所有常规的查询操作符. 通常会放置在管道最前面的位置,理由如下: 1:快速将不需要的文档过滤,减少后续操作的数据量 2:在投影和分组之前做筛选,查询 ...

  4. Day1-Python基础--数据类型

    距离上次更新,已经一月有余.说明学习状态不好,且滞后严重.第二模块也滞后5周之多,可能学习方法不对,有点凌乱,导致写作业时思路还是打不开,再一个是练习的太少了吧,以后得多挤挤时间来了.目前到了这个年纪 ...

  5. js格式化文件大小, 输出成带单位的字符串工具

    /** * 格式化文件大小, 输出成带单位的字符串 * @method formatSize * @grammar formatSize( size ) => String * @grammar ...

  6. js基础学习笔记(六)

    事件(可以被 JavaScript 侦测到的行为) 主要事件表: 加载事件(onload) 事件会在页面加载完成后立即发生,同时执行被调用的程序. 卸载事件(onunload) 当用户退出页面时(页面 ...

  7. 重建控制文件ORA-12720

    重建过程出错:ORA-01503: CREATE CONTROLFILE failedORA-12720: operation requires database is in EXCLUSIVE mo ...

  8. (转)Application, Session, Cookie, Viewstate, Cache对象用法和区别

    ================================================================================         1.Applicati ...

  9. Simultaneous Localization and Mapping Technology Based on Project Tango

    Abstract: Aiming at the problem of system error and noise in simultaneous localization and mapping ( ...

  10. python的基础socket知识

    对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 代码意思if __name__ == '__main__':是主文件的话就先执行main函数, ...