Java|servlet关于url-pattern路径匹配的问题
1 前言关于servlet的路径映射有三种配置方法,通过配置xml文件中的url-pattern来实现,其按优先级排序分别为:完全路径匹配、目录匹配、扩展名匹配。本文小编将详细介绍这三种匹配方式。2 完全路径匹配完全路径匹配也叫模式匹配。相当于是把路径写死,所以其匹配是最精确的,优先级也是最高的。例如:Servlet中的代码为:import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException; public class AServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("AServlet is called"); }}Xml文件中Url-pattern配置为: <servlet> <servlet-name>aServlet</servlet-name> <servlet-class>AServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>aServlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping>访问结果为:
图2.1完全路径匹配访问结果3 目录匹配目录匹配也叫通配符匹配,就是路径中用*代替。但是与正则表达式不同,所以不能想当然的用正则表达式来进行匹配。其用法如下:Servlet中代码与前面的一致,这里就不过多展示了。Url-pattern配置代码为: <servlet> <servlet-name>bServlet</servlet-name> <servlet-class>BServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>bServlet</servlet-name> <url-pattern>/aaa/*</url-pattern> </servlet-mapping>其访问结果为:
图3.1路径匹配访问结果4 扩展名匹配扩展名匹配就是只匹配路径中的扩展名,文件名用*代替,比如*.jsp、*.do。但是值得注意的是,扩展名匹配不能与其他匹配方式混用,只能以*开头,不能以开头。所以像“/aaa/*.do”这种是不可用的,程序会直接报错。Url-pattern配置代码为: <servlet> <servlet-name>cServlet</servlet-name> <servlet-class>CServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>访问结果为:
图4.1扩展名匹配访问结果5 匹配优先级展示有了三种匹配方式后,可以测试下它们的优先级。小编这里的三种配置代码为: <servlet> <servlet-name>aServlet</servlet-name> <servlet-class>AServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>aServlet</servlet-name> <url-pattern>/aaa</url-pattern> </servlet-mapping> <servlet> <servlet-name>bServlet</servlet-name> <servlet-class>BServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>bServlet</servlet-name> <url-pattern>/aaa/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>cServlet</servlet-name> <servlet-class>CServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>然后用以下路径访问:/aaa/a.do/aaa/bbb/aaa/a.do/ccc/a.do经过测试后,访问结果如下:AServlet is calledCServlet is calledBServlet is calledBServlet is calledCServlet is called5 结语以上就是小编所要分享的关于servlet路径匹配的问题。提到servlet,在web程序中常常还会有filter过滤器,这是新版servlet增加的功能,其中过滤用户访问路径的规则与servlet匹配路径的规则相似。但是两者的匹配规则又不完全相同,大家可以去试一下,看看有何不同。实习编辑:刘凤莲稿件来源:深度学习与文旅应用实验室(DLETA)