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