1.1 接口Servlet
今天我们开始一个有趣的新话题——servlets。正是在 Java 中添加了 servlet,Java 才成为大型服务器应用程序的事实标准。世界上 80% 的企业软件都是用 Java 编写的。而在中国,一切都是100%。那么什么是servlet?
Servlet 正是将 Java 程序转换为 Web 服务并允许它处理来自客户端的请求的东西。是这样的……
上世纪 90 年代,万维网出现后,立即出现了网络客户端(浏览器)和网络服务器。Web 服务器通常只是简单地分发它们在 Internet 上存储的文件:html 页面、脚本、图片等。
在某个时候,每个人都得出结论,有必要让双方都变得更聪明。JavaScript 被添加到 HTML 页面,插件被添加到服务器 -响应特定请求而调用的特殊脚本,使服务器的行为更加灵活和智能。
所以servlet就是这样一个Java 插件,内置Java web-server
并允许它在某些页面请求时执行 Java 代码。这段由从 Servlet 类继承的类表示的 Java 代码已经实现了其开发人员的预期。
正如您所知,最流行的 Java Web 服务器是Tomcat。顺便说一句,为了纪念卡通“汤姆和杰瑞”中的猫汤姆而命名。
Tomcat 如何与 servlet 交互?事实上,这个过程是标准化的,称为servlet 生命周期。其中,servlet是一个可加载对象,web服务器是一个servlet容器。
如果 servlet 尚未加载,则:
- servlet 类由容器加载。
- 容器创建 servlet 类(对象)的实例。
- 容器调用
init()
servlet 对象上的方法。该方法仅被调用一次。
标准工作周期 -服务客户请求:
- 每个请求都在单独的线程中处理。
- 容器调用
service()
servlet 上的一个方法并在那里传递 ServletRequest 和 ServletResponse 对象。 - 要终止 servlet,需要
destroy()
在 servlet 对象上调用一个方法。它只被调用一次。
servlet 终止的原因有很多:
- 程序员重新启动 web 服务器,有必要优雅地关闭所有 servlet。
- 程序员加载新版本的 servlet,必须正确卸载旧版本。
- 等等。
请记住最主要的事情:Web 服务器及其 servlet 应该可以无故障地工作并重新启动数月,每分钟处理数千个请求。因此,加载、工作和卸载 servlet 的代码应该始终编写得非常高质量。
1.2 HttpServlet类
Servlet 类的存在是为了标准化 servlet 和容器的工作方式。程序员不直接使用此类。好吧,他们很少工作。最常用的类HttpServlet
继承自Servlet。
这个类有几个对我们有用的方法。你会经常使用它们:
方法 | 描述 | |
---|---|---|
1个 | init() |
加载 servlet 时调用一次 |
2个 | destroy() |
卸载 servlet 时调用一次 |
3个 | service(HttpRequest, HttpResponse) |
为 servlet 的每个新请求调用 |
4个 | doGet(HttpRequest, HttpResponse) |
为 servlet 的每个新 GET 请求调用 |
5个 | doPost(HttpRequest, HttpResponse) |
调用 servlet 的每个新 POST 请求 |
6个 | doHead(HttpRequest, HttpResponse) |
为 servlet 的每个新 HEAD 请求调用 |
7 | doDelete(HttpRequest, HttpResponse) |
调用 servlet 的每个新 DELETE 请求 |
8个 | doPut(HttpRequest, HttpResponse) |
为 servlet 的每个新 PUT 请求调用 |
init()
和方法destroy()
继承自 Servlet 类。因此,如果您决定在您的 servlet 中覆盖它们,您还需要从基类中调用它们的实现。该命令用于此super.method name()
。
服务小程序示例:
public class FirstHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// Getting the parameter “secret” from request
String secret = request.getParameter("secret");
// Put parameter “secret” into Http-session
HttpSession session = request.getSession(true);
session.setAttribute("secret", secret);
// Print HTML as response for browser
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Header</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet example "+ secret +"</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
}
1.3 service(HttpServletRequest, HttpServletResponse)方法
如果从 servlet 的角度来看客户端请求的处理,那么事情是这样的。
对于每个客户端请求,容器(Web 服务器)创建HttpServletRequest
和对象HttpServletResponse
,然后调用service(HttpServletRequest request, HttpServletResponse response)
相应的 servlet 上的方法。将这些对象传递给它,以便该方法可以从中获取必要的数据request
并将工作结果放入response
.
该方法service()
具有默认实现。如果没有重新定义,那么它将被执行。他就是这么做的。
该方法service()
根据请求(GET、POST、...)确定HTTP方法类型,并调用请求对应的方法。
方法 | 描述 | |
---|---|---|
1个 | service(HttpRequest, HttpResponse) |
为 servlet 的每个新请求调用 |
2个 | doGet(HttpRequest, HttpResponse) |
为 servlet 的每个新 GET 请求调用 |
3个 | doPost(HttpRequest, HttpResponse) |
调用 servlet 的每个新 POST 请求 |
4个 | doHead(HttpRequest, HttpResponse) |
为 servlet 的每个新 HEAD 请求调用 |
5个 | doDelete(HttpRequest, HttpResponse) |
调用 servlet 的每个新 DELETE 请求 |
6个 | doPut(HttpRequest, HttpResponse) |
为 servlet 的每个新 PUT 请求调用 |
在您的班级中,您可以重新定义一个方法service()
,也可以保留它,然后根据需要重新定义方法doGet()
、doPost()
...。
GO TO FULL VERSION