• 04_web基础(四)之servlet详解


     16.17.18.servlet生命周期

      javax.servlet.Servlet接口方法:
    public String getServletInfo():获取Servlet相关信息(作者,版权,版本)
    public ServletConfig getServletConfig() :获取当前Servlet的配置对象.
    public void init(ServletConfig config):初始化方法(准备工作)
    public void service(ServletRequest req, ServletResponse res):服务方法,每次请求都会执行该方法
    public void destroy():销毁方法(扫尾操作,服务器关闭的时候执行).
    -----------------------------------------------------------------------
    生命周期方法:
    init(ServletConfig config):初始化方法(准备工作)
    service(ServletRequest req, ServletResponse res):服务方法,每次请求都会执行该方法
    destroy():销毁方法(扫尾操作).(该方法只要正常关闭Tomcat才执行,不需要再改方法编写扫尾代码)
    执行流程:
       构造器(只执行一次)--->init方法(只执行一次)---->service(每次请求都执行)---->destroy
    Servlet是单例:只要Tomcat服务器不关闭,Servlet就只有一个实例.
    构造器和init方法只在第一次请求之前,执行,只执行一次.
    编写Servlet:
       1):Servlet的构造器必须是public的.
       2):Servlet的构造器必须是无参数的.
    为什么:
      底层创建Servlet对象(调用构造器):
      Servlet obj  = Class.forName("com.test.servelt.HelloServlet").newInstance();

    19.servlet请求流程(非常重要)

      Servlet的请求流程文字描述:
    1:浏览器发出请求:http://localhost:8080/hello/hi.
    2:tomcat解析请求:
           上下文路径: /hello
           资源名称:   /hi
    3:从..webapp的WEB-INF下找到web.xml文件(当前访问项目的配置文件).
      并判断web.xml文件中是否有<url-pattern>的文本内容为/hi.
      若找不到:响应404.
      找    到:获取当我请求资源对应Servlet类的全限定名称:  com.test.servlet.HelloServlet
    4:判断Servlet实例缓存池中是否存在com.test.servlet.HelloServlet对应的对象.
       Map<String,Servlet> cache = ....(Servlet实例缓存池)
       Servlet obj = cache.get(":  com.test.servlet.HelloServlet");
       if(obj==null){//实例缓存中没有:  com.test.servlet.HelloServlet的对象,说明是第一次.
           //使用反射创建对象(调用构造器)
           obj = Class.forName(":  com.test.servlet.HelloServlet").newInstance();
           //把Servlet对象,放入缓存中,供下次使用
           cache.put(":  com.test.servlet.HelloServlet",obj);
       }else{
           GOTO 6:
       }
    5:创建ServletConfig对象,并调用init方法.
      obj.init(config);
    6:创建ServletRequest和ServletResponse对象,并调用service方法,并作出相应.
      obj.service(req,resp);

    20.servlet初始化参数

      ServletConfig接口:封装了Servlet的配置信息.
             该接口提供了获取Servlet配置信息(servlet的配置名称等)的方法.
    ---------------------------------------------------------------------------------
    ServletConfig接口的方法:
      String getServletName()                       :获取Servlet的名称
      ServletContext getServletContext()        :获取Servlet上下文
      String getInitParameter(String paramName):获取初始化参数
      Enumeration<String> getInitParameterNames():获取所有初始化参数的名字

      

      

    21.模拟httpServlet

      

      

    22.servlet继承体系

      

      

    23.24.httpServlet简单使用

      HttpServletRequest接口,表示Http的请求对象.是ServletRequest接口的子接口.
      在该接口中的方法,可以获取请求信息(请求行,请求头,请求实体).
    ---------------------------------------------------------------------
    常用的方法:
    1:String getMethod():返回请求方式:如GET/POST
    2:String getRequestURI():返回请求行中的资源名字部分
    3:StringBuffer getRequestURL():返回客户端请求的完整URL
    4:String getContextPath():返回请求URL所属Web应用的路径
    5.String getRemoteAddr():返回发出请求的客户机的IP地址
    6.String getHeader(String name):根据指定的请求头名,获取对应值.
    获取请求参数:
      01.String getParameter(String name):返回指定名字参数的值。
      02.String[] getParameterValues(String name):返回指定名字参数的多个参数值。
       03.Enumeration<String> getParameterNames():返回所有参数名的Enumeration对象。
       04.getParameterMap():返回所有的参数和值所组成的Map对象。
    ------------------------------------------------------------------------
    问题:
      String getInitParameter(String paramName):获取初始化参数,初始化参数是我们自己为了避免硬编码在web.xml中手动设置的.
      String getParameter(String paramName):获取请求参数,(用户录入的数据)
      

    25.请求的中文乱码处理

      对于中文乱码问题:
      根本原因,Tomcat底层使用的ISO-8859-1编码,该编码不支持中文.
    解决方案:
        1:先使用ISO-8859-1,把乱码数据恢复成二进制形态
         byte[] data  = username.getBytes("ISO-8859-1");
          2:再使用UTF-8,对二进制数据重新编码
       username=new String(data,"UTF-8");
    =================================================
    解决方案没问题,但是如果参数过大,工程浩大.
    如果请求方式是POST:
       获取任意参数之前,先设置请求编码.
      req.setCharacterEncoding("UTF-8");
      

    26.HttpServletResponse接口与响应乱码

      

    27.Servlet注解

      

    28.servlet映射细节

       Servlet的映射细节:
       1:同一个Servlet,可以配置多个url-pattern.
       2:资源通配符配置: *(任意个数的任意字符)
            第一种:  /* 或则/web/*
               /*:随便一个字符,都可以访问当前Servlet.
               /web/*:所以以 /web/ 打头的资源名才可以访问该Servlet.
            第二种: *.拓展名
               *.html:资源名必须以.html结尾才可以访问当前Servlet.
       3:配置Servlet的时候,<servlet-name>不能起名为default.
          在Tomcat中,主web.xml文件,规定了,访问静态资源都得通过default的Servlet.
       4:Servlet对象的生命周期:
          第一次访问的:
            构造器--->init--->service
          第N次:
            service.
          在框架中,我们习惯给Servlet配置:<load-on-startup>来决定其构建和初始化顺序.
          学习SpringMVC的时候,优先启动该Servlet(该Servlet主要负责加载资源和初始化操作.)

      

  • 相关阅读:
    spring事务传播机制实例讲解
    一篇关于交叉编译的文章
    Java中的泛型方法
    层序遍历打印二叉树
    寻找第K大 网易2016实习研发工程师编程题
    二叉树的非递归遍历
    二叉树 网易2016实习研发工程师编程题
    比较重量 网易2016实习研发工程师编程题
    网络地址为172.16.0.0,采用子网掩码255.255.224.0 .以下说法正确的是?
    2.7链表 回文链表
  • 原文地址:https://www.cnblogs.com/newAndHui/p/8986189.html
Copyright © 2020-2023  润新知