<html>
HttpServlet概述
在大多数的Web应用程序中,client都是通过Http协议去訪问server端的资源,而我们编写的Servlet主要是用于Http协议的请求和响应处理。为了高速开发应用于Http协议的Servlet类,Sun公司在javax.servlet.http包中提供了一个抽象类HttpServlet,它继承于GenericServlet,用于创建适合基于Http协议的Web Servlet。
public abstract class HttpServlet extends GenericServlet {}
下列表中罗列了HttpServlet的全部方法:
Method Summary | |
---|---|
protected void | doDelete(HttpServletRequest req, HttpServletResponse resp) |
protected void | doGet(HttpServletRequest req, HttpServletResponse resp) |
protected void | doHead(HttpServletRequest req, HttpServletResponse resp) |
protected void | doOptions(HttpServletRequest req, HttpServletResponse resp) |
protected void | doPost(HttpServletRequest req, HttpServletResponse resp) |
protected void | doPut(HttpServletRequest req, HttpServletResponse resp) |
protected void | doTrace(HttpServletRequest req, HttpServletResponse resp) |
protected long | getLastModified(HttpServletRequest req) |
protected void | service(HttpServletRequest req, HttpServletResponse resp) |
void | service(ServletRequest req, ServletResponse res) |
以下我们就针对HttpServlet抽象类中提供的各个方法进行讨论。
重写的service()方法
在HttpServlet类中提供了两种重载的service()方法:
public abstract class HttpServlet extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else if (method.equals(METHOD_HEAD)) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
} else if (method.equals(METHOD_POST)) {
doPost(req, resp);
} else if (method.equals(METHOD_PUT)) {
doPut(req, resp);
} else if (method.equals(METHOD_DELETE)) {
doDelete(req, resp);
} else if (method.equals(METHOD_OPTIONS)) {
doOptions(req,resp);
} else if (method.equals(METHOD_TRACE)) {
doTrace(req,resp);
} else {
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[1];
errArgs[0] = method;
errMsg = MessageFormat.format(errMsg, errArgs);
resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg);
}
}
通过查看HttpServlet的源码我们能够知道,第一个service()方法是GenericServlet类中的Service()方法的实现。
在该service()方法中将ServletRequest和ServletResponse对象转换成HttpServletRequest(继承于ServletRequest接口)和HttpServletResponse(继承于ServletResponse接口)。然后调用了第二个service()方法,对client的请求进行处理。
在第二个service()方法中。针对Http 1.1协议中定义的7种请求方式Get、Post、Head、Put、Delete、Trace和Options提供了7种处理方法。这7种方法的參数类型及异常抛出类型与HttpServlet类中的第二个service()方法是一致的。
当Servlet容器接收到一个针对HttpServlet对象的请求时,调用该对象的方法顺序例如以下:
- 调用公用service()方法,将參数类型转换成HttpServletRequest和HttpServletResponse,然后调用受保护的service()方法。
- 在受保护的service()方法中,获取Http请求方法的名字。然后依据请求方法的类型,调用响应的doXXX()方法。
因此。我们在自己定义Servlet继承于HttpServlet的时候。通常不须要重写service()方法,仅仅需重写响应的doXXX()方法就可以。
七种请求处理方法
在HttpServlet抽象类中提供了针对Http 1.1协议中定义的7种请求方式Get、Post、Head、Put、Delete、Trace和Options提供了7种处理方法:
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
- protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
- protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
- protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
- protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
- protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
这7种处理请求的方法中,HttpServlet类对Trace和Options方法做了适当的实现,因此我们不须要重写doTrace()和doOptions()方法。
而对于其它的5种请求处理方法,HttpServlet类提供的实现都是返回Http错误。对于Http 1.0的client请求,这些方法返回的状态码为400。表示client发送的请求在语法上是错误的。对于Http 1.1的client请求。这些方法返回的状态码为405,表示对于指定资源的请求方法不被同意。
而对于Http协议的实际应用来讲。我们最经常使用的是Get和Post,所以在自己定义Servlet时,常重写doGet()和doPost()两个请求处理方法。当中doGet()方法用来处理Get方式的请求,doPost()方法用来处理Post方式的请求,以下我们通过一个案例来看一看:
- 创建一个HTML页面用于发送client请求。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index.html</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<h1>GET方式请求</h1>
<form id="userinfo" method="get" action="threeServlet">
用户名:<input type="text" id="username" name="username">
<input type="submit" id="submit" value="提交">
</form>
<h1>POST方式请求</h1>
<form id="userinfo" method="post" action="threeServlet">
用户名:<input type="text" id="username" name="username">
<input type="submit" id="submit" value="提交">
</form>
</body>
</html>
- 创建一个Servlet用于处理请求。
public class ThreeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("这是GET方式发送的请求,Servlet使用doGet()方法来处理.");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("这是POST方式发送的请求,Servlet使用doPost()方法来处理.");
}
}
- 配置web.xml文件。
<?xml version="1.0" encoding="UTF-8"?
>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>ThreeServlet</servlet-name>
<servlet-class>app.java.servlet.ThreeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ThreeServlet</servlet-name>
<url-pattern>/threeServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- 将Webproject公布到Tomcatserver,并启动Tomcatserver。
- 打开浏览器。在地址栏中输入http://localhost:8080/08_servlet/index.html。
利用GET方式发送请求。控制台会打印doGet()方法的内容。
利用POST方式发送请求,控制台会打印doPost()方法的内容。
转载说明:请注明作者及原文链接。谢谢!
- 本文已收录于下面专栏:
相关文章推荐
-
HttpServlet 简单表单演示样例
本文代码转载自 《Servlet、JSP和Spring MVC初学指南》 以下是一个简单的利用get进行输入表单页面显示,post进行 表单提交内容展示的实例 package mai...- sinat_30665603
- 2017-02-09 17:45
- 210
-
Servlet以及HttpServlet的源代码分析
说明:在编写 Servlet 时须要用到两个用于全部 Servlet 的基本软件包:javax.servlet 和 javax.servlet.http。以下主要介绍javax.servlet.htt...
- lovedaysmile
- 2013-10-17 15:16
- 3333
-
採用HttpServlet 实现web文件下载
package com.TopWisdom.framework.web;import java.io.*;import javax.servlet.*;import javax.servlet.htt...- gmlee2004
- 2005-08-25 16:08
- 605
-
解析Tomcat之HttpServlet具体解释(图文)
Servlet的框架是 由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了全部的Servlet类都必须实现或扩展的的通用接...- u012033124
- 2016-11-30 19:25
- 104
-
Servlet处理clientHTTP请求
本篇博客将在上一篇博客《Servlet第一个演示样例》的基础上继续介绍。Servlet怎样处理client的请求,获得client的请求消息。- jianggujin
- 2016-01-28 10:26
- 2355
-
给HttpServlet导入jar包
參考文章:http://www.cfanz.cn/index.php?a=read&c=article&id=52285 --------------------------------------...- friendan
- 2013-06-11 23:54
- 46971
-
HttpServlet源代码
HttpServlet源代码 package javax.servlet.http; import java.io.IOException; import java.io.Serializable...- tanga842428
- 2016-11-24 08:51
- 243
-
Servlet具体解释
Servlet具体解释 基本概述 Session在计算机中,尤其是在网络应用中,称为“会话控制”。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通...- q547550831
- 2016-01-04 21:13
- 2229
-
JSP编译成Servlet(一)语法树的生成——语法解析
一般来说,语句按一定规则进行推导后会形成一个语法树。这样的树状结构有利于对语句结构层次的描写叙述。相同Jasper对JSP语法解析后也会生成一棵树。这棵树各个节点包括了不同的信息,但对于JSP来说解析后的语...- wangyangzhizhou
- 2016-03-18 16:46
- 2885
-
用简单的语句解说浏览器输入地址进入servlet原理
浏览器输入地址进入servlet原理,最本质的就是tomcat的执行原理。深奥原理的确非常复杂。我们仅仅要知道流程即可了。这就简单了。 拿个地址来讲 http://localhost:8080/Se...- u013897204
- 2016-09-02 10:51
- 848
posted on 2017-08-16 12:16 gavanwanggw 阅读(177) 评论(0) 编辑 收藏 举报
0条评论