zoukankan      html  css  js  c++  java
  • Java Servlet详解(体系结构+注解配置+生命周期)

    Java Servlet详解(注解配置+生命周期)

    什么是Servlet : (Server applet)?

    顾名思义:服务端的小程序
    Servlet只是一个接口,定义了Java被浏览器访问到(Tomcat)的识别规则,我们需要定义一个类来实现Servlet接口

    创建一个项目流程

    1.创建一个JavaEE项目
    2.定义一个类实习Servlet方法
    3.实现接口中的抽象方法

    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import java.io.IOException;
    public class Servlet implements javax.servlet.Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("初始化");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("访问");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
            System.out.println("关闭");
        }
    }
    
    

    4.在WEB.XML中配置Servelt

    在这里插入图片描述

    <?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_3_1.xsd"
             version="3.1">
        <servlet>
            <servlet-name>demo1</servlet-name>
            <servlet-class>Servlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>demo1</servlet-name>
            <url-pattern>/demo1</url-pattern>
        </servlet-mapping>
    </web-app>
    

    结果

    在这里插入图片描述
    在这里插入图片描述

    执行原理加图解

    1.当服务器接受到服务器请求的时候,会先解析浏览器的UPL地址,获取访问服务的路径
    2.然后查找WEB.xml文件,查看是否有对应的标签体的内容
    3.如果有,则找到对应的全类名
    4.tomcat会将字节码文件加载进内存,并且创建其对象
    5.调用其方法

    在这里插入图片描述

    Servlet的生命周期

    1.被创建:执行init方法只执行一次
    Servlet什么时候创建?
    默认情况:在第一次被访问的时候创建
    可以在配置执行Servlet的创建时机
    标签下配置

    1. 第一次被访问时,创建
      的值为负数
    2. 在服务器启动时,创建
      的值为0或正整数

    注意

    • Servlet的init方法,只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
    • 多个用户同时访问时,可能存在线程安全问题。
    • 解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值

    2. 提供服务:执行service方法,执行多次
    * 每次访问Servlet时,Service方法都会被调用一次。
    3. 被销毁:执行destroy方法,只执行一次
    * Servlet被销毁时执行。服务器关闭时,Servlet被销毁
    * 只有服务器正常关闭时,才会执行destroy方法。
    * destroy方法在Servlet被销毁之前执行,一般用于释放资源

    Servlet3.0

    好处:支持注解配置,不需要使用web.xml了
    步骤:
    1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
    2. 定义一个类,实现Servlet接口
    3. 复写方法
    4. 在类上使用@WebServlet注解,进行配置

    * @WebServlet("资源路径")
    
    
    				@Target({ElementType.TYPE})
    				@Retention(RetentionPolicy.RUNTIME)
    				@Documented
    				public @interface WebServlet {
    				    String name() default "";//相当于<Servlet-name>
    				
    				    String[] value() default {};//代表urlPatterns()属性配置
    				
    				    String[] urlPatterns() default {};//相当于<url-pattern>
    				
    				    int loadOnStartup() default -1;//相当于<load-on-startup>
    				
    				    WebInitParam[] initParams() default {};
    				
    				    boolean asyncSupported() default false;
    				
    				    String smallIcon() default "";
    				
    				    String largeIcon() default "";
    				
    				    String description() default "";
    				
    				    String displayName() default "";
    				}
    

    代码

    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebServlet;
    import java.io.IOException;
    @WebServlet("/demo1")
    public class Servlet implements javax.servlet.Servlet {
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            System.out.println("初始化");
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
            System.out.println("访问");
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        @Override
        public void destroy() {
            System.out.println("关闭");
        }
    }
    

    相比于之前更加简洁,使用更加方便

    在这里插入图片描述
    在这里插入图片描述

    IDEA中Tomcat的相关配置

    1. IDEA会为每一个tomcat部署的项目单独建立一份配置文件
    * 查看控制台的log:Using CATALINA_BASE: "C:Users86151.IntelliJIdea2017.3system omcatTomcat_8_5_31_CSDNWeb"
    地址来源
    在这里插入图片描述

    2. 工作空间项目和tomcat部署的web项目
    * tomcat真正访问的是“tomcat部署的web项目”,"tomcat部署的web项目"对应着"工作空间项目" 的web目录下的所有资源
    * WEB-INF目录下的资源不能被浏览器直接访问。
    3. 断点调试:使用"小虫子"启动 dubug 启动

    Servlet的体系结构

    在这里插入图片描述GenericServlet
    将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
    将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

    HttpServlet
    对http协议的一种封装,简化操作
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String method = req.getMethod();
            long lastModified;
            if (method.equals("GET")) {
                lastModified = this.getLastModified(req);
                if (lastModified == -1L) {
                    this.doGet(req, resp);
                } else {
                    long ifModifiedSince;
                    try {
                        ifModifiedSince = req.getDateHeader("If-Modified-Since");
                    } catch (IllegalArgumentException var9) {
                        ifModifiedSince = -1L;
                    }
    
                    if (ifModifiedSince < lastModified / 1000L * 1000L) {
                        this.maybeSetLastModified(resp, lastModified);
                        this.doGet(req, resp);
                    } else {
                        resp.setStatus(304);
                    }
                }
            } else if (method.equals("HEAD")) {
                lastModified = this.getLastModified(req);
                this.maybeSetLastModified(resp, lastModified);
                this.doHead(req, resp);
            } else if (method.equals("POST")) {
                this.doPost(req, resp);
            } else if (method.equals("PUT")) {
                this.doPut(req, resp);
            } else if (method.equals("DELETE")) {
                this.doDelete(req, resp);
            } else if (method.equals("OPTIONS")) {
                this.doOptions(req, resp);
            } else if (method.equals("TRACE")) {
                this.doTrace(req, resp);
            } else {
                String errMsg = lStrings.getString("http.method_not_implemented");
                Object[] errArgs = new Object[]{method};
                errMsg = MessageFormat.format(errMsg, errArgs);
                resp.sendError(501, errMsg);
            }
        }
    

    ** Servlet相关配置**
    1. urlpartten:Servlet访问路径
    1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
    2. 路径定义规则:
    1. /xxx:路径匹配
    2. /xxx/xxx:多层路径,目录结构
    3. *.do:扩展名匹配

    以上就是Tomcat与Servlet的一些基础知识,喜欢我的可以关注收藏,我会经常更新文章

    在这里插入图片描述

  • 相关阅读:
    LeetCode 81 Search in Rotated Sorted Array II(循环有序数组中的查找问题)
    LeetCode 80 Remove Duplicates from Sorted Array II(移除数组中出现两次以上的元素)
    LeetCode 79 Word Search(单词查找)
    LeetCode 78 Subsets (所有子集)
    LeetCode 77 Combinations(排列组合)
    LeetCode 50 Pow(x, n) (实现幂运算)
    LeetCode 49 Group Anagrams(字符串分组)
    LeetCode 48 Rotate Image(2D图像旋转问题)
    LeetCode 47 Permutations II(全排列)
    LeetCode 46 Permutations(全排列问题)
  • 原文地址:https://www.cnblogs.com/pjhaymy/p/13396936.html
Copyright © 2011-2022 走看看