在Servlet API 章节,我们已经谈到了一部分关于H他Http Servvlet 的一部分。在本篇文章中,我们更加细致地讨论Http Servlet.
不像GenericServlet, Http Servlet 不会重载service()方法,而是重载doGet(),doPost()方法,或者同时重载这两个方法。doGet()方法用于从服务器获取信息,doPost()方法发送信息到服务器。
在Http Servlet中,没有必要重载service()方法,因为这个方法分发http 请求的哦呵对应的处理方法中,例如,如果接收到Http Get请求,就分发此请求到doGet()方法。
Http Servlet 如何工作的?
正如你看到的下面的这张图,客户端(用户的浏览器)制造请求,这个请求可以是任意类型,例如是Get请求,Post请求,Head请求等,服务分发这些请求到servlet的service()方法。此方法分发这些请求到对应的处理者上,例如接收到Get请求,它就会分发请求到doGet()方法。
Http Servlet的继承关系
java.lang.Object
|_extended by javax.servlet.GenericServlet
|_extended by javax.servlet.http.HttpServlet
我已经在Generic Servlet 章节说过了总是应该使用HttpServlet而不是GenericServlet。HttpServlet 是很容易使用的,比GenericServlet有更多的方法。
Http Servlet 例子
我们创建一个html文件,它将在我们点击这个页面上的链接时调用一次servlet.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Http Servlet Demo</title>
</head>
<body>
<a href="welcome">Click to call Servlet</a>
</body>
</html>
ExampleHttpServlet.java
现在我们通过继承HttpServlet类创建了Http Servlet.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// Creating Http Servlet by Extending HttpServlet class
public class ExampleHttpServlet extends HttpServlet
{
private String mymsg;
public void init() throws ServletException
{
mymsg = "Http Servlet Demo";
}
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException,
IOException
{
// Setting up the content type of web page
response.setContentType("text/html");
// Writing the message on the web page
PrintWriter out = response.getWriter();
out.println("<h1>" + mymsg + "</h1>");
out.println("<p>" + "Hello Friends!" + "</p>");
}
public void destroy()
{
// Leaving empty. Use this if you want to perform
//something at the end of Servlet life cycle.
}
}
web.xml
<web-app>
<display-name>BeginnersBookServlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>MyHttpServlet</servlet-name>
<servlet-class>ExampleHttpServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyHttpServlet</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
</web-app>
现在,我们的目录结构看起来像这个样子:
HttpServlet
├── index.html
└── WEB-INF
├── classes
│ └── ExampleHttpServlet.java
└── web.xml
放到tomcat webapps目录器,
在classes编译java文件
启动tomcat
HttpServlet类中的方法
1) protected void doGet(HttpServletRequest req, HttpServletResponse resp): 这个方法被servlet的service()方法调用处理Http GET请求。当重载这个方法,读取请求数据,写响应头信息,获取response的writer或者输出流对象,最终写响应数据。
2) protected long getlastModified(HttpServletRequest res): 返回一个长整形指明HttpServletRequest对象最后修改时间。格林尼治时间1970年1月1日午夜后的毫秒,如果不知道时间,则为-1。
3) protected void doHead(HttpServletRequest req, HttpServletResponse resp): servlet服务方法调用此方法来处理来自客户端的HTTP头请求。当客户只希望查看响应的头信息(如内容类型或内容长度)时,就发送HEAD请求
4) protected void doPost(HttpServletRequest req, HttpServletResponse resp): servlet服务方法调用此方法来处理来自客户机的POST请求。HTTP POST方法允许客户端一次性向Web服务器发送无限长度的数据(但是浏览器实际上是做了限制),在向服务器发送信息时非常有用。与我们从服务器获取信息的doGet不同,当我们将信息从客户端传输到服务器时,将使用此方法。
5) protected void doPut(HttpServletRequest req, HttpServletResponse resp): servlet服务方法调用此方法来处理来自客户机的PUT请求。此方法与doPost方法类似,但与我们将信息发送到服务器的doPost方法不同,此方法将文件发送到服务器,这类似于从客户机到服务器的FTP操作。
6) protected void doDelete(HttpServletRequest req, HttpServletResponse resp): 由servlet service()方法调用来处理来自客户机的删除请求,该请求允许客户机从服务器删除文档、网页或信息。
7) protected void doOptions(HttpServletRequest req, HttpServletResponse resp): 由service()方法调用,以允许servlet处理选项请求。OPTIONS请求确定服务器支持哪些HTTP方法,并返回适当的标头。
8) protected void doTrace(HttpServletRequest req, HttpServletResponse resp): 此方法由service()方法调用,用于处理跟踪请求。用于调试目的。
9) rotected void service(HttpServletRequest req, HttpServletResponse resp): 不需要覆盖此方法,此方法从客户端接收HTTP请求并将其转发给相应的doXXX方法,如doGet()、doPost()、doHEAD()等。
10) public void service(ServletRequest req, ServletResponse res): 将客户端请求转发到受保护的service()方法。也没有必要重写这个方法。