Servlet生命周期和工作原理
Posted du001011
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Servlet生命周期和工作原理相关的知识,希望对你有一定的参考价值。
首先说一下如何创建Servlet,
第一步定义一个类,继承HttpServlet类
第二步重写doGet()和doPost()方法
第三步Servlet程序会自动交给tomcat服务器运行
第四步 在web.xml文件中进行配置
说明:博主创建的自定义类名为FirstServlet
配置的具体内容如下:
<!--网站首页的配置-->
<welcome-file-list>
<welcome-file>02.html</welcome-file>
</welcome-file-list>
<!--网站信息的配置-->
<!--配置servlet的信息-->
<servlet>
<!--建议和类名一致-->
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.dkc.demo.FirstServlet</servlet-class>
</servlet>
<!--Servlet的映射信息的配置-->
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<!--地址栏输入的映射路径
必须“/”-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Servelt生命周期主要分为:
init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet
时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”
(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
destroy():仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的
线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
Servlet的执行过程:
1.启动tomcat
2.在web工程下的web.xml查找是否存在url-pattern,如果有直接访问Servlet没有的话看下面解释
<servlet>
<servlet-name>MyFirstServlet</servlet-name> (c)
<servlet-class>com.dkc.a_hello.MyFirstServlet</servlet-class>(d) 通过反射找到对应的文件
</servlet>
<servlet-mapping>
<servlet-name>MyFirstServlet</servlet-name> (b)
<url-pattern>/hello</url-pattern> (a)
</servlet-mapping>
3.通过反射获取当前Servlet的class对象
4.解析Servlet中的方法,给我们用户响应!
解释:访问servlet先动态(web.xml),在静态(webapp下寻找是否存在xxx.html/jsp)如果有就访问,没有就打开的页面会报错Not 404)
Servlet工作原理:
1.首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求进行响应的,通过源代码可见service()方法中对请求的方式进行了
匹配,选择调用doGet,doPost等这些方法,然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet()、doPost()等等这些方
法的,HttpServlet中定义了这些方法,但是都是返回error信息,所以,我们每次定义一个Servlet的时候,都必须实现doGet或doPost等这些方法。
2.每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),
destroy()方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接
口。所以我们定义Servlet的时候只需要继承HttpServlet即可。
3.Servlet接口和GenericServlet是不特定于任何协议的,而HttpServlet是特定于HTTP协议的类,所以HttpServlet中实现了service()方法,并将请求ServletRequest、
ServletResponse强转为HttpRequest 和 HttpResponse。
以上是关于Servlet生命周期和工作原理的主要内容,如果未能解决你的问题,请参考以下文章