1、  servlet的生命周期:

  a)  流程

i.  Web服务器首先会检查是否装载了该servlet的实例对象。如果装载了直接进行第四步。

ii.  装载并创建该servlet的实例对象。

iii. 调用servlet的init方法,这个方法是将该实例对象装载到内存中。

iv. 创建一个封装http请求对象httpservletrequest和一个响应http的对象httpservletresponse,讲两个参数传到service方法中。

v. Web应用被重启或者停止的时候,servlet引擎将卸载servlet,在卸载之前调用servlet的destroy方法。

  b)生命全过程

i. 加载

ii.  实例化

iii.初始化

iv. 处理请求

v.退出服务

  c) 开发servlet的有三种方法

i.实现servlet接口

ii. 继承GenericServl

iii. 通过继承HttpServlet

  d) Get和post提交的区别

i. 安全方面:post更加安全,因为get提交的时候会把参数传到地址栏里。。

ii. 提交内容方面:get提交的数据一般不能大于2k,post是无限制的,但在实际开发中建议不要大于64.

iii.从速度来看:get的提交速度会比post快。

iv. 收藏:get可以保留uri中的数据,易于收藏。

2、  使用myeclipse开发servlet

  a) 部署

i. 首先,我们要知道在哪儿部署??部署什么??部署的时候是在web.xml文件中部署的,部署两个标签,<servlet><servlet-mapping>,<servlet>标签中有两个属性:<servlet-name>和<servlet-class>,<servlet-name>命名可以随意但是要和<servlet-mapping>标签中的<servlet-name>保持一致。<servlet-class>是我们的servlet的所在包是路径以及servlet的名字(说白了就是:包.servlet的名字)。<Servlet-mapping>标签中的<url-pattern>中的路径可以随便写,它就是url中地址中的资源名

  b) 优化myeclipse

i.validation有很多,包括xml、jsp、jsf、js等等,我们没有必要全部都去自动校验一下,只是需要的时候才会手工校验一下,速度将很快提升好几个档次。windows > perferences > myeclipse > validation将Build下全部勾取消,如果你需要验证某个文件的时候,我们可以单独去验证它。方法是:在需要验证的文件上( 右键 -> MyEclipse -> Run Validation 。

ii.Window > Preferences > General > Startup andy Shutdown 在这里列出的是MyEclipse启动时加载的模块

iii. 关闭拼写检查

  c) 给myeclipse制定tomcat

  d) 将项目发布到服务器

i. 方法一:

      

ii.  方法二:

      

  e)  java.lang.UnsupportedClassVersionError: Bad version number in .class异常的解决方法

i. 分析:看到version后可以确定是tomcat和jdk版本不一致的问题

    

3、  Servlet的细节问题

  a)一个注册的servlet可以多次被映射,说白了就是:一个<servlet>(注册servlet)标签可以对应多个<servlet-mapping>(映射servlet到url)标签。

  b) 映射一个servlet的时候可以多层:说白了就是,<url-pattern>标签中的路径可以这样设置:/sdf/sald

  c) 通配符在servlet映射中的用法:

i. *.扩展名:该扩展名的所有名字都可以访问

ii. / 路径名/*:/路径名之后随便加,都可以访问。

  d)Servlet的单例问题

i.所谓的单例怎么在servlet中体现????
说白了就是我们的init方法把servlet实例化到内存中以后,在不关闭web服务器或者重启web应用的时候,我们的这一个servlet实例对象可以一直对请求响应。
因为servlet是单例的,因此会出现线程安全问题,比如:售票系统

    ii. 疑问:售票系统不加同步机制,则会出现问题,什么是同步机制???怎么实现同步机制???

  e)Servlet中<load-on-startup>的配置
如果在<servlet>元素中配置了一个<load-on-startup>元素,那么WEB应用程序在启动时,就会装载并创建Servlet的实例对象、以及调用Servlet实例对象的init()方法。

  f)缺省的servlet
如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
什么是缺省的servlet那???
   说白了就是当我们访问servlet的时候出现问题了,web应用就会访问该servlet。

  g) Servlet中的线程安全问题
当多个客户并发访问servlet的时候,我们会为每个线程提供service方法,当他们多个线程中同时访问同一个资源的时候,就可能引发线程安全问题。
怎么解决这一个问题那???

i.  让变量成为局部变量即可,这样每个线程都访问的是自己的变量就不会发生线程安全问题。

ii.针对Servlet的线程安全问题,Sun公司是提供有解决方案的:Servlet去实现一个SingleThreadModel接口,如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其service方法。
      查看Sevlet的API可以看到,SingleThreadModel接口中没有定义任何方法和常量,Java中,把没有定义任何方法和常量的接口称之为标记接口,经常看到的一个最典型的标记接口就是"Serializable",这个接口也是没有定义任何方法和常量的,标记接口在Java中有什么用呢?主要作用就是给某个对象打上一个标志,告诉JVM,这个对象可以做什么,比如实现了"Serializable"接口的类的对象就可以被序列化,还有一个"Cloneable"接口,这个也是一个标记接口,在默认情况下,Java中的对象是不允许被克隆的,就像现实生活中的人一样,不允许克隆,但是只要实现了"Cloneable"接口,那么对象就可以被克隆了。
      让Servlet实现了SingleThreadModel接口,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可。
      对于实现了SingleThreadModel接口的ServletServlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。 
   实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)。

iii.             
同步对共享数据的操作
对这里我还存在很大的疑问!!!!!

4、  偶遇java.net.BindException异常,怎么解决???
这个异常查了之后发现是tomcat端口被占用,要么是你的端口和其他的程序端口冲突,要么就是Tomcat没有正常关闭。前者可以把占8080端口的进程杀掉,后者你可以通过shartdown将tomcat手动关闭。

第四天:servlet的生命周期和一些细节问题的更多相关文章

  1. Servlet对象生命周期(四)

    一.Servlet对象生命周期 一下图片说明上图第7点 destroy()方法是在停止tomcat服务器时执行 https://pan.baidu.com/s/1mgTabWW#list/path=% ...

  2. servlet的生命周期与运行时的线程模型

    第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过 ...

  3. JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...

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

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

  5. j2ee基础(1)servlet的生命周期

    Servlet的生命周期 Servlet 生命周期规定了 Servlet 如何被加载.实例化.初始化. 处理客户端请求,以及何时结束服务. 该生命周期可以通过 javax.servlet.Servle ...

  6. (转)JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

    [声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...

  7. (转)Servlet的生命周期——初始化、运行、销毁全部过程

    背景:面试中很基础的一个问题,所以有必要好好整理一番. Servlet体系结构是建立在 Java 多线程机制上的,它的生命周期由 Web 容器负责. 当客户端第一次请求某个 Servlet 时,Ser ...

  8. Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)

    三.Servlet的生命周期 一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet怎样被加载并被初始化,怎样接收请求并作出对请求的响应,怎样被从服务中清除.Servlet ...

  9. Servlet 的生命周期 及 注意事项 总结

    Servlet的生命周期 图解Servlet的生命周期 生命周期的各个阶段 实例化 :Servlet 容器创建 Servlet 的实例 初始化 :该容器调用init() 方法 请求处理 :如果请求Se ...

随机推荐

  1. JavaScript作用域新总结

    作用域是什么 当我们将变量引入程序后,这些变量住在哪里,当程序需要的时候如何找到他们?这些问题都需要一个规则来存储变量,并且之后可以方便的找到这些变量,这套规则就被称为 作用域 .(管理变量的规则) ...

  2. mybatis报Error updating database. Cause: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String

    mybatis 3.3.0中对于时间参数进行比较时的一个bug. 如果拿传入的时间类型参数与空字符串''进行对比判断则会引发异常. 所以在上面的代码中去该该判断, 只保留非空判断就正常了 <if ...

  3. TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议【转】

    转自:http://blog.csdn.net/goodboy1881/article/details/668556 把这三个协议放到一起学习是因为这三个协议处于同一层(网际层),ARP协议用来找到目 ...

  4. PHP中获取文件扩展名的N种方法

    PHP中获取文件扩展名的N种方法 从网上收罗的,基本上就以下这几种方式: 第1种方法:function get_extension($file){substr(strrchr($file, '.'), ...

  5. OpenCV教程【002 VideoCapture加载并播放视频】

    #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace c ...

  6. POJ - 2079:Triangle (旋转卡壳,求最大三角形)

    Given n distinct points on a plane, your task is to find the triangle that have the maximum area, wh ...

  7. webpack里CommonJS的require与ES6 的module.exports加载模块有何不同

    只需明白commonjs的规则即可,import会被转化为commonjs格式的,babel默认会把ES6的模块转化为commonjs规范的. import vue from 'vue'; //等价于 ...

  8. bzoj 4503 两个串——FFT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4503 翻转T,就变成卷积.要想想怎么判断. 因为卷积是乘积求和,又想到相等的话相减为0,所以 ...

  9. fastjson --JSONObject 和JSONArray 转换

    fastjson解析:resultValue=[    {        "total": 1,        "saleLists": [           ...

  10. unix下网络编程之I/O复用(三)

    poll函数 在上文unix下网络编程之I/O复用(二)中已经介绍了select函数的相关使用,本文将介绍另一个常用的I/O复用函数poll.poll提供的功能与select类似,不过在处理流设备时, ...