Servlet学习笔记

一,Servlet在web应用程序中的位置:

 二,基本工作流程:

  1. 客户机将请求发送到服务器;
  2. 服务器上的Web容器实例化(装入)Servlet;
  3. Web容器将请求信息发送到Servlet;
  4. Servlet创建一个响应,并将其返回到Web容器;
  5. web容器将响应发回客户机;
  6. 服务器官必或Servlet空闲时间超过一定限度时,调用destory()方法退出。

 三,主要功能:

  • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
  • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
  • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
  • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
  • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。

就像是一个浏览器(客户端)和服务器的一个小助手,服务器收到客户机的请求后,web容器召唤来Servlet并把请求信息交给它:“小老弟,接下来看你的了!”Servlet这个小助手立马就创建了一个响应然后去找Web容器:“顺利完成任务,这是响应结果!”,“做得很棒,这可是你的专长啊”随后Web容器将响应发回客户机;(客户机与Servlet间没有直接的交互。无论客户机对Servlet的请求还是Servlet对客户端的响应,都是通过Web服务器来实现的,这使得Servlet的可移植性大大提高

四,与Applet和JSP比较

 与Applet比较:

  • 相同之处:(1)它们不是独立的应用程序,没有main()方法;       

                                   (2)它们不是由用户调用,而是由另外一个应用程序(容器)调用;

                          (3)它们都有一个生存周期,包含init()和destroy()方法;

  • 不同之处:

                          (1)Applet运行在客户端,具有丰富的图形界面;

                          (2)Servlet运行在服务器端,没有图形界面;

与JSP比较:

 JSP转译后的.java文件与Servlet的处理方式一样;Servlet是JSP技术的基础

(1)JSP使人们把显示和逻辑分隔成为可能,这意味着显示和逻辑开发可以并行进行;而Servlet并没有将输出HTML代码和逻辑处理分离开

(2)JSP是HTML与Java代码结合的嵌套型语言;而Servlet是纯Java;

所以在设计应用界面时,很难充分利用Web页面开发工具,如果这种工具用于开发Web页面布局,所生成的HTML就必须手工嵌入到Servlet代码中;

 五,开发Servlet的三种方法:

1,实现Servlet接口:

 //Servlet的生命周期:从Servlet被创建到Servlet被销毁的过程
//一次创建,到处服务
//一个Servlet只会有一个对象,服务所有的请求
/*
 * 1.实例化(使用构造方法创建对象)
 * 2.初始化  执行init方法
 * 3.服务     执行service方法
 * 4.销毁    执行destroy方法
 */
public class ServletDemo1 implements Servlet {

    //public ServletDemo1(){}

     //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
    public void init(ServletConfig arg0) throws ServletException {
//TODO:Add your code here
System.out.println(
"=======init========="); } //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法 //这个函数用于处理业务逻辑,程序员应把业务逻辑代码写在这里 //request:用于获得客户端(浏览器)的信息 //response:用于向客户端(浏览器)返回信息 public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { //TODO:Add your code here System.out.println("service it"); PrintWriter pw=response.getWriteer(); pw.println("hellow world"); } //生命周期方法:当Servlet被销毁时执行该方法(释放内存) public void destroy() { System.out.println("******destroy**********"); } //当停止tomcat时也就销毁的servlet。 public ServletConfig getServletConfig() { return null; } //包含关于Servlet的信息,如作者,创建日期,描述等 public String getServletInfo() { return null; } }

 生命周期图解:

 

2,继承GenericServlet

扩展了GenericServlet类的Servlet,最常用于构建网络应用程序,这些应用程序使用定制协议或其他非HTTP协议,如FTP,POP3协议等

1 public class ServletDemo2 extends GenericServlet {
2 
3     @Override
4     public void service(ServletRequest arg0, ServletResponse arg1)
5             throws ServletException, IOException {
6         System.out.println("BOOGIE");
7 
8     }
9 }

3,继承HttpServlet

一般不覆盖Service()方法,在这种情况下,默认的service()方法将自动调用另一个方法来响应客户的请求;

扩展了Httpservlet类的servlet,它用于构建web应用程序;Httpservlet类扩展了GenericServleet,因此继承了它所有的功能,主要用于生成处理基于Http的连接要求;

 1 public class ServletDemo3 extends HttpServlet {
 2 
 3     @Override
 4     protected void doGet(HttpServletRequest req, HttpServletResponse resp)
 5             throws ServletException, IOException {
 6         System.out.println("ISEE");
 7     }
 8 
 9     @Override
10     protected void doPost(HttpServletRequest req, HttpServletResponse resp)
11             throws ServletException, IOException {
12         System.out.println("up");
13         doGet(req,resp);
14     }
15 
16 }

总结:

  • 所有的Servlet必需直接或间接的实现javax.servlet.Servlet接口
  • 如果编写的Servlet程序与HTTP协议无关,那么必须继承GenericServlet类;若有关,必须继承HttpServlet类;
  • 在创建支持HTTP协议的Servlet类的时候,我们必须扩展javax.servlet.HttpServlet类。

 

原文地址:https://www.cnblogs.com/boogie-xy/p/11516319.html