zoukankan      html  css  js  c++  java
  • Servlet基础(工作原理、生命周期)

    (一)Servlet开发与配置

    1.1 开发步骤

    •  1)编写java类,继承HttpServlet类
    •  2)重新doGet和doPost方法
    •  3)Servlet程序交给tomcat服务器运行!

    配置信息:

     1     <servlet>
     2         <!-- Servlet 的内部名称,自定义 -->
     3         <servlet-name>HelloServlet</servlet-name>
     4         <!--servlet的类全名-->
     5         <servlet-class>com.infaraway.HelloServlet</servlet-class>
     6     </servlet>
     7 
     8     <!--Servlet的映射配置-->
     9     <servlet-mapping>
    10         <!--servlet的内部名称,要和上面的保持一致-->
    11         <servlet-name>HelloServlet</servlet-name>
    12         <!--servlet的映射路径(访问servlet的名称)-->
    13         <url-pattern>/HelloServlet</url-pattern>
    14     </servlet-mapping>

                         url-pattern                                    浏览器输入
    精确匹配        /HelloServlet            http://localhost:8080/day10/HelloServlet
                       /path/HelloServlet    http://localhost:8080/day10/path/HelloServlet

    模糊匹配        /*           http://localhost:8080/projectName/任意路径
           /path/*                http://localhost:8080/projectName/path/任意路径
            *.后缀名                 http://localhost:8080/projectName/任意路径.do
            *.do
               *.action
            *.html(伪静态)

    注意:
    1)url-pattern要么以 / 开头,要么以*开头。 例如, path是非法路径。
    2)不能同时使用两种模糊匹配,例如 /path/*.do是非法路径
    3)当有输入的URL有多个servlet同时被匹配的情况下:
        a 精确匹配优先。(长的最像优先被匹配)
        b 以后缀名结尾的模糊url-pattern优先级最低!

    1.2 servlet缺省路径

    servlet的缺省路径(<url-pattern>/</url-pattern>)是在tomcat服务器内置的一个路径。该路径对应的是一个DefaultServlet(缺省Servlet)。这个缺省的Servlet的作用是用于解析web应用的静态资源文件。

    问题: URL输入http://localhost:8080/projectName/index.html 如何读取文件?

    • 1)到当前projectName应用下的web.xml文件查找是否有匹配的url-pattern。
    • 2)如果没有匹配的url-pattern,则交给tomcat的内置的DefaultServlet处理
    • 3)DefaultServlet程序到projectName应用的根目录下查找是存在一个名称为index.html的静态文件。
    • 4)如果找到该文件,则读取该文件内容,返回给浏览器。
    • 5)如果找不到该文件,则返回404错误页面。

    (二)Servlet的生命周期

    2.1 Servlet重要的四个生命周期方法

    • 构造方法: 创建servlet对象的时候调用。默认情况下,第一次访问servlet的时候创建servlet对象 只调用1次。证明servlet对象在tomcat是单实例的。
    • init方法: 创建完servlet对象的时候调用。只调用1次。
    • service方法: 每次发出请求时调用。调用n次。
    • destroy方法: 销毁servlet对象的时候调用。停止服务器或者重新部署web应用时销毁servlet对象。只调用1次。

    2.2 伪代码演示servlet的生命周期

    Tomtcat内部代码运行:
    1)通过映射找到到servlet-class的内容,字符串: com.infaraway.HelloServlet
    2)通过反射构造HelloServlet对象
      2a. 得到字节码对象
        Class clazz = class.forName("com.infaraway.HelloServlet");
      2b. 调用无参数的构造方法来构造对象
        Object obj = clazz.newInstance(); ---1.servlet的构造方法被调用
    3)创建ServletConfig对象,通过反射调用init方法
      3a 得到方法对象
        Method m = clazz.getDeclareMethod("init",ServletConfig.class);
      3b 调用方法
        m.invoke(obj,config); --2.servlet的init方法被调用
    4)创建request,response对象,通过反射调用service方法
      4a 得到方法对象
        Method m =clazz.getDeclareMethod("service",HttpServletRequest.class,HttpServletResponse.class);
      4b 调用方法
        m.invoke(obj,request,response); --3.servlet的service方法被调用
    5)当tomcat服务器停止或web应用重新部署,通过反射调用destroy方法
      5a 得到方法对象
        Method m = clazz.getDeclareMethod("destroy",null);
      5b 调用方法
        m.invoke(obj,null); --4.servlet的destroy方法被调用

    (三)Servlet相关问题

    3.1. 自动加载

    默认情况下,第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或init方法中执行了比较多的逻辑代码,那么导致用户第一次访问sevrlet的时候比较慢。因此,为了提高访问的速度,我们需要改变servlet创建对象的时机: 提前到加载web应用的时候!在servlet的配置信息中,加上一个<load-on-startup>即可!

    即在配置Servlet的时候在配置文件中加入

    1     <servlet>
    2         <!-- Servlet 的内部名称,自定义 -->
    3         <servlet-name>HelloServlet</servlet-name>
    4         <!--servlet的类全名-->
    5         <servlet-class>com.infaraway.HelloServlet</servlet-class>
    6         <!-- 让servlet对象自动加载
    7             注意: 整数值越大,创建优先级越低!!-->
    8         <load-on-startup>1</load-on-startup>
    9     </servlet>

    3.2. 有参数init方法和无参数的init方法

    在原来的init方法中会调用无参数的init方法;无参数的Init用来编写初始化的逻辑代码;有参数的init方法是Servlet生命周期的方法,一定会被tomcat调用。如果编写程序时,不需要覆盖有参数的init方法,只需要将初始化代码放到无参数的init方法即可;

    3.3. 多线程并发问题

    注意: servlet对象在tomcat服务器是单实例多线程的。

    (四)ServletConfig对象

    Servlet中需要学习的四个对象,其中前两个在学习Http请求的时候已经详细讲述了:具体见之前的博文:

    • HttpServletRequest 请求对象:获取请求信息
    • HttpServletResponse 响应对象: 设置响应对象
    • ServletConfig对象 servlet配置对象
    • ServletContext对象; servlet的上下文对象

    作用:ServletConfig对象主要用于加载Servlet的初始化参数,在一个web应用中,可以存在多个ServletConfig对象(一个Servlet对应一个ServletConfig对象)

    创建时间:在创建完servlet对象之后,在调用init方法之前会创建ServletConfig对象

    获取对象:直接从有参数的init方法中得到该对象;

    其中Servlet中初始化参数的配置:

     1     <servlet>
     2         <!-- Servlet 的内部名称,自定义 -->
     3         <servlet-name>HelloServlet</servlet-name>
     4         <!--servlet的类全名-->
     5         <servlet-class>com.infaraway.HelloServlet</servlet-class>
     6         <!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
     7         <init-param>
     8             <param-name>path</param-name>
     9             <param-value>e:/b.txt</param-value>
    10         </init-param>
    11     </servlet>

    注意: servlet的参数只能由当前的这个sevlet获取!

    ServletConfig的API:

    • java.lang.String getInitParameter(java.lang.String name) 根据参数名获取参数值
    • java.util.Enumeration getInitParameterNames() 获取所有参数
    • ServletContext getServletContext() 得到servlet上下文对象
    • java.lang.String getServletName() 得到servlet的名称

    (五)ServletContext对象 

      ServletContext对象 ,叫做Servlet的上下文对象。表示一个当前的web应用环境。一个web应用中只有一个ServletContext对象。

    创建时机:加载web应用时创建ServletContext对象。

    获取对象: 从ServletConfig对象的getServletContext方法得到

     1     1)创建ServletContext对象      ServletContext  context = new ServletContext()        
     2 
     3     2)创建ServletConfig对象       ServetConfig config = new ServletConfig();
     4                                               config.setServletContxt(context);
     5                     class  ServletConfig{
     6                             ServletContext context;
     7                             public ServletContext getServletContxt(){
     8                                 return contxt;
     9                             }
    10                     } 
    11 
    12                     public void init( ServletConfig config ){
    13                         得到ServletConfig对象
    14                         从ServletConfig对象中得到ServletContext对象
    15                         SerlvetContext context = config.getServletContext();
    16                     }

     

    ServletContext对象的核心API

    • java.lang.String getContextPath() --得到当前web应用的路径
    • java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
    • java.util.Enumeration getInitParameterNames()
    • void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
    • java.lang.Object getAttribute(java.lang.String name)
    • void removeAttribute(java.lang.String name)
    • RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
    • java.lang.String getRealPath(java.lang.String path) --得到web应用的资源文件
    • java.io.InputStream getResourceAsStream(java.lang.String path)
  • 相关阅读:
    比较一下ASP、ASP.net、JSP和PHP的优点和缺点
    修改MSSQLServer的登陆方式
    ASP.NET获取IP和MAC代码(C#)
    RPM 五种基本的操作方式
    飞鸽TCP/IP 10106错误解决
    修复rpm命令(不小心删了rpm命令)方法
    Asp.Net连接ACCESS数据库相对路径问题 web.config中如何使用相对路径及在类文件中调用这个相对路径
    VMware下redhat linux 9使用NAT共享主机IP上网
    Visual Studio2005 + Visual SourceSafe 2005 实现团队开发、源代码管理、版本控制
    SQL2005安装出现“性能监视器计数器要求错误”的解决方案
  • 原文地址:https://www.cnblogs.com/infaraway/p/6543332.html
Copyright © 2011-2022 走看看