• Servlet 概述及基础知识


    Servlet

    • 概念:运行在服务器端的小程序

      • Servlet就是一个接口,定义了java类被浏览器访问到(Tomcat识别)的规则
      • 定义一个类,实现Servlet接口,复写方法
    • 快速入门:

      1. 创建JavaEE项目

      2. 定义一个类,实现Servlet接口

      3. 实现接口中的抽象方法

      4. 配置Servlet

        <!--配置servlet-->
            <servlet>
                <servlet-name>demo1</servlet-name>
                <servlet-class>com.cjd.web.servlet.ServletDemo1</servlet-class>
            </servlet>
            <servlet-mapping>
                <servlet-name>demo1</servlet-name>
                <url-pattern>/demo1</url-pattern>
            </servlet-mapping>
        
    • 执行原理

      1. 当服务器接收到客户端浏览器的请求后,会解析请求的URL路径,获取访问的Servlet的资源路径
      2. 查找web.xml文件,是否有对应的标签体内容
      3. 如果有,则找到对应的全类名
      4. Tomcat会将字节码文件加载进内存,并且创建对象
      5. 调用其方法
    • Servlet的生命周期

      1. 被创建:执行init方法,只执行一次

        • Servlet什么时候被创建?

          • 默认情况下,第一次被访问时,Servlet被创建

          • 可以配置执行Servlet的创建时间(在web.xml中配置)

              <servlet>
                    <servlet-name>demo2</servlet-name>
                    <servlet-class>com.cjd.web.servlet.ServletDemo2</servlet-class>
            <!--        指定Servlet的创建时机
                        1.第一次被访问时创建
                            <load-on-startup>的值为负数
                        2.在服务器启动时创建
                            <load-on-startup>的值为0或正数
            -->     
                    <load-on-startup>5</load-on-startup>
               </servlet>
            
        • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的

          • 多个用户同时访问时,可能存在线程安全问题。
          • 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对其修改值
      2. 提供服务:执行service方法,执行多次

        • 每次访问Servlet时,service方法都会被调用一次
      3. 被销毁:执行destroy方法,执行一次

        • Servlet被销毁时执行。服务器关闭时,Servlet被销毁
        • 只有服务器正常关闭时才会执行destroy方法
        • destroy方法在Servlet被销毁之前执行,一般用于释放资源
      public class ServletDemo2 implements Servlet {
      
          /*
           * 初始化方法
           * 当Servlet被创建时,执行。只会执行一次
           * */
          @Override
          public void init(ServletConfig servletConfig) throws ServletException {
      
          }
      
          /*
          * 获取ServletConfig对象
          * ServletConfig:Servlet的配置对象
          * */
          @Override
          public ServletConfig getServletConfig() {
              return null;
          }
      
          /*
          * 提供服务方法
          * 每一次Servlet被访问时,执行,执行多次
          * */
          @Override
          public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
      
          }
      
      
          /*
          * 获取Servlet的一些信息,版本,作者等等。。
          * */
          @Override
          public String getServletInfo() {
              return null;
          }
      
          /*
           * 销毁方法
           * 在服务器正常关闭时,执行,执行一次
           * 非正常关闭不会执行
           * */
          @Override
          public void destroy() {
      
          }
      }
      
    • Servlet3.0

      • 好处
        • 支持注解配置,可以不需要web.xml了。
      • 步骤
        1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
        2. 定义一个类,实现Servlet接口
        3. 复写方法
        4. 在类上使用@webServlet注解,进行配置
          • @WebServlet("资源路径")
    • IDEA与Tomcat的相关配置

      1. IDEA会为每一个Tomcat部署的项目建立一份配置文件
        • 查看控制台的log输出
          Using CATALINA_BASE: "C:Userscjd.IntelliJIdea2019.3system omcatTomcat_9_0_31_web_2"
      2. 工作空间项目 和 Tomcat部署的web项目
        • tomcat真正访问的时“tomcat部署的web项目”,“tomcat部署的web项目”,对应着“工作空间项目”的web目录下的所有资源
        • WEB-INF目录下的资源不能直接被浏览器访问
    • Servlet的体系结构
      ​ Servlet -- 接口
      ​ |继承
      ​ GenericServlet -- 抽象类
      ​ |继承
      ​ HttpServlet -- 抽象类

      • GenericServlet:将Servlet接口中的其他方法做了默认空实现,只讲service()方法作为抽象
        • 定义Servlet类时,可以继承GenericServlet,实现service()方法即可
      • HttpSetvlet:对http协议的一种封装,简化操作
        1. 定义类继承HTTPServlet
        2. 复写doGet或doPost方法
    • Servlet相关配置

      1. urlpattern:Servlet访问路径
        • 一个Servlet可以定义多个访问路径:@WebServlet({"/xx","/xxxx","/xxxxx"})
        • 路径定义规则
          1. /xxx
          2. /xxx/xxx:多层路径,目录结构(路径匹配)
          3. *:通配符,可以是任意路径,优先级比较低
          4. *.xx: *.后面的是后缀名(扩展名匹配)
  • 相关阅读:
    SpringCloud笔记(一)服务注册与发现
    个人备忘录
    ActiveMQ 消息持久化到Mysql数据库
    染色 [组合数 容斥]
    各种图床
    NOIP2012 疫情控制
    网格计数
    找钱 [多重背包 计数]
    序列[势能线段树]
    牛客挑战赛33 B-鸽天的放鸽序列
  • 原文地址:https://www.cnblogs.com/cjdstudy/p/12775748.html
Copyright © 2020-2023  润新知