Servlet虚拟路径映射配置详解
在上⼀篇中我们初识了Servlet,相信⼤家对Servlet也都有了些了解,知道了如何创建⼀个Servlet,并且为其添加虚拟映射,最终发布项⽬,并在浏览器上请求对应的Servlet。
我们知道,只有给Servlet配置好虚拟路径,客户端才可以进⾏访问,但是对于Servlet的路径映射,真的只有现在所知的这么简单么?
答案当时是No了,不然怎么会有这篇⽂章 ,下⾯让我们⼀起来探究其中的秘密吧!
Servlet虚拟路径映射
在l⽂件中,⼀个<servlet-mapping>元素⽤于映射⼀个Servlet的对外访问路径,该路径也称为虚拟路径。例如<url-
pattern>/TestServlet</url-pattern>,其中“/TestServlet”就是⼀个虚拟路径。
1.配置多个映射路径
在上⼀⽂中,我们说到@WebServlet中的urlPatterns属性,其可以是⼀组匹配规则,也就是说⼀个Servl
et是可以配置多个虚拟路径的,也就是Servlet和虚拟路径可以是⼀对多的⼀个关系(并不是多对多,⼀个虚拟路径只能映射⼀个Servlet),其具体实现如下,并修改doPost处的代码:@WebServlet(
description = "My First Servlet",
urlPatterns = { "/HelloServlet", "/StillMe" },
initParams = {
@WebInitParam(name = "name", value = "lizishu")
})
public class HelloServlet extends HttpServlet {
//具体逻辑参看上篇⽂章
//...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置返回客户端的contentType
//text/plain :纯⽂本格式设置为text/html println的换⾏会失效
response.setContentType("text/plain;charset=utf-8");
//response.setCharacterEncoding("utf-8");
PrintWriter out = Writer();
out.println("Served at: " + ContextPath());
String name = InitParameter("name");
servlet和tomcat的关系out.println("name: " + name);
out.println("访问的Servle名为:" + HelloServlet.class);
}
}
u rlPatterns在Servlet 3.0版本之前,都是配置在l中的,每个Servlet会有⼀个对应的<servlet-mapping>标签,其中可以配置多个<url-pattern>。2.urlPatterns匹配规则
说到Servlet虚拟路劲的匹配规则,还需要说到urlPatterns的⼏种匹配规则,主要有以下四种:
精确匹配:也就是我们在上⾯配置的匹配规则,需要完全相等才能匹配成功,这也是我们经常发⽣错误的地⽅,请求Servlet时的⼤⼩写拼写错误导致404;
路径匹配:⽐如想匹配以rest开头的所有请求,可以写成"/rest/*",其格式为以'/‘字符开头,并以'/*'结尾;
扩展名匹配:⽐如想匹配所有以.do结尾的请求,可以写成"*.do",其格式为以'*.',后⾯跟上扩展名;
缺省匹配:映射路径为"/",那么这个Servlet就是当前应⽤的缺省Servlet,默认处理⽆法匹配到虚拟路径的请求。
最后需要注意的是,我们说了上⾯四种匹配规则,尤其是缺省匹配,可以匹配到任意请求,那么⼀个请求如果可以匹配多个Servlet的虚拟路径,那么该执⾏哪个Servlet?其实啊,这些匹配规则是有优先级的,具体的优先级为:精确匹配>路径匹配>扩展名匹配>缺省匹配,Servlet容器会从优先级⾼的虚拟路径开始匹配,匹配到后就会⽴刻将请求交给对应的Servlet来处理,不会再关⼼其他Servlet的虚拟
路径是否会匹配成功。
下⾯我们来⼀组Servlet及其对应的虚拟路径:
urlPatterns Servlet Name
/abc/*Servlet1
/Servlet2
/abc Servlet3
*.do Servlet4
当请求去除上下⽂路径后路径为:"/abc/a.html"时,根据上述规则,会调⽤Servlet1;
请求为:"/abc",根据匹配优先级,会调⽤Servlet3;
请求为:"/abc/a.do",会匹配到'/abc/*'、'*.do',但根据匹配优先级,会调⽤Servlet1;
请求为:"/a.do",会匹配到'/'、'*.do',但根据匹配优先级,会调⽤Servlet4;
3.Tomcat提供的缺省Servlet
为了测试缺省Servlet,我们来进⾏⼀个测试。我们新建个SelfDefaultServlet,其urlPatterns我们配置为"/",其中的⽅法我们不做任何修改。
@WebServlet(
description = "Self create default Servlet",
urlPatterns = { "/" }
)
public class SelfDefaultServlet extends HttpServlet {
//...
}
其实,客户端的每个请求,都是由Servlet容器根据虚拟路径的匹配规则来进⾏处理的,包括静态资源。并且,如果路径输⼊错误(去除了⾃⼰配置的缺省Servlet后),我们常见的下⾯的错误,也是Servlet返回给我们,哈哈,还是很意外?
我们能通过servlet⽅便简单的开发⽹站,是因为我们站在了巨⼈的肩膀上,下⾯我们⼀起来看下Sun公司都为我们开发者提前做了些什么⼯作。Tomcat会为项⽬配置⼀个缺省的Servlet(如果项⽬中⾃⾏配置,则不会⽣效),配置⽂件在tomcat安装⽬录下conf⽬录中的l⽂件中,具体内容如下,缺省的Servlet名为DefaultServlet。
<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除外),如果请求⽂件能到,就会将页⾯通过HttpServletResponse对象以流的⽅式返回给客户端,否则报404错误。
这是什么原因?为什么不是调⽤缺省的servlet了?这是因为tomcat除了缺省Serlvet外,还给我们提供⼀个处理jsp⽂件的Servlet,配置如下,因为后缀匹配的优先级⾼于缺省的Servlet,所以访问JSP的时候需要交由JspServlet来处理(JSP因为可能包含Java代码,所以第⼀次执⾏的时候需要先编译,这个⼯作由JspServlet完成)
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
4.总结
本⽂具体讨论了urlPatterns属性的匹配规则,主要为四种,其优先级也各不相同,我们在使⽤时,也需要根据⾃⼰的需求⾃⼰设定urlPatterns,不过知道了匹配规则,使⽤起来也会⽅便很多,也能帮我们快速的定位错误。
到此这篇关于Servlet虚拟路径映射配置详解的⽂章就介绍到这了,更多相关Servlet 虚拟路径映射内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。