Servlet笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、C/S和B/S的比较
1) c/s架构的系统在使用的时候必须安装一个客户端软件,如果服务器端升级
之后,客户端也需要进行升级.所以对于这样一种类型的软件可维护性比较差。
2) b/s架构的系统在使用的时候客户端不需要安装特殊的软件,只需要一个
浏览器就可以了,服务器端升级完毕之后,客户端不需要作任何改变,就可以使
用升级之后的软件,所以对于这样一种类型的软件可维护性比较好,应用广泛。
2、Web的介绍
1) 互联网: 连接全球计算机资源的网络环境,它是基于TCP/IP协议。
TCP/IP是一个协议簇,包括:
应用层: HTTP FTP(上传下载) TELNET STMP POP3(邮件协议)
传输层: TCP UDP
网络层: IP
数据链路层
2) 万维网(www World Wide Web):是互联网提供的一种服务,它是基于HTTP
协议,Web也就是万维网。
4、CGI定义
CGI(Common Gateway Interface 公共网关接口),CGI是用来开发web应用
的一门技术,CGI程序可以来处理客户端的请求,动态生成html。
优点: CGI程序可以很多种语言编写(C、Perl和VB等),便于程序员掌握。
缺点: 1) 服务器调用CGU程序处理客户端请求的时候,会启动一个进程
去执行,所以性能方面比较低。
2) 移植性不好
5、Servlet定义
1) 简单地说,Servlet就是运行在服务器端的一个java类
2) 专业地说,Servlet是一个Web组件
组件: 利用少量的、简单的API编写的一段程序,这段程序可以
去完成某个和客户端请求有关的功能(如用户注册)。
6、Servlet的使用目的
1) 利用Servlet技术来开发Web应用
2) Servlet采用java语言编写,具有java语言的一切优点。
3) 服务器调用Servlet处理客户端请求的时候,会分配一个线程去执行,
所以性能比较好。
4) 利用Servlet可以动态地生成html
7、Web Server
Web Server是一个能够接收并处理http请求,还能产生response的软件,用户开发
好的Web应用要部署到Web Server上才能运行,类似Windows中的IIS。
一般将Web Server称为Web服务器或应用服务器。常见的有:
Tomcat: Apache(软件基金会)提供的开源的web服务器
商用型:
WebSphere: IBM
Weblogic: BEA
客户端 --> web server(中间件)-->Web应用
客户端----》hibernate(中间件)---》数据库
8、容器(Container)
容器是Web Server中的其中一个组成部分,它的主要工作就是管理部署在Web Server上
的web应用的运行(装载和卸载web应用)以及这些web应用中的web组件(servelt,jsp等)的生命周期。
容器是运行在Web server(进程)中的一个很重要的后台线程。在Tomcat中容器的名字
叫Catalina。
容器分为Web容器和EJB容器两种:
1) web容器
装载和卸载Web应
用(管理Web应用的生命周期)
在Tom和cat中只有一个Web容器,Tomcat只能部署Web应用。
2) ejb容器
装载和卸载ejb应用(管理ejb应用的生命周期)
Websphere和Weblogic有一个Web容器和ejb容器,它们可以部署Web应用
和ejb应用。
9、Servlet处理请求的流程:
1) 客户端在浏览器的地址栏中输入一个请求的URL,按回车后就向服务器端发起一个http request(由浏览器生成)。
2) 服务器端的Web Server首先接受到请求,并将请求转交给容器,容器会根据请求的URL去调用客户端要访问的Servlet。
3) 容器会根据web.xml中对Servlet的描述去查找要访问的Servlet,若找到,将此Servlet
装载进虚拟机并实例化(第一次访问),然后调用Servlet实例中的service方法处理请求,并分配一个线程去执行。
注: 当第二次去访问同一个Servlet时,若容器判断到该Servlet已经被装载并实例化,
那么容器就不会再去创建一个新的Servlet实例,直接调用原来那个Servlet实例中的service方法
来处理请求。
4) 若没有查找到,直接返回一个404的错误代码到客户端,表示访问的资源不存在。
10、tomcat是apache的一个开源的项目.
tomcat的目录结构
bin:存放了tomcat的一些可执行文件,比如启动tomcat或则关闭tomcat
common:存放了tomcat和所有web应用都可以使用的类和jar包
conf:存放tomcat的一些配置文件.
logs:存放tomcat和web应用输出的日志文件.
server:存放只有tomcat才能使用的类和jar包,以及tomcat自带的web应用
shared:存放所有web应用都可以使用的类和jar包
temp:存放一些临时文件
webapps:存放开发的web应用(可以有多个)
work:存放jsp相关的一些servlet类
11、部署在tomcat上的Web应用的目录结构
Web应用名------WEB-INF----classes(servlet或其它类编译后的class文件)
| |-----lib(web应用需要使用的第三方jar包,如classes12.jar)
|--*.jsp |-----web.xml(用来描述Web应用中所有的
Servlet、Filter、Listener等)
|--*.html
|--js
|--image
|--css
12、servlet技术是j2ee的其中一个规范,主要包含两个方面
1) 开发人员在开发servlet的时候必须遵循servlet规范(主要是servlet api)开发
如: 开发人员开发一个Servlet要去继承javax.servlet.http.HttpServlet
2) 中间件开发商在开发Web Server的时候,也必须遵循这个规范
13、开发一个servlet的基本步骤
1) 创建一个java类,继承javax.servlet.http.HttpServlet
2) 在web.xml文件中描述这个servlet
let-name>
注意:
* 在
*
*
14、开发一个Servlet的三种方式
1) 定义一个类继承(推荐使用)
javax.servlet.http.HttpServlet
2) 定义一个类继承
javax.servlet.GenericServlet
3) 定义一个类实现
javax.servlet.Servlet
15、ServletContext(interface)
代表一个Web应用的上下文,在一个Web应用中只有一个独一无二的ServletContext。
1、在Servlet中获得提交表单中信息的方法
1) String value = request.getParameter(name);
功能: a) 获得提交表单中的指定字段信息
name --> 和表单中的字段名字对应
b) 获得URL中?后面的指定参数值
name --> 和?后面的参数名对应
2) String[] array = request.getParameterValues(name);
功能: 获得同一个字段名字下的多个值,封装到一个数组中。
通常用于checkbox中
3) Enumeration e = request.getParameterNames();
功能: 获得提交表单中所有字段的名字,封装到一个枚举类型中。
4) String queryString = request.getQueryString();
功能: 获得URL中?后面的字符串
2、http request的格式
分为请求头(Http协议的头部)和请求体(Http协议的体部)
注: http response也分为头部和体部
3、表单的常用提交方式
1) GET
浏览器将提交表单中的字段信息放置在请求头中,不适合大数据量的传输,
适合根据关键字作查询。
2) POST
浏览器将提交表单中的字段信息放置在请求体中,适合大数据量的传输,
如:向服务器端上传文件等。
注意:
1) 若直接在地址栏中输入URL按回车
按GET方式提交
2) 若属性method不指定任何值或者
不加属性method默认按GET方式
提交
3) 只有在method指定为POST时才按
POST方式提交
4、解决中文乱码
1) request中的中文乱码
a) POST方式提交
在获得提交表单信息之前调用
request
.setCharactersEncoding("UTF-8");
b) GET方式提交
在Tomcat的server.xml中配置
...
2) reponse中的中文乱码
在通过response获得输出流之前调用
response.setCharacterEncoding("UTF-8");
Servlet的生命周期:
1、装载并实例化Servlet(在整个生命周期中Servlet实例只有一个)
分为两种装载方式:
a) 延迟装载(默认方式)
当客户端发起一个请求第一次
去访问Servlet时,
容器会将Servlet装载进虚拟机并实例化,第二次以后去访问
同一个Servlet时容器就不会再去装载并实例化。
b) 预先装载
当Web Server启动,容器在装载Web应用的时候会将
Servlet装载进虚拟机并实例化。
这种方式必须在web.xml中描述:
...
number
number<0: 采用延迟装载
number>=0: 采用预先装载
number越小越先被装载
number越大越晚被装载
number=0最早被装载
注: 若不描述默认采用延迟装载
2、init方法的调用
当Servlet被装载并实例化后,容器会调用init方法对
Servlet进行初始化,只有在init方法调用成功后,Servlet
才处于service状态,能够处理客户端的请求。
注意: 1) 在整个Servlet的生命周期中init方法仅被调用一次
2) 用户定义的Servlet中可以覆盖有参或无参的
init方法,但是若覆盖有参init方法,最好先调用super.init(config),
对变量config进行赋值初始化。而覆盖无参init可以不调用super.init(),
推荐覆盖无参init,为了使用方便。
3) 用户定义的Servlet中可以不去覆盖init方法,
覆盖只是为了使用方便(如:获得web.xml中描述的初始化参数)
4) init方法的调用次序: 见init.ppt
3、service方法的调用
当Servlet被装载实例化并初始化后,客户端发起请求,
容器就会调用Servlet实例的service方法对请求进行处理。
注意: service方法在生命周期中被调用多次,这跟请求的次数有关。
4、Servlet实例的销毁
当容器在销毁Servlet实例前会先去调用destroy(),
在此方法中可以作下列工作:
1) 恢复一些初始化的变量
2) 释放资源
3) 控制所有运行在Servlet中的线程在Servlet实例被
销毁之前能正常运行结束
4) 记录日志信息
注意: 1) destroy()在生命周期中仅被调用一次
2) 用户定义的Servlet中可以不覆盖destroy()
服务器内部和外部跳转:
1、获得请求分发器RequestDispatcher的方式
1) RequestDispatcher dispatcher =
request.getRequestDispatcher(url);
url: 指定要跳转的服务器端资源(如:Servlet Jsp Html等)的URL
url可以为
a) 绝对路径: 如"/form/show"
b) 相对路径: 如"show"
2) ServletContext scx = super.getServletContext();
RequestDispatcher dispatcher = scx.getRequestDispatcher(url);
url: 只能是绝对路径(如:"/form/show")
ServletContext: Web应用的上下文
2、服务器内部跳转(Web内部跳转)
功能: 在服务器内部从一个Servlet跳转到服务器端的
另外一个资源(Servlet Jsp Html等)。
跳转方式:
1) forward方式
dispatcher.forward(request,response);
2) include方式
dispatcher.include(request,respon
se);
两种跳转的区别:
forward: 会将response体部中的信息清空
include: 将写到输出流中的信息包含进response中,
不会将response体部信息清空。
3、request(属于HttpServletRequest类型)
1) 使用范围
从客户端的一次请求到response之前是存在的,但是
response之后就不存在。
2) 使用语法
a) 往request中存放信息
request.setAttribute(key,value);
key: String类型
value: Object类型
b) 从request中获取信息
Object o = request.getAttribute(key);
c) 删除request中的信息
request.removeAttribute(key);
4、服务器外部跳转(重定向)
1) 跳转语法
response.sendRedirect(url);
url可以为
a) 绝对路径:
如: request.getContextPath()+"/resource/dispatch2"
等于
"/servlet_jd0801a/resource/dispatch2"
b) 相对路径:
如: "dispatch2"
2) 功能
从一个Servlet重定向到服务器端的另外一个资源
(Servlet Jsp Html等)。
3) 注意点
客户端发起了两次请求
一、Http协议的特点
1、 基于Http协议的http request和服务器端采用一次性的
连接,这样客户端不必关心服务器端系统的升级和维护,
要获得信息只要发起一次请求即可。
2、Http协议是一种无状态的协议,当客户端向服务器端发起
一次请求,服务器端不会来区分客户端以及保存客户端的状态信息,
优点: 可以提高服务器端的处理请求能力和提高response的
响应灵敏度。
缺点: 服务器端无法跟踪和保存客户端的状态信息
二、跟踪和保存客户端状态信息的技术
1、Cookie
1) Cookie是在服务器端构造的对象,在Cookie中可以
以文本形式保存客户端的状态信息(如登陆的用户名和密码),
并将Cookie对象放置在response中返回并保存在客户端。
2) 服务器端生成Cookie的方式
Cookie cookie =
new Cookie(cookieName,cookieValue);
cookieName: String类型
cookieValue: String类型
如: Cookie cookie = new Cookie("username","jack");
Cookie cookie2 = new Cookie("password","888888");
3) 设置Cookie保存在客户端的存活期
cookie.setMaxAge(int time);
time: Cookie存活期的时间(单位:秒),默认为-1
time > 0: Cookie被保存在客户端的某个文件中
time < 0: Cookie被保存在客户端的浏览器中
time = 0: 表示删除浏览器中同名的Cookie
注意:
* 当time > 0时,若超过了Cookie的存活期,
那么在下次请求时,浏览器就不会把Cookie放置在
request中发送到服务器端。
* 当time < 0时,在关闭浏览器后,那么保存
在浏览器中Cookie也就会不存在。
4) 将Cookie放置在response中并返回到客户端
response.addCookie(cookie);
5) 在服务器端
获得从客户端发送过来所有Cookie
Cookie[] cookies = request.getCookies();
6) Cookie功能可以被浏览器屏蔽
目的: 解决安全隐患问题
屏蔽的特点: 在Cookie被浏览器屏蔽后,服务器端
返回response中的Cookie不会被浏览器接受,客户端发起
请求后浏览器也不会把保存在客户端的Cookie放在
request中发送到服务器端。
2、session(会话) --> 属于HttpSession类型
1) 获得session的方式
(a) HttpSession session = request.getSession();
当第一次调用此方法时,容器会先去获得从客户端
发送过来的Cookie,从中取出jsessionid,若没有取到的话,
容器会构造一个新的session对象并为之分配一个唯一的jsessionid,
并将这个session对象放置在由容器维护的一个Map中
(jsessionid,session对象引用),同时紧接着构造一个Cookie对象
来存放jsessionid的值,格式如下:
Cookie cookie = new Cookie("JSESSIONID","jsessionid的值");
然后调用response.addCookie(cookie);
将cookie放置在response中返回到客户端保存在当前浏览器中。
当第二次以后去调用此方法时,容器就可以从客户端
发送来的Cookie中获得jsessionid,然后从Map中取出原来构造的
session对象。
(b) HttpSession session = request.getSession(boolean create);
create=true: 同 a)
create=false: 当容器获取不到Cookie中的
jsessionid时,它不会去构造一个新的session对象,
此方法直接返回null。
2) session的使用方式
a) 往session中存放信息
session.setAttribute(key,value);
b) 从session中获得信息
Object o = session.getAttribute(key);
c) 将session中的信息删除
session.removeAttribute(key);
3) session的特点
a) 一个浏览器对应一个session(一个浏览器中存放
当前session的jsessionid)
b) 在同一个浏览器中,一个session可以跨越多个
请求,多个请求可以共享同一个session。若多个请求
要共享的信息可以放置在session中。
c) session是依赖于Cookie的,若Cookie功能被屏蔽
后,那么session就不好使用。
使用建议: 将信息尽量存放在request中,存放在
session中的信息会占有系统资源的。
4) session的失效方式
所谓失效: 容器会将session对象引用从Map中删除
a) session.invalidate()
b) 关闭浏览器后,session在默认30分钟后会自动失效
c) 用户在页面上不作任何操作,默认也是在30分钟后会失效
d) 在web.xml中设置失效时间
5) 存放信息的四种范围
a) applicationScope: --> ServletContext
针对整个Web应用范围,可以跨越多个session,跨越多个浏览器
b) sessionScope: --> ses
sion(HttpSession)
针对一个浏览器范围,可以跨越多个request
c) requestScope: --> request(HttpServletRequest)
针对一个请求范围,可以跨越多个page、Servlet
d) pageScope: --> PageContext(jsp)
针对一个页面或者一个Servlet范围
6) Cookie和session的比较
a) 两者都可以用来跟踪和保存客户端的状态信息
b) Cookie是在服务器端创建,在客户端保存
session是在服务器端创建,在服务端保存
c) Cookie中只能存放String类型,而session
中可以存放Object类型。
d) session是依赖于Cookie的,jsessionid还是
存放在Cookie中并保存在客户端的浏览器中。
3、URL重写
1) 功能: 解决Cookie被浏览器屏蔽的问题
2) URL重写的方式:
String newURL = response.encodeURL(oldURL);
或者
String newURL = response.encodeRedirctURL(oldURL);
newURL的格式: newURL = oldURL;jsessionid=*****
注意:
1) 当客户端以newURL向服务器发起请求后,容器会
从newURL中获得jsessionid,然后根据jsessionid从
由容器维护的Map中找到对应的session对象。
2) 程序只要有一个地方的URL重写后,那么其它
地方的URL都要重写,目的就是将jsessionid维持下来,
将其发送到服务器端。
1、事件监听器
对各个范围内的一系列动作进行监听,捕获产生的事件对象并进行处理。
1) ServletContext事件监听器---->针对applicationScope
a) ServletContextListener(*)
对整个Web应用的装载和卸载进行监听。
b) ServletContextAttributeListener
对ServletContext中的信息存放、删除和替换进行监听。
2) HttPSession事件监听器----->针对sessionscope
a) HttpSessionListener(*)
对session的创建和失效进行监听。
b) HttpSessionAttributeListener
对session中的信息存放、删除和替换进行监听。
3) ServletRequest事件监听器 ----->针对requestscope
a) ServletRequestListener
对request的产生和结束进行监听。
b) ServletRequestAttributeListener
对request中的信息存放、删除和替换进行监听。
2、listener和filter一样要在web.xml中进行描述