Servlet路径映射

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" />  
时间: 2024-10-24 05:00:39

Servlet路径映射的相关文章

servlet路径映射优先顺序

一个Servlet可以配置多个url-pattern URL 配置格式 三种: 1.完全路径匹配  (以/开始 ) 例如:/hello /init 2.目录匹配 (以/开始) 例如:/*  /abc/* / 代表网站根目录 3.扩展名匹配 (不能以/开始) 例如:*.do *.action 典型错误 /*.do 在浏览器中 访问的优先级顺序为: 优先级:完全匹配>目录匹配 > 扩展名匹配 在优先级相同的情况下,先访问范围更确定的url配置 示例:    Servlet引擎将调用servlet2

001_JavaWeb之Servlet的路径映射问题

001_JavaWeb之Servlet的路径映射问题 在web.xml中写入: <servlet> <servlet-name>DeleteStudent</servlet-name> <servlet-class>com.wh.mvc.DeleteStudent</servlet-class> </servlet> <servlet-mapping> <servlet-name>DeleteStudent&l

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

@RequestMapping请求路径映射,假设标注在某个controller的类级别上,则表明訪问此类路径下的方法都要加上其配置的路径.最经常使用是标注在方法上.表明哪个详细的方法来接受处理某次请求. 下面两种方式都能够从url中传參数,可是另外一种方式的适用性更高一些,当參数中包括中文的时候,假设用第一种方式传參数,常常会出现參数还没到controller就已经经过编码了(比如:经过utf-8编码后,原本要传的參数就会以%+ab...cd这种方式出现),然后controller接受到这种请求

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

首先用MyEclipse创建一个web Project(工程名起为TestServletProject),新建一个Servlet(这里servlet的名字起TestServlet),将请求的servlet映射名称设为/TestServlet,(具体步骤可以查看tomcat上servlet程序的配置与处理servlet请求过程).并在TestServlet的doGet方法中在控制台打印一句“this is TestServlet” jxf.servlet.TestServlet.java 1 pa

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

基础不扎实,从头学,认真记录笔记. 感谢@孤傲苍狼:http://www.cnblogs.com/xdp-gacl/p/3760336.html -为什么要配置? 由于客户端是通过URL访问web服务器的资源,所以servlet要想被外界访问,需要映射到一个url地址上. -如何映射? 这个映射需要在web.xml中使用:<servlet></servlet> 和<servlet-mapping></servlet-mapping> 元素完成. <se

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

[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140529.html 联系方式:[email protected] 一.Servlet映射匹配问题: 在第一篇文章中的第四段(MyEclipse及Tomcat的配置)已经讲到这个知识,现在再细化一下: 由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使

tomcat中虚拟主机 、 web应用 、虚拟路径映射相关问题

1.虚拟主机:tomcat中可以配置管理多个网站,外界在访问这些网站时,并不知道这些网站是运行在同一个tomcat中的,感觉起来就像他们各自运行在各自的虚拟出来的主机中一样,所以将一个网站交给tomcat去管理的过程称为为tomcat配置一台虚拟主机. 2.web应用:一个虚拟主机包含着许多web资源,但这些web资源不能直接交给虚拟主机管理,需要按照 功能将web资源按照一定的目录结构组织成web应用再交给虚拟主机管理. 3.虚拟路径映射:将web应用交给虚拟主机管理,为web应用真实路径配置

ASP.NET MVC 4 (一)路径映射

正如ASP.NET MVC名字所揭示的一样,是以模型-视图-控制设计模式构建在ASP.NET基础之上的WEB应用程序,我们需要创建相应的程序类来协调处理,完成从客户端请求到结果相应的整个过程: VS2012中一个典型的MVC工程结构是这样的: Controllers文件夹下存放控制类,Models文件下是业务数据模型类,Views文件下则是类似于aspx的视图文件.在传统ASP.NET form的应用程序中,客户端的请求最后都映射到磁盘上对应路径的一个aspx的页面文件,而MVC程序中所有的网络

Servlet路径跳转问题

Servlet中路径跳转 相对路径         注意这里的相对含义,相对于谁而言 经过多次试验总结,servlet相对路径跳转相对于servlet配置的xml路径(或servlet3.0注解路径) 如下: //XML文件  <servlet-mapping> <servlet-name>RegServlet</servlet-name> <url-pattern>/servlet/RegServlet</url-pattern> </s