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

jxf.servlet.TestServlet.java

 package jxf.servlet;
import java.io.IOException;
import java.util.Date;
import java.io.PrintWriter;
import java.text.SimpleDateFormat; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().write(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
System.out.println("this is TestServlet");
}
}

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

 <?xml version="1.0" encoding="UTF-8"?>
<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">
<display-name></display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<!--3、 servlet的内部名称-->
<servlet-name>TestServlet</servlet-name>
<!--4、 servlet的类全名: 包名+简单类名 -->
<servlet-class>jxf.servlet.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--2、 servlet的映射内部名称,通过他可以找到上面的servlet的内部名称-->
<servlet-name>TestServlet</servlet-name>
<!--1、 请求servlet的映射路径-->
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</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应用的静态资源文件。

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

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

  1. Linux部署Web应用程序超链接下载中文名称文件404问题解决办法

    Web应用程序目录下有帮助文档,是中文名称的Word文件 超链接内容如下: <a href="jsp/plugin/用户手册.doc">用户手册</a> 开 ...

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

    在使用spring mvc 构建web应用程序之前,需要了解spring mvc 的请求过程是怎样的,然后记录下如何搭建一个超简单的spring mvc例子. 1) spring mvc的请求经历 请 ...

  3. Servlet路径映射

    Serlvlet路径映射 当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url. 容器默认请求的是一个Servlet,所以不会直接根据 ...

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

    编写web应用程序时,有很多的技术决策.笔者最近回来编写现代Web应用程序,并希望总结一些曾经在开发周期过程中做了记录零散的想法.这篇文章是关于一套对笔者最近开发的项目有帮助的框架.笔者重温了一些最重 ...

  5. JSP、ASP、PHP Web应用程序怎么这么多P!

    之前我们说完了计算机网络应用程序的两种结构:C/S,B/S(传送门)今天我们详细说一说B/S开发中的这么多P是干什么的. 1.什么是Web应用程序 一个Web应用程序是由完成特定任务的各种Web组件( ...

  6. 提升 web 应用程序的性能(二)

    最佳实践 本章将略述能帮助您提升 web 应用程序性能的最佳实践. 减少 HTTP 请求数 每个 HTTP 请求都有开销,包括查找 DNS.创建连接及等待响应,因此削减不必要的请求数可减少不必要的开销 ...

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

    Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能 二.减少 HTTP 的请求数    当用户浏览页面时,如果我们在用户第一次访问时将一些信息一次性加载到客户端缓存, ...

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

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

  9. Maven关于web.xml中Servlet和Servlet映射的问题

    在配置Servlet时,有两个地方需要配置. 一个是<servlet>,另一个是<servlet-Mapping>,这两个一个是配置Servlet,一个是配置其映射信息. &l ...

随机推荐

  1. 如何扩展大规模Web网站的性能?

    Reduce Data广告服务网站如何扩展到每天300K QPS请求?分享经验如下: 1. 为大规模设计,广告服务平台从一开始增长就很惊人,因此,系统开始就为大规模设计,系统为水平和垂直伸缩扩展. 2 ...

  2. strcmp函数实现及分析

    最近看C,看到strcmp函数,对它的实现原型不很清楚,于是到网上搜.网上算法一大堆,看了很多代码后自己做了一下总结 strcmp函数是C/C++中基本的函数,它对两个字符串进行比较,然后返回比较结果 ...

  3. Mac下快捷键列表

    主界面 command + tab 切换程序 command + ` 在程序内切换界面 command + w 关闭界面 command + q 关闭程序 command + option + esc ...

  4. JDBC_demo:java连接mysql过程

    1.任何数据库驱动程序都提供对java.sql.Driver接口的驱动类,mysql-connector-java-5.1.39-bin.jar中Driver: package com.mysql.j ...

  5. Linux安装Git

    (1)下载git压缩文件,使用当前的用户yum安装git,先下载再安装,其中有一次需要输入Y sudo yum install git-all 服务器回应,其实除了安装git之外,也会安装其他需要的依 ...

  6. Centos系统python2.x升级python3.x

    1. Centos7初始安装的python版本为2.7.5 2.下载最新的python3.5.2,解压到/usr/local/src 3. 配置.编译.测试.安装(根据软件的README说明) ./c ...

  7. Java和Tomcat类加载机制

    转自:http://blog.csdn.net/codolio/article/details/5027423 加载类是运行程序的基础,了解Java和Tomcat的类加载机制对更有效地开发.调试Web ...

  8. android中数据存储

    android中数据存储     Android 中存储数据的方式有五种:SQLite数据库.文件存储.内容提供者.网络.SharedPreferences(Key----value)五种存储方式. ...

  9. android 75 新闻列表页面

    new.xml <?xml version="1.0" encoding="UTF-8" ?> <newslist> <news& ...

  10. System Operations on AWS - Lab 5W - Managing Resources (Windows)

    登陆到CommandHost实例,通过AWS CLI来管理各个资源 1. 通过Tags来管理资源 1.1 登陆到CommandHost实例 1.2 找出development实例 1.2.1 打开Po ...