• servlet使用


    概述

    是运行在web服务器上的java程序,用来处理前端(客户端)的响应和请求

    生命周期

    Servlet对象是由tomcat服务器创建的。默认第一次浏览器中输入servlet访问时创建该对象,也可以通过配置服务器一启动就创建对象

    服务器关闭servlet就销毁了

    使用

    方法

    /**
     * 运行一个项目,当开启服务器是都没有执行,输入地址访问,init()service()运行,
     *         刷新一次service执行一次,当关闭服务器tomcat时候,init()service()销毁,destroy执行
     */
    public class DemoServlet implements Servlet {
    
       //servlet对象创建的时候执行(并不是tomcat服务器启动的时候 是在浏览器输入的访问servlet类的时候)
        @Override
        public void init(ServletConfig servletConfig) throws ServletException {
            //ServletConfig参数作用 1、获取配置信息 2、获取xml中的参数 3、获取所有的参数名称 4、获取ServletContext对象
            servletConfig.getServletName();
            servletConfig.getInitParameter("xxx");
            servletConfig.getInitParameterNames();
            servletConfig.getServletContext();
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        //ServletRequest :代表请求 认为ServletRequest 内部封装的是http请求的信息,
        // ServletResponse :代表响应 认为要封装的是响应的信息
        @Override
        public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
    
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
    
        //servlet销毁的时候执行
        @Override
        public void destroy() {
    
        }
    }
    

    配置

    测试

    浏览器输入http://localhost:8080/web02---servlet练习/abc后台就可以看到servlet方法中的内容

    执行过程分析

    配置说明

    url-pattern配置

    缺省的servlet

    可以将url-pattern配置成一个/,代表该servlet是缺省的servlet,当你访问资源地址所有的servlet都不匹配时 , 缺省的servlet负责处理

    全局web.xml

    静态资源加载过程

    3.0时代

    实现

    从servlet3.0开始就可以直接使用注解的方式创建servlet,直接new一个servlet

    //有了这个注解 就不用再写配置文件,括号内容就是地址栏中path后面跟的内容
    
    @WebServlet("/myFirsetServlet")
    public class MyFirsetServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doGet(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.service(req, resp);
        }
    }

    web.xml

    metadata-complete是否扫描注解 true不扫描 false扫描

    
    
      
      market
      
        index.html
        index.htm
        index.jsp
      
    

    内部方法的调用过程

    收到一个servlet请求,tomcat会找到这个servlet对应的service方法,如果没有service方法就会到父类当中去找

    如下源码,内部会把ServletRequest参数转成HttpServletRequest,转换完成后继续调用HttpServletRequest的service方法,根据不同的参数类型调用不同的方法

        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            HttpServletRequest request;
            HttpServletResponse response;
            try {
                request = (HttpServletRequest)req;
                response = (HttpServletResponse)res;
            } catch (ClassCastException var6) {
                throw new ServletException(lStrings.getString("http.non_http"));
            }
    
            this.service(request, response);
        }
    
        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);
            }
    
        }

  • 相关阅读:
    LC-6245. 找出中枢整数(前缀和、二分法、数学)【周赛321】
    88页《Redis学习文档》,从入门到精通,看这一篇就足够
    input标签,新增那些属性
    linux 输出重定向
    每日一个设计模式之【装饰器模式】
    【机器学习】岭回归和LASSO回归详解以及相关计算实例-加利福尼亚的房价数据集、红酒数据集
    冰蝎默认加密的流量解密
    【JVM】垃圾收集算法
    【Java】UWB高精度工业定位系统项目源代码
    细节控有福了!显微镜级别的检测手法
  • 原文地址:https://blog.csdn.net/qq_34491508/article/details/126009642