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

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

jxf.servlet.TestServlet.java

 1 package jxf.servlet;
 2 import java.io.IOException;
 3 import java.util.Date;
 4 import java.io.PrintWriter;
 5 import java.text.SimpleDateFormat;
 6
 7 import javax.servlet.ServletException;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 public class TestServlet extends HttpServlet {
12     public void doGet(HttpServletRequest request, HttpServletResponse response)
13             throws ServletException, IOException {
14         response.getWriter().write(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
15         System.out.println("this is TestServlet");
16     }
17 }

此时打开工程的web.xml配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
 3   <display-name></display-name>
 4   <servlet>
 5     <description>This is the description of my J2EE component</description>
 6     <display-name>This is the display name of my J2EE component</display-name>
 7     <!--3、 servlet的内部名称-->
 8     <servlet-name>TestServlet</servlet-name>
 9     <!--4、 servlet的类全名: 包名+简单类名 -->
10     <servlet-class>jxf.servlet.TestServlet</servlet-class>
11   </servlet>
12   <servlet-mapping>
13     <!--2、 servlet的映射内部名称,通过他可以找到上面的servlet的内部名称-->
14     <servlet-name>TestServlet</servlet-name>
15     <!--1、 请求servlet的映射路径-->
16     <url-pattern>/TestServlet</url-pattern>
17   </servlet-mapping>
18   <welcome-file-list>
19     <welcome-file>index.jsp</welcome-file>
20   </welcome-file-list>
21 </web-app>

将项目部署(在tomcat服务器)好后在浏览器中输入http://localhost:8081/TestServletProject/TestServlet(我的端口为8081),这时候服务器就会先找到TestServletProject工程下的web.xml,然后寻找这一次请求的映射路径/TestServlet,如上图绿色注释部分 根据映射/TestServlet找到注释1,然后找到同级servlet的映射内部名称注释2,在根据映射的内部名称找到servlet的内部名称注释3,最后找到同级的servlet的具体类名注释4,然后服务器在根据反射执行这个类的doGet方法...详细的Servlet请求的整个生命周期就不在这里讨论了。

最终在控制台输出this is TestServlet,并且页面上也显示出当前系统时间,说明该Servlet被请求并执行了。

本文主要介绍 请求servlet的映射路径 的写法:

上面的例子就是一种写法,为精确匹配
如:

/first                     http://localhost:8080/ProjectName/first

/xxx/demoServlet          http://localhost:8080/ProjectName/xxx/demoServlet

还有一种写法是模糊匹配如:

/*                                 http://localhost:8080/ProjectName/任意路径

/test/*                          http://localhost:8080/ProjectName/test/任意路径

*.后缀名                         http://localhost:8080/ProjectName/任意路径.do   如:*.do      *.action        *.html(伪静态)

假如将上面的配置文件

<url-pattern>/TestServlet</url-pattern>改为<url-pattern>/*</url-pattern>

在浏览器地址栏中输入http://localhost:8080/ProjectName/xxxx(任意的请求映射路径/xxxx)一样可以请求到TestServlet.

注意:

1)url-pattern(请求servlet的映射路径)要么以 / 开头,要么以*开头。  例如, 只写test是非法路径。

2)不能同时使用两种模糊匹配,例如 /test/*.do是非法路径

3)当有输入的URL有多个servlet同时被匹配的情况下:

  3.1 精确匹配优先。(长的最像优先被匹配,这里就做不验证了)

  3.2 以后缀名结尾的模糊url-pattern优先级最低

4)虽然能够以/开头(/和/*两种写法是等价的),但是不推荐这种写法。为什么?

注意4解答:

当上面的配置文件<url-pattern>/TestServlet</url-pattern>改为<url-pattern>/*</url-pattern> 以后,我们想要访问项目中默认的静态文件index.html(创建项目后就自动有了),在浏览器中输入http://localhost:8080/ProjectName/index.html,发现请求的结果也是页面输出当前系统时间,控制台也输出this is TestServlet,可见其实最终访问到的是/TestServlet。因为 “请求servlet的映射路径”已经匹配到,服务器就当成是请求该servlet了。所以这里最好不要只写/或/*,因为项目中的其他静态资源都将无法访问到。

可以查看  tomcat根目录/conf/web.xml ,有下面一段代码

<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-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

可以得知,/是servlet中预定义好的一个映射路径:servlet的缺省映射路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个映射路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。

并且通过此我们还可以得出一个结论:先找动态资源,当动态资源不存在的时候,再找静态资源

时间: 2024-10-20 18:52:27

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

spring mvc构建WEB应用程序入门例子

在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请求由DispatcherServlet分配给控制器(根据处理器映射),在控制器完成处理后,请求会被发送到一个视图(根据viewController解析逻辑视图) 来呈现输出结果. 整理成下图所示: 2)搭建一个简单的spring mvc例子 ①创建一个maven工程,其中pom中要有spring相关

Servlet路径映射

Serlvlet路径映射 当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url. 容器默认请求的是一个Servlet,所以不会直接根据路径从文件夹中查找文件,而是先从web.xml中根据<url-pattern>查找对应的Servlet文件,匹配成功后就停止继续匹配:如果没有找到,才会从文件夹中找.都没有,则返回404. 匹配规则 url-pattern匹配规则只有以下五种(*为通配符): ■ 以"/"字符开

构建移动Web应用程序的技术堆栈

编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重要的框架类型,其中每一个可以展开来写一篇文章.这并不是一个广泛的现有产品相比,只是一个笔者最近使用的部分技术. 虽然笔者的重点是移动优先, 笔者认为,这套技术可以应用在一般的web应用程序. 笔者的决定和数据支持考虑了几个要求: 基于JavaScript(CoffeeScript,Dart,绝对值得

Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能

Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能 二.减少 HTTP 的请求数    当用户浏览页面时,如果我们在用户第一次访问时将一些信息一次性加载到客户端缓存,用户访问其他页面时是可以大大提高页面访问速度的,因为每一次发生http请求是要产生服务器开销的,常用的方法有:合并css,js,并作为外部引用,这样就可以减少访问其他页面时再次加载.目前大多数的网站都采用将页面所用到的图片全部放在一张大图上,这样只要访问网站,图片就全部加载到客户端缓存起来了.不过也

ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

原文:ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射 本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义,这个对象是用来将我们的数据持久化到数据库,一般来说,持久化对象中的字段会与数据库中对应的 table 保持一致. 2.视图对象VO(View Object):视图对象 V

【Java Web】把逻辑名映射到servlet文件

Ⅰ.请求URL Ⅱ.容器搜索DD,查找servlet-mapping <?xml version="1.0" encoding="ISO-8859-1" ?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&quo

web学习之servlet

1)web服务软件作用: 把本地资源共享给外部访问 2)tomcat服务器基本操作 : 启动:  %tomcat%/bin/startup.bat 关闭: %tomcat%/bin/shutdown.bat 访问tomcat主页: http://localhost:8080 3)web应用目录结构 |- WebRoot   根目录 |-静态资源(html+css+javascript+images+xml)  可以直接被浏览器访问到的 |-WEB-INF                     

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文件中使