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 }
时间: 2024-10-13 16:16:47