一.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);