Servlet的一些细节(1)
1. Servlet程序必须映射到一个URL地址
由于客户端是通过URL访问web服务器资源,所以Servlet程序必须映射到一个URL地址。这个工作在web.xml文件中使用<servlet>元素和<servlet-maping>元素完成
<servlet>用于注册Servlet,<servlet-name>和<servlet-Class>分别用于设置Servlet的注册名称和完整类名
一个<servlet-maping>元素用于映射一个已经注册的Servlet的一个对外访问路径,子元素<servlet-name>和<url-pattern>分别指定Servlet的注册名称和对外访问路径
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>ServletDemo</servlet-name> <servlet-class>cn.school.ServletDemo</servlet-class> </servlet> <servlet> <servlet-name>ServletDemo2</servlet-name> <servlet-class>cn.school.ServletDemo2</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/ServletDemo</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo2</servlet-name> <url-pattern>/servlet/ServletDemo2</url-pattern> </servlet-mapping> </web-app>
对于第一个程序,使用http://localhost:8080/D623/ServletDemo
对于第二个程序, 使用http://localhost:8080/D623/servlet/ServletDemo2
2. 同一个Servlet可以被映射到多个URL地址上去
即是一个Servlet注册名可以对应多个<servlet-mapping>元素
也就是说可以有多个地址访问同一个Servlet程序
<servlet> <servlet-name>ServletDemo</servlet-name> <servlet-class>cn.school.ServletDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/my1/ServletDemo</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/my2/ServletDemo</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/my3.html</url-pattern> </servlet-mapping>
注意最后一个访问地址是http://localhost:8080/D623/my3.html
在地址栏中出现这样的地址看起来好像是一个静态页面,其实Selvlet是动态页面,这就是常说的伪静态
3. Servlet映射地址可以使用* 通配符
但只有两种固定格式
*.扩展名 或者 以 /* 结尾
<servlet> <servlet-name>ServletDemo</servlet-name> <servlet-class>cn.school.ServletDemo</servlet-class> </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/ServletDemo</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>*.dd</url-pattern> </servlet-mapping>
通配符的意思是可以输入任何字符
注意一点,当修改web.xml时,不需要重新生成web应用,web服务器会自动监测web.xml的改动
Tomcat服务器的conf文件夹下context.xml文件有一句
<WatchedResource>WEB-INF/web.xml</WatchedResource>
4. 最先匹配最像的路径
如下映射关系
Servlet1 映射到 /abc/*
Servlet2 映射到 /*
Servlet3 映射到 /abc
Servlet4 映射到 *.do
当请求URL为 /abc/a.html 时,匹配Servlet1
当请求URL为 /abc 时,匹配Servlet3
当请求URL为/abc/a.do 时,匹配Servlet1 (*在前面的方式优先级最低)
当请求URL为 /a.do 时 匹配Servlet2