zoukankan      html  css  js  c++  java
  • Servlet映射规范和隐式映射

    问题描述:

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

    过程尝试:

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

    问题解答:

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

    解决方案:

    如何解决这种情况?
    1. 用jsp代替html;
    2. 不使用默认映射;
    3. 在默认Servlet中增加处理html的方法;
    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.

    资料来源:

    Spring MVC中为什么/*无法匹配,而/却可以匹配到?
    http://www.iteye.com/problems/36433
  • 相关阅读:
    Golang---反射(reflect)
    golang--交替打印一个数组中的元素
    Golang---基本类型(interface)
    利用random5 生成 random7
    Golang---基本类型(map)
    Golang---基本类型(slice)
    Golang---基本类型(string)
    二维码扫码登录原理
    Golang---内存逃逸
    关于我
  • 原文地址:https://www.cnblogs.com/echo1937/p/6582189.html
Copyright © 2011-2022 走看看