第四天:servlet的生命周期和一些细节问题
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接口的Servlet,Servlet引擎仍然支持对该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的生命周期和一些细节问题的更多相关文章
- Servlet对象生命周期(四)
一.Servlet对象生命周期 一下图片说明上图第7点 destroy()方法是在停止tomcat服务器时执行 https://pan.baidu.com/s/1mgTabWW#list/path=% ...
- servlet的生命周期与运行时的线程模型
第 14 章 生命周期 注意 讲一下servlet的生命周期与运行时的线程模型,对了解servlet的运行原理有所帮助,这样才能避免一些有冲突的设计. 如果你不满足以下任一条件,请继续阅读,否则请跳过 ...
- JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...
- Servlet学习笔记(1)--第一个servlet&&三种状态对象(cookie,session,application)&&Servlet的生命周期
servlet的404错误困扰了两天,各种方法都试过了,翻书逛论坛终于把问题解决了,写此博客来纪念自己的第一个servlet经历. 下面我会将自己的编写第一个servlet的详细过程提供给初学者,大神 ...
- j2ee基础(1)servlet的生命周期
Servlet的生命周期 Servlet 生命周期规定了 Servlet 如何被加载.实例化.初始化. 处理客户端请求,以及何时结束服务. 该生命周期可以通过 javax.servlet.Servle ...
- (转)JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 一.http协议回顾: 在上一篇文章中:JavaW ...
- (转)Servlet的生命周期——初始化、运行、销毁全部过程
背景:面试中很基础的一个问题,所以有必要好好整理一番. Servlet体系结构是建立在 Java 多线程机制上的,它的生命周期由 Web 容器负责. 当客户端第一次请求某个 Servlet 时,Ser ...
- Java Web -- Servlet(5) 开发Servlet的三种方法、配置Servlet具体解释、Servlet的生命周期(2)
三.Servlet的生命周期 一个Java servlet具有一个生命周期,这个生命周期定义了一个Servlet怎样被加载并被初始化,怎样接收请求并作出对请求的响应,怎样被从服务中清除.Servlet ...
- Servlet 的生命周期 及 注意事项 总结
Servlet的生命周期 图解Servlet的生命周期 生命周期的各个阶段 实例化 :Servlet 容器创建 Servlet 的实例 初始化 :该容器调用init() 方法 请求处理 :如果请求Se ...
随机推荐
- jsp:tld标签
z注意每个uri地址要保持统一 1.创建MytagPrinta.java文件 package cn.tag; import java.io.IOException; import javax.serv ...
- java从小白到架构师大牛必看书籍
一.基础类 1.<ThinkingJava>,入门第一位是建立正确的概念. 2.<Core Java>,我没系统读过,这本书更贴近实践,更多API的介绍,同样,更新也更频繁. ...
- HDU 1711 kmp+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=1711 Number Sequence Time Limit: 10000/5000 MS (Java/Other ...
- android Application Project目录结构
src:存放java源文件 gen: 资源配置文件 Android4.0: 4.0 类库 Android Private Lib: 支持库 Android Dependencies: android ...
- InnoDB参数详解
1.查询5.5版本的InnoDB参数并注释:[root@localhost etc]# grep -i innodb my.cnf; t_innodb; otherwise, slaves may d ...
- 如何显示PHP运行错误
在运行文件的最前面加两行代码: error_reporting(E_ALL); ini_set('display_errors', '1'); 这样调试起来就方便多了
- GDB Core,gdb 调试大全,core文件调试
编译: gcc -g -o hello hello.c gdb 调试: 基本 gdb 命令. 命 令 描 述 小结:常用的gdb命令 backtrace 显示程序中的当前位置和表示如何到达当前位置的栈 ...
- C++ const 常量和常指针
常量,该指针所指向的值为只读 ; const int * p = &a; 常指针,该指针的值为只读,不可再指向其他地址 const * const p = &a; 常值,常指针 con ...
- OpenCV-Python在图片上输出中文
OpenCV中在图片上输出中文一般需要借助FreeType库实现.FreeType库是一个完全免费(开源)的.高质量的且可移植的字体引擎,它提供统一的接口来访问多种字体格式文件.但使用FreeType ...
- 用Java实现异构数据库的高效通用分页查询功能
不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...