Servlet学习总结-2

综述:

1.什么是Servlet?

    1)Servlet就是Java类;

    2)Servlet是一个继承HttpServlet类的类;

    3)Servlet在服务器端运行,用以处理客户端的请求;

2.Servlet相关包的介绍:

Servlet是实现javax.servlet.Servlet接口的对象。大多数Servlet通过从GenericServlet或HttpServlet类进行扩展来实现。Servlet API包含于两个包中,即javax.servlet和javax.servlet.http。下边我们分别来介绍。




    1)javax.servlet.*:存放与HTTP协议无关的一般性Servlet类;

    2)javax.servlet.http.*:除了继承javax.servlet.*之外,并且还增加与HTTP协议有关的功能;

    3)HttpServlet:提供了一个抽象类用来创建Http Servlet

           public void doGet()方法:用来处理客户端发出的GET请求;

           public void doPost()方法:用来处理客户端发出的POST请求;

     还有几个方法大家自己去查阅API帮助文件

    4)javax.servlet包的接口:

        ServletConfig接口:在初始化的过程中由Servlet容器使用;

        ServletContext接口:定义Servlet用于获取来自其容器的信息的方法;

        ServletRequest接口:向服务器请求信息;

        ServletResponse接口:响应客户端请求;

        Filter接口:

     5)javax.servlet包的类:

        ServletInputStream类:用于从客户端读取二进制数据;

        ServletOutputStream类:用于将二进制数据发送到客户端;

     6)javax.servlet.http包的接口:

           HttpServletRequest接口:提供Http请求信息;

           HttpServletResponse接口:提供Http响应;

     注:所有的Servlet都必须实现javax.servlet.Servlet接口(Interface).

           若Servlet程序和Http协议无关,那么必须继承javax.servlet.GenericServlet类;

           若Servlet程序和Http协议有关,那么必须继承javax.servlet.HttpServlet类;

3. Servlet生命周期
Servlet生命周期就是指创建Servlet实例后,存在的时间以及何时销毁的整个过程.
Servlet生命周期有三个方法:
    1)init()方法
    2)service()方法:Dispatches client requests to the protected service method 
    3)destroy()方法:Called by the servlet container to indicate to a servlet that the servlet is being taken out of service.
Servlet生命周期的各个阶段:
    1).实例化:Servlet容器创建Servlet实例
    2).初始化:调用init()方法
    3).服务:如果有请求,调用service()方法
    4).销毁:销毁实例前调用destroy()方法
    5).垃圾收集:销毁实例

Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过
javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。     Servlet的生命周期包含了下面4个阶段: 
 加载和实例化 
    Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。 
 初始化 
    在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。这样servlet的实例就可以把与容器相关的配置数据保存起来供以后使用,在初始化期间,如果发生错误,Servlet实例可以抛出ServletException异常,一旦抛出该异常,servlet就不再执行,而随后对它的调用会导致容器对它重新载入并再次运行此方法。 
 请求处理 
    Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。对于HttpServlet类,该方法作为HTTP请求的分发器,这个方法在任何时候都不能被重载。当请求到来时,service()方法决定请求的类型(GET、POST、HEAD、OPTIONS、DELETE、PUT、TRACE),并把请求分发给相应的处理方法(doGet()、doPost()、doHead()、doOptions()、doDelete()、doPut()、doTrace())每个do方法具有和第一个service()相同的形式。我们常用的就是doGet()和doPost()方法,为了响应特定类型的HTTP请求,我们必须重载相应的do方法。如果Servlet收到一个HTTP请求而你没有重载相应的do方法,它就返回一个说明此方法对本资源不可用的标准HTTP错误。 
 服务终止 
    当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。 在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。

 HTTP协议定义了GET和POST两种请求方法,POST方法对请求发送的数据量没有限制。 
 Servlet允许用户在服务器上运行Java代码和生成动态内容。 
 Servlet运行于Servlet容器中。 
 扩展HttpServlet类的Servlet必须覆盖如下至少一个方法:doGet、soPost、doPut、doDelete、init、destroy和getServletInfo。 
 Servlet声明周期包含三种方法:init()、service()和destroy()。 
 Servlet API包含在两个包中,javax.servlet和javax.servlet.http。 
 通过从GenericServlet类或HttpServlet类扩展,可以编写Servlet。

4.Servlet的基本结构:
package com.fly.servlet;

//下面是导入相应的包
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;

/**
* This is a Servlet Demo
* @author sunlovefly
*/
public class ServletDemo extends HttpServlet {   
    //初始化
   public void init() throws ServletException {
    System.out.println("我是init()方法!用来进行初始化工作");
   }

  //用于处理客户端发送的GET请求   
  public void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
	//这条语句指明了向客户端发送的内容格式和采用的字符编码
    response.setContentType("text/html;charset=UTF-8");
	PrintWriter out = response.getWriter();
    out.println(" 您好!");//利用PrintWriter对象的方法将数据发送给客户端
    out.close();
  }

  //用于处理客户端发送的POST请求
  public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
	//这条语句的作用是,当客户端发送POST请求时,调用doGet()方法进行处理
    doGet(request, response);
  }

    //销毁实例
   public void destroy() {
     super.destroy();
     System.out.println("我是destroy()方法!用来进行销毁实例的工作");
   }
}
web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
   xmlns="http://java.sun.com/xml/ns/j2ee" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <servlet>
    <servlet-name>ServletDemo</servlet-name>
    <servlet-class>com.fly.servlet.ServletDemo</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>ServletDemo</servlet-name>
    <url-pattern>/servlet/ServletDemo</url-pattern>
  </servlet-mapping>

</web-app>
①上面的两个<servlet-name>必须相同
②<servlet-class>后面指在对应的类上面,你可以直接在你的servlet类中复制过来,这样可以避免出错!
③<url-pattern>

阅读:
自427年1月Sun Microsystems公司所组成的JavaSoft部门将Servlet API定案以来,推出了Servlet API1.0,就当时功能来说,Servlet所提供的功能包含了当时的CGI与Netscape Server API(NSAPI)之类产品的功能。发展至今,它依旧是一个具有跨平台特性、10% Pure Java的Server-Side程序,Servlet不只限定于HTTP协议,开发人员可以利用Servlet自定义或延伸任何支持Java的Server,包括Web Server、Mail Server、Ftp Server、Application Server或任何自定义的Server。     Server有以下优点: 
    可移植性,Servlet皆是利用Java语言来开发的,因此,延续Java在跨平台上的表现,不论Server的操作系统是什么,Windows、Linux、Solaris、HP-UX等,都能够将我们写好的Servlet程序放在这些操作系统上执行,借助Servlet的优势,就可以真正达到Write Once,Serve Anywhere的境界。Servlet是在Server端执行的,所以,程序员只要专心开发能在实际应用的平台环境下测试无误即可。除非从事做Servlet Container的公司,否则不须担心写出来的Servlet是否能在所有的Java Server平台上执行。 
    强大的功能,Servlet能够完全发挥Java API的威力,包括网络和URL存取、多线程、影像处理、RMI(Remote Method Invocation)、分布式服务器组件、对象序列化等。若想写个网络目录查询程序,则可以利用JNDI API,相连接数据库可以用JDBC,偶这些强大功能的API做后盾,相信Servlet更能发挥其优势。 
    性能,Servlet在加载执行后,其对象实体通常会一直停留在Server的内存中,若有请求发生时,服务器再调用Servlet来服务,假若收到相同服务的请求时,Servlet会利用不同的线程来处理,不像CGI程序必须产生许多进程来处理数据。在性能表现上,大大超过CGI程序。Servlet在执行时,不是一直停留在内存中,服务器会自动将停留时间过长一直没有执行的Servlet从内存中移除,不过有时候也可以自行写程序来控制,至于停留时间长短通常和选用的服务器有关。 
    安全性,Servlet也有类型检查的特性,并且利用Java的垃圾回收与没有指针的设计,使得Servlet避免内存管理的问题。由于在Java的异常处理机制下,Servlet能够安全地处理各种错误,不会因为发生程序上逻辑错误而导致整体服务器系统的崩溃。例如,某个Servlet发生除以零或其他不合法的运算时,会抛出一个异常让服务器处理,如记录在Log日志中。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值