<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/post//</link>
<title><![CDATA[关于Servlet的生命周期与工作原理]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Mon, 24 Mar 2014 06:58:22 +0000</pubDate> 
<guid>https://www.heckjj.com/post//</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Servlet的生命周期其实分为三个阶段：<br/><br/>　　1、初始化阶段&nbsp;&nbsp;调用init()方法<br/><br/>　　2、响应客户请求阶段　　调用service()方法<br/><br/>　　3、终止阶段　　调用destroy()方法<br/><br/>Servlet初始化阶段：<br/><br/>　　在下列时刻Servlet容器装载Servlet：<br/><br/>　　　　1、Servlet容器启动时自动装载某些Servlet，实现它只需要在web.XML文件中的&lt;Servlet&gt;&lt;/Servlet&gt;之间添加如下代码：<br/><br/>&lt;loadon-startup&gt;1&lt;/loadon-startup&gt;<br/><br/>　　　　2、在Servlet容器启动后，客户首次向Servlet发送请求<br/><br/>　　　　3、Servlet类文件被更新后，重新装载Servlet<br/><br/>　　Servlet被装载后，Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化。<span style="color: #FF0000;">在Servlet的整个生命周期内，init()方法只被调用一次。</span><br/><br/>　　　　<br/><br/>Servlet工作原理：<br/><br/>　　首先简单解释一下Servlet接收和响应客户请求的过程，首先客户发送一个请求，Servlet是调用service()方法对请求进行响应的，通过源代码可见，service()方法中对请求的方式进行了匹配，选择调用doGet,doPost等这些方法，然后再进入对应的方法中调用逻辑层的方法，实现对客户的响应。在Servlet接口和GenericServlet中是没有doGet,doPost等等这些方法的，HttpServlet中定义了这些方法，但是都是返回error信息，所以，我们每次定义一个Servlet的时候，都必须实现doGet或doPost等这些方法。<br/><br/>　　每一个自定义的Servlet都必须实现Servlet的接口，Servlet接口中定义了五个方法，其中比较重要的三个方法涉及到Servlet的生命周期，分别是上文提到的init(),service(),destroy()方法。GenericServlet是一个通用的，不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于GenericServlet，因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承HttpServlet即可。<br/><br/>　　Servlet接口和GenericServlet是不特定于任何协议的，而HttpServlet是特定于HTTP协议的类，所以HttpServlet中实现了service()方法，并将请求ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。<br/><br/>public void service(ServletRequest req,ServletResponse res) <br/>&nbsp;&nbsp;throws ServletException,IOException<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpRequest request;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpResponse response;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp; try<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; req = (HttpRequest)request;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res = (HttpResponse)response;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;catch(ClassCastException e)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new ServletException(&quot;non-HTTP request response&quot;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;service(request,response);<br/>&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;代码的最后调用了HTTPServlet自己的service(request,response)方法，然后根据请求去调用对应的doXXX方法，因为HttpServlet中的doXXX方法都是返回错误信息，<br/><br/>protected void doGet(HttpServletRequest res,HttpServletResponse resp)<br/>&nbsp;&nbsp;throws ServletException,IOException<br/>&#123;<br/>&nbsp;&nbsp; String protocol = req.getProtocol();<br/>&nbsp;&nbsp; String msg = IStrings.getString(&quot;http.method_get_not_supported&quot;);<br/>&nbsp;&nbsp; if(protocol.equals(&quot;1.1&quot;))<br/>&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.sendError(HttpServletResponse.SC.METHOD.NOT.ALLOWED,msg);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp; esle<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.sendError(HttpServletResponse.SC_BAD_REQUEST,msg);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>所以需要我们在自定义的Servlet中override这些方法！<br/><br/>　　　　源码面前，了无秘密！<br/><br/>- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -&nbsp;&nbsp;- - -&nbsp;&nbsp;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -<br/><br/>Servlet响应请求阶段：<br/><br/>　　对于用户到达Servlet的请求，Servlet容器会创建<span style="color: #DC143C;">特定于这个请求的ServletRequest对象和ServletResponse对象</span>，然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求信息，处理该请求，并通过ServletResponse对象向客户返回响应信息。<br/><br/>　　对于Tomcat来说，它会将传递过来的参数放在一个Hashtable中，该Hashtable的定义是：<br/><br/>private Hashtable&lt;String String[]&gt; paramHashStringArray = new Hashtable&lt;String String[]&gt;();<br/>　　这是一个String--&gt;String[]的键值映射。<br/><br/>　　HashMap线程不安全的，Hashtable线程安全。<br/><br/>-----------------------------------------------------------------------------------------------------------------------------------<br/><br/>Servlet终止阶段：<br/><br/>　　当WEB应用被终止，或Servlet容器终止运行，或Servlet容器重新装载Servlet新实例时，Servlet容器会先调用Servlet的destroy()方法，在destroy()方法中可以释放掉Servlet所占用的资源。<br/><br/>-----------------------------------------------------------------------------------------------------------------------------------<br/><br/>Servlet何时被创建：<br/><br/>　　1，默认情况下，当WEB客户第一次请求访问某个Servlet的时候，WEB容器将创建这个Servlet的实例。<br/><br/>　　2，当web.xml文件中如果&lt;servlet&gt;元素中指定了&lt;load-on-startup&gt;子元素时，Servlet容器在启动web服务器时，将按照顺序创建并初始化Servlet对象。<br/><br/>　　注意：在web.xml文件中，某些Servlet只有&lt;serlvet&gt;元素，没有&lt;servlet-mapping&gt;元素，这样我们无法通过url的方式访问这些Servlet，这种Servlet通常会在&lt;servlet&gt;元素中配置一个&lt;load-on-startup&gt;子元素，让容器在启动的时候自动加载这些Servlet并调用init()方法，完成一些全局性的初始化工作。<br/><br/><br/><br/>Web应用何时被启动：<br/><br/>　　1、当Servlet容器启动的时候，所有的Web应用都会被启动<br/><br/>　　2、控制器启动web应用<br/><br/>-----------------------------------------------------------------------------------------------------------------------------------------------<br/><br/>Servlet与JSP的比较：<br/><br/>　　有许多相似之处，都可以生成动态网页。<br/><br/>　　JSP的优点是擅长于网页制作，生成动态页面比较直观，缺点是不容易跟踪与排错。<br/><br/>　　Servlet是纯Java语言，擅长于处理流程和业务逻辑，缺点是生成动态网页不直观。<br/>Tags - <a href="https://www.heckjj.com/tags/servlet%25E7%2594%259F%25E5%2591%25BD%25E5%2591%25A8%25E6%259C%259F/" rel="tag">servlet生命周期</a> , <a href="https://www.heckjj.com/tags/servlet%25E5%25B7%25A5%25E4%25BD%259C%25E5%258E%259F%25E7%2590%2586/" rel="tag">servlet工作原理</a> , <a href="https://www.heckjj.com/tags/servlet/" rel="tag">servlet</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/post//#blogcomment</link>
<title><![CDATA[[评论] 关于Servlet的生命周期与工作原理]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>