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)

(0)

相关推荐