相亲怎么做  

  web应用需要放在Tomcat容器中才能启动,Tomcat容器内有一个默认的web.xml文件,在自己项目中配置的XML文件都是继承自Tomcat中的全局XML文件并重写其中相应配置,这种继承且重写的关系和子类继承父类并重写相关方法一样,如果子类重写了父类的方法,那么就使用子类的方法,反之就使用父类的方法。像XML这种格式化的文件最终会被转换成一个类去保存配置信息,所以理解全局XML文件和项目XML文件的关系也可以类比子类重写父类方法的模式。

  打开Tomcat安装目录下的XML文件,关注其中两个servlet及其对应的servlet-mapping。

  • default。default servlet用于处理静态资源,如果一个请求在无法找到servlet-mapping去处理那么最终会被default处理。
  • jsp。用于处理所有jsp结尾的请求。
    <servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <!-- The mappings for the JSP servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>

  如果把DispatcherServlet的url-pattern配置成/*,那么它会覆盖掉jsp servlet,所有的jsp请求最交给DispatchServlet处理,如果Controller中没有配置相关处理方法那么会无法处理。事实上没有必要越俎代庖的处理.jsp请求,完全可以交给Tomcat容器处理jsp请求,因此DispatchServlet要配置成/。

  看培训班的视频或者早期的SpringMVC资料,他们把DispatchServlet配置成.do或者.action形式,那是因为早期的SpringMVC缺乏对静态资源的管理,如果配置成/那么所有对静态资源如js的请求也会交给DIspatchServlet处理,除非配置相应的Controller否则也会报错,所有静态资源管理的任务还是应该由Tomcat中的default来管理,因此早期DispatchServlet配置成.do .action等形式来避免覆盖掉default的功能。

  这种url风格是不符合REST的要求的,所以后来SpringMVC加入了两个重要的注解,它们结合使用产生的功效是如果DispatchServlet发现请求是一个静态资源那么会交给default servlet即交给Toncat处理,效果拔群。

    <mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>

  总之最后的结论是:

  • 配成/
  • springMVC里加两个注解

  如此配置之后,妈妈再也不用担心静态资源和jsp页面的问题了

为什么

  为什么加上了上述两个注解静态资源访问就没有问题了呢?打上断点来查看加注解前后的区别。

  首先是两个注解都不加,此时HandlerMappings中的AnnotationHandlerMapping中存储这Controller和url的映射关系,由于我们没有编写Controller去处理js html等静态资源,所以此时的状态是动态资源可以访问,静态资源不可访问。

  

  其次是只加上default-servlet-handler,发现处理Controller的AnnotationHandler不见了,取而代之的是SimpleURLHandlerMapping,该Handler种的handlerMap非常简单只有一个/**即无论什么请求都直接去当前webapp下去找。这样配置静态资源肯定是可以访问的,因为它的作用和不使用SpringMVC中的DIsplacedServlet直接使用Tomcat一样。但由于AnnotationHandler的缺失,导致Controller这种基于注解配置处理请求的方法无法访问,所以这种配置下的状态是静态资源可以访问,动态资源不可以访问。

  最后当把两个注解都加上的时候,不仅有处理静态资源的SimpleUrlHandlerMapping,还多了一个优先级最高的RequestMapping,点开详情信息发现我们配置的Controller都在里面。这就是我们要的效果:对于每一个非jsp请求都会被DispatchServlet拦下,然后交给优先级最高的RequestMapping处理。RequestMapping遍历自己的Mappings,如果这个请求是一个动态请求,那么一定可以找到对应的Controller,Controller处理并返回;如果该请求是一个针对静态资源文件的,RequestMapping无能为力,他会按照优先级交给后续HandlerMapping如没啥用的BeanNameUrlHandlerMapping,以及放在最后用来兜底的SimpleUrlHandlerMapping,当SimpleUrlHandlerMapping拿到一个针对静态资源的请求后,会在/**目录下找到静态资源并返回。

配置DispatcherServlet应该写/还是/*的更多相关文章

  1. 当配置 DispatcherServlet拦截“/”,SpringMVC访问静态资源的三种方式

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截“/”,拦截了所有的请求,同时对*.js,*.jpg ...

  2. 01 - spring mvc 概述及配置DispatcherServlet

    1.Spring mvc 基于model2实现,整体框架流程如(图片来自百度): ①web容器接收到http请求,若匹配DispatcherServlet的请求映射路径(web.xml),则容器会交给 ...

  3. spring in action学习笔记十五:配置DispatcherServlet和ContextLoaderListener的几种方式。

    在spring in action中论述了:DispatcherServlet和ContextLoaderListener的关系,简言之就是DispatcherServlet是用于加载web层的组件的 ...

  4. springboot mvc自动配置(一)自动配置DispatcherServlet和DispatcherServletRegistry

    所有文章 https://www.cnblogs.com/lay2017/p/11775787.html 正文 springboot的自动配置基于SPI机制,实现自动配置的核心要点就是添加一个自动配置 ...

  5. 分析配置DispatcherServlet类时load-on-startup标签作用

    <servlet> <servlet-name>DispatcherServlet</servlet-name> <servlet-class>org. ...

  6. Spring MVC配置DispatcherServlet的url-pattern

    在配置Spring MVC的核心过滤器DispatcherServlet的url-pattern时是有要求的. <servlet> <servlet-name>...</ ...

  7. web.xml配置DispatcherServlet

    1. org.springframework.web.servlet.DispatcherServlet 所在jar包: <dependency> <groupId>org.s ...

  8. 使用SpringMVC时,配置DispatcherServlet注意的url-pattern的问题

    url-pattern配置时注意: <!--springMVC配置--><servlet> <servlet-name>springMVC</servlet- ...

  9. ASP.NET 配置log4net启用写错误日志功能

    http://www.cnblogs.com/yeminglong/archive/2013/05/21/3091192.html 首先我们到apche的官网下载log4net的项目编译得到log4n ...

随机推荐

  1. java使用POI将数据导出放入Excel

    本文主要是将数据库取出的数据按照自定义的行列格式导出到excel中,POI则是实现我们需求所用到的技术. POI介绍 使用spring boot导入相关依赖 获取数据(自行处理) 完整代码实例:创建e ...

  2. 向后台提交数据:cookie,secure_cookie,

    向后台提交数据除了前端url,form表单,Ajax外还可以用cookie,secure_cookie,提交更多信息可以在用cookie基础上用session, cookie,secure_cooki ...

  3. Vue 组件之间传值

    一.父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据. 子组件部分: 这是 header.vue 的 HTML 部分,logo 是在 data 中定义的变量. 如果需要从 ...

  4. VysorPro助手

    Vysor是一款非常强大而又好用的Android远程显示及控制软件,有Chrome插件版.Windows客户端版和Mac版,是Android开发和测试人员的必备神器.其中Windows客户端版相对Ch ...

  5. Android getprop 读取的属性哪里来的?

    Android  getprop 和  setprop 可以对系统属性进行读取和设置. 通过串口执行以下 geyprop    打印出来的属性让你一目了然. 属性出来了,但是在哪里设置的呢,这里有两个 ...

  6. 运行svn tortoiseSvn cleanup 命令失败的解决办法

    这个时候请使用命令行模式运行 svn clean up 然后世界和平了:)

  7. 智能POS正餐主副机模式FAQ(无桌台或桌台模块)

    1.无桌台 (1).如果是初次使用,首先检查是否是新建的机器号,新建的机器是默认关闭桌台的,需要到模块管理中开启. 2.无桌台模块 (1).是否在主副机开启连接上后重启主机与副机,且同步数据.

  8. turnserver 配置说明记录

    coTurn工程提供了较完整的STUN和TURN服务,记录其主要的命令行参数配置说明 针对TURN/STUN服务进程turnserver.exe的使用参数做简单说明 -L 监听的IP地址 -p 监听端 ...

  9. 你的leader还在考核你的千行代码Bug率吗?

    管理学大师德鲁克说:你如果你无法度量它,就无法管理它.要想做有效的管理,就很难绕开度量的问题. 软件开发的过程或者技术团队的管理也存在着如何去合理的度量效率的问题.而度量是把双刃剑,度量具有极强的引导 ...

  10. weblogic---- Remote远程调用

    删之前重新写一下以防以后遗忘 一.服务器端 package com.ij34.dao; import javax.ejb.Remote; /** * @author Admin * @date 创建时 ...