-----------------------------------------------------------------------------仅仅用来学习------------------------------------------------------------------------------------
模拟servlet 的运行原理
* 1、写一个主程序Engine,启动以后,读取配置文件web.xml,找到文件中的所有的servlet类的全名
* 2、获得servlet的实例对象* 3、执行对象中相应的方法
项目结构:
代码部分:
Engine.java类
主程序类,用来读取配置文件,利用反射构建对象并执行里面的方法
package com.itheima.xmldemo;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Engine {
public static void main(String[] args) throws Exception {
//读取配置文件获得类的全名
SAXReader reader = new SAXReader();
Document document = reader.read(new File("web.xml"));
Element rootElement = document.getRootElement();
List<Element> servletList = rootElement.elements();
for (int i = 0; i <servletList.size(); i++) {
Element servletElement = servletList.get(i);
List<Element> childElements = servletElement.elements();
for (int j = 0; j < childElements.size(); j++) {
Element childElement = childElements.get(j);
//判断 是否是servlet-calss元素
if("servlet-class".equals(childElement.getName())){
String classname = childElement.getText();
System.out.println(classname);
runSerlvet(classname);
}
}
}
}
/**
* 运行指定名称的servlet
* @param classname 类的全名
* @throws Exception
*/
private static void runSerlvet(String classname) throws Exception {
//根据类的全名获得字节码
Class<Servlet> clazz = (Class<Servlet>) Class.forName(classname);
//由字节码,获得实例对象
Servlet servlet = clazz.newInstance();
//在适当的时候运行
servlet.init();
servlet.service();
servlet.destory();
}
}
Servlet.java类
接口,提供规范,写到配置文件中的类必须实现该接口
package com.itheima.xmldemo;
/**
*
* 模拟servlet 的运行原理
* 1、写一个主程序Engine,启动以后,读取配置文件web.xml,找到文件中的所有的servlet类的全名
* 2、获得servlet的实例对象,
* 3、执行对象中相应的方法
*
* @author leo
*
*/
public interface Servlet {
public void init();
public void service();
public void destory();
}
ServletOne.java类
继承了Servlet接口的具体类
package com.itheima.xmldemo.servlet;
import com.itheima.xmldemo.Servlet;
public class ServletOne implements Servlet{
@Override
public void init() {
System.out.println("ServletOne.init()");
}
@Override
public void service() {
System.out.println("ServletOne.service()");
}
@Override
public void destory() {
System.out.println("ServletOne.destory()");
}
}
ServletTwo.java类
实现了Servlet接口的类
package com.itheima.xmldemo.servlet;
import com.itheima.xmldemo.Servlet;
public class ServletTwo implements Servlet{
@Override
public void init() {
System.out.println("ServletTwo.init()");
}
@Override
public void service() {
System.out.println("ServletTwo.service()");
}
@Override
public void destory() {
System.out.println("ServletTwo.destory()");
}
}
如果要实现第三个Servlet实例,只需要实现Servlet接口并添加到配置文件中即可