servlet学习笔记_1

一.动态页面和静态页面
  动态页面&静态页面:如果浏览器在不同时刻不同条件下访问web服务器的某个页面,浏览器所获得的页面内容会发生变化,那么这种页面称之为动态页面.动态页面和静态页面的区别在于针对页面的访问请求,服务器能够在不同条件下返回给客户端的网页内容是否相同.要想web浏览器访问某一web页面的时候,能够查询出一些动态变化的实时信息,就必须采用动态页面.
  动态页面和动态HTML页面:尽管动态HTML页面也能实现页面内容的改变,但是这种结果仅仅是浏览器执行的结果,而不是由于服务器的程序执行,使得浏览器页面的源码发生了改变所造成的结果.这里说的动态网页是指web服务器在不同时刻返回给浏览器的页面的内容会发生变化的网页.可以通过查看源代码来观察.

二.引擎和动态网页程序

  引擎是通过应用程序接口(API)和动态网页程序交互的.引擎接受来自于服务器转交的请求,并且负责把请求转交给动态网页程序,将动态网页程序的相应返还给服务器.具体工作流程见下图:

三.Servlet开发入门
1.ServletAPI:Servlet引擎和Servlet程序之间通过ServletAPI进行通信,实际上,Servlet程序就是一个在web服务器端运行的调用了ServletAPI的Java类.
2.Servlet路径的通配符:在<url-pattern>标签下,可以使用通配符,有两种固定的格式,一种格式是*.扩展名,在*前面不能有目录分隔符/,另一种格式是以/开头,并以/*结尾.例如:/action/*.当接受到请求的时候,将采用最具体匹配的原则,来匹配映射,其中*.扩展名优先级最低.优先级为具体的匹配(例如/abc)>/*匹配(例如/abc/*)>*.扩展名匹配(例如*.abc)>缺省servlet.

 3.Servlet程序不能被设置为web网页默认的打开文档,例如在web.xml中,添加一行:

 紧接着会发现访问主页的时候,仍然无法跳转到BServlet来执行结果.

4.类加载器的基本概念:
类加载器--(将.class文件转为Java虚拟机可以阅读的类的字节码数据)-->Java虚拟机--(将类的字节码数据转化为可执行的二进制数据)-->内存
BootStrap类加载器:加载核心包中的类(rt.jar)中的类.(不用转门的类加载器去加载,是Java虚拟机的内核)
ExtClassLoader:负责加载在jre/lib/ext中的类
AppClassLoader:负责加载应用程序的启动执行类.例如java Test.即用AppClassLoader加载Test类
类加载采用委托机制,即加载某一个类的时候,先委托给当前类加载器的父加载器,一直向上,然后从根类加载器开始加载,直到当前类加载器,如果仍然无法加载类的
话,则会报出ClassNotFoundException异常.因此在这种情况下,如果在一个类的编写中调用到一个类,而这个类需要用当前类的子类加载器才能加载,被调用的类将会无法被加载,因为父类加载器的加载任务不会委托给子类加载器.
Tomcat的类加载器机制:(注意CatalinaClassLoader和SharedClassLoader在Tomcat7中,被赋值为CommonClassLoader示例,代码如下:

private void initClassLoaders() {

try {

commonLoader = createClassLoader( "common" , null );

if ( commonLoader == null ) {

commonLoader = this .getClass().getClassLoader();

}

catalinaLoader = createClassLoader( "server" , commonLoader );

sharedLoader = createClassLoader( "shared" , commonLoader );

} catch (Throwable t) {

handleThrowable (t);

log .error( "Class loader creation threwexception" , t);

System. exit (1);

}

}

Tomcat类加载器加载机制如下图:(AppClassLoader主要加载CATALINA/conf,WebappClassLoader加载的是/WEB-INF/classes目录下面的class文件,Common加载CATALINA_HOME/lib)

四.Servlet特点和运行流程
1.servlet执行流程:

2.servlet的运行过程.
1>.当接受到某个servlet的访问请求的时候,引擎将首先检查是否已经装载并创建了servlet的实例对象(初始化).如果已经创建了servlet对象,那么创建一个用于封装Http请求的HttpServletRequest对象和代表HTTP相应消息的HttpServletResponse对象,然后调用Servlet的service方法,并且将参数传递进去.
2>.如果没有创建servlet对象,创建并且装载servlet对象
3>.调用servlet对象的init方法,完成一些必要的初始化操作.
4>.同样在新创建的对象中,传递参数ServletRequest和ServletResponse.HttpServletRequest封装了请求消息的各种内容,而初始的HttpServletResponse没有内容,但是以后能调用各种方法生成相应的各种部分.当servlet的service方法执行完毕后,返回,web服务器可以从相应对象中读取相应消息
5>.在应用程序被停止或者重新启动之前,servlet引擎将卸载其中的Servlet.在卸载Servlet之前,将调用servlet对象的destory方法,完成一些必要的清理操作.
注意事项:
1>.其中第2步和第3步,是在针对该servlet的第一次访问的时候完成的.
2>.在servlet整个生命周期,它的init方法,只会被调用一次,而service方法,每次针对该servlet发出请求的时候,都将被调用.每次HttpServletRequest和HttpResponse对象都会被重新封装,servlet可以从HttpServletRequest对象中获取需要的数据,并且调用相应对象的方法将相应内容写入到servlet引擎的缓冲区中.再由web服务器发送给客户端.
3>.如果对于一个已经加载的servlet进行了修改,那么除非重启服务器,否则客户访问的依然是原来的servlet,这是因为servlet在服务器的运行期间只会被装载一次.就算硬盘上修改了servlet,但是服务器上依然用的是旧的servlet.
3.ServletAPI:Servlet引擎负责创建ServletRequest,ServletResponse对象,那是如何实现和Servlet交互的呢?实际上,根据面向对象的基本原则,只需要提供相应的API(标准),然后由servlet引擎负责创建具体的实现类对象.而在service方法中接受的是相应的接口的引用,这样子,就可以实现servlet引擎和servlet的交互.

posted @ 2016-11-02 23:23  hlhdidi  阅读(220)  评论(0编辑  收藏  举报