zoukankan      html  css  js  c++  java
  • 02-servlet基本介绍访问流程生命周期Service、doGet、doPost

    一、servlet的基本介绍

    • 是一种Web服务端编程技术
    • 是实现了特殊接口(HttpServlet)的Java类
    • 由支持Servlet的Web服务器(Tomcat)调用和启动运行
    • 一个Servlet负责对应的一个或一组URL访问请求,并返回相应的相应内容

    现在对于服务器运行代码有了一些认知

    现在知道只要写一个MyServlet一个java类 集成一个抽象类之后,实现代码就能完成请求响应的一个逻辑

    package xyz.kxq;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class MyServlet 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);
            resp.getWriter().write("first web project");
            System.out.println("my first web project");
        }
    }

    服务器具体是怎么执行的?

    请求8080是请求的Tomcat, 通过请求路径映射到Myservlet类,那怎么会知道要执行service方法,这是怎么做到的,

    public void test(Hello hello){
        hello.service();
    }
    /*
    这个service方法逻辑代码是我们写的,举一个test的例子,这时候是调用hello里面的一个service,service方法具体是哪一个子类的,不能确定,Tomcat也不需要知道,但是必须要规定某一个客户端/浏览器发送过来的请求必须要能调用service方法, 那意味着类对象要先定义好, 意味着先定义好接口
    
    如果先发送一个请求,会先找到web.xml文件,映射会找到
    <url-patter>/first</url-patter>
    然后找到servlet名称, 继续找到上面servlet标签下servlet名称,
    通过反射的方式,找到Myservlet, 就会调用里面的service方法
    
    
    实际上就是面向对象多态的一个基本实现
    有一个继承关系
    子类重写了父类方法
    父类对象指向子类引用,调用的就是子类里面的方法
    
    */

    1、实现使用简述

    • 创建一个普通java文件
    • java文件的类名实现HttpServlet
    • 重写service方法
    • 在WEB-INF下的web.xml中添加请求与servlet类的映射关系

    二、servlet的访问流程

    http://localhost:8080/FirstWeb/first
    1. http://localhost:8080    请求服务器的地址及端口号
    2. FirstWeb                      Tomcat中有一个目录是webapps, 写好的web项目放到这个地方 Eclipse是能看到项目名称的 
          1. IDEA做了一个优化, 不放在webapps下了, 项目中会出现一个out目录
          2.  

          3. 虚拟项目名称 

             改变后浏览器访问的虚拟项目名也要随之改变

    3. first 对应web.xml.  配置servlet的别名,同时在servlet-class配置项中添加servlet类的完全限定名(报名+类名), 配置servlet跟请求的映射关系

    三、servlet的生命周期

     新建一个java文件,- 自动创建

     web.xml

        <servlet>
            <servlet-name>life</servlet-name>
            <servlet-class>xyz.kxq.ServletLife</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>life</servlet-name>
            <url-pattern>/life</url-pattern>
        </servlet-mapping>

    ServletLife.java

    package xyz.kxq;
    
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import java.io.IOException;
    
    @WebServlet(name = "ServletLife", value = "/ServletLife")
    public class ServletLife extends HttpServlet {
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.getWriter().write("servlet life");
            System.out.println("learn servlet life");
        }
    }

    会按照完全限定名反射后生成一个对象, 当接收到客户端请求的时候才会创建这个对象

    可以验证一下.

     我现在把class文件删除掉, 会影响程序运行吗

     发送请求并不影响

    当前类对象已经创建好了, 那它什么时候创建的ServletLife类对象

    停掉服务,重启启动

    访问报错

     找不到类文件xyz.kxq.ServletLife, 实例化ServletLife类异常, 刚刚把class文件删除掉了

    意味着创建对象的时机是接收客户端请求的时候时才创建对象

     这里是空的可以删除掉, 会重新自动创建

    代码中加入

        // 完成servlet对象的初始化工作
        @Override
        public void init() throws ServletException {
            System.out.println("init");
        }

    重新运行代码

    发现并没有打印"init"

    重新发送请求后打印

    init
    learn servlet life

    意味着在servlet接收到第一次请求的时候创建对象, 只执行一次init方法

    那么思考Servlet对象什么时候销毁呢?

    代码中加入

        @Override
        public void destroy() {
            System.out.println("被销毁了");
        }

    Tomcat停止时被销毁

    生命周期: 从第一次接收请求开始到服务器关闭之后销毁

    web.xml

        <servlet>
            <servlet-name>life</servlet-name>
            <servlet-class>xyz.kxq.ServletLife</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>life</servlet-name>
            <url-pattern>/life</url-pattern>
        </servlet-mapping>

    开启Tomcat服务时, 开启自动对象的创建过程, 中间的数值表示优先级的意思

    init会在启动服务器时执行, 关闭服务器会销毁

     四、Service、doGet、doPost方法的区别

    新建一个Servlet,名为MethodServlet,把勾去掉,自动生成完全限定名

     web.xml文件

        <servlet>
            <servlet-name>MethodServlet</servlet-name>
            <servlet-class>xyz.kxq.MethodServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>MethodServlet</servlet-name>
            <url-pattern>/method</url-pattern>
        </servlet-mapping>

     通过jsp模拟发送GET、POST请求

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <form action="method" method="get">
            用户名: <input type="text" name="name" value=""><br>
            密码: <input type="text" name="pwd", value=""><br>
            <input type="submit" value="登陆">
        </form>
    </body>
    </html>

    1、Service方法

    不管是get还是post请求方式, 如果service方法存在, 则优先执行service方法

    模拟get请求

    method.jsp

    <body>
        <form action="method" method="get">
            用户名: <input type="text" name="name" value=""><br>
            密码: <input type="text" name="pwd", value=""><br>
            <input type="submit" value="登陆">
        </form>
    </body>

    MethodServlet

    public class MethodServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    
        @Override
        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("我是service");
        }
    }

    打印结果:

    /*
    我是service
    */

    发送post请求同样打印如上结果

    Servlet类中可以由service方法, 用来接收get或者post请求

    2、doGet方法

    在没有service的情况下,如果是get请求,调用doGet方法

    3、doPost方法

    在没有service的情况下,如果是post请求,调用doPost方法

     五、servlet的常见错误

    1、404

    访问资源不存在

    1、 没有method2 这映射关系,请求路径跟web.xml中填写的请求不一致

    2、请求路径的项目虚拟名称填写错误

    2、405

    请求的方式跟servlet中支持的方式不一致

    MethodServlet.

    public class MethodServlet extends HttpServlet {
    //    @Override
    //    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //        System.out.println("我是get");
    //    }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("我是post");
        }
    
    //    @Override
    //    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //        System.out.println("我是service");
    //    }
    }

    method.jsp

    <body>
        <form action="method" method="get">
            用户名: <input type="text" name="name" value=""><br>
            密码: <input type="text" name="pwd", value=""><br>
            <input type="submit" value="登陆">
        </form>
    </body>

    3、500

    服务器内部错误

    1、web.xml中把完全限定名改一个不存在的

        <servlet>
            <servlet-name>MethodServlet</servlet-name>
            <servlet-class>xyz.kxq.MethodServlet2</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>MethodServlet</servlet-name>
            <url-pattern>/method</url-pattern>
        </servlet-mapping>

     2、代码逻辑错误

  • 相关阅读:
    第60天Shader法线贴图、切线空间
    第59天Shader基本光照模型、漫反射光照算法、光照计算、高光、灰度图实现
    第58天shader混合命令、颜色运算、顶点/片元着色、属性类型、语义、坐标空间、Unity内置矩阵、纹理采样、Cg函数
    第57天shader基本结构、渲染队列、裁剪、深度写入
    第55天XLua实现背包
    第54天XLua插件使用(续)
    第53天XLua插件使用
    第52天-lua语言基础语法
    第51天-AssetBundle(AB包)
    第50天-背包实例(三)
  • 原文地址:https://www.cnblogs.com/kongxiangqun/p/15339288.html
Copyright © 2011-2022 走看看