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:\Users\cjd.IntelliJIdea2019.3\system\tomcat\Tomcat_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: *.后面的是后缀名(扩展名匹配)
posted @ 2020-04-25 22:19  cjd  阅读(173)  评论(0编辑  收藏  举报