讲给Android程序员看的前端系列教程(40集免费视频教程+源码)
版权声明
- 本文原创作者:谷哥的小弟
- 作者博客地址:http://blog.csdn.net/lfdfhl
在之前的学习中,我们了解到:在JavaWeb中提供三种方式实现servlet技术,即:javax.servlet.Servlet接口、javax.servlet.GenericServlet类、javax.servlet.http.HttpServlet类。在稍前的教程中,我们学习了javax.servlet.Servlet接口和javax.servlet.GenericServlet类;在本节教程中我们来一起学习javax.servlet.http.HttpServlet类。
HttpServlet概述
javax.servlet.http.HttpServlet是一个抽象类,它继承自javax.servlet.GenericServlet。HttpServlet类为Servlet接口提供了与HTTP协议相关的通用实现。
在HTTP的请求消息中请求方式有 GET、POST、HEAD、PUT、DELETE、 TRACE、OPTIONS和CONNECT共8种。故,在HttpServlet其提供了对应的doXXX( )方法用于依据不同类型的HTTP请求作出对应的响应,例如:doGet( )、doPost( )、doDelete( )、doPut( )、doTrace( )、doOptions( )等等。
故,在实际开发中编写Servlet时,通常情况下应继承HttpServlet而避免直接去实现Servlet接口。而且,开发人员在编写Servlet时,通常只需要覆写doGet( )或doPost( )等方法而不用覆写service方法( )。
讲到这里,或许有的童鞋就有疑问了:doXXX( )方法处理完了不同类型的请求,那么之前在avax.servlet.Servlet接口和javax.servlet.GenericServlet类中提到的非常重要的service(ServletRequest req, ServletResponse res)方法在HttpServlet中又充当什么角色呢?别急,我们来瞅瞅HttpServlet中service(ServletRequest req, ServletResponse res)的源码。
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod();
if (method.equals(METHOD_GET)) {
long lastModified = getLastModified(req);
if (lastModified == -1) {
// servlet doesn't support if-modified-since, no reason
// to go through further expensive logic
doGet(req, resp);
} else {
long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE);
if (ifModifiedSince < lastModified) {
// If the servlet mod time is later, call doGet()
// Round down to the nearest second for a proper compare
// A ifModifiedSince of -1 will always be less
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
}
}
} 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 {
//
// Note that this means NO servlet supports whatever
// method was requested, anywhere on this server.
//
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);
}
}
哇哈,看到这我们就明白了:在service(ServletRequest req, ServletResponse res)方法中,首先利用req参数的getMethod( )方法获得客户端的请求方式,然后依据该请求方式来调用与之匹配的处理方法。例如:如果为请求方式为GET则调用doGet( )方法;如果为请求方式为POST则调用doPost( )方法;以此类推。
HttpServlet示例
index.html如下:
<!DOCTYPE html>
<!-- 本文作者:谷哥的小弟-->
<!-- 博客地址:https://blog.csdn.net/lfdfhl-->
<html>
<head>
<meta charset="UTF-8">
<title>TestServletForm</title>
</head>
<body>
<form action="/ServletHelloWorld03/servletTest" method="get">
姓 名:<input type="text" name="name" />
<br /><br />
城 市:<input type="text" name="city" />
<br /><br />
<input type="submit" value="提交" />
</form>
</body>
</html>
在该表单中,填写相关信息后即可提交。
ServletTest代码如下:
package cn.com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 本文作者:谷哥的小弟
* 博客地址:http://blog.csdn.net/lfdfhl HttpServlet入门示例
*
* Servlet实现方式3:继承抽象类javax.servlet.http.HttpServlet
*
* 请您注意:
* 去掉super.doGet(req, resp);
* 去掉super.doPost(req, resp);
*
* 否则报错:
* HTTP Status 405 - HTTP method GET is not supported by this URL
*/
public class ServletTest extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
System.out.println("deGet( )");
PrintWriter writer = response.getWriter();
writer.write("You use get submit form");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost( )");
PrintWriter writer = response.getWriter();
writer.write("You use post submit form");
}
}
在该Servlet中重写了doGet( )方法和doPost( )方法分别处理Get请求和Post请求。
web.xml如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<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>
<display-name>ServletHelloWorld03</display-name>
<servlet>
<servlet-name>servletTest</servlet-name>
<servlet-class>cn.com.ServletTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servletTest</servlet-name>
<url-pattern>/servletTest</url-pattern>
</servlet-mapping>
</web-app>
我们先使用get方式提交表单,结果如下:
我们再使用post方式提交表单,结果如下:
转载:https://blog.csdn.net/lfdfhl/article/details/101386016