Servlet上

<h1>第一个web应用</h1>
 <p>主要配置 elcipse Tomcat7.0 jdk1.7</p>
 <p>目录</p>
 <ol>
 <li>src存放源文件 mapack目录 DispathServlet.java HelloTag.java</li>
 <li>WEB-INF目录 mapack目录 DispatchServlet.class HelloTag.class 还有web.xml</li>
 <li>在webRoot下面放jsp还有html 其中重要是html中的action</li>
 <li>
 最重要的是web.xml
 <ol>
 <li>&lt;servlet-name&gt;定义Servlet的名字</li>
 <li>&lt;servlet-class&gt;制定Servlet的完整类名(包括包的名字)</li>
 <li>&lt;init-param&gt;定义servlet的初始化参数(包括参数名和参数值),在一个<servlet>元素中可以有多个&lt;init-param&gt;.(&lt;init-param&gt;的具体方法(ServletConfig))</li>
 <li>&lt;load-on-startup&gt;制定当Servlet容器启动web应用时,加载各个Servlet的次序,在依次加载其他数值大的Servlet,如果这个值为负数或者没有设定,那么Servlet容器将在客户端首次访问这个Servlet时加载它</li>
 </ol>
 </li>
 <li>&lt;servlet-mapping&gt;其元素为Servlet映射一个URL:&lt;Servlet-name&gt;子元素制定待映射的Servlet名字&lt;url-pattern&gt;</li>
 </ol>
 <h1>Servler技术上 Servlet是javaweb应用中最核心</h1>
 <p>的组件。本书等第二章的2.2节</p>
 <ol>
 <li>动态生成HTML页面</li>
 <li>把请求转发给同一个web应用中的的Servlet组件</li>
 <li>把请求转发给其他Web应用中的Servlet组件</li>
 <li>读取客户端的Cookie,以及向用户端写入Cookie</li>
 <li>访问其他服务器资源</li>
 </ol>
 <p>要想精通servlet编程,不仅要了解Servlet自身的用法,还要了解Servlet最常用的武器</p>
 <ol>
 <li>请求对象(ServletRequest和HttpServletRequest)Servlet从对象中获取来自客户端的请求信息</li>
 <li>影响对象(ServletResponse和HttpServletResponse):Servlet通过该对象来相应结果</li>
 <li>Servlet配置对象(ServletConfig):当容器初始化一个Servlet对象是,Servlet配置一个ServletConfig对象,Servlet通过该对象获取初始化参数信息及ServletContext对象</li>
 <li>Sevlet上下文对象(ServletContext):Servlet 通过该对象来访问
 容器为Web应用各种资源</li>
 </ol>
 <p>展示Servlet对象模型的静态结构,即接受ServletAPI的各种借口和之间关系(关联,依赖,继承和实现),以及接口的常用方法。</p>
 <h1>servlet接口</h1>
 <p>Servlet在javax.servlet.Servlet接口,所有的Servlet类都必须实现这一接口,在Servlet中第一了五个方法,中有三个方法有servlet容器调用,容器会在Servlet的生命周期的不同阶段调用不同的特点方法</p>
 <ol>
 <li>init(ServletConfig config)方法:负责初始化Servlet对象。容器在创建好后,调用此方法。</li>
 <li>servlet(ServletRequest request,ServletResponse response)方法:负责相应客户的请求,为客户提供相应服务。当容器接受到客户端要求访问特定Servlet对象的请求时,就会调用该Servlet对象的servlet()方法。</li>
 <li>destroy()方法:负责释放Servlet对象占用的资源。当servlet对象结束生命周期时,容器会调用此方法。</li>
 <li>Servlet()接口还定义了一下两个返回Servlet的相关信息的方法。javaWeb应用中的程序代码可以访问Servlet的两个方法,从而获得Servlet的配置信息及相关信息。</li>
 <li>getServletConfig()返回一个ServletConfig对象,在该对象中包含了Servlet的初始化参数信息。</li>
 <li>getServletInfo():返回一个字符串,该字符串中包含了Servlet的创建者、版本和版权信息</li>
 </ol>
 <h1>GenericServlet抽象类</h1>
 <p>GenericServlet抽象类为Servlet接口提供了通用的实现,它与任何网络层应用程序的协议无关。GenericServlet类实现Servlet接口,还是实现了ServletConfig接口和Serializable接口
 1. init(ServletConfig config)初始化方法。GenericServlet类中有一个ServletConfig类型的私有变量config,当Servlet容器调用的GenericServlet()的init(ServletConfig config)方法时,该方法使的私有变量Congfig引用有容器传入的ServletConfig对象,即使的GenericServlet对象与一个ServletConfig对象关联</p>
 <ol>
 <li>GenericServlet类还定义了一个不带参数的init()方法,init(ServletConfig config)</li>
 <li>GenericServlet类没有实现Servlet接口中的service()方法。service()方法是GenericServlet类中唯一的抽象方法,</li>
 <li>GenericServlet尽管事先destroy()方法但实际上什么也没有用,但实际上什么也没做。GenericServlet类中的具体子类可以覆盖方法,从而为待销毁的当前Servlet对象释放所有占有的各种资源(例如关闭文件输入流和输出流,关闭与数据库的连接)</li>
 <li>
 <p>GenericServlet类实现了ServletConfig接口中的所有方法。因此GenericServlet类的子类可以直接调用在ServletConfig()接口中定义的getServletContext()、getInitParameter()和getInitParameterNames()</p>
 </li>
 <li>
 <p>GenericServlet类实现了Servlet接口中的ServletConfig接口。GenericServlet类的子类可以直接调用在ServletConfig()接口中定义的getServletContext()/getInitParameter()和getInitParameterName是()</p>
 </li>
 </ol>
 <p>TIPs GenericServlet类实现了Servlet接口中和ServletConfig接口。
 GenericServlet类的主要身份是servlet,此外,它还运用了装饰设计模式,为自己附加了ServletConfig装饰身份,在具体的实现中,GenericServlet包装了ServletConfig接口的实例,通过该实例来实现ServletConfig接口中的方法。</p>
 <p>4.1.3HttpServlet
 HttpServlet类是GenericServlet类的子类。HttpServlet类为Servlet接口提供了与Http协议相关的通用实现,也就是说,HttpServlet对象适合运行在与客户端采用Http协议通讯的Servlet容器或者Web服务器中。在开发javaweb应用时,自定义的Servlet类一般要扩展
 HttpServlet类实现了Servlet接口中的service(ServletRequest req,ServletResponse res)</p>
 <p>在以上重载service()方法中,首先调用HttpServletRequest类型的req参数的getMethod()方法,从而获得客户端的请求方式,然后依据该请求来调用匹配的服务方法。如GET方式则调用doGet()方法:如果为POst方式,则调用doPost()方法,依次类推。</p>
 <p>HttpServlet 类为所有的针对特定的请求方式的doXXX()方法提供了默认的实现,在HttpServlet类中的默认实现中,doGet()、doPost()和doDelete()方法都会向客户端返回一个错误</p>
 <ol>
 <li>如果客户端和服务器才用HTTp1.1协议通信,那么返回的错误为HttpServletResponse.SC<em>METHOD</em>NOT_ALLOWED(对应405)</li>
 <li>如果客户端与服务器之前不采用HTTp1.1协议通信,那么返回HTTPServletResponse.SC<em>BAD</em>REQUEST(对应400)</li>
 </ol>
 <h1>ServletRequest接口</h1>
 <p>在Servlet接口中service(ServletRequest req,ServletResponse res)方法中有一个ServletRequest类型的参数。ServletRequest类表示来自客户端的请求。当Servlet容器接受到客户端要求访问特定Servlet的请求时,容器先解析客户端的原始请求数据,把它包装秤一个ServletRequest的对象。当容器调用Servlet对象的service()方法时,就可以把ServletRequest对象作为参数传递给service()</p>
 <ol>
 <li>
 <p>ServiceRequest 接口提供了一系列用于读取客户端的请求数据的方法。
 getContentLength();返回请求正文的长度。如果请求正未知文的长度未知怎返回-1</p>
 </li>
 <li>
 <p>getContentType()获得请求正文的MIME类型。</p>
 </li>
 <li>
 <p>getInputStream()返回用于读取请求正文的输入流。</p>
 </li>
 <li>getLocakAddr()返回服务器端的Ip地址</li>
 <li>getLocalName()返回服务器的主机名</li>
 <li>getLocalPort()放回服务器的主机FTP端口号</li>
 <li>getParameter(String name)所用:根据给定的请求参数名,返回来自客户请求中匹配的请求参数值。关于请求参数的概念,处理HTTP请求参数及HTML表单</li>
 <li>getProtocol()返回客户端与服务器端通信协议所用的名称及版本号</li>
 <li>getReader():返回用于读取字符串形式的请求正文的Bufferedreader对象</li>
 <li>getRemoteAddr()返回客户端的IP地址</li>
 <li>getRemoteHost()返回客户端的主机名</li>
 <li>getRemotePort()返回客户端的FTP端口号</li>
 <li>此外ServletRequest接口还定义了一组用于在请求范围内保存参数</li>
 <li>setAttribute(String name,java.lang.Object object):在请求范围内保存一个属性,参数name表示属性名,参数object表示属性值</li>
 <li>getAttribute(String name):根据name参数给制定的属性名,返回请求范围内的匹配的属性值</li>
 <li>removeAttribute(String name):从范围内删除一个属性</li>
 </ol>
 <p>#HttpServletRequest接口是ServletRequest接口中的子接口。HttpServlet类的重载service()方法doGet()和doPost()等方法都有一个HttpServletRequest类型参数
 HttpServletRequest接口提供了用于读取Http请求中的相关信息的方法</p>
 <p>getContextPath();返回客户端的请求的访问的应用程序Url入口。例如
 如果客户端的访问的Url为http://localhost:8080/helloapp/info,那么给方法返回“/hellpapp”</p>
 <p>getCookies():返回Http请求中的所有Cookie</p>
 <p>getHeader(String name)返回请求头部的特定项。</p>
 <p>getHeadeNames()返回一个Enumeration对象,它包含了HTTP请求头部的所有项目名</p>
 <p>getMethod()返回Http请求方式</p>
 <p>getRequestURI():返回HTTP请求头部的第一行中的URI
 getQueryString()返回Http请求中的查询字符串,即URl中的&quot;?&quot;后面的内容,如果客户端发送的是http://localhost:8080/helloapp/info?usrname=tom ,返回的是username = Tom</p>
 <h1>ServletResponse</h1>
 <p>在servlet接口中的service(ServletRequest request,ServletResponse response)方法中够一个ServletResponse类型的参数,Servlet通过ServletResponse对象来生成相应的结果,当servlet容器接受到客户端要求访问特定Servlet的请求时,容器会创建一个ServletRequest对象,并把它作为参数传给特定Servlet的请求时,容器会创建一个ServletRequest对象,并把它作为参数传递给Servlet的service()方法</p>
 <p>在ServletResponse接口中定义一系列的生成的相应结果</p>
 <p>setCharacterEndcoding(String charset)设置相应正文的字符编码。
 响应正文的默认字符编码为Iso-8859-1</p>
 <p>setContentLength(int len):设置响应正文的长度</p>
 <p>setContentType(String type)设置正文的MIME的类型</p>
 <ul>
 <li>
 <p>getCharacterEncoding():返回相应的正文的编码</p>
 </li>
 <li>
 <p>getContentType()返回相应正文的MIME类型</p>
 </li>
 <li>
 <p>setBufferSize(int size):设置用于存放响应正文数据的缓冲区</p>
 </li>
 <li>
 <p>getBufferSize()获取用于存放数据的缓冲区</p>
 </li>
 <li>
 <p>reset()清空缓冲区的正文数据,并且清空相应状态码及响应头</p>
 </li>
 <li>
 <p>resetBuffer()仅仅清空缓冲区内的正文数据,并且相应状态码及响应头数据</p>
 </li>
 <li>
 <p>flushBuffer():强制性的吧缓冲区内的相应正文数据发送到客户端</p>
 </li>
 <li>
 <p>isCommitted()方法放回一个boolean类型的值。如果为True,表示缓冲区内的数据已经提交客户,即数据已经发送给客户端。</p>
 </li>
 <li>
 <p>getOutputStream()返回一个ServiceOutputStream对象,Servlet用它来输出二进制的正文数据</p>
 </li>
 <li>
 <p>getWriter()返回一个PrintWrite对象,Servlet用它来输出字符串的形式的正文数据</p>
 </li>
 <li>
 <p>servletResponse中相应正文的ServletResponse对象主要产生Http
 默认的类型MIME类型为text/plain,即纯文本类型,而HttpServletResponse 中相应正文的默认MIMEl类型为text/html,即HTML文档类型</p>
 </li>
 <li>servletRespone对象主要产生的HTTP相应结果的正文部分,ServletResponse的getOutputStream()方法返回一个ServletOutPutStream对象,Servlet可以利用ServletOutputStream()方法返回一个ServletoutPutStream对象,ServletOutputStream对象,Servlet可以利用ServletoutputStream来输出二进制的正文数据,ServletResponse的getWriter()方法放回一个PrintWriter对象,Servlet可以利用PrintWriter来输出字符串形式的正文数据</li>
 <li>为了提高输出数据的效率,ServletOutputStream 和PrintWriter先把数据写到缓冲区内。当缓冲区内的数据被提交客户后,ServletResponse的isCommitted()方法返回true</li>
 <li>当缓冲区内的数据已满时,ServletOutputStream或PrintWriter会自动把缓冲区内的数据发送给客户端,并且清空缓冲区</li>
 <li>Servlet调用Servletresponse对象的FlushBuffer()方法。</li>
 <li>Servlet调用ServletOutputStream或printWriter对象的flush()方法或Close()方法</li>
 <li>在Tomcat的实现中,如果Servlet的Service()方法没有调用ServletoutPutStream或PrintWriter的close方法。那么Tomcat在调用完Servlet的Service()方法后,就会关闭ServletOutputStream或Printwriter,从而确保Servlet输出的所有数据被提交给客户。</li>
 </ul>
 <p>Servlet还可以通过ServletResponse对象的setContentLength(),setContentType()和setCharacterEncoding()来分别设置响应正文的长度、MIME类型和字符编码。在ServletResponse接口中的实现类中,这些setXXX()方法会把响应的设置写道HTTP响应头中。
 值得注意的是,如果要设置正文的MIME类型和字符编码,必须先调用ServletResponse对象的setContentType()和setCharacterEncoding()方法,然后再调用ServletResponse的getOutputStream()或getWriter()方法,或者提交缓冲区内的正文数据。只有满足这样的操作顺序,所做的设置再能生效。</p>
 <ul>
 <li>HttpServletResponse接口</li>
 <li></li>
 <li>HttpServletRequestResponse接口是ServletResponse的子接口,HttpServlet类的重载service()方法及doGet()和doPost()等方法中都有一个HttpServletResponse类型的参数:</li>
 <li>HttpServletResponse接口提供了与HTTP协议相关的一些方法,Servlet可通过这些方法来设置HTTP响应头向客户端写cookie</li>
 <li>addHeader(String name,String values):向HTTP中加入一项内容。</li>
 <li>sendError(int sc)向客户端发送一个代表制定错误的Http响应的状态码。</li>
 <li>sendError(int sc ,String msg):向客户端发送衣蛾代表特定错误HTTP响应状态码,并且发送具体的错误消息。</li>
 <li>setStatus(int sc)设置HTTP响应状态代码。</li>
 <li>addCookie(Cookie cookie):向HTTP响应中加入一个Cookie。</li>
 <li>addCookie(Cookie cookie):向HTTP响应中加入一个Cookie。</li>
 <li>在HTTPServletResponse接口中定义了一些代表HTTP响应状态代码的静态常量,</li>
 <li>HTTPServletResponse.SC<em>BAD</em>REQUEST:对应的状态码是400</li>
 <li>HTTPServletResponse.SC_FOUND对应的状态码为302.</li>
 <li>HttpServletResponse.SC<em>METHOD</em>NOT_ALLOWED:对应的相应状态代码为405.</li>
 <li>HTTPServletResponse.SC<em>METHOD</em>NOT_ALLOWED:对应的状态码405</li>
 <li>HTTPServletResponse.SC<em>NOT</em>AUTHORITATIVE_INFORMATION对应的状态码是203</li>
 <li>HTTPServletResponse.SC_FORBIDDEN对应的状态码为403</li>
 <li>HTTPServletResponse.SC<em>NOT</em>FOUND对应的状态码为404</li>
 <li>
 <p>HTTPServletResponse.SC_OK对应的响应的状态码为200</p>
 <ul>
 <li>package liwei;</li>
 </ul>
 <p>import java.io.IOException;
 import java.io.PrintWriter;</p>
 <p>import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;</p>
 <p>public class HelloServlet extends HttpServlet {</p>
 <pre><code>public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
 /*获得username*/
 String username = request.getParameter(&quot;username&quot;);
 /*字节码装换
 * HTTP请求中默认字符编码为ISO-8859-1,如果请求包含中文
 * 需要把它转换成为GB2312
 * */
 if(username!=null){
 username = new String(username.getBytes(&quot;ISO-8859-1&quot;),&quot;GB2312&quot;);
 }
 if(username == null){
 //仅仅为了演示response.sendError()的用法。
 response.sendError(response.SC_FORBIDDEN);
 return;
 }
 //设置HTTP正文的MIME类型及字符编码
 response.setContentType(&quot;text/html;charset=GB2312&quot;);
 /*输出文档*/
 PrintWriter out = response.getWriter();
 out.println(&quot;&lt;HTML&gt;&lt;HEAD&gt;&lt;TITLE&gt;HelloServlet&lt;/TITLE&gt;&lt;/HEAD&gt;&quot;);
 out.println(&quot;&lt;BODY&gt;&quot;);
 out.println(&quot;你好:&quot;+username);
 out.println(&quot;&lt;/BODY&gt;&lt;/HTML&gt;&quot;);
 System.out.println(&quot;before close():&quot;+response.isCommitted());
 out.close();
 System.out.println(&quot;after close():&quot;+response.isCommitted());
 }
 </code></pre>
  
 <p>}</p>
 <p>?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</p>
 </li>
 </ul>
 <blockquote>
 <pre><code>&lt;web-app version=&quot;2.5&quot;
 xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
 xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&gt;
 &lt;servlet&gt;
 &lt;servlet-name&gt;helloservlet&lt;/servlet-name&gt;
 &lt;servlet-class&gt;liwei.HelloServlet&lt;/servlet-class&gt;
 &lt;/servlet&gt;
 &lt;servlet-mapping&gt;
 &lt;servlet-name&gt;helloservlet&lt;/servlet-name&gt;
 &lt;url-pattern&gt;/hello&lt;/url-pattern&gt;
 &lt;/servlet-mapping&gt;
 &lt;welcome-file-list&gt;
 &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;
 &lt;/welcome-file-list&gt;
 &lt;/web-app&gt;
 </code></pre>
  
 <p>以上的HelloServlet类利用HttpServletResponse对象的setContentType()方法来设置响应的正文的MIME类型及字符编码
 //方式一
 response.setContentType(&quot;text/html;charset=GB2312&quot;);
 //方式二
 response.setContentType(&quot;text/html&quot;);
 response.setCharacterEncoding(&quot;GB2312&quot;);
 //方式三
 response.setHeader(&quot;Content-type&quot;,&quot;text/html;charset=GB2312&quot;);</p>
 </blockquote>
 <p>HelloServlet类的service()方法中最后调用PrintWrinter对象中的close()方法中关闭底层输出流,该方法在关闭输出流之前会先把缓冲区内的数据提交到客户端,因此在调用PrintWriter对象的close()方法之前,
 response.isCommitted()方法返回false;而在调用PrintWriter对象的Close()方法之前,response.isCommitted()方法返回false;而在调用PrintWriter对象中的close()方法之后,response.isCommitted()方法返回true。HelloServlet类的Service()方法返回true。HelloServlet类的Service()方法中的System.out.println(....)
 语句把内容打印到Tomcat服务器所在控制台。</p>
 <p>servletConfig()接口</p>
 <ul>
 <li>
 <p>Servlet接口中的init(ServletConfig config)方法有一个ServletConfig类型的参数。当Servlet容器初始化一个Servlet对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数的信息,此外,ServletConfig对象还与当前Web应用的ServletContext对象关联。Servlet的初始化参数信息,此外ServletConfig对象当前Web应用的ServletContext对象关联。Servlet容器在调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfig()对象作为参数传给Servlet对象,init(ServletConfig config)方法会使得当前Servlet对象与ServletConfig对象之间建立关联关系。</p>
 </li>
 <li>
 <p>getInitParameter(String name):</p>
 </li>
 <li>getInitParameterNames():返回一个Enumeration对象,里面包含了所有的初始化参数名</li>
 <li>getServletContext():返回一个ServletContext对象。里面包含了所有的初始化参数名</li>
 <li>getServletNames()返回一个Servlet的名字,即web.xml文件
 文件中的<Servlet></servlet>子元素的处理里值。如果没有为&lt;servlet配置&lt;Servlet-name&gt;子元素的值</li>
 </ul>
 <p>每个初始化参数包括一对参数名和参数值。在Web.xml文件中相应<servlet></p>
 <blockquote>
 <p>&lt;init-param&gt;&lt;/init-param&gt;
 &lt;param-name&gt;&lt;/param-name&gt;</p>
 <pre><code>&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 &lt;web-app version=&quot;2.5&quot;
 xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
 xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&gt;
 &lt;servlet&gt;
 &lt;servlet-name&gt;font&lt;/servlet-name&gt;
 &lt;servlet-class&gt;liwei.FontServlet&lt;/servlet-class&gt;
 &lt;init-param&gt;
 &lt;param-name&gt;color&lt;/param-name&gt;
 &lt;param-value&gt;blue&lt;/param-value&gt;
 &lt;/init-param&gt;
 &lt;init-param&gt;
 &lt;param-name&gt;size&lt;/param-name&gt;
 &lt;param-value&gt;15&lt;/param-value&gt;
 &lt;/init-param&gt;
 &lt;/servlet&gt;
 &lt;servlet-mapping&gt;
 &lt;servlet-name&gt;font&lt;/servlet-name&gt;
 &lt;url-pattern&gt;/do&lt;/url-pattern&gt;
 &lt;/servlet-mapping&gt;
 &lt;welcome-file-list&gt;
 &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;
 &lt;/welcome-file-list&gt;
 &lt;/web-app&gt;
 </code></pre>
  
 </blockquote>
 <pre><code>package liwei;
  
 import java.io.IOException;
 import java.io.PrintWriter;
  
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
  
 public class FontServlet extends HttpServlet {
 public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
 //获得word请求参数
 String word = request.getParameter(&quot;word&quot;);
 if(word==null)
 word =&quot;Hello&quot;;
 //读取初始化参数
 String color = getInitParameter(&quot;color&quot;);
  
 String size = getInitParameter(&quot;size&quot;);
  
 System.out.println(&quot;sevletName: &quot;+getServletName());//打印servletName:Font
 //设置HTTP响应的正文的MIME类型及字符编码
 response.setContentType(&quot;text/html;charset=GB2312&quot;);
  
 /*输出HTML文档*/
 PrintWriter out = response.getWriter();
 out.println(&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;FontSize&lt;/title&gt;&lt;/head&gt;&quot;);
 out.println(&quot;&lt;body&gt;&quot;);
 out.println(&quot;&lt;font size ='&quot;+size+&quot;' color='&quot;+color+&quot;'&gt;&quot;+word+&quot;&lt;/font&gt;&quot;);
 out.println(&quot;&lt;/body&gt;&lt;/html&gt;&quot;);
  
 out.close();
  
 }
  
  
 }
 </code></pre>
  
 <h1>4.1.9ServletContext接口</h1>
 <p>ServletContext是Servlet与Servlet容器之间的之间通讯接口。</p>
 <p>Servlet容器在启动一个Web应用时,会为它创建一个ServletContext对</p>
 <p>象,每个WEb应用都有唯一的ServletContext对象,可以把</p>
 <p>Servletcontext对象形象地理解为Web应用的总管家,同一个Web应用中的</p>
 <p>所有Servlet对象共享一个总管家,Servlet对象们通过这个总管家来访问</p>
 <p>容器中的各种资源。
 * ServletContext接口提供的方法可分为以下几种类型</p>
 <ul>
 <li>用于在Web应用范围内存共享数据的方法</li>
 <li>setAttribute(String name,java.lang.Object.object):把一个java对象与一个属性名绑定,并把它存入到ServletContext中,参数name制定属性名,参数object表示共享数据</li>
 <li>getAttribute(String name)根据参数制定的属性名,返回一个Object类型的对象,它表示ServletContext中的与属性名匹配的值。</li>
 <li>getAttributeNames()返回一个Enumenteration对象,该对象包含了所有的存放在ServletContent属性名</li>
 <li>removeAttribute(String name)根据参数制定属性名称,从ServletContext中中删除匹配的属性</li>
 <li>
 <p>(2)访问当前Web应用的资源</p>
 </li>
 <li>
 <p>getContextPath():返回当前web应用的URL</p>
 </li>
 <li>
 <p>getInitParamter(String name )根据给定的参数名,返回Web应用范围内的匹培的初始化参数。在Web。xml中,直接在Wep-app根元素下定义
 &lt;context-param&gt;元素再应用范围的初始化参数</p>
 </li>
 <li>
 <p>getInitParameterNames():返回一个Enumeeration对象,它包含了Web应用范围内所有的初始化参数名</p>
 </li>
 <li>getServletContextName():返回Web应用的名字,即Web。xml文件中范围内的初始化参数名</li>
 <li>getRequestDisoatcher(String path)返用于回一个向其他Web组件的转发请求的RequestDispather对象</li>
 <li>访问Servlet容器的相关信息</li>
 <li>getContext(String path)根据指定参数的URI,返回当前Servlet容器中的其他Web应用的ServletContext对象</li>
 <li>访问Servlet容器的相关信息</li>
 <li>getMarjorVersion():返回Servlet容器支持的JavaServletAPI的主版本号。</li>
 <li>getRealPath(String path)根据参数制定的虚拟路径,返回文件系统中的一个真实路径。</li>
 <li>getResource(String path)返回一个映射到参数制定的路径的URL</li>
 <li>getResourceAsStream(String path)返回一个用于读取制定参数的文件的输入流,该方法的方法参见本章</li>
 <li>getMimeType(String file) 返回参数的制定的文件的MiME类型。</li>
 <li>输出日志</li>
 <li>log(String msg):向servlet的日志文件写日志</li>
 <li>log(String message,java.lang.Throwable throwable),向servlet的日志文件中写错误的日志,以及异常的堆栈信息</li>
 </ul>
 <p>在ServletConfig接口中定义了getServletContext()方法。HttpServelet类继承GenericServlet类,而GenericServlet类实现了ServletConfig接口,因此在HttpServlet类或GenericSerlet类及子类中都直接调用getServletContext()对象方法中,从而得打当前Web应用的ServletContext对象</p>
 <pre><code>package liwei;
  
 import java.io.IOException;
 import java.io.PrintWriter;
  
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
  
 public class ContextTesterServlet extends HttpServlet {
 public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
 //获取ServletContext对象
 ServletContext context = getServletContext();
 //设置HTTP相应的正文的MIME类型及字符编码
 response.setContentType(&quot;text/html;charset=GB2312&quot;);
 //输出HTML文档
 PrintWriter out = response.getWriter();
 out.println(&quot;&lt;html&gt;&lt;head&gt;&lt;title&gt;FontServlet&lt;/title&gt;&lt;/head&gt;&quot;);
 out.println(&quot;&lt;body&gt;&quot;);
 out.println(&quot;&lt;br&gt;Emaile: &quot;+context.getInitParameter(&quot;emai10fwebmaseter&quot;));
 out.println(&quot;&lt;br&gt;Path:&quot;+context.getRealPath(&quot;/WEB_INF&quot;));
 out.println(&quot;&lt;br&gt;MimeType:&quot;+context.getMimeType(&quot;/WEB-INF/Web.xml&quot;));
 out.println(&quot;&lt;br&gt;MajorVersion:&quot;+context.getMajorVersion());
 out.println(&quot;&lt;br&gt;ServletInfo: &quot;+context.getServerInfo());
 out.println(&quot;&lt;/body&gt;&lt;/html&gt;&quot;);
 //输出日志
 //context.log(&quot;这是ContextTestServlet输出的日志&quot;);
  
 }
  
 }
  
 ?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
 &lt;web-app version=&quot;2.5&quot;
 xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
 xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
 xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd&quot;&gt;
 &lt;context-param&gt;
 &lt;param-name&gt;emai10fwebmaseter&lt;/param-name&gt;
 &lt;param-value&gt;webmaster@hotmail1.com&lt;/param-value&gt;
 &lt;/context-param&gt;
 &lt;servlet&gt;
 &lt;servlet-name&gt;contextTest&lt;/servlet-name&gt;
 &lt;servlet-class&gt;liwei.ContextTesterServlet&lt;/servlet-class&gt;
 &lt;/servlet&gt;
 &lt;servlet-mapping&gt;
 &lt;servlet-name&gt;contextTest&lt;/servlet-name&gt;
 &lt;url-pattern&gt;/contextTest&lt;/url-pattern&gt;
 &lt;/servlet-mapping&gt;
 &lt;welcome-file-list&gt;
 &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;
 &lt;/welcome-file-list&gt;
 &lt;/web-app&gt;
 </code></pre>
  
 <h1>4.2JavaWeb应用的生命周期</h1>
 <p>JavaWeb应用的生命周期时有Servlet容器控制的。归纳起来,JavaWeb应用的生命周期包括三个阶段
 * 启动阶段:加载Web应用的有关数据,创建ServletContext对象。并Filter(应用过滤器)和一些Servlet进行初始化
 * 运行阶段
 * 终止阶段</p>
 <h2>4.2.1启动阶段</h2>
 <p>Servlet容器在启动JavaWeb应用时,会完成以下操作
 * 把web.xml文件中的数据加载到内存
 * 为JavaWeb应用创建一个ServletContext对象
 * 为所有的Filter进行初始化。
 * 为那些需要的在web应用启动是就进行初始化的Servlet进行初始化。Servlet容器初始化Servlet的具体</p>
 <h2>4.2.2运行时阶段</h2>
 <p>这是JavaWeb应用最主要的生命阶段。在这个阶段,它的所有Servlet都处于待命状态,随时可以响应客户端的特点请求,提供相应的服务。假如客户端请求的Servlet还不存在,Servlet容器会初始化Servlet,然后再调用它的Service()。</p>
 <h2>4.2.3终止阶段</h2>
 <p>Servlet容器在终止JavaWeb应用时,会完成以下操作
 (1)销毁JavaWeb应用中所有处于运行时状态的Servlet。Servlet容器销毁Servlet的具体步骤</p>
 <p>(2)销毁JavaWeb应用中所有运行的状态的Filiter。</p>
 <p>(3)销毁所有与javaWeb应用相关的对象,如ServletContext对象中,并且释放应用所占有的相关资源</p>
 <h2>4.2.3用Tomcat的管理平台管理web应用的生命周期</h2>
 <p>当Servlet容器启动时,会启动JavaWeb应用。当javaWeb应用启动后,就处于运行状态。当Servlet容器关闭时,Servlet容器就会先终止所有的的javaweb应用。Web应用随着Servlet容器的启动而启动,随着Servlet容器的运行而运行,随着servlet容器的终止而终止。</p>
 <p>Tomcat作为Servlet容器的一种具体变现,还提供了一个管理平台,听过该平台,用户可以在Tomcat运行时,手工的管理单个Web应用的声明周期。</p>
 <p>管理单个生命周期的步骤,其中之一就是在Tomcat安装后操作一次</p>
 <pre><code>1()修改&lt;CADALINA_HOME&gt;/conf/tomcat-users.xml 加入一个&lt;user&gt;
 &gt; &lt;tomcat-users&gt;
 &gt; &lt;role rolename =&quot;manager&quot;/&gt;
 &gt; &lt;user username =&quot;tomcat&quot; password =&quot;tomcat&quot; roles =&quot;manager&quot;/&gt;
 &gt; &lt;/tomcat-users&gt;
 &gt;
 </code></pre>
  
 <blockquote>
 <p>(2)启动Tomcat</p>
 </blockquote>
 <p>(3)Tomcat管理平台本身也是一个JavaWeb应用,它位于<CATALINOME>/wepapps/manager目录下当url为http://localhost:8080/manager</p>
 <blockquote>
 <p>将会弹出一个对话框 ,进行身份验证</p>
 <p>Tomcat中发布的所有Web应用,对于每个&gt;Web应用</p>
 </blockquote>
 <ul>
 <li>Start操作:启动当前Web应用</li>
 <li>Stop操作:终止当前Web应用</li>
 <li>Reload:等价于先终止当前Web线程,重新启动当前Web应用</li>
 <li>Undeploy操作:从Tomcat中卸除当前的Web应用,Web应用文件会删除</li>
 </ul>
 <h1>4.3Servlet的声明周期</h1>
 <p>JavaWeb应用的声明周期有Servlet容器控制,而Servlet作为JavaWeb应用的最核心的组件,其生命周期也由Servlet容器控制。Servlet的生命周期可以分为三个阶段:初始化阶段、运行阶段、销毁阶段。在javax。Servlet.Servlet接口中定义了三个方法:init()、service()和Destroy()他们讲分别在Servlet的不同阶段被Servlet容器调用。</p>
 <h2>4.3.1初始化阶段</h2>
 <ul>
 <li>1 Servlet容器加载Servlet类,把它的.class文件中的数据读入到内存中.</li>
 <li>2 Servlet容器创建ServletConfig对象。ServletConfig对象包含了特定Servlet的初始化配置信息,如Servlet的初始化参数。此外,Servlet容器还会使得ServletConfig对象与当前Web应用的ServletContext对象关联。</li>
 <li>3 Servlet容器创建Servlet对象</li>
 <li>4 Servlet容器调用Servlet对象的init(ServletConfig config)方法。会建立Servlet对象和ServletConfig对象</li>
 <li>初始化创建了Servlet对象和Servletconfig对象,并且Servlet对象与ServletConfig对象关联,而ServletConfig对象与当前的Web应用的ServletContext对象关联。当Servlet容器初始化完Servlet后,Servlet对象只要通过getServletContext()方法就能得到当前Web应用的ServletContext对象</li>
 <li>1当前Web应用会处于运行时阶段,特定Servlet被客户端首次请求访问时,多数Servlet都会在这种情况下被Servlet容器初始化。</li>
 <li>如果在weg.xml文件中为一个Servlet设置了&lt;load-on-startup&gt;元素,那么当Servlet容器启动Servlet所属的Web应用时,就会初始化这个Servlet。</li>
 <li><servlet></li>
 <li>&lt;servelt-name&gt;servlet1&lt;/servlet-name&gt;</li>
 <li>&lt;servlet-class&gt;Servlet1&lt;/servlet-class&gt;</li>
 <li>&lt;load-on-startup&gt; 1 &lt;/load-on-startup&gt;</li>
 <li></servlet></li>
 <li><servlet></li>
 <li>&lt;servelt-name&gt;servlet2&lt;/servlet-name&gt;</li>
 <li>&lt;servlet-class&gt;Servlet2&lt;/servlet-class&gt;</li>
 <li>&lt;load-on-startup&gt; 2 &lt;/load-on-startup&gt;</li>
 <li></servlet></li>
 <li><servlet></li>
 <li>&lt;servelt-name&gt;servletx&lt;/servlet-name&gt;</li>
 <li>&lt;servlet-class&gt;Servletx&lt;/servlet-class&gt;</li>
 <li></li>
 <li></servlet></li>
 </ul>
 <h1>4.3.2运行阶段</h1>
 <p>这是Servlet的生命周期中最重要阶段。在这个阶段,Servlet可以随时响应客户端请求。当Servlet容器接收到要求访问特定Servlet的客户请求时,Servlet容器会创建针对这个请求的ServeltRequest和ServletResponse对象,然后调用相应的Servlet对象的Servlet()方法。ServletRequest对象的Service()方法中。Service()方法从ServletRequest对象中获取客户请求信息并处理该请求,再通过ServletResponse对象中生成相应结果。</p>
 <p>当Servlet容器把Servlet生成的相应结果发送给了客户,Servlet容器就会销毁ServletRequest对象和ServletResponse对象</p>
 <h2>4.3.3销毁阶段</h2>
 <p>当Web应用终止时,Servlet容器会调用Web应用中所有Sevlet对象的destroy()方法,然后再销毁这些Servlet容器会先调用Web应用中的Servlet对象中destroy()方法,然后销毁这些Servlet对象。在Destroy()方法的实现中,可以释放Servlet所占用的资源(关闭文件的输入和输出流,关闭数据库的连接等),此外还会销毁与Servlet对象和ServletConfig</p>
 <h2>4.3.4演示Servlet的声明周期范例</h2>
 <p>在Servlet的生命周期中,Servlet的初始化和销毁只会发生一次,因此init()方法和destroy()方法只会被Servlet容器调用一次,而Service()可能会被Servlet容器调用多次,这取决于客户端请求访问Servlet的次数</p>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值