(六)HttpServlet

通常浏览器客户端都是通过Http协议来访问服务端资源,而Servlet也主要是应运于http协议的请求和响应。为此sun公司为我们提供个抽象的类HttpServlet,它继承自GenericServlet类,用于创建适合Web站点的HTTP Servlet。

在HttpServlet中主要是对Service的重写

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        ................

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        service(request, response);
    }

在servlce中将ServeltRequest和ServletResponse转换为HttpServletRequest 和HttpServletResponse传给重载后的service

    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();

        if (method.equals("GET")) {
            long lastModified = getLastModified(req);
            if (lastModified == -1L) {
                doGet(req, resp);
            } else {
                long ifModifiedSince = req.getDateHeader("If-Modified-Since");
                if (ifModifiedSince < lastModified) {
                    maybeSetLastModified(resp, lastModified);
                    doGet(req, resp);
                } else {
                    resp.setStatus(304);
                }
            }
        } else if (method.equals("HEAD")) {
            long lastModified = getLastModified(req);
            maybeSetLastModified(resp, lastModified);
            doHead(req, resp);
        } else if (method.equals("POST")) {
            doPost(req, resp);
        } else if (method.equals("PUT")) {
            doPut(req, resp);
        } else if (method.equals("DELETE")) {
            doDelete(req, resp);
        } else if (method.equals("OPTIONS")) {
            doOptions(req, resp);
        } else if (method.equals("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(501, errMsg);
        }
    }

此时由重载的Service来对客户端的请求,进行处理。为此HttpServlet分别提供了7个do**处理方法,主要针对HTTP1.1中定义的7种请求方法:GET、POST、HEAD、PUT、DELETE、TRACE和OPTIONS。

        protected void doGet (HttpServletRequest req,
                HttpServletResponse resp) throws ServletException, java.io.IOException
        protected void doPost (HttpServletRequest req,
                HttpServletResponse resp) throws ServletException, java.io.IOException
        protected void doHead (HttpServletRequest req,
                HttpServletResponse resp) throws ServletException, java.io.IOException
        protected void doPut (HttpServletRequest req,
                HttpServletResponse resp) throws ServletException, java.io.IOException
        protected void doDelete (HttpServletRequest req,
                HttpServletResponse resp) throws ServletException, java.io.IOException
        protected void doTrace (HttpServletRequest req,
                HttpServletResponse resp) throws ServletException, java.io.IOException
        protected void doOptions (HttpServletRequest req,
                HttpServletResponse resp) throws ServletException, java.io.IOException

在重载后的service中,通过判断req.getMethod(); 来调用相应的请求方法做出处理。

总结如下:

这7个方法的参数类型及异常抛出类型与HttpServlet类中的第二个重载的service()方法是一致的。

当容器接收到一个针对HttpServlet对象的请求时,调用该对象中的方法顺序如下:

① 调用公共的(public)service()方法。

② 在公共的service()方法中,首先将参数类型转换为HttpServletRequest和HttpServletResponse,

然后调用保护的(protected)service()方法,将转换后的HttpServletRequest对象和HttpServletResponse对象作为参数传递进去。

③ 在保护的service()方法中,首先调用HttpServletRequest对象的getMethod()方法,获取HTTP请求方法的名字,然后根据请求方法的类型,调用相应的doXxx ()方法。

因此,我们在编写HttpServlet的派生类时,通常不需要去覆盖service()方法,而只需重写相应的doXXX()方法。

HttpServlet类对TRACE和OPTIONS方法做了适当的实现,因此我们不需要去覆盖doTrace()和doOptions()方法。

而对于其他的5个请求方法,HttpServlet类提供的实现都是返回HTTP错误,对于HTTP 1.0的客户端请求,这些方法返回状态代码为400的HTTP错误,表示客户端发送的请求在语法上是错误的。

而对于HTTP 1.1的客户端请求,这些方法返回状态代码为405的HTTP错误,表示对于指定资源的请求方法不被允许。这些方法都是使用javax.servlet.ServletRequest接口中的getProtocol()方法来确定协议的。

HttpServlet虽然是抽象类,但在这个类中没有抽象的方法,其中所有的方法都是已经实现的。只是在这个类中对客户请求进行处理的方法,没有真正的实现,当然也不可能真正实现,因为对客户请求如

何进行处理,需要根据实际的应用来决定。我们在编写HTTP Servlet的时候,根据应用的需要,重写其中的对客户请求进行处理的方法即可。

时间: 2024-10-12 15:49:59

(六)HttpServlet的相关文章

javaweb学习总结(六)——Servlet开发(二)

转载:http://www.cnblogs.com/xdp-gacl/p/3763559.html 只为成功找方法,不为失败找借口! javaweb学习总结(六)——Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: 1 <servlet> 2 <servlet-name>ServletC

Java+MyEclipse+Tomcat (六)详解Servlet和DAO数据库增删改查操作

此篇文章主要讲述DAO.Java Bean和Servlet实现操作数据库,把链接数据库.数据库操作.前端界面显示分模块化实现.其中包括数据的CRUD增删改查操作,并通过一个常用的JSP网站前端模板界面进行描述.参考前文: Java+MyEclipse+Tomcat (一)配置过程及jsp网站开发入门 Java+MyEclipse+Tomcat (二)配置Servlet及简单实现表单提交 Java+MyEclipse+Tomcat (三)配置MySQL及查询数据显示在JSP网页中 Java+MyE

Maven3路程(六)用Maven创建Spring3 MVC项目

一.      环境 spring-framework-3.2.4.RELEASE jdk1.7.0_11 Maven3.0.5 eclipse-jee-juno-SR2-win32 二.      创建Web项目 Eclipse中创建Web项目,见前边日志<Maven3路程(三)用Maven创建第一个web项目(1)> 三.      项目依赖,配置pom.xml文件 pom.xml文件如下: <project xmlns="http://maven.apache.org/P

【SSH进阶之路】一步步重构MVC实现Struts框架——完善转向页面,大功告成(六)

目录: [SSH进阶之路]Struts基本原理 + 实现简单登录(二) [SSH进阶之路]一步步重构MVC实现Struts框架--从一个简单MVC开始(三) [SSH进阶之路]一步步重构MVC实现Struts框架--封装业务逻辑和跳转路径(四) [SSH进阶之路]一步步重构MVC实现Struts框架--彻底去掉逻辑判断(五) [SSH进阶之路]一步步重构MVC实现Struts框架--完善转向页面,大功告成(六) 第四篇博客[SSH进阶之路]一步步重构MVC实现Struts框架--封装业务逻辑和跳

正常下载与URLConnection 六(64)

一 正常下载 服务使用断点下载时,响应的信息是206. UrlConnection - HttpurlConnection.-通过URL来获取urlconnection实例. 正常下载示例 package cn.demo; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.net.Htt

玩转web之servlet(六)---session介绍及简单使用(登录验证中保存信息)

在浏览器与服务器进行交互时,往往需要把涉及到的一些数据保存下来,这时就需要使用cookie或session进行状态管理. 这篇文章先来说说session怎么用,首先在servlet中创建一个session来保存信息,举个例子,在做登陆验证时,如果登陆成功,需要将用户的信息保存到session中,怎么保存呢?下面给出代码: public class Login_Do extends HttpServlet { String order_name = ""; String order_pa

java微信开发API解析(六)-综合运用(消息处理、自定义菜单响应处理、用户自动分组处理;包含源码)

java微信开发API解析(六) 全局说明 * 详细说明请参考前两篇文章. 本文说明 * 本文主要是对前面学习的知识进行综合整合. * 我们对需要的bean.工具类.xml.file进行必要的包装. * 我们构建一个可以直接使用的Java微信应用. * 文后包含该部分效果的测试微信公众号 * 文后包含构建好的源码供下载 bean的构建 public class Access_token,获取Access_token对应的bean. private String access_token; pri

JavaWeb学习记录(六)——用户登录功能

使用JDBC.spring框架.servlet实现一个简单的用户登录功能. 一.mySql数据库 SET FOREIGN_KEY_CHECKS=0; -- ------------------------------ Table structure for user-- ----------------------------DROP TABLE IF EXISTS `user`;CREATE TABLE `user` (  `id` int(11) NOT NULL AUTO_INCREMEN

Servlet第六课:Cookie的使用

目标规划: 通过这一节课,我们可以懂得如何使用Cookie,以及如何获取Cookie中的内容. Cookie的详细概述. 1. Cookie 是保存在客户端的一个"键-值"对,用来标识用户的一些信息. 2. Cookie的应用 –在电子商务会话中标识用户 –对站点进行定制 –定向广告 3. 调用Cookie的构造函数,给出cookie的名称和cookie的值,二者都是字符串 Cookie c = new Cookie("userID", "a1234&qu