首先用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. calabash-android Win10 入门笔记

    参考官方文档:https://developer.xamarin.com/guides/testcloud/calabash/   概述     Calabash是一个BDD的UI自动化验收测试框架, ...

  2. Nido.Common.Utilities.MD5类

    using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Sec ...

  3. NHibernate加载DLL错误

    这几天在开发关于Rest的服务,其中用到了NHibernate来进行数据库交互,突然有一天发现了一个错误,如下: Could not load file or assembly 'NHibernate ...

  4. 升级到 ExtJS 5的过程记录

    升级到 ExtJS 5的过程记录   最近为公司的一个项目创建了一个 ExtJS 5 的分支,顺便记录一下升级到 ExtJS 5 所遇到的问题以及填掉的坑.由于 Sencha Cmd 的 sencha ...

  5. Naive and Silly Muggles

    Problem Description Three wizards are doing a experiment. To avoid from bothering, a special magic i ...

  6. struts1与strut2的区别

    struts1和struts2是两个完全不同的框架 struts1工作流程:发布Struts Web服务时,根据web.xml初始化ActionServlet,ActionContext等内容.在接到 ...

  7. SqlCommand对象

    SqlCommand对象以及如何使用它与数据库交互 1.什么是command对象2.如何使用ExecuteReader方法查询数据3.如何使用ExecuteNonQuery方法插入和删除对象4.如何使 ...

  8. iOS中SQLite知识点总结1

    数据库(SQLite) 01-数据库简介 1.什么是数据库 数据库(Database)是按照数据结构来组织,存储和管理数据的仓库 2.数据库的分类 关系型数据库(主流) PC端:Oracle/MySQ ...

  9. SUSE Linux实现局域网时间同步

    0.前言     需求是这么来的,搭建了Storm集群进行协同过滤算法的计算性能测试,要求精度在毫秒(ms)级别.局域网内40个虚拟机节点,用 date 命令,精度上和效率上都不可行.所以,就搭建了 ...

  10. notepad++下载Subversion插件,显示intalltion of subversion failed

    notepad++安卓subversion的插件不成功,是因为我们下载TortoiseSVN客户端的版本跟subversion的版本不兼容 一.背景: 在新浪云平台上开发微信公众账号,因为要使用SVN ...