servlet知识点

1. 什么是Servlet?

sun公司制订的一种用来扩展web服务器功能的组件规范。

(1)用来扩展web服务器功能

web服务器只能处理静态资源的请求(即需要事先将html文件准备好,并存放到指定的文件夹下面),
不能够处理动态资源的请求(即需要计算,生成动态页面),所以需要扩展其功能。
servlet可以扩展web服务器功能,当web服务器收到请求之后,
如果需要计算,可以调用servlet来处理。

(2)组件规范

1)什么是组件?

符合规范,实现部分功能,并且需要部署到相应的
容器里面才能运行的软件模块。
servlet就是一个组件,需要部署到servlet容器里面
才能运行。

2)什么是容器?

符合规范,提供组件运行环境的程序。
servlet容器需要符合servlet规范,为servlet提供
网络相关的服务。

2.如何写一个Servlet?

step1.写一个java类,实现Servlet接口或者继承
	HttpServlet抽象类。
注:一般选择继承。
step2.编译。
step3.打包。(变成一个组件)
	appname (应用名)
		WEB-INF
			classes (放 .class文件)
			lib (可选,放.jar文件)
			web.xml (部署描述文件)
step4.部署。
	将step3创建的整个文件夹拷贝到容器里面。
	注:
		可以使用jar命令将step3创建的整个文件夹压缩成".war"结尾的文件,然后再拷贝这个文件就可以了。
step5.启动servlet容器,访问servlet。
	http://ip:port/appname/url-pattern
	注:
		url-pattern在web.xml文件当中设置。

3.Servlet是如何运行的?

比如在浏览器地址栏输入
http://ip:port/day01/hello

step1.浏览器依据ip,port与tomcat建立连接。
step2.浏览器将请求数据打包并发送请求。
	注:即按照http协议的要求,创建请求数据包,并把该请求数据包发送给tomcat。
step3.tomcat收到请求数据包之后,拆包,并且将解析到的数据存放到request对象里面,同时创建一个response对象。
	注:拆包,即按照http协议要求,解析请求数据包的内容。
step4.tomcat将servlet实例化,然后调用该实例的service方法。
	注:
		tomcat会将request对象和response对象作为参数传递给service方法。
		开发人员可以通过调用request对象提供的方法来获取请求数据包里面的数据,也可以将处理结果写入response对象。
step5.tomcat会从response对象中获取处理结果,然后打包发送给浏览器。
step6.浏览器解析响应数据包,生成页面。

4.Servlet的生命周期

(1)什么是Servlet的生命周期?

servlet容器如何创建servlet对象、如何对其进行初始化处理、如何调用其方法处理请求,以及如何销毁该对象的整个过程。

(2)生命周期分成哪几个阶段?

1)实例化

a.什么是实例化?
	容器调用servlet的构造器,创建servlet对象。
b.什么时候实例化?
	情形1: 容器收到请求之后。
	情形2: 容器启动之后,立即创建。
		注:需要额外的配置。
		<!-- 

			配置启动加载:即容器启动之后,
			会立即创建相应的实例。
		注:
			值是一个大于等于零的整数,值越小,
			优先级越高(优先被创建)。
		 -->
		<load-on-startup>1</load-on-startup>
	

c.会创建几个实例?
	容器只会创建一个实例!	

2)初始化

a.什么是初始化?
 	容器调用servlet的init方法。
	注:该方法只会执行一次!
b.GenericServlet已经提供了init方法的实现。
	注:
	  将容器传递过来的ServletConfig对象保存下来了,并且提供了一个方法(getServletConfig)来获得该对象。
c.如何实现自已的初始化处理逻辑?
	只需要override GenericServlet的init方法。
	注:
		override 不带参的那个init方法。
d.初始化参数
	step1.配置初始化参数
	<!-- 配置初始化参数 -->

	<init-param>
		<param-name>company</param-name>
		<param-value>IBM</param-value>
	</init-param>	
	step2.使用ServletConfig提供的getInitParameter方法来读取初始化参数。

3)就绪(调用)

a.什么是就绪?
	容器收到请求之后,调用servlet的service方法来处理请求。
b.HttpServlet已经提供了service方法的实现。
	注:
		依据请求类型调用对应的doXXX方法。
		比如,get请求调用doGet方法,post请求调用doPost方法(这两个方法只是抛出了一个异常)。
c.我们写servlet,可以有两个选择:一是override HttpServlet的service方法,另外一个选择是override HttpServlet的doGet方法和doPost方法。

4)销毁

a.什么是销毁?
	容器在删除servlet对象之前,会调用destroy方法。
	注:
		该方法只会执行一次!
b.GenericServlet已经提供了destroy方法的实现。
	注:
		该方法是一个空方法,什么都没做。
c.如何实现自已的销毁处理逻辑?
	override GenericServlet的destroy方法。

(3)相关的接口与类(了解)

a.Servlet接口
	init(ServletConfig config)
	service()
	destroy()
b.GenericServlet抽象类
	实现了Servlet接口中的部分方法(init和destroy)。
c.HttpServlet抽象类
	继承了GenericServlet,实现了service方法。

5. Servlet上下文

(1)什么是Servlet上下文?

容器启动之后,会为每一个web应用创建唯一的一个符合ServletContext接口要求的对象,该对象一般我们称之为
servlet上下文。
注:
	唯一性:一个web应用对应一个上下文。
	持久性:只要容器不关闭,应用没有被卸载,那么上下文就会
	一直存在。

(2)如何获得Servlet上下文?

GenericServlet提供了getServletContext()方法来获得上下文。

(3)作用

1)绑订数据

	setAttribute
	getAttribute
	removeAttribute
注:
	request,session,servlet上下文都提供了绑订数据相关的方法,如何选取?
	a. 这三个对象,生存时间长度依次为request < session < servlet上下文,在满足使用条件的情况下,尽量优先使用生命
	周期短的。

6.Servlet线程安全问题

(1)为什么说Servlet会有线程安全问题?

a.容器只会创建一个servlet实例。
b.容器收到一个请求,就会启动一个线程,由这个线程来调用servlet
实例来处理请求。
这样一来的话,就有可能有多个线程同时去调用某个servlet实例,
就有可能发生线程安全问题(比如说,这些线程要修改某个属性值)。

(2)如何解决?

使用synchronized对有可能产生线程安全问题的代码块加锁。
注:
	加锁之后,会影响性能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值