完整Servlet详情介绍
servlet介绍
Servlet是sun公司提供的一门用于开发动态web资源的技术。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
1、编写一个Java类,实现servlet接口。 2、把开发好的Java类部署到web服务器中。
按照一种约定俗成的称呼习惯,通常我们也把实现了servlet接口的java程序,称之为Servlet。
1. 加载和实例化
容器负责加载和实例化一个Servlet。实例化和加载可以发生在引擎启动的时候,也可以推迟到容器需要该Servlet为客户请求服务的时候。
2. 初始化
Servlet加载并实例化后,容器必须在它能够处理客户端请求前初始化它。初始化的过程主要是读取永久的配置信息,昂贵资源(例如JDBC连接)以及其它仅仅需要执行一次的任务。通过调用它的init方法并给它传递唯一的一个(每个Servlet定义一个)ServletConfig对象完成这个过程。给它传递的这个配置对象允许Servlet访问容器的配置信息中的名称-值对(name-value)初始化参数。这个配置对象同时给Servlet提供了访问实现了ServletContext接口的具体对象的方法,该对象描述了Servlet的运行环境。
2.1 初始化的错误处理
2.2 工具因素
3. 处理请求
在Servlet被适当地初始化后,容器就可以使用它去处理请求了。每一个请求由ServletRequest类型的对象代表,而Servlet使用ServletResponse回应该请求。这些对象被作为service方法的参数传递给Servlet。在HTTP请求的情况下,容器必须提供代表请求和回应的HttpServletRequest和HttpServletResponse的具体实现。需要注意的是容器可能会创建一个Servlet实例并将之放入等待服务的状态,但是这个实例在它的生存期中可能根本没有处理过任何请求。
3.1 多线程问题
3.2 处理请求中的异常
3.3 线程安全
4. 服务结束
容器没有被要求将一个加载的Servlet保存多长时间,因此一个Servlet实例可能只在容器中存活了几毫秒,当然也可能是其它更长的任意时间(但是肯定会短于容器的生存期)。当容器决定将之移除时(原因可能是保存内存资源或者自己被关闭),那么它必须允许Servlet释放它正在使用的任何资源并保存任何永久状态(这个过程通过调用destroy方法达到)。容器在能够调用destroy方法前,它必须允许那些正在service方法中执行的线程执行完或者在服务器定义的一段时间内执行(这个时间段在容器调用destroy之前)。一旦destroy方法被调用,容器就不会再向该实例发送任何请求。如果容器需要再使用该Servlet,它必须创建新的实例。destroy方法完成后,容器必须释放Servlet实例以便它能够被垃圾回收。
5. 多种Servlet接口介绍
Servlet接口:
- init()
- service()
- destroy()
- getServletConfig()
- getServletInfo()
GenericServlet类
HttpServlet类
- service()
- getLastModified()
HttpServletRequest接口
- getParameter()
- getParametervalues()
- getParameterNames()
- setContentType()
- getWriter()
- getOutputStream()
- setHeader()
Java代码
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
}
}
// ...doPost()...等类似