一.动态页面和静态页面
  动态页面&静态页面:如果浏览器在不同时刻不同条件下访问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的交互.

servlet学习笔记_1的更多相关文章

  1. # jsp及servlet学习笔记

    目录 jsp及servlet学习笔记 JSP(Java Server Page Java服务端网页) 指令和动作: servlet(小服务程序) jsp及servlet学习笔记 JSP(Java Se ...

  2. Servlet学习笔记(四)

    目录 Servlet学习笔记(四) 一.会话技术Cookie.session 1. 什么是会话技术? 2. 会话技术有什么用? 3. Cookie 3.1 什么是Cookie? 3.2 使用Cooki ...

  3. Servlet学习笔记(三)

    目录 Servlet学习笔记(三) 一.HTTP协议 1.请求:客户端发送欸服务器端的数据 2.响应:服务器端发送给客户端的数据 3.响应状态码 二.Response对象 1.Response设置响应 ...

  4. Servlet学习笔记(二)

    目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...

  5. jsp&servlet学习笔记

    1.路径引用问题 一个css.jsp.html.或者javascript文件从从一个工程复制到另一工程,如果引用的时候使用的时相对路径,看似没有错误,但是却一直引用不进来,这时候要使用绝对路径,这样才 ...

  6. Servlet 学习笔记

    Servlet 运行在服务器上的 java 类: Servlet 容器为 javaWeb 应用提供运行时环境,负责管理 servlet 和 jsp 生命周期,以及管理他们的共享数据. 现在我们知道了 ...

  7. Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期

    servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...

  8. Servlet学习笔记(七)—— 自己定义过滤器的编写改进:自己定义实现FilterChain

    笔记六中实现了三种过滤器:字符编码过滤.登录权限过滤.敏感词过滤,可是有个缺陷就是,限定了过滤顺序,而不能实现先进行request过滤.最后response过滤,而且中间几项过滤的顺序不能动态改变.所 ...

  9. Servlet学习笔记(八)—— 文件下载

    一.文件下载概述 比如图片或者HTML这类静态资源,仅仅要在浏览器中打开正确的网址就行下载.仅仅要资源放在应用程序文件夹或者其下的子文件夹中,但不在WEB-INF下.Servlet/JSP容器就会将资 ...

随机推荐

  1. python简单爬虫示例

    #coding=utf-8   import urllib import re   def downloadPage(url):     h = urllib.urlopen(url)     ret ...

  2. 解决python "Non-ASCII character"错误

    原文http://jingyan.baidu.com/article/219f4bf7d04887de442d3899.html 1.出现问题的原因:程序中的编码错误,python默认是acii模式, ...

  3. ORM系列之一:Dos.ORM

    阅读目录 引言 1.为什么使用Dos.ORM 2.配置 3.开始使用 3.1. 物理表 3.2. 实体类 3.3. 使用方法 引言 Dos.ORM(原名Hxj.Data)于2009年发布,2015年正 ...

  4. LeetCode Encode and Decode Strings

    原题链接在这里:https://leetcode.com/problems/encode-and-decode-strings/ 题目: Design an algorithm to encode a ...

  5. Python开发程序:简单主机批量管理工具

    题目:简单主机批量管理工具 需求: 主机分组 登录后显示主机分组,选择分组后查看主机列表 可批量执行命令.发送文件,结果实时返回 主机用户名密码可以不同 流程图: 说明: ### 作者介绍: * au ...

  6. lodash的源码(1)

    数组篇 1.compact,就是将数组中的false值去掉 function compact(array) { var index = -1, length = array ? array.lengt ...

  7. 关于Left join

    Sql关联表时条件放在On或者where上结果是不一样的. 1.放在on上 如下 select S.StoreID,* from BizProductItem as P left join BizSt ...

  8. C#异步:实现一个最简单的异步

    异步就是方法异步执行, 这个好理解. 异步有啥用? 以前只是听说过, 也不想计较. 不过还是碰到了需要这个东西的时候. 比如: 定时执行, 如果不用异步方法,也不用定时器,只用Thread.Sleep ...

  9. Cross-site Scripting (XSS) 阅读笔记

    本文源自 https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 通过阅读和翻译,并按照自己的理解,整理成如下文档. 概述 XSS ...

  10. 《30天自制操作系统》15_day_学习笔记

    harib12a: 这一部分我们来尝试两个任务的切换.下面我们一步一步的看: 1.定义TSS任务状态段(task statuc segment):定义的一种段,需要在GDT中定义使用 //TSS任务状 ...