写一个类继承Servlet,实现init、service等方法后,当tomcat收到一个http请求后,会根据web.xml获取都对应类后,便会自动调用init、service等方法。原理就是Tomcat获取到类的名称后,通过java的反射机制来自动调用servlet的init、service等方法。
下面编写一个程序来模拟Tomcat通过Java的反射机制,自动调用方法的过程
1. 首先在代码路径下添加web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>atest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>com.test.servelet.SimServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/thisatest</url-pattern>
</servlet-mapping>
</web-app>
2. 编写一个接口Iservlet,定义方法init、service
public interface Iservlet {
public void init();
public void service();
}
3. 编写一个类继承Iservlet
public class SimServlet implements Iservlet {
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("init");
}
@Override
public void service() {
// TODO Auto-generated method stub
System.out.println("service");
}
}
4. 编写一个类模拟tomcat自动调用servlet的init、service方法的过程
public class Test2 {
public static void main(String[] args) {
//1. 加载web.xml
SAXReader reader = new SAXReader();
Document doc = reader.read("src/web.xml");
Element rootElement = doc.getRootElements();
List<Element> list = rootElement.elements("servlet");
for(Element servEle : list) {
Element classEle = servEle.element("servlet-class");
System.out.println(classEle.getText());
//2. 根据类名可以创建字节码
Class clazz = Class.forName(classEle.getText());
Object obj = clazz.newInstance();
//3. 调用方法
Method mInit = clazz.getMethod("init");
mInit.invoke(obj);
Method mService = clazz.getMethod("service");
mService.invoke(obj);
}
}
}