问题描述:

  1. web.xml中配置了缺省路径"/"后,原先在webapp下的静态页面(html)无法通过URL访问了,为什么?

过程尝试:

  1. 1. html后缀改为.jsp后可以正常访问
  2. 2. 将缺省路径"/"删除可以正常访问
  3. 3. 原有的index.jsp可以正常访问

问题解答:

  1. tomcat在/conf/web.xml中定义了”/”到DefaultServlet的映射,在DefaultServlet中有renderHTMLrenderXML方法来表示或者渲染htmlxml文件
  2.  
  3. <servlet>
  4.   <servlet-name>default</servlet-name>
  5.   <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
  6. </servlet>
  7. <servlet-mapping>
  8.   <servlet-name>default</servlet-name>
  9.   <url-pattern>/</url-pattern>
  10. </servlet-mapping>
  1. 并定义了”*.jsp”和”*.jspx”到JspServlet的映射,在JspServlet中处理jspjspx文件
  2.  
  3. <servlet>
  4.   <servlet-name>jsp</servlet-name>
  5.   <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
  6. </servlet>

  7. <servlet-mapping>
  8.   <servlet-name>jsp</servlet-name>
  9.   <url-pattern>*.jsp</url-pattern>
  10. </servlet-mapping>
  11. <servlet-mapping>
  12.   <servlet-name>jsp</servlet-name>
  13.   <url-pattern>*.jspx</url-pattern>
  14. </servlet-mapping>
  1. Servlet的匹配权重:
  2.   1. 精确路径匹配(/ab高于/*)
  3.   2. 最长路径匹配(/ab/cd高于/ab;/ab/cd/*高于/ab/*)
  4.   3. 扩展匹配(*.xxx)
  5.   4. 默认匹配("url-pattern /" --> defaultServlet)
  6.  
  7. 因此:
  8. jsp资源由权重3的org.apache.jasper.servlet.JspServlet处理;html资源由权重4的defaultServlet处理
  9.  
  10. 如果在web.xml自行定义了默认映射<url-pattern>/</url-pattern>,会使得tomcat中的默认映射失效,而自己定义的Servlet通常不具备处理html文件的能力,所以无法渲染html页面。
  11. 而tomcat中/conf/web.xml中定义了*.jsp的映射,根据规则3是不会被默认映射捕获的,所以jsp文件可以正常访问。

解决方案:

  1. 如何解决这种情况?
  2. 1. jsp代替html
  3. 2. 不使用默认映射;
  4. 3. 在默认Servlet中增加处理html的方法;
  5. 4. 使用Spring的<mvc:default-servlet-handler>或者<mvc:resources>

附录:Java™ Servlet Specification

中文释义:

  一个比较好的中文释义

应用引申:

The pattern /* will force everything through your servlet.
The pattern /   will make your servlet the default servlet for the app, meaning it will pick up every pattern that doesn't have another exact match.

资料来源:

  1. Spring MVC中为什么/*无法匹配,而/却可以匹配到?
  2. http://www.iteye.com/problems/36433

Servlet映射规范和隐式映射的更多相关文章

  1. 【Head First Servlets and JSP】笔记16:JSP隐式对象(内置对象)的映射关系

    接笔记15. 1.不管是JSP中的<%%>还是<%\=%>最终都将处于servlet的方法体中,那么有没有一种元素可以声明成类的成员呢? ——答案是有,而且非常非常简单,这个元 ...

  2. DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数

    以下内容,我看了多篇文章,整合在一起,写的一个例子,关于dll工程的创建,请参考博客里另一篇文章:http://www.cnblogs.com/pingge/articles/3153571.html ...

  3. 操作系统学习笔记(二) 页式映射及windbg验证方式

    页式映射 本系列截图来自网络搜索及以下基本书籍: <Windows内核设计思想> <Windows内核情景分析> <WINDOWS内核原理与实现> 一个32位虚拟地 ...

  4. JSP——JavaServer Page中的隐式对象(implicit object)、指令(directive)、脚本元素(scripting element)、动作(action)、EL表达式

    目录 1.JSP概述 2.注释(comment) 2.1.JSP注释 2.2.HTML注释 3.隐式对象(implicit object) 3.1.隐式对象清单 3.2.request对象 3.3.o ...

  5. JSP与EL隐式对象

    一,JSP隐式对象 隐式对象是可以直接使用的,无需声明.因为在JSP转译为servlet文件后,会自动声明其对象. 隐式对象① 说明 out 对应JspWriter对象,其内部关联一个PrintWri ...

  6. JSP JSP工作原理 JSP语法 JSP声明 JSP注释 JSP指令 jsp九大隐式/内置对象

    1 什么是JSP   1)为什么说,Servlet是一个动态Web开发技术呢?     Servlet是基于服务端的一种动态交互技术,     HttpServletRequest表示客户端到服务端的 ...

  7. [javaEE] jsp的九大隐式对象

    pageContext对象: 1.可以作为入口对象获取其他八大隐式对象的引用 1.1 getEXception获取exception隐世对象 1.2 getPage获取page对象 1.3 getRe ...

  8. jsp学习与提高(二)——JSP 隐式对象、表单处理及过滤器

    1.JSP 隐式对象 JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明.JSP隐式对象也被称为预定义变量. JSP所支持的九大隐式对象: 对象 描述 req ...

  9. JSP页面以及JSP九大隐式对象

    €JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. €JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比 ...

随机推荐

  1. Bomb(要49)--数位dp

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submi ...

  2. 2019.04.11 第四次训练 【 2017 United Kingdom and Ireland Programming Contest】

    题目链接:  https://codeforces.com/gym/101606 A: ✅ B: C: ✅ D: ✅ https://blog.csdn.net/Cassie_zkq/article/ ...

  3. 通过java代码给log4j指定appender

    工具代码 import org.apache.log4j.ConsoleAppender; import org.apache.log4j.LogManager; import org.apache. ...

  4. *2_3_5_加入reference model

    摘自:http://book.2cto.com/201408/46009.html 在2.1节中讲述验证平台的框图时曾经说过,reference model用于完成和DUT相同的功能. referen ...

  5. 3行代码,为QQ轻游戏加上语音互动能力

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 游戏和社交往往有着密不可分的关系,QQ轻游戏就是一款集成在手Q里面的游戏平台,直接通过手Q入口就能随开 ...

  6. HDFS常用shell命令

    注,其实常用命令不用网上搜,和linux下的命令很类似,触类旁通,直接在linux 上 hadoop fs 看一下就行了,不需要刻意去记我把 linux 上的 help 列举下,方便直接看吧,hdfs ...

  7. Package.json中dependencies依赖包中^符号和~符号前缀的区别

    刚git了webpack的包发现package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^,如下图标记: 然后搜了下在stackoverflow上找到一个比 ...

  8. Java如何大批量从json数据源中按指定符号隔字符串,并修改、删除数据

    原文出自:https://blog.csdn.net/seesun2012 package com.seesun2012.com; /** * Java大批量修改.删除数据,按指定标识符分隔字符串 * ...

  9. C#中使用Log4Net记录日志

    https://www.cnblogs.com/W--Jing/p/8125652.html 实例参考 https://www.cnblogs.com/soundcode/p/4866078.html ...

  10. Cheatsheet: 2018 05.01 ~ 07.31

    JAVA Java Tips: Creating a Monitoring-Friendly ExecutorService Other Modeling the Card Game War in C ...