Servlet总结——servlet的主要接口、类

Servlet总结01——servlet的主要接口、类

(一)servlet类

Servlet主要类、接口的结构如下图所示:

要编写一个Servlet需要实现javax.servlet.Servlet接口,该接口定义了5个方法。如下:

1.init(),初始化servlet对象,完成一些初始化工作。

它是由servlet容器控制的,该方法只能被调用一次,初始化过程如下:

2.service(),接受客户端请求对象,执行业务操作,利用响应对象响应客户端请求。

3.destroy(),当容器监测到一个servlet从服务中被移除时,容器调用该方法,释放资源。

4.getServletConfig(),ServletConfig是容器向servlet传递参数的载体。

5.getServletInfo(),获取servlet相关信息。

(二)与servlet相关的接口

从servlet仅有的5个方法当中,我们知道其涉及3个接口,分别是:

ServletConfig

ServletRequest

ServletResponse

2.1. ServletConfig

主要方法:

重点关注getServletContext,之前说servletConfig是容器向servlet传递参数的载体,那么它也可以让Servlet获取其在容器中的上下文。

ServletContext是针对一个web应用,jdk中具体描述——

There is one context per "web application" per Java Virtual Machine. (A "web application" is a collection of servlets and content installed under a specific subset of the server‘s URL namespace such as /catalog and possibly installed via a .war file.)

2.2.ServletRequest

获取客户端发来的请求数据。(查看api

note:注意getAttribute和getParameter的区别。

getAttribute( String name )可以得到由setAttribute()设置的参数值,相当于是使用getAttribute()得到一

个自己定义的参数,而不是从客户端得到的参数。

getParameter( String name )它用来获取客户端通过get或post方法等传递过来的值,是从客户端传递过来的,

一般指的是客户端提交的表单组件的值。

note:setCharacterEncoding在什么时候使用才有效?

它可以覆盖请求正文中所使用的字符编码,但是它必须在读取parameters之前设置,否则无效。

2.3.ServletResponse

响应客户端请求。(查看api

(三)GenericServlet抽象类

为了简化serlvet的编写,在javax.servlet包中提供了一个抽象类GenericServlet,它给出了除service()方法以外的简单实现。

GenericServlet定义了一个通用的,不依赖具体协议的Servlet,它实现了Servlet接口和ServletConfig接口。

public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable

(四)HttpServlet抽象类

HttpServlet主要是应用于HTTP协议的请求和响应,为了快速开发HTTP协议的serlvet,sun提供了一个继承自GenericServlet的抽象类HttpServlet,

用于创建适合Web站点的HTTP Servlet。

public abstract class HttpServlet extends GenericServlet implements java.io.Serializable

重点关注HttpServlet中的一个私有方法service。

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 / 1000 * 1000)) {

                    // 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);

        }

    }

  而它实现Servlet接口的service方法,是将ServletResponse对象和ServletRequest对象转化成httpServletResponse对象和HttpservletRequest对象,

然后再调用私有方法service。它根据request获取Http method(get、post等)的名称,根据http method调用不同的方法执行操作。

(五)HttpServletRequest、HttpServletResponse

由于HttpServletRequest和HttpServletResponse都是基于Http协议“升级改造”的,所以这两个对象较之ServletRequest和ServletResponse多出的方法主要和

Http协议相关。

例如:Cookie、request(response)headers、Session、URL等。

具体请查看api。

时间: 2024-11-07 15:10:19

Servlet总结——servlet的主要接口、类的相关文章

Servlet技术——Servlet基础

Servlet是运行在Web服务器端的Java应用程序,它使用Java语言编写,具有Java语言的优点.与Java程序的区别是,Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持.在Java Web应用方面,Servlet的应用占有十分重要的地位,它在Web请求的处理功能方面也十分强大. 1.Servlet体系结构Servlet实质上就是按Servlet规范编写的Java类,但是它可以处理Web应用中的相关请求.Servlet是一个标准,它由Sun定义,其

Servlet、Servlet容器等内容讲解

转载自http://blog.csdn.net/iAm333 对于Servlet.Servlet容器以及一个Servlet容器-Tomcat这些概念讲解的挺清晰的,转载下 之前在开源中国看到一篇文章<初学 Java Web 开发,请远离各种框架,从 Servlet 开发>,觉得很不错.想到自己之前一直对各种框架执迷不悟,顿感惭愧.于是,看了孙鑫的<Servlet/JSP深入详解:基于Tomcat的Web开发>.林信良的<JSP&Servlet学习笔记(第二版)>

理解Servlet和Servlet容器、Web服务器等概念

转载自http://blog.csdn.net/iAm333 之前在开源中国看到一篇文章<初学 Java Web 开发,请远离各种框架,从 Servlet 开发>,觉得很不错.想到自己之前一直对各种框架执迷不悟,顿感惭愧.于是,看了孙鑫的<Servlet/JSP深入详解:基于Tomcat的Web开发>.林信良的<JSP&Servlet学习笔记(第二版)>以及网上其他一些相关的资料,将自己的理解整理如下. Web技术 随着互联网技术的发展,基于HTTP和HTML的

【Servlet】Servlet入门总结及第一个Servlet程序

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 目录 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 Servlet生命周期 五servlet工作过程 六 Servlet与JSP区别 七Servlet代码结构 八 Servlet第一个程序 一.了解Servlet的概念 Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容.Servlet引擎作为WEB服务器的扩展

【转】多用户访问Servlet,servlet单实例多线程

public class MyClass { private String variable1 ; private static String variable2 ; public MyClass(){ } public void method(){ String variable3; } } 上面是随手写的一个类,没有任何意义,只是为了强调一些概念,这和这个主题很有关系:1) java中的变量的分类:    a. 实例变量    b. 局部变量    c. 静态变量本篇并不是java的基础教程

Servlet概述-servlet学习之旅(一)

Servlet概述 servlet是server+applet的缩写.applet是运行于客户端浏览器的java小程序,java诞生的时候,因为applet而闻名于世,但是现在已经没有多少热使用了,而servlet却继续发展进化,成为许多框架的基础,比如spring等. servlet也是java类,但是servlet又是特殊的java类,要遵循servlet的规范进行编写,比如servlet与一般的java程序不一样的地方在于,servlet没有mian方法,而且servelt运行于服务端,它

servlet之servlet(二)

·servlet用于创建返回基于客服请求的动态页面(整个).部分页面.与数据库交互 ·servlet接口: 继承servlet接口后,要在web.xml中配置和映射servlet.配置servlet初始化参数.指定servlet被创建的时机.配置当前web应用的初始化参数 <servlet> <!-- 配置servlet --> <servlet-name>helloServlet</servlet-name> <servlet-class>yj

MyBatis Spring整合配置映射接口类与映射xml文件

Spring整合MyBatis使用到了mybatis-spring,在配置mybatis映射文件的时候,一般会使用MapperScannerConfigurer,MapperScannerConfigurer会自动扫描basePackage指定的包,找到映射接口类和映射XML文件,并进行注入.配置如下: [html] view plain copy <!-- 数据源 --> <bean id="dataSource" class="com.mchange.v

类,抽象基类,接口类三者间的区别与联系(C++)

联系很明显,三个都是‘类’,如果读者对类的概念不清楚,可以参照wid的博文http://www.cnblogs.com/mr-wid/archive/2013/02/18/2916309.html. 下面着重解释一下区别,但此文仅是个人理解,如果觉得我说的不对的地方,还请赐教. (1)结构上的区别: 普通类:数据+方法+实现 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现 接口类:方法(纯虚方法) (2)概念上的区别: 普通的类和另外两个的区别很明显,普通类就是猫狗之类的,而抽象类

常用设备接口类GUID

转载:http://blog.csdn.net/jhqin/article/details/6775321 注意:在VC中使用这些常量名称时,除了包含相应的头文件外,还需要预先包含initguid.h头文件.即: [cpp] view plaincopy #include <initguid.h> 常用设备接口类GUID Identifier Class GUID Header GUID_DEVINTERFACE_USB_DEVICE {A5DCBF10-6530-11D2-901F-00C0