小言_互联网的博客

JavaWeb核心技术系列教程(06)——HttpServlet

394人阅读  评论(0)

C语言自学完备手册(33篇)

Android多分辨率适配框架

JavaWeb核心技术系列教程

HTML5前端开发实战系列教程

MySQL数据库实操教程(35篇图文版)

推翻自己和过往——自定义View系列教程(10篇)

走出思维困境,踏上精进之路——Android开发进阶精华录

讲给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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场