Servlet 主要功能
Servlet 主要功能在于交互式地获取和响应数据,生成动态 Web 内容。这个过程为:
1.客户端发送请求信息到服务器
2.服务器将请求信息封装并交给Servlet
3.Servlet接收请求信息、处理数据,并生成响应信息
4.Servlet将响应信息封装并交给服务器
5.服务器返回响应信息给客户端
图解
Servlet生命周期
●什么是生命周期
生命周期指的是一个对象从创建到销毁的过程(从出生--->死亡)
●Servlet的生命周期
Servlet的生命周期指的是Servlet对象从创建到销毁的过程(创建对象,初始化操作,运行操作,销毁操作)
●谁来管理?
Servlet对象的整个生命周期都是由Tomcat来管理的(Servlet的创建,初始化,运行,销毁的行为/方法都是Tomcat来负责调用的)
●javax.servlet.Servlet接口中的方法
void init(ServletConfig config):初始化Servlet对象方法
void service(ServletRequest req, ServletResponse resp):服务方法,Web动态网页的操作就编写在该方法.
void destroy():销毁Servlet对象方法.
-------------------------上面三个方法是生命周期相关的方法---------------------------------
ServletConfig getServletConfig():获取Servlet的配置信息对象.
String getServletInfo():获取Servlet的信息(Servlet的作者,版本,版权相关).
●生命周期方法执行时机
(构造器:在服务端程序第一次被请求的时候,调用,只被调用一次)
void init(ServletConfig config):在构造器执行完毕之后,调用init方法,也只会执行一次.
void service(ServletRequest req, ServletResponse resp):每一次请求都会执行该方法.
void destroy():正常关闭Tomcat才会执行(该方法不一定会被执行,我们没必要在其中编写扫尾的操作).
代码演示
简易版
●总结:
1)执行流程:构造器--->init方法---->[ service方法 ]循环 ---->destory方法
2)重要结论:Servlet是单例的,只会在第一次请求时被创建一次.(多线程访问可能有线程安全问题,如何解决? 避免使用成员变量,要使用局部变量)
●注意:
Servlet类的构造器必须使用public、无参构造器.(Tomcat通过反射获取public构造器创建Servlet对象的)
Servlet的请求流程
1:浏览器发送请求到Tomcat:http://localhost:80/hello.
2:Tomcat解析HTTP请求:/hello.
上下文路径:“”;资源的名称:/hello
3:Tomcat解析/conf/server.xml文件,获取其中所有的<Context/>元素,并找到path属性为“”的元素.
<Context docBase="web项目根路径" path=""/>.
再获取该<Context/>元素中docBase属性值,该属性值就是要访问的web项目的根路径.
4:从该web项目根路径/WEB-INF下找到web.xml文件.并寻找值为:/hello的<url-pattern>.
找不到: 报404错误.
找 到: 继续.
5:通过/hello,找到当前Servlet的全限定名.com.test.hello.HelloServlet.
6:从Servlet的实例缓存池中去获取com.test..hello.HelloServlet对应的对象.
Map<String,Servlet> cache = .....;
Servlet obj = cache.get("com.test.hello.HelloServlet");
if(obj == null{
//第一次请求:TO 7.
}else{
//非第一次请求:TO 10;
}
7:使用反射创建Servlet对象并存储到Servlet实例缓存池中,供下一次请求使用.
Servlet obj = Class.forName("com.test.hello.HelloServlet").newInstance();
cache.put("com.test.hello.HelloServlet",obj);
8:容器创建ServletConfig对象,并调用init方法,来完成初始化操作.
obj.init(config);
9:容器创建ServletRequest和ServletResponse对象,并调用service方法,处理请求.
obj.service(req,resp);
10:在service方法中,对当前请求的客户端做响应.
网友评论