-
需要知识
- 配置文件
- 流
- 反射机制
-
创建三个角色
- TomCat —— TomCat 类
- Servlet ——ServLet接口
- Web应用程序 ——BankServiceWebApp 类
- 程序员设置的配置文件——web.properties
-
ServLet接口
package javaWeb;
/**
* 模拟sun公司
* 拟定servlet接口/规范
*/
public interface ServLet {
//提供服务的方法
void service();
}
- BankServiceWebApp 类
package javaWeb;
public class BankServiceWebApp implements ServLet {
@Override
public void service(){
System.out.println("BankService's service ");
}
}
- web.properties配置文件
bank=javaWeb.BankServiceWebApp
list=src.javaWeb.UserListWebApp
- TomCat类
package javaWeb;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Properties;
import java.util.Scanner;
/**
* 充当Tomcat的开发者
*/
public class TomCat {
public static void main(String[] args) throws Exception {
System.out.println("TomCat服务器启动,接收用户访问!");
/**
* 用户访问服务器的webapp,是提供不同的请求路径
* 用户的请求路径不同,后台执行的servlet不同
*
* 现在利用键盘输入模拟用户传输的请求
* 用户输入 启动程序
* bank BankServiceWebApp
* list UserListWebApp
*/
System.out.println("请输入访问路径");
Scanner s =new Scanner(System.in);
//获取用户的请求路径 银行业务 用户列表
String key =s.nextLine();
/**
* 将用户输入的请求路径 和 webApp程序做桥梁衔接
* 即:当用户输入"bank" 时,服务器是如何知道启动BankServiceWebApp
* 而不是其他的程序
* 解决方法:
* web程序员会将用户输入和web程序做一个衔接,
* 这个衔接模拟以属性配置文件、Map集合的形式存在的。
*/
FileReader reader = new FileReader("src/javaWeb/web.properties");
Properties pro = new Properties();
pro.load(reader);
//关闭流
reader.close();
//通过key获取value 用户列表对应的value是src\javaWeb\UserListWebApp.java
String className = pro.getProperty(key);
System.out.println("用户对应加载的应用名——"+className);
/**
* 获取类名之后,利用反射机制运行字节码文件,创建对象
* Class.forName方法执行的时候,会导致类加载。类加载时静态代码块会执行
*/
Class c= Class.forName(className);
/**
* 创建对象,利用创建的对象执行方法
* 此时创建的对象类型对于TomCat的开发人员是不知道的
* 为了统一类型,所有的webApp实现了Servlet接口
* 这样,TomCat的开发人员就知道任何webapp都实现了servlet接口
*/
Object obj = c.newInstance();
ServLet servlet = (ServLet) obj;
servlet.service();
}
}