servlet的注册和映射Servlet程序需要在web.xml中注册和映射,才可以被Servlet引擎加载和被外界访问,通常存
servlet的注册和映射
Servlet程序需要在web.xml中注册和映射,才可以被Servlet引擎加载和被外界访问,通常
存储在<WEB应用程序目录>\WEB-INF\class目录中。
1. Servlet注册
<web-app> ... <servlet> <servlet-name>nameToRegister</servlet-name> <servlet-class>com.john.Threaten</servlet-class> </servlet> ...</web-app>
servlet-name是注册到引擎的servlet名称,需要符合规范(可以包含空格)且唯一。
servlet-class是servlet类的全限定名,就是把包名带上。
2. Servlet映射
<web-app> ... <servlet-mapping> <servlet-name>nameToRegister</servlet-name> <url-pattern>/myservlet</url-pattern> </servlet-mapping> ...</web-app>
servlet-name是已经注册的servlet名称。
url-pattern是映射的路径,可以使用*通配符,但是只能有两种固定的格式,且不能混合使用:
a. *.扩展名
b. 斜杠(/)开头并以(/*)结尾
请求的路径符合该pattern就会调用servlet-name指定的servlet处理。
3. servlet和url-pattern的关联
servlet是唯一的,多个不同的url-pattern可以映射到同一个servlet上:
<web-app> ... <servlet-mapping> <servlet-name>nameToRegister</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>nameToRegister</servlet-name> <url-pattern>/treaty/*</url-pattern> </servlet-mapping> ...</web-app>
url符合*.do或者/treaty/*都会映射到注册名为nameToRegister的servlet上。
4. 映射优先级
a. io文件和映射
<servlet-mapping> <servlet-name>nameToRegister</servlet-name> <url-pattern>/test/myservlet.html</url-pattern></servlet-mapping>
在test目录下有myservlet.html文件,那么servlet引擎是调用这个html文件还是nameToRegister呢?
答案是后者
b. 多个映射之间
有以下按照优先级从高到低的映射:
/theatre/* 映射到 ServletA
/* 映射到 ServletB
/theatre 映射到 ServletC
*.do 映射到 ServletD
当请求URL为"theatre/retreat.html"时, /theatre/*和/*都可以匹配,Servlet引擎将调用ServletA
当请求URL为"/theatre"时,"/theatre/*"和”/theatre"都可以匹配这个URL,Servlet引擎将调用ServletC
当请求URL为"/theatre/retreat.do"时,"/theatre/*"和"*.do"都可以匹配这个URL,Servlet引擎将调用ServletA
当请求URL为"/retreat.do"时,"/*"和"*.do"都可以匹配这个URL,Servlet引擎将调用ServletB
当请求URL为"/cheat/wheat/retreat.do"时,"/*"和"*.do"都可以匹配这个URL,Servlet引擎将调用ServletB
可以看出,匹配是按照最相符以及优先级原则