大家都知道,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. 证明LDU分解的唯一性

    首先上(下)三角矩阵乘以上(下)三角矩阵结果还是上(下)三角矩阵, 另外我们考虑相乘后的对角元素可发现,对角原始是原来2矩阵对应对角元素的乘积. 另外对角线都是1的上(下)三角矩阵必定可以只是用行运算 ...

  2. Win7 VS2015及MinGW环境编译矢量库agg-2.5和cairo-1.14.6

    书接上文,昨天装了MinGW,主要原因之一是要用到MSYS,所以顺手把FFMPEG又编译了一遍. 回到主题,其实我是想编译矢量库,因为最近要学习一些计算几何算法,所以找个方便的2D画图库就很重要. 说 ...

  3. iconfont阿里巴巴矢量图标库批量保存

    F12输入——var iconList = document.querySelectorAll('.icon-gouwuche1');for (var i = 0; i < iconList.l ...

  4. Clion 教程书写Hello World,C语言开发;Clion 的C语言开发

    一.编译器安装 二.项目搭建 1.新建项目 2.项目类型选择(双红圈是项目名称,可以修改) 3.点击create,自动生成项目. 4.运行项目

  5. Effective C++ 随笔(5)

    条款27:尽量稍作转型动作 const_cast:常量性移除 dynamic_cast:安全向下转型 reinterpret_cast: static_cast: 如在子类当中享调用父类当中的某个方法 ...

  6. 【ORA错误大全】 ORA-19527

    在做主备切换的时候,需要将备库的联机日志文件清除(clear online redo logfile),为了加快switchover的速度,Oracle10g在将备库置于manged standby状 ...

  7. 1057 Stack 树状数组

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...

  8. day35(servlet 3.0)

    servlet3.0的问题 Servlet3.0与Servlet2.5提供了三个新特性: * 注解开发   :方便 * 文件上传   :有些API不是特别全. * 异步请求   :多线程的实现 注解开 ...

  9. day32(表单校验js和jquery表单校验)

    校验用户名.密码.密码一直性. <style> .error { color: red } .success { color: green } </style> <scr ...

  10. 比较两个Excle表格的修改内容

    //输入参数为文件输入流public static Map<String, List<String>> excelColumn2maplist(InputStream is){ ...