Servlet规范

servlet规范
一。介绍
1.它是javaee里面的一种规范。
2.作用:
1)在servlet规范中指定了动态资源文件的开发步骤
2)在servlet规范中,指定了http服务器调用动态资源文件规则
3)指定http服务器管理动态资源文件实例对象规则

二。servlet接口实现类
1.servlet接口来自于servlet规范下的一个接口,这个接口存在于http服务器提供的jar
2.tomcat服务器下lib文件有一个servlet-api.jar存放Servlet接口(javax.servlet.ervlet接口)
3.Servlet规范中,http服务器能调用的动态资源文件必须是一个Servlet接口实现类
例如:
class Student{
//这是一个普通的类,不是一个动态资源文件,tomcat没有权利来调用
}
————————————————————————-
class Student implements Servlet{
//这是一个合法的动态资源文件,因为实现了Servlet接口,tomcat可以调用
Servlet s = new Servlet();
s.doGet();//创建对象,执行方法都是http服务器来做的
}

三。Servlet接口实现类开发步骤
第一步:创建一个java类继承与httpservlet父类,让他成为一个servlet接口实现类
第二步:重写httpservlet父类的两个方法,doGet,doPost
get
浏览器———oneServlet.doGet()
post
浏览器———oneServlet.doPost()
第三步:将servlet接口实现类注册到tomcat服务器

	在web-inf下的web.xml文件中配置实现类
	<!--这是将接口的实现类类路径交给tomcat-->
	<servlet>
             <servlet-name>one1</servlet-name><!--这是实现类的别名-->
	     <servlet-class>com.cqust.controller.OneServlet</servlet-class>
	     <!--这是实现类的类路径-->
	</servlet>
	tomcat会声明一个变量:String one1 = "com.cqust.controller.OneServlet"

	<!--为了降低用户访问servlet接口实现类难度,需要设置请求别名-->
	<servlet-mapping>
	       <servlet-name>one1</servlet-name>
	       <url-pattern>/one</url-pattern>
	       <!--设置请求别名,这是给用户使用的-->
	</servlet-mapping>
	在配置之后访问OneServlet动态资源文件的地址是:
	http://localhost:8080/one

四。Servlet对象的生命周期
1.网站中所有的servlet接口实现类的实例对象,只能由http服务器负责创建
开发人员不能手动创建实例对象
2.在默认的情况下,http服务器接受到对于当前servlet接口实现类第一次请求
时自动创建这个servlet接口实现类的实例对象

		在手动配置的情况下,要求http服务器在启动服务器的时候
		创建这个servlet接口实现类的实例对象
		<servlet>
			<load-on-startup>30</load-on-startup>
			<这里需要填一个大于0的整数>
		</servlet>

	3.在服务器运行期间,一个实现类只会创建一个实例对象
	4.http服务器关闭,自动销毁所有对象。

五。HttpServletResponse接口
1.介绍:
1)HttpServletResponse接口来自于Servlet规范中,存在于servlet-api.jar中
2)接口的实现类由服务器负责提供
3)接口负责将doGet执行的结果写入响应体里交给用户浏览器
4)接口修饰的对象称为响应对象response

2.主要功能
	1).将执行结果以二进制形式写入响应体
	2).设置响应头中content-type属性值,从而控制浏览器使用对应的编译器
	将二进制编译为图片,命令
	3).设置响应头中location属性,将一个请求地址赋值给location
	从而控制浏览器向指定服务器发送请求。

六。HttpServletRequset接口
1.介绍:
1)HttpServletRequest接口来自于Servlet规范中,存在于servlet-api.jar中
2)接口的实现类由服务器负责提供
3).该接口负责在doGet/doPost方法运行时读取请求协议包中的内容
4).开发人员习惯于将该接口修饰的对象称为请求对象。
2.作用:
1)读取http请求协议包中请求行的信息
2)读取保存在http请求协议包中请求头或者请求体中请求参数的信息
3)可以代替浏览器向服务器申请资源文件调用

七。请求对象和响应对象的生命周期
1.在服务器接受到浏览器发送的请求协议包之后
自动为当前的请求协议包创建请求对象和响应对象
2.在服务器调用doGet/doPost方法的时候负责将请求对象和响应对象作为实参传递到方法里面
确保doGet/doPost正确执行。
3.在服务器准备推送响应协议包之前,负责将本次请求关联的请求对象,和响应对象销毁。

设置当前网站的默认欢迎资源文件规则
在web.xml中定义:
<welcome-file-list>
	<welcome-file>login.html</welcome-file>
</welcome-file-list>

设置自定义默认文件定位规则,此时tomcat自带定位规则将失效

八。http状态码
1.介绍:
1)由三位数字组成的一个符号
2)http服务器在推送到响应包之前根据本次请求处理情况
将状态码写入到状态行
3)如果服务器针对本次请求返回了对应的资源文件。
通过状态码通知浏览器应该如何处理这个结果

	如果针对本次请求,无法返回对应的资源文件,通过状态码向浏览器
	解释不能提供服务的原因

2.分类:
	1)组成 100--599:分为5类
	2)1xx :
		最有特征 100:通知浏览器本次返回的资源文件并不是一个独立的资源文件
		,需要浏览器在接受响应包之后,将继续向http服务器索要依赖的的其他文件。
		例如:<img src="xx.jpg"/> 索要次文件还需要索要图片。

	3)2xx:
		最有特征的是200,通知浏览器本次返回的是一个完整的资源文件
		,浏览器在接受到之后不需要关联其他的文件

	4)3xx:
		最有特征302,通知浏览器本次返回的不是一个资源文件的内容
		而是一个地址,需要浏览器自动向这个地址发起请求
		然后索要资源文件

		response.sendRedirect("http://www.baidu.com");
		写入响应头中
		location=http://www.baidu.com
		这个行为会导致tomcat将状态码302写入到状态行
	5)4xx:
		404:通知浏览器,服务端没有定位到该资源文件
		405:服务端定位到了资源文件,但是请求方式错误

	6)5xx:
		500:访问方式正确,资源文件存在,但是servlet在执行的时候出错了。
		java程序报异常

九。多个servlet之间的调用规则:
1.前提条件:
某些来自于浏览器发送请求。往往需要服务端中多个servlet协同处理
但是浏览器一次只能访问到一个servlet,导致用户需要手动通过浏览器
发起多次才能得到服务
这样会增加用户的难度,导致用户放弃访问当前网站
2.提高用户使用感受:
无论本次请求涉及到多个servlet,用户只需要手动通知浏览器
发起一次请求即可
3.多个servlet之间的调用规则:
1)重定向
2)请求转发

十。重定向解决方案:(每一次请求都是通过浏览器来发起的这样效率比较低)
1.工作原理:用户第一次通过【手动方式】通知浏览器访问OneServlet
OneServlet工作完毕后,将TwoServlet地址写入响应头location属性中
,导致tomcat将302状态码写入到状态行。
在浏览器接受到响应包之后,会读取302状态行,此时浏览器自动根据
响应头中location属性的值发起第二次请求,访问TwoServlet去完成请求
中剩余任务

2.实现命令:
	response.sendRedirect("请求地址");
	将地址写入到响应头中的loation属性

3.特征:
	1)请求地址:
		可以是网站内部资源(/myweb/one)
		可以是其他网站的资源文件("http://www.baidu.com")

	2)请求次数
		浏览器至少发送两次请求,但是只有一次请求是用户自己手动发送
		后续请求都是浏览器自动发送
	3)请求方式:
		重定向解决方案,通过地址栏通知浏览器发起下一次请求,因此通过重定向方案
		访问资源文件接受的方式一定是get


4.缺点:
	重定向解决方案需要在浏览器与服务器之间进行多次往返,大量时间
	消耗在往返的次数上,增加了用户等待服务的时间

十一。请求转发解决方案:(地址栏不会发生变化)
1.原理:
用户第一次通过手动的方式要求浏览器访问OneServlet
OneServlet工作完毕之后通过当前的请求对象代替浏览器向tomcat
发起请求,申请调用TwoServlet
tomcat在接受到这个请求之后,自动调用TwoServlet来完成剩余的任务

2.实现命令:请求对象代替浏览器向tomcat发起请求
	1.通过当前请求对象生成资源文件申请报告对象
	RequestDispatcher report = request.getRequestDispatcher("/two")
	2.将报告对象发送给tomcat
	report.forward(request,response);

3.优点:
	1)无论本次请求涉及到多个Servlet,用户只需要手动的通过浏览器发送一次请求
	2)Servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数
	增加处理服务速度

4.特征:
	1)请求次数
		在请求转发过程中,浏览器只发送一次请求
		
	2)请求地址
		只能向tomcat服务器申请调用当下网站资源文件地址
		request.getRequestDispathcer("/two")
	3)请求方式
		在请求转发过程中,浏览器只发送一个http请求协议包
		参与本次请求的所有Servlet共享一个请求协议包,因此这些
		Servlet接受的请求方式与浏览器发送的请求方式保持一致

十二。多个Servlet之间的数据共享实现方案:
1.数据共享:OneServlet工作完毕,将产生数据交给TwoServlet来使用
2.Servlet规范中提供四种数据共享方案
1)ServletContext接口
2)Cookie接口
3)HttpSession接口
4)HttpServletRequest接口
十三。ServletContext接口:
1.介绍
1)来自于Servlet规范中的一个接口。在tomcat中存在servlet-api.jar
在tomcat中负责提供这个接口实现类
2)如果两个Servlet来自于同于一个网站,彼此之间通过网站的ServletContext
实例对象实现数据共享
3)开发人员习惯于将ServletContext对象称为【全局作用域对象】
2.工作原理:
每一个网站都存在一个全局作用域对象。这个对象相当于一个map
在网站中OneServlet可以写入一个数据到全局作用域对象中,当前网站
的其他Servlet可以从全局作用域对象获取这个数据。
3.全局作用域对象的生命周期:
1)在http服务器启动的过程中,自动为当前网站创建一个全局作用域对象
2)在http服务器运行期间,全局作用域对象只能有一个
3)在http服务器运行期间,全局作用域对象一直处于存活状态
4)服务器关闭,全局作用域对象销毁
4.命令的实现:
【OneServlet将数据给TwoServlet】
1)通过请求对象向tomcat索要当前网站的全局作用域对象
ServletContext application = request.getServletContext();
2)将数据添加到全局作用域对象作为共享数据
application.setAttribute(“key1″,”value1”);

	Two
	1)通过请求对象向tomcat索要当前网站的全局作用域对象
	ServletContext application = request.getServletContext();
	2)从对象中获取到指定关键字对应数据
	Object value = application.getAttribute("key1");

十四。Cookie
1.介绍:
1)Cookie来自于Servlet规范中的一个工具类,存在于tomcat提供servlet-api.jar
2)如果两个动态资源文件来自于同一个网站,并且为同一个浏览器提供服务,此时
借助于Cookie对象进行数据共享
3)Cookie存放于当前用户下的私人数据,在共享数据过程中提高服务质量。
4)在现实生活中,Cookie相当于用于用户在服务端得到的会员卡

2.原理:
	用户通过浏览器第一次向myweb网站发起请求申请OneServlet
	OneServlet在运行期间创建一个Cookie存储与当前用户相关的数据
	OneServlet工作完毕之后,将Cookie写入到响应头交还到浏览器
	浏览器在接受到响应包后,将Cookie存储在浏览器的缓存
	一段时间后用户通过【同一个浏览器】向myweb网站发起请求申请TwoServlet
	浏览器需要无条件将myweb网站之前推送过来的Cookie写入到请求头,发送过去
	此时TwoServlet在运行时,就可以通过读取请求头中的Cookie中的信息得到OneServlet
	提供的共享数据

3.实现命令:
	OneServlet{
		1)创建一个Cookie对象,保存共享数据
		Cookie card1 = new Cookie("key1","v1");
		Cookie card2 = new Cookie("key2","v2");
		Cookie相当于一个map,一个Cookie只能方放一个键值对
		这个键值对的key,value只能是String,key不能是中文
		2)将Cookie写入到响应头,交给浏览器
		respones.addCookie(card1)
		respones.addCookie(card1)

}

4.Cookie销毁时机:
	1)在默认的情况下,Cookie对象存放在浏览器的缓存中
	因此只要浏览器关闭,Cookie对象就被销毁

	2)在手动设置情况下,可以要求浏览器将接受的Cookie存放在客户端计算机上的硬盘
	同时需要指定Cookie在1硬盘上存活的时间,在存活的时间范围内,关闭浏览器关闭客户端计算机
	关闭服务器,都不会导致Cookie销毁。在存活时间到达时,Cookie自动从硬盘上被删除

	Cookie.setMaxAge(60);

十五。HttpSession接口:
1.介绍:
1)HttpSession接口来自于Servlet规范下的一个接口,存在于tomcat中的servlet-api.jar
其实现类由http服务器提供。tomcat提供实现类存在于serlvet-api.jar
2)如果两个servlet来自同一个网站下,并且为同一个用户提供服务,此时借助于
HttpSession对象进行数据共享
3)开发人员习惯于将httpSession接口修饰的对象称为【会话作用域对象】
2.HttpSession与Cookie区别:
1)存储位置:
Cookie:存放在客户端计算机(浏览器内存/硬盘)
HttpSession:存放在服务端计算机内存
2)数据类型:
Cookie对象存储共享数据类型只能是String
httpSession对象可以是任意类型数据
3)存储数量:
一个Cookie对象只能存储一个共享数据
HttpSession使用map集合存储共享数据,所以可以存储任意数量共享数据

	4)参照物:
		Cookie相当于客户在服务端的会员卡
		HttpSession相当于客户端在服务端的私人保险柜。


3.命令实现:同一个网站下OneServlet将数据传递给TwoServlet
OneServlet{
	1)调用请求对象向tomcat索要当前用户在服务端的私人储物柜
	httpSession session = request.getSession();
	2)将数据添加到用户私人储物柜
	session.setAttribute("key1","value1")
}


TwoServlet{
	1)调用请求对象向tomcat索要当前用户在服务端的私人储物柜
	httpSession session = request.getSession();
	2)从会话作用域对象得到OneServlet提供的共享数据
	Object value1 = session.getAttribute("key1")
	
}

4.Http服务器如何将用户与HttpSession关联起来
	Cookie
Cookie存储私人存储柜的id,没有就创建。

5.getSession and getSession(false)

1)getSession():如果当前用户在服务端有自己的柜子,要去tomcat返回储物罐
	如果没有则要求tomca创建一个私人的储物柜
2)getSession(false):如果当前用户在服务端已经拥有自己的私人储物柜
		要求将储物柜返回
		如果没有储物柜,则返回null

6.HttpSession销毁时机
	1)用户与HttpSession关联时使用的Cookie只能存放在浏览器缓存中
	2)由于浏览器关闭时,意味着用户与他的HttpSession关系被切断
	3)由于tomcat无法检测浏览器何时关闭,因此在浏览器关闭时并不会
	导致tomcat将浏览器关联的HttpSession销毁
	4)为了解决这个问题,tomcat为每一个HttpSession对象设置【空闲时间】
	默认是30分钟,如果当前HttpSession空闲达到了30分钟tomcat会销毁这个HttpSession


7.HttpSession空闲时间的手动设置:
	在当前网站中/web/WEB-INF/web.xml
	<session-config>
		<session-timeout>5</session-tomeout>表示当前网站每个HttpSession
		最大空闲时间5分钟
	</session-config>

十六。HttpServletRequest接口实现数据共享:

1.介绍:
	1)在同一个网站中,如果两个Servlet之间通过【请求转发】方式进行调用
	彼此之间共享同一个请求协议包,而一个请求协议包值对应一个请求对象
	因此Sevrvlet之间共享一个请求对象,此时可以利用这个请求对象在两个
	Servlet之间实现数据共享
	2)在请求对象实现Servlet之间数据共享时,开发人员将请求对象称为【请求作用域对象】

2.命令实现:OneServlet通过请求转发申请调用TwoServlet,需要给TwoServlet提供共享数据
	OneServlet{
		添加数据到【请求作用域对象】中的attrbute属性
		request.setAttibute("k1","v1")
		向tomcat申请调用TwoServlet
		request.getRequestDispatcher("/two").foeword(requets,response);
	}


	TwoServlet{
	
		从当前请求对象得到OneServlet写入到共享数据
		Object o = request.getAttibute("k1");
	}

十七。Servlet规范扩展————-监听器接口

1.介绍:
	1)一组来自于Servlet规范下的接口,共有8个接口。在tomcat存在servlet-api.jar
	2)监听器接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类
	3)监听器接口用于监控【作用域对象生命周期变化时刻】以及【作用域对象共享
	数据变化时刻】

2.作用域对象:
	1)在Servlet规范中认为在服务端内存中可以在某些条件下为两个Servlet之间提供
	数据共享方案的对象,被称为【作用域对象】

	2)Servlet规范下作用域对象:
		ServletContext:全局作用域对象
		HttpSession:会话作用域对象
		HttpServletRequest:请求作用域对象


3.监听器接口实现类开发规范:(三步)
	1)根据监听的实际情况,选择对应监听器接口进行实现
	2)重写监听器接口声明【监听事件处理方法】
	3)在web.xml文件将监听器接口实现类注册到Http服务器

4.ServletContextListener接口:
	1)作用:通过这个接口合法的检测全局作用域对象被初始化时刻以及被销毁时刻
	2)监听事件处理方法:
		public void contextInitlized():在全局作用域对象被Http服务器初始化调用

		public void contextDestory():在全局作用域对象被Http服务器销毁时调用

5.ServletContextAttributeListener接口:
	1)作用:通过这个接口合法的检测全局作用域对象共享数据变化时刻
	2)监听事件处理方法:
		public void contextAdd():在全局作用域对象添加共享数据
		public void contextReplaced():在全局作用域对象更新共享数据
		public void contextInitlized():在全局作用域对象删除数据


6.全局作用域对象共享数据变化时刻
	ServletContext application = request.getServletContext();
	application.setAttribute("k1","v1");//新增共享数据
	application.setAttibute("k1","v2");//更新共享数据
	application.removeAttibute("key1");//删除共享数据

十八。Filter接口—过滤器接口(Servlet规范扩展):
1.介绍:
1)一组来自于Servlet规范下的接口,在tomcat存在servlet-api.jar
2)Filter接口需要由开发人员亲自实现,Http服务器提供jar包并没有对应的实现类
3)Filter接口在Http服务器调用资源文件之前,对Http服务器进行拦截
2.具体作用:
1)拦截Http服务器,帮助Http服务器检测当前请求合法性
2)拦截Http服务器,对当前请求进行增强操作

3.Filter接口实现类开发步骤:三步
	1)创建一个java类实现Filter接口
	2)重写Filter接口中的doFilter方法
	3)web.xml将过滤器接口实现类注册到Http服务器

4.Filter拦截地址格式:
	1)命令格式:
		<filter-mapping>
			<filter-name>OneFilter</filter-name>
			<url-pattern>/拦截地址</url-pattern>
		</filter-mapping>
	2)命令的作用:拦截地址通知tomcat在调用何种资源文件之前需要调用OneFilter过滤
	进行拦截
	3)要求tomcat在调用某一个具体文件之前,来调用OneFilter拦截
		<url-pattern>/img/mm.jpg</url-pattern>

	4)要求tomcat在调用某一个文件夹下所有的资源文件之前,来调用OneFilter拦截
		<url-pattern>/img/*</url-pattern>

	5)要求tomcat在调用任意文件夹下的某种类型之前,来调用OneFilter拦截
		<url-pattern>*.jpg</url-pattern>

	6)要求tomcat在调用网站中任意文件之前,来调用OneFilter拦截
		<url-pattern>/*</url-pattern>
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Servlet规范