大家都知道,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. 启动tomcat报错Caused by: java.io.FileNotFoundException: class path resource [io/renren/controller/NodeDataController] cannot be opened because it does not exist

    ?? 清理项目,再重启服务就好了.........

  2. dj 用户认证组件

    auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,主要的三个: 1.1 authenticate() 提供了用户认证 ...

  3. 利用url传多个参数

    刚开始接触jsp,比较偏向于用button标签的onclick方法进行页面的跳转.但是关于页面跳转的各种问题真是叫人头大,以下记录,仅仅为自己以后查看. Qone 用url传参的时候遇到中文怎么办 编 ...

  4. 写了十年JS却不知道模块化为何物?

    作者:肖光宇 野狗科技联合创始人,先后在猫扑.百度.搜狗任职,爱折腾的前端工程师. 野狗官博:https://blog.wilddog.com/ 野狗官网:https://www.wilddog.co ...

  5. 实例讲解Silverlight 初始控件如何获得焦点

    这个问题本来是在我实际的项目中遇到过的,但这其实是当初项目要求,要求一进入就要使得在用户名那个文字框中聚焦,而不是再用鼠标去点击获得焦点,后来自己费了点时间解决了.本来我没太注意就过去了,没想到在QQ ...

  6. day30(对象转json(java))

    转换之前需要知道什么是json json类似于map集合:键值对的方式存在,是一种轻量级数据交互格式. eg: {name:" ",age:15} [{name:" &q ...

  7. js去除字符串中的空格

    //去除空格 function Trime(string){ return string.replace(/\s/ig,""); }

  8. POJ 1191棋盘分割问题

    棋盘分割问题 题目大意,将一个棋盘分割成k-1个矩形,每个矩形都对应一个权值,让所有的权值最小求分法 很像区间DP,但是也不能说就是 我们只要想好了一个怎么变成两个,剩下的就好了,但是怎么变,就是变化 ...

  9. bootstrap阶段测验【问题】

  10. poj2481

    题意:给定一些线段(s, e),起点为s,终点为e,求每一段线段被多少线段包含(不包括相等) 思路:很明显的树状数组题目..但是做的时候想了挺久..(下面的x为线段起点, y为线段终点) 做法1:先对 ...