<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><servlet-name>定义Servlet的名字</li> | |
<li><servlet-class>制定Servlet的完整类名(包括包的名字)</li> | |
<li><init-param>定义servlet的初始化参数(包括参数名和参数值),在一个<servlet>元素中可以有多个<init-param>.(<init-param>的具体方法(ServletConfig))</li> | |
<li><load-on-startup>制定当Servlet容器启动web应用时,加载各个Servlet的次序,在依次加载其他数值大的Servlet,如果这个值为负数或者没有设定,那么Servlet容器将在客户端首次访问这个Servlet时加载它</li> | |
</ol> | |
</li> | |
<li><servlet-mapping>其元素为Servlet映射一个URL:<Servlet-name>子元素制定待映射的Servlet名字<url-pattern></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中的"?"后面的内容,如果客户端发送的是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("username"); | |
/*字节码装换 | |
* HTTP请求中默认字符编码为ISO-8859-1,如果请求包含中文 | |
* 需要把它转换成为GB2312 | |
* */ | |
if(username!=null){ | |
username = new String(username.getBytes("ISO-8859-1"),"GB2312"); | |
} | |
if(username == null){ | |
//仅仅为了演示response.sendError()的用法。 | |
response.sendError(response.SC_FORBIDDEN); | |
return; | |
} | |
//设置HTTP正文的MIME类型及字符编码 | |
response.setContentType("text/html;charset=GB2312"); | |
/*输出文档*/ | |
PrintWriter out = response.getWriter(); | |
out.println("<HTML><HEAD><TITLE>HelloServlet</TITLE></HEAD>"); | |
out.println("<BODY>"); | |
out.println("你好:"+username); | |
out.println("</BODY></HTML>"); | |
System.out.println("before close():"+response.isCommitted()); | |
out.close(); | |
System.out.println("after close():"+response.isCommitted()); | |
} | |
</code></pre> | |
<p>}</p> | |
<p>?xml version="1.0" encoding="UTF-8"?></p> | |
</li> | |
</ul> | |
<blockquote> | |
<pre><code><web-app version="2.5" | |
xmlns="http://java.sun.com/xml/ns/javaee" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> | |
<servlet> | |
<servlet-name>helloservlet</servlet-name> | |
<servlet-class>liwei.HelloServlet</servlet-class> | |
</servlet> | |
<servlet-mapping> | |
<servlet-name>helloservlet</servlet-name> | |
<url-pattern>/hello</url-pattern> | |
</servlet-mapping> | |
<welcome-file-list> | |
<welcome-file>index.jsp</welcome-file> | |
</welcome-file-list> | |
</web-app> | |
</code></pre> | |
<p>以上的HelloServlet类利用HttpServletResponse对象的setContentType()方法来设置响应的正文的MIME类型及字符编码 | |
//方式一 | |
response.setContentType("text/html;charset=GB2312"); | |
//方式二 | |
response.setContentType("text/html"); | |
response.setCharacterEncoding("GB2312"); | |
//方式三 | |
response.setHeader("Content-type","text/html;charset=GB2312");</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>子元素的处理里值。如果没有为<servlet配置<Servlet-name>子元素的值</li> | |
</ul> | |
<p>每个初始化参数包括一对参数名和参数值。在Web.xml文件中相应<servlet></p> | |
<blockquote> | |
<p><init-param></init-param> | |
<param-name></param-name></p> | |
<pre><code>><?xml version="1.0" encoding="UTF-8"?> | |
<web-app version="2.5" | |
xmlns="http://java.sun.com/xml/ns/javaee" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> | |
<servlet> | |
<servlet-name>font</servlet-name> | |
<servlet-class>liwei.FontServlet</servlet-class> | |
<init-param> | |
<param-name>color</param-name> | |
<param-value>blue</param-value> | |
</init-param> | |
<init-param> | |
<param-name>size</param-name> | |
<param-value>15</param-value> | |
</init-param> | |
</servlet> | |
<servlet-mapping> | |
<servlet-name>font</servlet-name> | |
<url-pattern>/do</url-pattern> | |
</servlet-mapping> | |
<welcome-file-list> | |
<welcome-file>index.jsp</welcome-file> | |
</welcome-file-list> | |
</web-app> | |
</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("word"); | |
if(word==null) | |
word ="Hello"; | |
//读取初始化参数 | |
String color = getInitParameter("color"); | |
String size = getInitParameter("size"); | |
System.out.println("sevletName: "+getServletName());//打印servletName:Font | |
//设置HTTP响应的正文的MIME类型及字符编码 | |
response.setContentType("text/html;charset=GB2312"); | |
/*输出HTML文档*/ | |
PrintWriter out = response.getWriter(); | |
out.println("<html><head><title>FontSize</title></head>"); | |
out.println("<body>"); | |
out.println("<font size ='"+size+"' color='"+color+"'>"+word+"</font>"); | |
out.println("</body></html>"); | |
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根元素下定义 | |
<context-param>元素再应用范围的初始化参数</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("text/html;charset=GB2312"); | |
//输出HTML文档 | |
PrintWriter out = response.getWriter(); | |
out.println("<html><head><title>FontServlet</title></head>"); | |
out.println("<body>"); | |
out.println("<br>Emaile: "+context.getInitParameter("emai10fwebmaseter")); | |
out.println("<br>Path:"+context.getRealPath("/WEB_INF")); | |
out.println("<br>MimeType:"+context.getMimeType("/WEB-INF/Web.xml")); | |
out.println("<br>MajorVersion:"+context.getMajorVersion()); | |
out.println("<br>ServletInfo: "+context.getServerInfo()); | |
out.println("</body></html>"); | |
//输出日志 | |
//context.log("这是ContextTestServlet输出的日志"); | |
} | |
} | |
?xml version="1.0" encoding="UTF-8"?> | |
<web-app version="2.5" | |
xmlns="http://java.sun.com/xml/ns/javaee" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | |
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee | |
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> | |
<context-param> | |
<param-name>emai10fwebmaseter</param-name> | |
<param-value>webmaster@hotmail1.com</param-value> | |
</context-param> | |
<servlet> | |
<servlet-name>contextTest</servlet-name> | |
<servlet-class>liwei.ContextTesterServlet</servlet-class> | |
</servlet> | |
<servlet-mapping> | |
<servlet-name>contextTest</servlet-name> | |
<url-pattern>/contextTest</url-pattern> | |
</servlet-mapping> | |
<welcome-file-list> | |
<welcome-file>index.jsp</welcome-file> | |
</welcome-file-list> | |
</web-app> | |
</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()修改<CADALINA_HOME>/conf/tomcat-users.xml 加入一个<user> | |
> <tomcat-users> | |
> <role rolename ="manager"/> | |
> <user username ="tomcat" password ="tomcat" roles ="manager"/> | |
> </tomcat-users> | |
> | |
</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应用,对于每个>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设置了<load-on-startup>元素,那么当Servlet容器启动Servlet所属的Web应用时,就会初始化这个Servlet。</li> | |
<li><servlet></li> | |
<li><servelt-name>servlet1</servlet-name></li> | |
<li><servlet-class>Servlet1</servlet-class></li> | |
<li><load-on-startup> 1 </load-on-startup></li> | |
<li></servlet></li> | |
<li><servlet></li> | |
<li><servelt-name>servlet2</servlet-name></li> | |
<li><servlet-class>Servlet2</servlet-class></li> | |
<li><load-on-startup> 2 </load-on-startup></li> | |
<li></servlet></li> | |
<li><servlet></li> | |
<li><servelt-name>servletx</servlet-name></li> | |
<li><servlet-class>Servletx</servlet-class></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> |