Servlet是sun公司提供的一门用于开发动态web资源的技术。(按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet)
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编 写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如 为Post请求,则调用doPost方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
由于客户端是通过URL地址访问web服务器中的资源,所以Servlet程序若想被外界访问,必须把servlet程序映射到一个URL地址上,这个工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
<servlet>元素用于注册Servlet,它包含有两个主要的子元素:<servlet-name>和<servlet-class>,分别用于设置Servlet的注册名称和Servlet的完整类名。
一个<servlet-mapping>元素用于映射一个已注册的Servlet的一个对外访问路径,它包含有两个子元素:<servlet-name>和<url-pattern>,分别用于指定Servlet的注册名称和Servlet的对外访问路径。
1 <web-app> 2 <servlet> 3 <servlet-name>AnyName</servlet-name> 4 <servlet-class>HelloServlet</servlet-class> 5 </servlet> 6 <servlet-mapping> 7 <servlet-name>AnyName</servlet-name> 8 <url-pattern>/demo/hello.html</url-pattern> 9 </servlet-mapping> 10 </web-app>
Servlet的生命周期:
Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web容器退出,servlet实例对象才会销毁。
在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
ServletConfig对象:
在Servlet的配置文件中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
ServletContext:
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
实例:
MyEclipse新建一个Web Project OutPutInfo 然后编写一个OutputInfo的Servlet
1 package com.woodrow.outputInfo; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 import java.util.Enumeration; 6 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServlet; 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 12 public class OutputInfo extends HttpServlet { 13 14 public void doGet(HttpServletRequest request, HttpServletResponse response) 15 throws ServletException, IOException { 16 response.setContentType("text/html;charset=gb2312"); 17 PrintWriter out = response.getWriter(); 18 Enumeration headNames = request.getHeaderNames(); 19 20 out.println("<html><head>"); 21 out.println("<title>Info Page</title>"); 22 out.println("<body><center>"); 23 24 out.println("<table border=1 align=center>"); 25 out.println("<caption>Servlet接收到的HTTP消息报头的信息</caption>"); 26 out.println("<tr bgcolor=#999999>"); 27 out.println("<th>消息报头的名字</th>"); 28 out.println("<th>消息报头的值</th>"); 29 out.println("</tr>"); 30 while(headNames.hasMoreElements()) 31 { 32 String name = (String) headNames.nextElement(); 33 String value = request.getHeader(name); 34 out.println("<tr>"); 35 out.println("<td>"+name+"</td>"); 36 out.println("<td>"+value+"</td>"); 37 out.println("</tr>"); 38 } 39 out.println("</table><p>"); 40 41 out.println("<table border=1 align=center>"); 42 out.println("<caption>其它访问信息</caption>"); 43 44 out.println("<tr>"); 45 out.println("<td>客户端的IP地址</td>"); 46 out.println("<td>"+request.getRemoteAddr()+"</td>"); 47 out.println("</tr>"); 48 49 out.println("<tr>"); 50 out.println("<td>客户端的端口号</td>"); 51 out.println("<td>"+request.getRemotePort()+"</td>"); 52 out.println("</tr>"); 53 54 out.println("<tr>"); 55 out.println("<td>服务器端的IP地址</td>"); 56 out.println("<td>"+request.getLocalAddr()+"</td>"); 57 out.println("</tr>"); 58 59 out.println("<tr>"); 60 out.println("<td>服务器端的端口号</td>"); 61 out.println("<td>"+request.getLocalPort()+"</td>"); 62 out.println("</tr>"); 63 64 out.println("</table>"); 65 66 out.println("</center></body></html>"); 67 out.close(); 68 } 69 70 public void doPost(HttpServletRequest request, HttpServletResponse response) 71 throws ServletException, IOException { 72 73 } 74 75 }
编辑web.xml文件
1 <servlet> 2 <servlet-name>OutputInfo</servlet-name> 3 <servlet-class>com.woodrow.outputInfo.OutputInfo</servlet-class> 4 </servlet> 5 6 <servlet-mapping> 7 <servlet-name>OutputInfo</servlet-name> 8 <url-pattern>/servlet</url-pattern> 9 </servlet-mapping>
使用Eclipse部署并启动Tomcat,打开浏览器输入:http://localhost:8080/OutputInfo/servlet,看到的页面如下: