• 对于Servlet原理以及Mapping的五种映射和404页面的详解


    一.Servlet原理

    1,浏览器向web容器发送Http请求,我们这里用的web容器为tomcat。
    2.我们在Servlet里的protected void doGet(HttpServletRequest req, HttpServletResponse resp)里写了请求和响应的方法,这里调用Servlet的Serice方法。
    3.访问我们自己写的实现类,重写这些方法。

    • 接受并处理请求。
    • 给出响应的信息。
      4.响应信息发出后,响应个客户端。
      Servlet原理图如下:
      在这里插入图片描述

    二.Mapping运用

    Mapping有好几种用法如下:

    • servlet可以映射一个路径
    • servlet可以映射多个路径
    • servlet可以映射公共路径
    • servlet可以映射默认路径
    • servlet可以映射前缀路径

    2.1 servlet映射一个路径

    url-pattern为路径,servlet-name为对应上面的hello com.gowork.servlet.helloservlet

     <servlet-mapping>
         <servlet-name>helloservlet-name>
         <url-pattern>/hellourl-pattern>
     servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4

    servlet映射一个路径访问效果如下:
    在这里插入图片描述

    2.2 servlet映射多个路径

    这次我们在hello后添加了zhu和zhang,映射的servlet-name还是hello,所以调用的还是之前的那个函数。

    <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hellourl-pattern>
    servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/zhuurl-pattern>
    servlet-mapping>
    
    <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/zhangurl-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    PS:记得重新启动服务器!
    servlet映射多个路径测试效果如下:
    在这里插入图片描述
    可以看到,我们在url指向zhu和zhang,也还是会映射到servlet名称为hello的接口,输出

    Hello,Servlet Shangjin small vegetable pig

    2.3 servlet映射公共路径

    servlet映射公共路径的标志是通配符*

    <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/zhu/*url-pattern>
    servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4

    servlet映射公共路径现在是如上代码,那么先说一下,现在我们写了/zhu/*就代表着
    /zhu可以正常映射,/zhu/1可以正常映射,只要/zhu正确,后面加什么url都是可以正确的映射到hello接口的。

    效果图:
    在这里插入图片描述

    2.4 servlet可以映射默认路径

    映射默认路径顾名思义就是设置一个默认路径,无论我们访问上面url都是映射到对应的接口上,这种方式非常的不推荐,直接写死了。

        <servlet-mapping>
            <servlet-name>helloservlet-name>
            <url-pattern>/*url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4

    servlet可以映射默认路径效果图如下:
    在这里插入图片描述

    2.5 servlet可以映射前缀路径

    映射前缀路径顾名思义就是如果我们的后缀没问题的话,前面写任意的url都是正确的。
    如下代码:

        <servlet-mapping>
            <servlet-name>helloservlet-name>
            <url-pattern>*.zhuurl-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4

    映射前缀路径效果图如下,一看就可以明白。
    在这里插入图片描述
    注意:在*号前不能加路径,否则报错。

    四.Servlet404页面

    1.我们首先创建一个类:

    Errorservlet
    
    • 1

    2.然后继承HttpServlet。

    public class Errorservlet extends HttpServlet
    
    • 1

    3.重写doGet和doPost

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf-8");
            PrintWriter Writer = resp.getWriter();
            Writer.print("

    404

    "
    ); }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.注册error页面

    这里先放一下,之前的hello页面:

    
        <servlet>
            <servlet-name>helloservlet-name>
            <servlet-class>com.gowork.servlet.helloservletservlet-class>
        servlet>
    
        <servlet-mapping>
            <servlet-name>helloservlet-name>
            <url-pattern>/hellourl-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    写一个error,使用映射默认路径,这里存在一个优先级。
    比如说我们在url访问:

    http://localhost:8080/javweb/hello

    是从上到下的顺序,所以先映射到了hello就正常的输出了:

    Hello,Servlet Shangjin small vegetable pig

    如果不是hello的url就走下面的error映射默认路径,出现404。

    
        <servlet>
            <servlet-name>errorservlet-name>
            <servlet-class>com.gowork.servlet.Errorservletservlet-class>
        servlet>
    
        <servlet-mapping>
            <servlet-name>errorservlet-name>
            <url-pattern>/*url-pattern>
        servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    效果图如下:
    在这里插入图片描述
    注意:
    指定了固定的url的优先级要大于映射默认路径。

  • 相关阅读:
    泛微E-Mobile 6.0命令执行漏洞
    PostgreSQL使用MySQL作为外部表(mysql_fdw)
    李宏毅2023机器学习作业HW05解析和代码分享
    git的基本使用
    pdb符号库文件详解
    [附源码]JAVA毕业设计-旅游产品销售管理-演示录像2020(系统+LW)
    MongoDB副本集群搭建和基础配置
    Nacos配置中心动态刷新数据源
    「学习笔记」可持久化线段树
    括号匹配
  • 原文地址:https://blog.csdn.net/weixin_52908342/article/details/126337640