JavaWeb的学习--XML&反射案例:通过解析xml,模拟浏览器路径访问servlet

 1. 案例分析

          通过解析xml,模拟浏览器路径访问servlet,我们希望用户访问的路径是/servlet1,将执行com.java.web.servlet01.MyServlet01程序,如果访问      的路径是/servlet2,将执行com.java.web.servlet01.MyServlet02程序。

          在执行测试程序前(@before),解析xml文件,将解析的结果存放在Map集合中,map中的数据的格式为 路径=实现类。

      

         解析xml的思路:先解析<servlet>,将结果存放map,name=class,然后再解析<servlet-mapping>,通过name获得class,再将url=class存放到map,最后将name=class移除。、

     代码实现:   

package com.java.web.servlet01;
/**
 * 定义servlet接口
 * 定义三个方法
 * @author vanguard
 *
 */
public interface IMyServlet {
    //初始化
    public abstract void init();
    //执行
    public abstract void service();
    //销毁
    public abstract void destory();
}
ackage com.java.web.servlet01;

public class MyServlet01 implements IMyServlet {

    @Override
    public void init() {
        System.out.println("MyServlet01初始化");
    }

    @Override
    public void service() {
        System.out.println("MyServlet01服务中");
    }

    @Override
    public void destory() {
        System.out.println("MyServlet01销毁了");
    }
    
}
package com.java.web.servlet01;

public class MyServlet02 implements IMyServlet {

    @Override
    public void init() {
        System.out.println("MyServlet02初始化");
    }

    @Override
    public void service() {
        System.out.println("MyServlet02服务中");
    }

    @Override
    public void destory() {
        System.out.println("MyServlet02销毁了");
    }
    
}
 1 /**
 2  * 模拟浏览器路径
 3  * @author vanguard
 4  *
 5  */
 6 public class TestServlet02 {
 7     //定义map集合存放解析的结果
 8     Map<String, String> data = new HashMap<String, String>();
 9     
10     /**
11      * 测试程序前解析xml文件
12      */
13     @Before
14     public void readXML() {
15         try {
16             //1. 创建解析器
17             SAXReader saxReader = new SAXReader();
18             //2. 读取xml文件
19             Document document = saxReader.read("src/com/java/web/servlet01/web.xml");
20             //3. 获取根元素
21             Element rootElement = document.getRootElement();
22             //4. 获取根元素下的所有子元素
23             List<Element> elements = rootElement.elements();
24             //5. 遍历子元素集合
25             for(Element element : elements) {
26                 String eleName = element.getName();
27                 //6. 如果是servlet元素
28                 if("servlet".equals(eleName)) {
29                     //7. 获取servlet-name元素下的内容
30                     String servletName = element.element("servlet-name").getText();
31                     //8. 获取servlet-class元素下的内容
32                     String servletClass = element.element("servlet-class").getText();
33                     //9. 将获取到的内容以 servletName为key,servletClass为value添加到map集合中
34                     data.put(servletName, servletClass);
35                 }
36                 //10. 如果是servlet-mapping元素
37                 if("servlet-mapping".equals(eleName)) {
38                     //11. 获取servlet-name元素下的内容
39                     String servletName = element.element("servlet-name").getText();
40                     //12. 获取url-pattern元素下的内容
41                     String url = element.element("url-pattern").getText();
42                     //13. 根据servlet-name获取map集合中对应的servletClass,
43                     //并将之前存放的此数据移除
44                     String servletClass = data.remove(servletName);
45                     //14. 以url为key,servletClass为value添加到map集合中
46                     data.put(url, servletClass);
47                 }
48             }
49         } catch (DocumentException e) {
50             
51             e.printStackTrace();
52         }
53     }
54     
55     @Test
56     public void testMyServlet() {
57         //1. 定义url路径
58         String url = "/myServlet02";
59         //2. 根据路径,从map集合中获取完整类名
60         String servletClass = data.get(url);
61         try {
62             //3. 反射获取字节码文件
63             Class clzz = Class.forName(servletClass);
64             //4. 创建对象
65             Object obj = clzz.newInstance();
66             //5. 获取三个方法并执行
67             Method init = clzz.getMethod("init");
68             init.invoke(obj);
69             Method service = clzz.getMethod("service");
70             service.invoke(obj);
71             Method destory = clzz.getMethod("destory");
72             destory.invoke(obj);
73         } catch (Exception e) {
74             
75             e.printStackTrace();
76         }
77     }
78 }
原文地址:https://www.cnblogs.com/guodong-wang/p/7295971.html