Servlet对象ServletConfig,ServletContext

一.Servlet创建对象的原理:

1.Servlet对象是由服务器进行创建的,其整个生命周期从创建到销毁由服务器进行管理,在第一次请求的时候会读取web.xml文件,通过反射创建Servlet对象。初始化init方法在第一次请求时调用,只调用一次。

2.反射过程的实现:

--1.找到Servlet程序的对应的类,通过反射找到当前的class字节码文件,通过class获取字节码文件对象

---Class clazz = Class.forName("全路径名称");

--2.如何执行init方法?

---获取构造器对象

----Constructor con = clazz.getConstructor();

---创建构造器的实例

----Object obj = con.newInstance();

---调用方法

----Method m = clazz.getDeclaredMethord("init",ServletConfig.class);

----m.invoke(obj,config);

--3.执行service方法

----Method m2 = clazz.getDeclaredMethord("service",HttpServletRequest.class,HttpServletResponse.class);

----m2.invoke(obj,request,response);

--4.执行destory方法

----Method m3 = clazz.getDeclaredMethod("destory",null);

---m3.invoke(obj,null);

二.Servlet生命周期:

1.Servlet被创建:默认情况下,Servlet第一次被访问时,被创建,调用init()方法。只执行一次。Servlet是单例的。可能会存在线程安全问题,尽量不要定义成员变量。

----可以配置Servlet的创建时机。在web.xml的<servlet>标签中配置<load-on-startup>
             <!-- 修改servlet的创建时机:
* 负整数:默认值 -1,在第一次被访问时创建
         * 非负整数:在服务器启动时创建
* 数字越小,优先级越高
            -->

<load-on-startup>0</load-on-startup>

2.提供服务:每一次被访问时,会调用service()方法提供服务

3.被销毁:服务器关闭时,servlet被销毁(服务器正常关闭时,在销毁Servlet之前,会调用destory()方法)

 三.ServletConfig对象(配置对象)

        ServletConfig是一个接口,在Servlet初始化的时候,由服务器创建其子类对象传递给 init()方法

作用:1.获取servlet初始化参数

    String getInitParameter(String name)

    Enumeration getInitParameterNames()

    初始化参数可在 web.xml中配置

 <servlet>

   <init-param>

      <param-name>参数名</param-name>
      <param-value>参数值</param-value>
    </init-param>
    <init-param>
      <param-name>。。。</param-name>
      <param-value>。。。</param-value>
    </init-param>

</servlet>

2.获取ServletContext对象(ServletContext对象是由服务器创建出来的)

ServletContext getServletContext()

3.获取servlet配置的名称 即在web.xml中给servlet起的名字

 String getServletName() 

四.ServletContext对象(全局作用域对象,代表整个web应用)

此对象也是由服务器创建,单例的

作用:

1.域对象:在域的范围内共享数据,存储所有用户共享的数据

setAttribute()。getAttribute()。removeAttribute()

2.获取文件mime类型

getMimeType(文件名称)

3.获取文件运行的真实路径(服务器路径)

getRealPath():

---webRoot下:项目根目录下

---WEB-INF:项目根目录下/WEB-INF

---src:项目根目录/WEB-INF/classes

注意:getRealPath("/"),获取的路径是项目的根目录

ServletContext只能用于web环境。如果是非web环境,则使用ClassLoader来获取真实路径

比如我web项目里有一个普通的java工具类 我想获取文件的真实路径 那我就用不了 ServletContext
//1.获取该类对应的类加载器对象
ClassLoader loader = this.getClass().getClassLoader();
//2.获取文件运行的真实路径
URL url = loader.getResource("a.txt");
String path = url.getPath();
//注意类加载器来获取路径也有局限性 只能获取src目录下的文件
// 方式2
        InputStream stream = MyUtil.class.getResourceAsStream("/a.txt");
System.out.println(stream);

猜你喜欢

转载自blog.csdn.net/Luna_ll/article/details/80601097