• servlet相关


    一:概念

    Servlet就是一个接口,定义了java类能被浏览器访问(tomcat识别)的规则,使用时只需实现接口即可(一般继承实现类HttpServlet)

    二:编写一个Servlet

    步骤:

    1. 创建一个webapp项目
      在这里插入图片描述

    2. 需导入有相应jar包

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    1. 实现Servlet接口,继承其实现类HttpServlet即可
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /**
     * @author : liu ming yong
     * @date : 2022/8/30 下午 4:44
     * @description : Servlet类
     */
    public class MyServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter writer = resp.getWriter();
            writer.print("servlet");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    1. 编写Servlet映射
      因为要通过浏览器访问servlet程序,而浏览器需要连接web服务器,所以需要在web服务器中注册我们的servlet程序,还需要给一个浏览器能访问的路径
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                          http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0"
             metadata-complete="true">
        <!--注册servlet-->
        <servlet>
            <servlet-name>myServlet</servlet-name>
            <servlet-class>com.lmy.MyServlet</servlet-class>
        </servlet>
        <!--servlet的请求路径-->
        <servlet-mapping>
            <servlet-name>myServlet</servlet-name>
            <url-pattern>/myServlet</url-pattern>
        </servlet-mapping>
    </web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    1. 配置tomcat
      在这里插入图片描述
      配置项目发布路径:
      在这里插入图片描述
    2. 测试
      在这里插入图片描述

    三:servlet执行原理

    在这里插入图片描述

    (1)浏览器依据ip,port建立与servlet容器(容器同时也是一个简单的web服务器)之间的连接。
    (2)浏览器将请求数据打包(按照http协议,该数据包也称为请求数据包)。
    (3)浏览器发送请求数据包给容器。
    (4)容器收到请求数据包之后,解析该数据包
    (5)将4中解析之后得到的数据封装到request对象上,同时,容器还要创建response对象。
    (6)容器要依据请求资源路径(“/servlet01/myServlet”)找到servlet的配置,然后创建servlet对象。
    (7)容器调用servlet对象的service方法。容器会将事先创建好的request,response作为参数传递给service方法。
    ( 8-10)在service方法里面,可以通过request对象获得请求参数,并进行相应的处理,处理结果会放到response对象里面。
    (11-13)容器从response对象中取出处理结果,然后打包(按照http协议,该数据包称之为响应数据包)。再将响应数据包发送给浏览器。
    (14-15)浏览器收到响应数据包之后,解析处理结果,然后生成相应的页面。

    其实Java Web开发人员需要手动编写代码的部分主要在8-10,因为其他部分工作已被web服务器和开发工具完成。

    四:Mapping路径映射问题

    • 一个servlet可以指定一个映射路径

      <servlet-mapping>
          <servlet-name>myServlet</servlet-name>
          <url-pattern>/myServlet</url-pattern>
      </servlet-mapping>
      
      • 1
      • 2
      • 3
      • 4
    • 一个servlet可以指定多个映射路径

      <servlet-mapping>
          <servlet-name>myServlet</servlet-name>
          <url-pattern>/myServlet</url-pattern>
        </servlet-mapping>
        <servlet-mapping>
          <servlet-name>myServlet</servlet-name>
          <url-pattern>/myServlet1</url-pattern>
      </servlet-mapping>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    • 一个servlet可以指定通用映射路径

      <servlet-mapping>
          <servlet-name>myServlet</servlet-name>
          <url-pattern>/myServlet/*
      
      
      • 1
      • 2
      • 3
      • 4
    • 默认的映射路径

      <servlet-mapping>
          <servlet-name>error</servlet-name>
          <url-pattern>/*
      
      
      • 1
      • 2
      • 3
      • 4
    • 指定后缀或前缀

    <!--自定义后缀实现映射时需注意,*前面不能加其它映射路径-->
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 映射的优先级问题
      指定了固有的映射路径优先级最高,若找不到就会走默认的映射路径

    五:ServletContext(企业开发中一般不用,下面4种用法用Session,Request代替)

    web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用

    • 共享数据(开发中用Session去实现)
      在不同的servlet中可共享获取到彼此保存的数据
      在这里插入图片描述
      保存共享数据:

      package com.lmy;
      
      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      
      /**
       * @author : liu ming yong
       * @date : 2022/9/3 下午 9:02
       * @description : 保存servletContext共享数据
       */
      public class SetServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              // 获取Servlet上下文
              ServletContext context = this.getServletContext();
              // 将数据保存到ServletContext中
              context.setAttribute("username","刘明勇");
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req,resp);
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29

      获取共享数据:

      package com.lmy;
      
      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.PrintWriter;
      
      /**
       * @author : liu ming yong
       * @date : 2022/9/3 下午 10:43
       * @description : 获取servletContext共享数据
       */
      public class GetServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              ServletContext context = this.getServletContext();
              String username = (String) context.getAttribute("username");
      
              resp.setCharacterEncoding("UTF-8");
              resp.setContentType("text/html");
              PrintWriter writer = resp.getWriter();
              writer.write("姓名:"+username);
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33

      配置映射文件:

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                            http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0"
               metadata-complete="true">
      
            <servlet>
                <servlet-name>setServlet</servlet-name>
                <servlet-class>com.lmy.SetServlet</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>setServlet</servlet-name>
                <url-pattern>/setServlet</url-pattern>
            </servlet-mapping>
      
          <servlet>
              <servlet-name>getServlet</servlet-name>
              <servlet-class>com.lmy.GetServlet</servlet-class>
          </servlet>
          <servlet-mapping>
              <servlet-name>getServlet</servlet-name>
              <url-pattern>/getServlet</url-pattern>
          </servlet-mapping>
      
      </web-app>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27

      测试结果:
      在这里插入图片描述

    • 获取初始化参数(开发中一般不用)

      
      <context-param>
          <param-name>urlparam-name>
          <param-value>jdbc:mysql://localhost:3306/dbparam-value>
      context-param>
      
      <servlet>
          <servlet-name>GetServletParamservlet-name>
          <servlet-class>com.lmy.GetServletParamservlet-class>
      servlet>
      <servlet-mapping>
          <servlet-name>GetServletParamservlet-name>
          <url-pattern>/GetServletParamurl-pattern>
      servlet-mapping>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      /**
       * @author : liu ming yong
       * @date : 2022/9/4 下午 10:07
       * @description : 获取初始化参数
       */
      public class GetServletParam extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              ServletContext context = this.getServletContext();
              String url = context.getInitParameter("url");
      
              resp.getWriter().print(url);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14

      测试结果:
      在这里插入图片描述

    • 请求转发(开发中一般用request去实现)

      /**
       * @author : liu ming yong
       * @date : 2022/9/4 下午 10:25
       * @description : 请求转发
       */
      public class ServletDispatcher extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              ServletContext context = this.getServletContext();
              context.getRequestDispatcher("/getServlet").forward(req,resp);
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      <servlet>
            <servlet-name>servletDispatcherservlet-name>
            <servlet-class>com.lmy.ServletDispatcherservlet-class>
      servlet>
      <servlet-mapping>
            <servlet-name>servletDispatcherservlet-name>
            <url-pattern>/servletDispatcherurl-pattern>
      servlet-mapping>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

      测试结果:
      在这里插入图片描述

    • 读取资源文件(开发中一般用类加载或反射去实现)
      maven由于约定大于配置,可能遇到配置文件无法生效的问题,解决办法为:

      
      <build>
         <resources>
             <resource>
                 <directory>src/main/resourcesdirectory>
                 <includes>
                     <include>**/*.propertiesinclude>
                     <include>**/*.xmlinclude>
                 includes>
                 <filtering>truefiltering>
             resource>
             <resource>
                 <directory>src/main/javadirectory>
                 <includes>
                     <include>**/*.propertiesinclude>
                     <include>**/*.xmlinclude>
                 includes>
                 <filtering>truefiltering>
             resource>
         resources>
      build>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

      Properties:

      • 在java目录下新建properties(默认不被识别打包进target,需maven配置build)
      • 在resources目录下新建properties(默认被识别打包进target)

      发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath;
      在这里插入图片描述
      获取配置文件:需要一个文件流;

      username=root
      password=123456
      
      • 1
      • 2
      package com.lmy;
      
      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      import java.io.InputStream;
      import java.util.Properties;
      
      /**
       * @author : liu ming yong
       * @date : 2022/9/4 下午 11:01
       * @description : 获取配置资源
       */
      public class ServletResources extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              ServletContext context = this.getServletContext();
              InputStream stream = context.getResourceAsStream("/WEB-INF/classes/db.properties");
      
              Properties properties = new Properties();
              properties.load(stream);
              String username = (String)properties.get("username");
              String password = (String)properties.get("password");
              resp.getWriter().print(username+":"+password);
      
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36

      测试结果:
      在这里插入图片描述

  • 相关阅读:
    【C++要笑着学】Functor 仿函数 | 模拟实现 stack & queue | 模拟实现优先级队列
    Next.js 热更新 Markdown 文件变更
    大二网页制作实习总结
    文件操作和IO(2):Java中操作文件
    【附源码】计算机毕业设计JAVA传统文化知识竞赛系统
    UVA-1343 旋转游戏 题解答案代码 算法竞赛入门经典第二版
    JumpServer---堡垒机
    4种方法解除ZIP压缩文件的密码保护
    知识图谱实体对齐1:基于平移(translation)嵌入的方法
    【Go 基础篇】Go语言运算符解析:探索数学与逻辑的奥秘与运用
  • 原文地址:https://blog.csdn.net/qq_41863697/article/details/126607825