分享

Java|servlet关于url-pattern路径匹配的问题

 算法与编程之美 2021-01-02
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 called
CServlet  is called
BServlet  is called
BServlet  is called
CServlet  is called
5 结语
以上就是小编所要分享的关于servlet路径匹配的问题。提到servlet,在web程序中常常还会有filter过滤器,这是新版servlet增加的功能,其中过滤用户访问路径的规则与servlet匹配路径的规则相似。但是两者的匹配规则又不完全相同,大家可以去试一下,看看有何不同。



实习编辑:刘凤莲
稿件来源:深度学习与文旅应用实验室(DLETA)

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多