Servlet虚拟路径的映射
在web.xml文件中,一个<servlert-mapping>元素用于映射一个Servlet的对外访问路径,该路径也称为虚拟路径。例如,在4.1.2小节中,HelloWorldServlet所映射的虚拟路径为“/HelloWorldServlet”。创建好的Servlet只有映射成虚拟路径,客户端才能对其进行访问。但是,在映射Servlet时,有一些细节问题需要注意,比如Servlet的多重映射、在映射路径中使用通配符、配置缺省的Servlet等,接下来,针对这些问题进行详细地讲解,具体如下:
一、Servlet的多重映射
Servlet的多重映射指的是同一个Servlet可以被映射成多个虚拟路径。也就是说,客户端可以通过多个路径实现对同一个Servlet的访问。Servlet多重映射的实现方式有两种,具体如下:
1、配置多个<servlet-mapping>元素。
<servlet>
<servlet-name>TestServlet01</servlet-name>
<servlet-class>cn.itcast.chapter04.servlet.TestServlet01</servlet-class>
</servlet>
<servlet-mapping>
<!--映射为TestServlet01-->
<servlet-name> TestServlet01</servlet-name>
<url-pattern>/TestServlet01</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--映射为Test01-->
<servlet-name>TestServlet01</servlet-name>
<url-pattern>/Test01</url-pattern>
</servlet-mapping>
重启Tomcat服务器,在浏览器的地址栏中输入URL地址http://localhost:8080/chapter04/TestServlet01
访问TestServlet01,浏览器显示的结果如图1所示。
图1 运行结果
在浏览器的地址栏中输入URL地址http://localhost:8080/chapter04/Test01
访问TestServlet01,浏览器显示的结果如图2所示。
图2 运行结果
通过图1和图2的比较,发现使用两个URL地址都可以正常访问TestServlet01。由此可见,通过配置多个<servlet-mapping>元素可以实现Servlet的多重映射。
2、在一个<servlet-mapping>元素下配置多个<url-pattern>子元素。同样以TestServlet01为例,在web.xml文件中对TestServlet01虚拟路径的映射进行修改,修改后的代码如下所示:
<servlet>
<servlet-name>TestServlet01</servlet-name>
<servlet-class>cn.itcast.chapter04.servlet.TestServlet01</servlet-class>
</servlet>
<servlet-mapping>
<!--映射为TestServlet01和Test02-->
<servlet-name>TestServlet01</servlet-name>
<url-pattern>/TestServlet01</url-pattern>
<url-pattern>/Test02</url-pattern>
</servlet-mapping>
重启Tomcat服务器,在浏览器的地址栏中输入URL地址http://localhost:8080/chapter04/Test01
访问TestServlet01,浏览器显示的结果如图3所示。
图3 运行结果
在浏览器的地址栏中输入URL地址http://localhost:8080/chapter04/Test02
访问TestServlet01,浏览器显示的结果如图4所示。
图4 运行结果
通过图3和图4的比较,发现使用两个URL地址都可以正常访问TestServlet01。由此可见,在一个<servlet-mapping>元素下配置多个<url-pattern>子元素同样可以实现Servlet的多重映射。
二、Servlet映射路径中使用通配符
有时候,我们希望某个目录下的所有路径都可以访问同一个Servlet,这时,可以在Servlet映射的路径中使用通配符“*”。通配符的格式只有两种,具体如下:
1)格式为“.扩展名”,例如“.do”匹配以“.do”结尾的所有URL地址。
2)格式为“/”,例如“/abc/”匹配以“/abc”开始的所有URL地址。
需要注意的是,这两种通配符的格式不能混合使用,例如,/abc/*.do就是不合法的映射路径。另外,当客户端访问一个Servlet时,如果请求的URL地址能够匹配多个虚拟路径,那么Tomcat将采取最具体匹配原则查找与请求URL最接近的虚拟映射路径。例如,对于如下所示的一些映射关系:
● /abc/* 映射到Servlet1
● /* 映射到Servlet2
● /abc 映射到Servlet3
● *.do 映射到Servlet4
将发生如下一些行为:
● 当请求URL为“/abc/a.html”,“/abc/”和“/”都可以匹配这个URL,Tomcat会调用Servlet1
● 当请求URL为“/abc”,“/abc/*”和“/abc”都可以匹配这个URL,Tomcat会调用Servlet3
● 当请求URL为“/abc/a.do”,“.do”和“/abc/”都可以匹配这个URL,Tomcat会调用Servlet1
● 当请求URL为“/a.do”,“/”和“.do”都可以匹配这个URL,Tomcat会调用Servlet2
● 当请求URL为“/xxx/yyy/a.do”,“.do”和“/”都可以匹配这个URL,Tomcat会调用Servlet2
三、缺省Servlet
如果某个Servlet的映射路径仅仅是一个正斜线(/),那么这个Servlet就是当前Web应用的缺省Servlet。Servlet服务器在接收到访问请求时,如果在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,就会将访问请求交给缺省Servlet处理,也就是说,缺省Servlet用于处理其他Servlet都不处理的访问请求。接下来对上一小节的TestServlet01进行修改,将其设置为缺省的Servlet,具体如下:
<servlet>
<servlet-name>TestServlet01</servlet-name>
<servlet-class>cn.itcast.chapter04.servlet. TestServlet01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet01</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
启动Tomcat服务器,在浏览器的地址栏中输入任意的URL地址http://localhost:8080/chapter04/abcde
,浏览器显示的结果如图5所示。
图5 运行结果
从图5中可以看出,当URL地址和TestServlet01的虚拟路径不匹配时,浏览器仍然可以正常访问TestServlet01。
值得一提的是,在Tomcat安装目录下的web.xml文件中也配置了一个缺省的Servlet,配置信息如下所示:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在上面的配置信息中,org.apache.catalina.servlets.DefaultServlet被设置为缺省的Servlet,它对Tomcat服务器上所有Web应用都起作用。当Tomcat服务器中的某个Web应用没有缺省Servlet时,都会将DefaultServlet作为默认缺省的Servlet。需要注意的是,当客户端访问Tomcat服务器中的某个静态HTML文件时,DefaultServlet会判断HTML是否存在,如果存在,就回将数据以流的形式回送给客户端,否则会报告404错误。