天天看點

JavaWeb的學習--XML&反射案例:通過解析xml,模拟浏覽器路徑通路servlet

 1. 案例分析

          通過解析xml,模拟浏覽器路徑通路servlet,我們希望使用者通路的路徑是/servlet1,将執行com.java.web.servlet01.MyServlet01程式,如果通路      的路徑是/servlet2,将執行com.java.web.servlet01.MyServlet02程式。

          在執行測試程式前(@before),解析xml檔案,将解析的結果存放在Map集合中,map中的資料的格式為 路徑=實作類。

JavaWeb的學習--XML&反射案例:通過解析xml,模拟浏覽器路徑通路servlet

         解析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