Serlvlet路径映射

当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url。

容器默认请求的是一个Servlet,所以不会直接根据路径从文件夹中查找文件,而是先从web.xml中根据<url-pattern>查找对应的Servlet文件,匹配成功后就停止继续匹配;如果没有找到,才会从文件夹中找。都没有,则返回404。

匹配规则

url-pattern匹配规则只有以下五种(*为通配符):
■ 以“/”字符开头,并以“/*”结尾的字符串用于路径映射

<url-pattern>/user/*</url-pattern>

  http://localhost:5555/ myapp /user      (也可以匹配到,*通配符相当于空)

  http://localhost:5555/ myapp /user/addUser.action

  http://localhost:5555/ myapp /user/updateUser.action

■ 以“*.”开头的字符串被用于扩展名映射

<url-pattern>*do</url-pattern>

  http://localhost:5555/myapp/item/order.do

  http://localhost:5555/myapp/user/test.do

■ 空字符串("")是用于指定精确映射应用程序 context root 的 URL 模式,比如从 http://host:port/<contextroot>/ 来的请求。在这种情况下路径信息是“/”,servlet 路径和 context 路径是一个空的字符串("")。
■ 字符串中仅有“/”字符时,表示应用容器提供的默认servlet。在这种情况下 servlet 路径是请求 URI 去掉 context 路径且路径信息为 null。

■ 其他类型的字符串都属于精确匹配。url必须与<url-pattern>中的配置完全匹配。

<url-pattern>/user</url-pattern> <!—没有/*结尾,属于精确匹配规则->

匹配顺序(匹配优先级):

精确匹配>路径匹配(长路径>短路径)>扩展名匹配>default Servlet(/)

Tomcat按照上述顺序依次将请求url和web.xml中的url-pattern进行匹配。

注意:

1.各匹配规则不能组合使用,以下同时设置路径匹配和扩展名匹配都不正确:

  <url-pattern>/kata/*.jsp</url-pattern>

  <url-pattern>/*.jsp</url-pattern>

  <url-pattern>he*.jsp</url-pattern>

  <url-pattern>/user/*.action</url-pattern>

2. “/*”属于路径匹配,路径就是/,可以匹配所有request。如果存在和请求对应的.jsp/.html文件,依然将请求发送给对应的servlet,导致404错误。url-pattern一般只用于filter

静态资源处理

tomcat在${tomcat_home}/conf/web.xml中配置了default servlet,对静态资源的请求容器会返回相应的资源文件:

<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>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> ... <servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

如果开发者在web应用的web.xml中使用了<url-pattern>/</url-pattern>,会优先于tomcat内置的default servlet生效。该url-pattern匹配所有request,但优先级最低,用于处理其他Servlet都不处理的请求。即使存在和请求对应的静态资源(.jsp除外),服务器仍然不会返回该静态资源,而是将该请求转给对应的Serlvet处理。

tomcat除了配置了default serlvlet,还内置了专门处理url-pattern为*.jspx和*.jsp的servlet,所以对.jsp的请求会返回对应的文件,除非出现优先级更高的url-pattern。

所以,为了使用SpringMVC而在web.xml中配置<url-pattern>/</url-pattern>,会导致静态资源的404错误。可以用如下方式解决:

1.为静态资源指定路径匹配或扩展匹配以重新利用tomcat的default servlet返回静态资源

<!--使用路径匹配规则为整个静态资源目录映射-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping> <!--或者使用扩展名匹配规则-->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>

这种方法不能访问WEB-INF目录下的静态资源,静态资源必须放在web应用的根目录下和WEB-INF目录平级,如上述的static目录。

2.使用spring 3.0.4的新特性,在springmvc.xml中添加<mvc:resource>元素:

<mvc:resources location="/static/js/" mapping="/js/**" />
<mvc:resources location="/WEB-INF/js/" mapping="/js/**" />

这种方式可以引用WEB-INF目录下的静态资源。

3.在Springmvc.xml中配置<mvc:default-serlvet-handler>使用容器的default servlet,该标签只对匹配规则为"/"的DispatcherServlet才生效。Springmvc会将请求转发给default servlet,多一个流程,性能不如方法1。

<mvc:default-servlet-handler default-servlet-name = "default_servlet_name" />  

Servlet路径映射的更多相关文章

  1. Servlet学习笔记(二)之Servlet路径映射配置、Servlet接口、ServletConfig、ServletContext

    Servlet路径映射配置 要使Servlet对象正常的运行,需要进行适当的配置,以告诉Web容器哪个请求调用哪个Servlet对象处理,对Servlet起到一个注册的作用.Servlet的配置信息包 ...

  2. servlet路径映射中的完全路径匹配、目录匹配、扩展名匹配

    在servlet路径映射中,关于url-pattern的配置有三种,分别是完全路径匹配.目录匹配.扩展名匹配 其优先级分别为:完全路径匹配>目录匹配>扩展名匹配: 一.三种路径印射的区别 ...

  3. 001_JavaWeb之Servlet的路径映射问题

    001_JavaWeb之Servlet的路径映射问题 在web.xml中写入: <servlet> <servlet-name>DeleteStudent</servle ...

  4. JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html 一.Servlet映射匹配问题: 在第一篇文章中的 ...

  5. web应用程序servlet的映射名称的规则及请求过程

    首先用MyEclipse创建一个web Project(工程名起为TestServletProject),新建一个Servlet(这里servlet的名字起TestServlet),将请求的servl ...

  6. Servlet学习第一天--Servlet开发映射URL配置

    基础不扎实,从头学,认真记录笔记. 感谢@孤傲苍狼:http://www.cnblogs.com/xdp-gacl/p/3760336.html -为什么要配置? 由于客户端是通过URL访问web服务 ...

  7. (转)JavaWeb学习之Servlet(三)----Servlet的映射匹配问题、线程安全问题

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html 一.Servlet映射匹配问题: 在第一篇文章中的 ...

  8. Spring注解@RequestMapping请求路径映射问题

    @RequestMapping请求路径映射,假设标注在某个controller的类级别上,则表明訪问此类路径下的方法都要加上其配置的路径.最经常使用是标注在方法上.表明哪个详细的方法来接受处理某次请求 ...

  9. Servlet路径跳转2--在servlet当中,跳转到某网页时的路径写法

    课程1-13   http://www.imooc.com/video/5554 Servlet路径跳转: 绝对路径:放在任何地方都对的路径 相对路径:相对于当前资源的路径 两种方法:请求重定向,服务 ...

随机推荐

  1. ecshop点滴记录

    会员中心: 用户中心页面的内容分布在两个模板文件中: user_clips.dwt(包含:欢迎页.我的留言.我的评论.我的标签.收藏商品.缺货登记.添加缺货登 记.我的推荐.单个商品推荐) user_ ...

  2. 手机自动化测试:Appium源码分析之跟踪代码分析八

    手机自动化测试:Appium源码分析之跟踪代码分析八   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家 ...

  3. 4.在浏览器中解析XML

    要在浏览器中解析获取XML数据,一般只需经过两个步骤:第一,将XML文档.XML字符串转化成XMLDoc对象.第二,使用JS操作XMLDoc对象. 3.1 将XML文档或XML字符串转化成XMLDoc ...

  4. PID控制算法研究

    1.matlab模糊控制工具箱:http://blog.csdn.net/gameboy12615/article/details/6367459 2.书籍:先进PID控制MATLAB仿真/刘金琨著 ...

  5. 基于MVC和Bootstrap的权限框架解决方案 二.添加增删改查按钮

    上一期我们已经搭建了框架并且加入了列表的显示, 本期我们来加入增删改查按钮 整体效果如下 HTML部分,在HTML中找到中意的按钮按查看元素,复制HTML代码放入工程中 <a class=&qu ...

  6. PHPCMS笔记第二弹

    熟练地使用PHPCMS可以插入模板,将静态站转变为动态站也更加方便,多加练习还是有好处的 将index.html的头和尾拆分出来,分别放在header.html和footer.html文件夹中,这三个 ...

  7. vue实现简单表格组件

    本来想这一周做一个关于vuex的总结的,但是由于朋友反应说还不知道如何用vue去写一个组件,所以在此写写一篇文章来说明下如何去写vue页面或者组件.vue的核心思想就是组件,什么是组件呢?按照我的理解 ...

  8. Apache Ranger对HDFS的访问权限控制的原理分析(一)

    介绍 Aapche Ranger是以插件的形式集成到HDFS中,由Ranger Admin管理访问策略,Ranger插件定期轮询Admin更新策略到本地,并根据策略信息进行用户访问权限的判定.Rang ...

  9. 前端JS来控制选中的项

    < script type = "text/javascript" > function change(){ document.getElementById(" ...

  10. python3.x元组打印错误 TypeError: unsupported operand type(s) for %: 'NoneType' and 'tuple'

    原创by南山南北秋悲 欢迎引用!请注明原地址:http://www.cnblogs.com/hwd9654/p/5676746.html  谢谢! TypeError: unsupported ope ...