• 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的一些基础知识,喜欢我的可以关注收藏,我会经常更新文章

    在这里插入图片描述

  • 相关阅读:
    翻译:实时通信协议UDP-RT——Michael Pan
    翻译:为DAW优化Windows
    翻译:Windows and Real-Time——Daniel Terhell
    笔记4:IIS6发布网站后“对XX路径的访问被拒绝”
    杂记3:VS使用Web Deploy一键发布网站到服务器
    杂记2:VS2013创建Windows服务实现自动发送邮件
    杂记1:不安装Oracle客户端远程连接Oracle的方法
    DevExpress随笔系列
    DevExpress(5): ASPxUploadControl上传照片后用ASPxBinaryImage展示
    DevExpress(4): ASPxGridView随笔
  • 原文地址:https://www.cnblogs.com/pjhaymy/p/13396936.html
Copyright © 2020-2023  润新知