大家都知道,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. hashable/iterable与orderable

    ################ # hashable协议 # ################ # 一个对象能被称为hashable,它必须实现__hash__与_eq__方法: >>& ...

  2. java se的那些细节

    局部变量:方法体内或语句块内,不能有修饰符 成员变量:与类的对象共存,可以有修饰符 类属性:与类共存,可以有修饰符 一.局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基 ...

  3. .net 根据网址生成静态页

    生成HTML页面代码 public int Htmls(int id) { ; string strHtmlContent = ""; HttpWebRequest request ...

  4. HDU-3608 最长回文

    HDU-3608 最长回文 题面 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如ab ...

  5. python基于matplotlib绘图

    import math import numpy as np import matplotlib.pyplot as plt from matplotlib.font_manager import F ...

  6. (转)eclipse下配置tomcat7的几个重要问题,值得一看

    转自:http://jingyan.baidu.com/article/ab69b270ccc4792ca7189fd6.html 这段时间开始接触的servlet,今天尝试在eclipse下配置to ...

  7. (转)MVC一个页面多个submit

    转自:http://stackoverflow.com/questions/442704/how-do-you-handle-multiple-submit-buttons-in-asp-net-mv ...

  8. NoSQL世界的几个重要理论

    和所有事物一样,NoSQL的兴起也是由许多理论支撑作为前提的,正是由下面一些理论的支撑,NoSQL的方向才能如此明朗. 1.CAP理论 CAP理论无疑是导致技术趋势由关系数据库系统向NoSQL系统转变 ...

  9. Vue的路由设置

    一.路由基础介绍 1.什么是前端路由? 路由是根据不同的url地址展示不同的内容或页面 前端路由就是把不同路由对应不同的内容或页面的任务交给前端来做,之前是通过服务器根据url的不同返回不同的页面实现 ...

  10. ASP.NET MVC Area 区域

    大型网站或项目通常有很多子系统或功能模块,如大型网站可能包含酒店.旅游.机票子系统,通过二级域名来访问,或者一个网站的前台和后台模块,每个团队负责某一子系统或模块,为了各团队进行协同开发,我们可以分不 ...