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