转载请注明作者:@author:Edison丶梦楠
servlet的生命周期:创建对象-->初始化-->运行(服务)-->销毁
1:调用实现类构造器创建对象
2:对servlet初始化
3:当我们请求的时候,tomcat才会利用对象调用service方法
4:正常关闭tomcat服务器,调用destoty()方法(有时会不执行)
public HelloServlet() {
System.out.println("创建servlet对象");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("初始化....");
}
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("服务.....");
}
public void destroy() {
System.out.println("销毁.....");
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
当我们在浏览器中发出请求时,可以看到控制台打印出下列信息:
而当我们第二次第三次请求时,却不会再创建对象和初始化,而是直接打印服务两个字。所以我们得出结论:servlet是单例的,并且在启动tomcat服务器后只会创建对象和初始化一次。以后的每一次请求,只要服务器不关闭,都是只执行该service()方法
关于销毁方法,有时会不执行,所以我们没必要在destory方法中编写一些类似释放资源的操作。
关于其余两个方法我们不关心,一个是获取作者、版权等信息,一个是获取servlet的配置信息。这两个方法都是由tomcat容器在调用。
总结:tomcat服务器管理了servlet
Servlet的请求流程:(重点)
localhost:8080/pss/hello
在浏览器中输入该地址,将发生以下情况:
1:解析域名
2:解析pss(上下文路径)和资源名称
3:首先找到Tomcat根路径下的/conf/server.xml文件,获取到该xml文件中的
4:进入该项目的根路径,找WEB-INF目录下的web.xml文件。
5:解析该文件,获取该xml文件中的所有的
找不到,就报404错误
找到了:就根据该元素所在mapping对应的
6:去servlet的实例缓存池中看看有没有servlet对象
if (obj ==null ){
//就说明是第一次请求
GOTO 7
}else{
//非第一次请求
GOTO 10,11
}
7:利用反射拿到我们创建的servlet类的字节码文件对象,利用该字节码文件对象的newInstance()方法,创建servlet对象。(所以我们要求我们的servlet类中必须要有一个公共的无参数构造器)
Class> servlet= class.forName(“全限定名”);
8:把该对象放入servlet的实例缓存池中,供下一次请求使用。(如果是关闭tomcat服务器重新启动,那么会再从第一步重来)
9:利用该servlet对象,tomcat会帮我们调用init方法。在调用之前会创建servletConfig对象,并传入到init方法中,然后初始化!
servlet.init(config);
10:tomcat再创建request和response对象,并传入到service方法中,利用servlet对象调用该方法,处理请求。
servlet.service(request,response);
11:在该service方法中,服务器再响应请求给客户端
关于web.xml配置
servlet-name 保持和类名相同
servlet-class 类的所在包的全限定名
mapping表示映射关系,通过此映射来找到上面的servlet
servlet-name 保持和类名相同,原因是:通过此name找到servlet中的name,再找到servlet-class这个具体的类
url-pattern 我们在浏览器中访问时的路径名称(理论上可以随便写,
但是为了与资源表示出一种关系,最好写具有意义的url名称)。
切记: 一定不要忘记加 /,否则会报404