zoukankan      html  css  js  c++  java
  • Servlet

    一 Servlet简介

    Servlet是JavaWeb三大组件之一 运行在服务器上的小程序

    Servlet是一个接口 定义了Java类被服务器(Tomcat等等)识别的规则

    二 新建一个Servlet

    1. 新建一个Web项目

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

    /**
     * Servlet快速入门
     * Created by Hy on 2020/6/29.
     */
    public class ServletDemo1 implements Servlet {
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {}
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("hello world");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {}
    }

    3. 配置Servlet web.xml

    <?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">
    
        <!-- 配置Servlet -->
        <servlet>
            <servlet-name>demo1</servlet-name>
            <servlet-class>com.hy.servlet.ServletDemo1</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>demo1</servlet-name>
            <url-pattern>/demo1</url-pattern>
        </servlet-mapping>
    </web-app>

    启动项目 访问 http://localhost:8080/demo1

    三 Servlet执行原理

    浏览器输入地址 -> 找到对应主机对应端口对应项目对应资源名称 -> 服务器检索web.xml -> 根据servlet-mapping匹配servlet -> 服务器将全类名对应的字节码文件加载进内存 创建实例 调用service()

    四 Servlet生命周期

    /**
     * Servlet生命周期
     * Created by Hy on 2020/6/29.
     */
    public class ServletDemo2 implements Servlet {
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            // 生命周期方法 创建
            // 在Servlet被创建时执行 只会执行一次
            System.out.println("init()");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            // 获取Servlet的配置对象
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            // 生命周期方法 提供服务
            // 每一次Servlet被访问时执行 执行多次
            System.out.println("service()");
        }
    
        @Override
        public String getServletInfo() {
            // 获取Servlet的一些信息 比如版本 作者等等
            return null;
        }
    
        @Override
        public void destroy() {
            // 生命周期方法 销毁
            // 在服务器正常关闭时执行 只会执行一次
            System.out.println("destroy()");
        }
    
    }

    1. 被创建 执行init() 只会执行一次

    Servlet在内存中只存在一个实例 Servlet是单例的

    当多个用户同时访问时 可能存在线程安全问题 所以尽量不要在Servlet中定义需要修改的成员变量

    Servlet默认情况下 第一次被访问时创建 可以配置Servlet创建时机 web.xml

    <?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">
    
        <servlet>
            <servlet-name>demo2</servlet-name>
            <servlet-class>com.hy.servlet.ServletDemo2</servlet-class>
            <!-- 配置Servlet创建时机
                    1. 第一次被访问时创建 值为负数
                    2. 在服务器启动时创建 值为0或正数 -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>demo2</servlet-name>
            <url-pattern>/demo2</url-pattern>
        </servlet-mapping>
    </web-app>

    2. 提供服务 执行service() 执行多次

    每次访问Servlet时 service()都会被调用一次

    3. 被销毁 执行destroy() 只会执行一次

    Servlet被销毁前执行 服务器正常关闭时 Servlet被销毁

    五 Servlet3.0注解

    使用注解代替web.xml配置

    /**
     * Servlet3.0注解 路径定义规则
     * 1. /xxx 路径匹配
     * 2. /xxx/xxx 多层路径 目录结构
     * 3. *.do 扩展名匹配
     * 注意: *是匹配所有 但是优先级最低
     * Created by Hy on 2020/6/29.
     */
    //@WebServlet("/demo3") //路径匹配
    //@WebServlet(urlPatterns = "/demo3", loadOnStartup = 1) //路径匹配 配置Servlet创建时机
    //@WebServlet({"/demo3", "/d3"}) //一个Servlet可以定义多个访问路径
    @WebServlet({"/demo3", "/d3", "/user/d", "/abc/*", "*.do"})
    public class ServletDemo3 implements Servlet {
    
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("init...");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("service...");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
            System.out.println("destroy...");
        }
    }

    六 Servlet体系结构

  • 相关阅读:
    Vue 使用Scss,深度修改局部样式
    Sublime Text 插件:批量删除空白行
    Sublime Text 3前端开发常用优秀插件介绍
    常用的sublime text 3插件(很爽哦)
    20 个强大的 Sublime Text 插件
    Java多线程之synchronized详解
    进阶Java多线程
    初识Java多线程
    分布式锁实现的正确打开方式
    分布式session实现方式
  • 原文地址:https://www.cnblogs.com/huangyi-427/p/13208159.html
Copyright © 2011-2022 走看看