1.Servlet是什么?
Servlet是sun公司制订的一种用于扩展web服务器功能的组件规范。
扩展方式:早期采用CGI(common gateway interface)技术。因采用 cgi程序编写的代码,可移植性差、编程相当复杂。
现在,采用的是【容器+组件】的方式来扩展。
【组件:】符合规范,实现特定功能,并且可以部署在容器上的软件模块。
【容器:】符合规范,为组件提供运行环境,并且管理组件的生命周期
(将组件实例化,调用其方法、销毁组件的过程)的软件程序;
采用【容器+组件】这种编程模型的优势:容器负责大量的基础服务
(包括浏览器与服务器之间的网络通信、多线程、参数传递等等)。而组件只需要处理业务逻辑。另外,组件的运行不依赖于特定的容器。
2.Servlet生命周期
1)加载Servlet类
2)实例化(调用类的构造方法)
3)初始化(调用该类对象的init()方法)
4)处理请求(调用该类对象的service()、doGet()或doPost()方法)
5)销毁对象(调用该类对象的destory()方法)
注:在整个Servlet生命周期,只创建一个Servlet对象,提供服务,处理请求是以多线程的方式进行的,为了线程安全,一般不要在Servlet类中定义成员变量,避免多个请求共用一个成员变量,而是在方法中定义局部变量。
3.Servlet运行过程
当用户向浏览器地址栏输入:http://ip:port/appname/servlet的url-pattern配置
1)浏览器使用ip:port(端口号)连接服务器
2)浏览器将请求数据按照http协议封装成一个数据包(请求数据包)发送给服务器
请求数据包的内容包含了请求资源路径(/helloweb/sayhello?name=zs),另外,
在请求数据包中,还会包含浏览器自动生成的一些信息。
3)服务器创建两个对象:请求对象(Request)和响应对象(Response)
服务器解析请求数据包,将解析之后的数据存放到请求对象里面,方便
servlet读取请求数据(因为servlet不用解析请求数据包,否则,需要理解http协议)。
请求对象是HttpServletRequest接口的一个实现。
响应对象是HttpServletResponse接口的一个实现,响应对象用于存放servlet处理的结果。
4)依据请求资源路径找到相应的servlet配置,通过反射创建servlet实例,
然后调用其service()方法。在调用service()方法时,会将事先创建好的请求对象(request)
和响应对象(response)作为参数进行传递。在servlet内部,可以通过request获得请求数据,
或者通过response设置响应数据。
5)服务器从response中获取数据,按照http协议打成一个数据包(响应数据包),发送给浏览器。
6)浏览器会解析响应数据包,取出相应的数据,生成相应的页面。