Servlet:模拟Servlet本质

!!! note 目录

Servlet:模拟Servlet本质

一、模拟Servlet的代码

  • 充当SUN公司的角色,制定Servlet规范

    • javax.servlet.Servlet接口

      1
      2
      3
      4
      5
      6
      7
      8
      9
      package javax.servlet;
      /*
      我们现在充当的角色是SUN公司。
      SUN公司把Servlet接口/规范制定出来了。
      */
      public interface Servlet{
      // 一个专门提供服务的方法
      void service();
      }
  • 充当Tomcat服务器的开发者

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    package org.apache;

    import java.util.Scanner;
    import java.util.Properties;
    import java.io.FileReader;
    import javax.servlet.Servlet;

    // 充当Tomcat服务器的开发者
    public class Tomcat {
    public static void main(String[] args) throws Exception {
    System.out.println("Tomcat服务器启动成功,开始接收用户的访问。");

    /* 简单的使用Scanner来模拟一下用户的请求
    用户访问服务器是通过浏览器上的“请求路径”
    也就是说用户请求路径不同,后台执行的Servlet不同。

    /userList UserListServlet
    /login UserLoginServlet
    /bank BankServlet
    ......*/

    System.out.print("请输入您的访问路径:");
    Scanner s = new Scanner(System.in);

    // 用户的请求路径 /bbbb
    String key = s.nextLine(); // Tomcat服务器已经获取到了用户的请求路径了。

    // Tomcat服务器应该通过用户的请求路径找对应的XXXServlet
    // 请求路径和XXXServlet之间的关系应该由谁指定呢?
    // 对于Tomcat服务器来说需要解析配置文件
    FileReader reader = new FileReader("web.properties");
    Properties pro = new Properties();
    pro.load(reader);
    reader.close();

    // 通过key获取value
    String className = pro.getProperty(key);
    // 通过反射机制创建对象
    Class clazz = Class.forName(className);
    Object obj = clazz.newInstance(); // obj的类型对于Tomcat服务器开发人员来说不知道。

    // 但是Tomcat服务器的开发者知道,你写的XXXXServlet一定实现了Servlet接口
    Servlet servlet = (Servlet)obj;
    servlet.service();
    }
    }
  • 配置文件

    1
    2
    3
    /aaaa=com.bjpowernode.servlet.UserListServlet
    /bbbb=com.bjpowernode.servlet.UserLoginServlet
    /cccc=com.bjpowernode.servlet.BankServlet
  • 充当Webapp的开发者

    • BankServlet implements Servlet

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      package com.bjpowernode.servlet;

      import javax.servlet.Servlet;

      // 充当的角色发生了改变:webapp开发者
      // 只要是我们webapp开发者写的XXXServlet都要实现Servlet接口
      public class BankServlet implements Servlet {
      public void service() {
      System.out.println("BankServlet's service...");
      }
      }
    • UserListServlet implements Servlet

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      package com.bjpowernode.servlet;

      import javax.servlet.Servlet;

      // 充当的角色发生了改变:webapp开发者
      public class UserListServlet implements Servlet {
      public void service() {
      System.out.println("UserListServlet's service...");
      }
      }
    • UserLoginServlet implements Servlet

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      package com.bjpowernode.servlet;

      import javax.servlet.Servlet;

      // 充当的角色发生了改变:webapp开发者
      public class UserLoginServlet implements Servlet {
      public void service() {
      System.out.println("UserLoginServlet's service...");
      }
      }

二、分析Servlet本质

  • 对于Java Web程序员来说,只需要做两件事:
    1. 编写一个类实现Servlet接口。
    2. 将编写的类配置到配置文件中,在配置文件中:指定请求路径和类名的关系。

注意:

  • 配置文件的文件名是固定的。
  • 配置文件的存放路径是固定的。
  • 文件名、文件路径都是SUN公司制定的Servlet规范中的明细。
  • 严格意义上来说Servlet其实并不是简单的一个接口,Servlet规范中规定了:
    1. 一个合格的webapp应该是一个怎样的目录结构。
    2. 一个合格的webapp应该有一个怎样的配置文件。
    3. 一个合格的webapp配置文件路径放在哪里。
    4. 一个合格的webapp中java程序放在哪里。

Tomcat服务器要遵循Servlet规范。Java Web程序员也要遵循这个Servlet规范。这样Tomcat服务器和webapp才能解耦合。