Servlet学习笔记

来源:互联网 发布:网络骚扰电话怎么打 编辑:程序博客网 时间:2024/06/18 13:16

1.一个Servlet程序就是一个实现了特殊接口的java类,它由支持servlet(具有servlet引擎)的web服务器调用和启动运行。

一个Servlet程序负责处理它所对应的一个或一组url地址的访问请求,并接收客户端发出的访问请求信息和产生响应内容。

2.所有的servlet(自定义的)都必须实现servlet接口(javax.servlet.Servlet)。由于Servlet接口中有很多方法不需要实现,因此可以继承GenericServlet类。

GenericServlet实现了servlet接口的基本特征和功能。

javax.servlet.http.HTTPServlet类继承了GenericServlet类,并在其基础上进行了一些对HTTP协议的扩充。

3.客户端每次访问一个支持HTTP的Servlet程序时,Servlet引擎都将调用Servlet的service方法来进行处理。

HTTPServletRequest用于封装HTTP请求,HTTPServletResponse用于封装HTTP响应。

HTTPServletResponse对象的getWrite()方法可以获得一个文本输出流对象。其内容可以作为响应消息的内容。

4.Servlet的注册与运行:

(1).Servlet程序必须通过Servlet引擎来启动运行,并且存储目录有特殊要求,通常需要存储在<Web应用程序>/WEB-INF/classes/目录中。

(2).Servlet程序必须在Web应用程序的web.xml文件中进行注册和映射其访问路径,才可以被servlet引擎加载和被外界访问。

(3).<servlet>元素用于注册一个servlet。<servlet-name>用于设置注册名,<servlet-class>用于设置servlet的完整路径。

(4).<servlet-mapping>用于映射一个已注册的servlet的一个对外访问路径。

<serlvet-name>用于指定servlet注册名,<url-pattern>用于映射对外访问路径。

(5).同一个servlet可以被映射到多个url上。

在servlet映射到的url中也可以使用”*”通配符。

(6).Servlet映射原则:最具体匹配原则。

如:*.do这种映射优先级最低。

/a.do匹配,/*不匹配,*.do优先级最低。

(7).注意:Servlet的url通配符只能映射为”/*”或者”*.do”等形式。

不能映射为”do.**”或者”/anyname/*.**”等形式。

5.Servlet激活器:

(1).Tomcat安装目录conf/web.xml文件中配置servlet激活器如下:

[xhtml] view plaincopy
  1. <servlet>  
  2.        <servlet-name>invoker</servlet-name>  
  3.        <servlet-class>org.apache.catalina.servlets.InvokerServlet</servlet-class>  
  4. </servlet>  
 

(2).在应用程序web描述文件的servlet映射中使用:

[xhtml] view plaincopy
  1. <servlet-name>invoker</servlet-name>  
  2. <url-pattern>/servlet/*</url-pattern>  
 

通过servlet激活器来调用servlet,这些servlet就不用再映射url了。只需注册,即可通过”/servlet/servlet注册名”来访问该servlet了。

6.缺省servlet:

映射路径为”/”的servlet为缺省servlet,凡是在web.xml中找不到匹配的<servlet-mapping>元素的url,访问都会由缺省servlet类处理。

7.类装载器作用:

根据类名称来定位和生成类的字节码数据后,返回给java虚拟机。Java虚拟机使用类的第一件事就是将该类的字节码装载进来,类加载之后被编译成可执行代码存储在内存中。

在程序中获得代表某个类的字节码数据的class对象的3种方式:

(1).类名.class。

(2).对象.getClass()。

(3).Class.forName(“类全路径名”)。

8.java中的类装载器:

java.lang.ClassLoader作为类装载器的基类,是一个抽象类。

类装载器本身也是一个java类,所以其本身也需要被其他类装载器装载。

(1).java虚拟机中内嵌了一个Bootstrap的类装载器,它是java虚拟机的内核,不用类装载器类装载,Bootstrap负责加载JDK/JRE中rt.jar里的类。

(2).ExtClassLoader类用于加载存放在jre/lib/ext目录下的java类。

AppClassLoader类用于加载应用程序的启动执行类。

9.java类装载器的委托加载模式:

(1).JVM中所有类装载器采用树形结构组织,实例化每个类装载器对象时,需要指定其父类装载器,若没有指定以ClassLoader.getSystemClassLoader()对象为准。

(2).ExtClassLoader是AppClassLoader的父级类装载器。

ExtClassLoader的父级类装载器是Bootstrap。

(3).每个ClassLoader本身只能分别加载特定位置和目录中的类。

类加载时,子级类加载器首先委托其父级类加载器进行加载,直至Bootstrap,父级类加载器无法加载时按委托顺序返回其子级类加载器,如再次回到发起加载类加载器还无法加载时,就会抛出ClassNotFoundException,而不会在委托其子级类加载器去加载。

一个类加载器只保留一份字节码数据。

(4).当java虚拟机要加载一个类时,到底使用哪个类加载器,使用以下规则:

a.首先,使用当前线程的类加载器去加载线程中的第一个类。

b.若类A中引用了类B,则JVM将使用加载类A的加载器去加载类B。

c.还可以调用ClassLoader.loadClass()方法来指定某个类加载器去加载某个类。

10.自定义类加载器:

编写自定义类加载器方法:

(1).继承ClassLoader类(系统类加载器)。

(2).覆盖父类的findClass方法(注意:父类的loadClass方法不能覆盖)。

(3).调用defineClass方法将得到的class文件转换成字节码文件。

注意:系统类装载器通过被设置为启动应用程序的AppClassLoader,可以通过java.system.class.loader系统属性来将系统类装载器设置为其他类装载器。

11.      一个已被父级类装载器装载的类,无法调用只能被子级类装载器发现和装载的类。

每个运行中的线程都有一个关联上下文类装载器,可以使用。Thread.setContextClassLoader()方法设置线程上下文类装载器。

每个线程默认的上下文类装载器是其父线程的上下文类装载器,而主线程的类装载器的初始设置为ClassLoader.getSystemClassLoader()方法返回的系统类加载器。

12.      Servlet的特点:

(1).Servlet是一个供其他java程序(servlet引擎)调用的java类,它不能独立运行,它的运行完全由servlet引擎来控制和调度。

(2).Servlet引擎是一种容器程序,它负责管理和维护所有servlet对象的生命周期,负责将客户端请求信息转交servlet处理和将servlet响应返回给客户端。

13.Servlet运行过程:

(1).Servlet引擎检查是否已经装载并创建了该servlet的实例对象,如果是,则直接执行第4步,否则执行第2步。

(2).装载并创建该Servlet的一个实例对象。

(3).调用Servlet实例对象的init()方法。

(4).创建一个用于封装HTTP请求信息的HTTPServletRequest对象和一个代表HTTP响应信息的HTTPServletResponse对象,然后调用servlet的service()方法,并将请求和响应对象作为参数传递进去。

(5).当web应用程序被停止或者重启之前,servlet引擎将卸载servlet,并在卸载之前调用servlet的destory()方法。

14.Servlet的线程安全问题:

Servlet引擎采用多线程模式运行。

若某个Servlet实现了SingleThreadModel接口(无任何方法,只做标记,已过期),该Servlet引擎将以单线程模式来调用其Service()方法。

SingleThreadModel不能解决线程安全问题。

15.Servlet引擎将servlet容器对象和Servlet配置参数一并封装到一个称为ServletConfig的对象中,并在初始化时传递给Servlet对象。

Servlet引擎调用Servlet实例对象的init(ServletConfig config)方法将ServletConfig对象传递给servlet,servlet.getServletConfig()方法必须返回init()方法中传递进来的ServletConfig对象引用。

16.ServletConfig接口中的方法:

(1).String getInitParameter(参数名称):获取初始参数。

(2).Enumeration getInitParameterNames():获取所有初始化参数名称。

(3).getServletName()。

(4).getServletContext()。


原创粉丝点击