Servlet的实例 实现思路是:
定义一个解析XML的Servlet功能实例
主要是实现Servlet中的基本功能
1 首先是建立一个Servlet接口 定义三个功能 主要是定义 init() service() destory() 功能
package com.itheima.servletdemo;
/*
* 这个是一个模拟servlet接口
*
**/
public interface Servlet {
void init();
void service();
void destory();
}
2 其次建立一个ServletOne实例
用于实现Serlet接口中的抽象方法
package com.itheima.servletdemo.servlet;
import com.itheima.servletdemo.Servlet;
public class ServletOne implements Servlet{
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("Servlet:inti");
}
@Override
public void service() {
// TODO Auto-generated method stub
System.out.println("Servlet:service");
}
@Override
public void destory() {
// TODO Auto-generated method stub
System.out.println("Servlet:destory");
}
}
定义另外一个实例 servletTow
package com.itheima.servletdemo.servlet;
import com.itheima.servletdemo.Servlet;
public class ServletTow implements Servlet {
@Override
public void init() {
// TODO Auto-generated method stub
System.out.println("ServletTow.init()");
}
@Override
public void service() {
// TODO Auto-generated method stub
System.out.println("ServletTow.service()");
}
@Override
public void destory() {
// TODO Auto-generated method stub
System.out.println("ServletTow.destory()");
}
}
3 写一个用于配置servlet的XML文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<wab-app>
<servlet>
<servlet-name>Server1</servlet-name>
<servlet-class>com.itheima.servletdemo.servlet.ServletOne</servlet-class>
</servlet>
<servlet>
<servlet-name>Server2</servlet-name>
<servlet-class>com.itheima.servletdemo.servlet.ServletTow</servlet-class>
</servlet>
</wab-app>
4 由于对XML的解析需要用到DOM4J技术 所以我们建立lib文件夹 用于导入dom4j-1.6.1.jar包 然后通过导入到类中
5 建立一个main类接口
其中为了简便 我们将对xml的解析和对函数的调用直接定义到main主函数中
package com.itheima.servletdemo;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class MainClass {
public static <SAReader> void main(String[] args) throws Exception {
// 解析web.xml xml文件 从文件中 读取servlet-class
// 1.获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("web.xml"));
// 2 获得根元素对象
Element rootElement = document.getRootElement();
// 3 获得所有的servlet元素
List elements = rootElement.elements();
// 遍历servlet元素集合
for (int i = 0; i < elements.size(); i++) {
Element servletElement = (Element) elements.get(i);// 获得所有的element并将获得的element强转Element类
// 获取servlet元素中的所有的子元素合集
List childElement = servletElement.elements();
// 获得每一个子元素 如servlet name 、servlet class
for (int j = 0; j < childElement.size(); j++) {
Element child = (Element) childElement.get(j);
//System.out.println(child);
// 做一个判断 如果字元素是我们想要的那么就运行className
if ("servlet-class".equals(child.getName())){
String className = child.getText();
//System.out.println(className);
runServlet(className);
}
}
}
}
private static void runServlet(String className) throws Exception {
// 采用反射的方式获取Servlet类 并执行serlet中方法
@SuppressWarnings("unchecked")
Class<Servlet> clazz = (Class<Servlet>) Class.forName(className);
Servlet servlet = clazz.newInstance();/*
* ////字节码文件.newInstance
* 可以直接new出调用的字节码对象从而直接使用字节码对象中的方法和实例
*
* 可以调用获得的方法时要用到上面相同类型的实例对象
*
* 通过Class类中的newInstance()方法也可创建类的实例,
* 其内部工作原理是先得无参的构造方法,再用构造方法创建实例对象。
*/
// 下面的方法 会在合适的时候去执行
//System.out.println(servlet);
servlet.init();
servlet.service();
servlet.destory();
}
}
运行结果如下:
ServletOne---:---inti
ServletOne---:---service
ServletOne---:---destory
ServletTow.init()
ServletTow.service()
ServletTow.destory()