深入servlet
Java Servlet是和平台无关的服务器端组件,它运行在 Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应” 的模式。
Servlet可完成如下功能:
- 创建并返回基于客户请求的动态HTML页面。
- 创建可嵌入到现有 HTML 页面中的部分 HTML 页面(HTML 片 段)。
- 与其它服务器资源(如数据库或基于Java的应用程序)进行通信 。
servlet API:
Servlet的框架是由两个Java包组成:
- javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
- javax.servlet.http 包 : 定义了采用HTTP协议通信的HttpServlet类。
Servlet的框架的核心是javax.servlet.Servlet接口 ,所有的Servlet都必须实现这一接口。在Servlet接 口中定义了五个方法,其中有三个方法代表了Servlet的生命周期:
- init方法:负责初始化Servlet对象;
- service方法:负责响应客户的请求;
- destroy方法:当Servlet对象退出生命周期时,负责释放 占用的资源。
ServletRequest接口:
- ServletRequest接口中封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议, 以及发出客户请求的远程主机信息等。 ServletRequest接口还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream。
- ServletRequest的子类可以为Servlet提供更多的和特定协议相关的数据. 例如: HttpServletRequest提供了读取HTTP Head信息的方法。
ServletResponse接口:
- ServletResponse接口为Servlet提供了返回响应结果 的方法。它允许Servlet设置返回数据的长度和MIME 类型, 并且提供输出流ServletOutputStream。
- ServletResponse子类可以提供更多和特定协议相关 的方法。例如: HttpServletResponse 提供设定HTTP HEAD信息的方法。
Servlet生命周期:
Servlet的生命周期可以分为三个阶段:
- 初始化阶段
- 响应客户请求阶段
- 终止阶段
在javax.servlet.Servlet接口中定义了三个方法init(), service(), destroy(),它们将分别在Servlet的不同阶段被调用。
Servlet的初始化阶段:
在下列时刻Servlet容器装载Servlet:
- Servlet容器启动时自动装载某些Servlet
- 在Servlet容器启动后,客户首次向 Servlet 发出请求
- Servlet的类文件被更新后,重新装载Servlet
Servlet被装载后,Servlet容器创建一个 Servlet 实例并且调用 Servlet 的 init()方法进行初始化。在 Servlet的整个生命周期中,init方法只会被调用一次。
Servlet的响应客户请求阶段:
对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和 ServletResponse对象,然后调用 Servlet 的 service方法。service方法从ServletRequest对象获得客户请求信息、处理该请求,并通过 ServletResponse对象向客户返回响应结果。
如果你的Servlet类扩展了HttpServlet类,你通常不必实现 service方法,因为HttpServlet类已经实现了service方法, 该方法的声明形式如下:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException;
在 HttpServlet 的 service 方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求方式调用相应的方法。例如:如果请求方式为GET ,那么调用doGet方法;如果请求方式为POST,那么调用 doPost方法。
Servlet的终止阶段:
当Web应用被终止,或Servlet容器终止运行,或 Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用Servlet的destroy方法。在destroy方法中,可以释放Servlet所占用的资源。
创建HTTPServlet类(以创建HelloServlet为例)的步骤:
- 扩展 HttpServlet 抽象类。
-
public class HelloServlet extends HttpServlet { }
-
- 覆盖HttpServlet的部分方法,如覆盖doGet()或 doPost()方法。
-
public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException ,ServletException { } }
-
- 获取HTTP 请求信息,例如通过HttpServletRequest 对象来检索 HTML 表单所提交的数据或 URL 上的查询字符串 。无论是HTML表单数据还是URL 上的查询字符串,在 HttpServletRequest 对象中都以参数名/参数值的形式存放, 你可以通过getParameter(String name)方法检索参数信息 。
-
-
public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException ,ServletException {
String clientName=request.getParameter("clientName");
if(clientName!=null){
clientName=new String(clientName.getBytes("ISO-8859- 1"),"GB2312");
} else {
clientName="我的朋友";
}
} }
-
- 生成 HTTP 响应结果。通过 HttpServletResponse 对象可以生成响应结果。 HttpServletResponse 对象有一个 getWriter()方 法,该方法返回一个 PrintWriter 对象。使用 PrintWriter 的 print()或 println()方法可以向客户端发送字符串数据流。
-
public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException ,ServletException { String clientName=request.getParameter("clientName");
if(clientName!=null){
clientName=new String(clientName.getBytes("ISO-8859- 1"),"GB2312");
} else {
clientName="我的朋友";
}
PrintWriter out;
String title="HelloServlet";
String heading1="This is output from HelloServlet by doGet:"; // set content type.
response.setContentType("text/html;charset=GB2312"); // write html page.
out = response.getWriter();
out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>" );
out.print("</HEAD><BODY>");
out.print(heading1);
out.println("<h1><P> "+clientName+" : 您好</h1>");
out.print("</BODY></HTML>"); //close out.
out.close();
} }
-
- 最后不要忘记在web.xml中发布: 在web.xml中为HelloServlet类加上如下<servlet>和 <servlet-mapping>元素:
-
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.test.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-