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

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

CSS控制XML与通过js解析xml然后通过html显示xml中的数据

使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} price{ display:block;colo book.xml <?xml version="1.0" encoding="GB2312" ?> <?xml-stylesheet type="text/css" href=&qu

java xml处理技术一(解析xml和生存xml的技术)

java xml处理技术一 XML 技术是随着 Java 的发展而发展起来的.在 XML 出现之前对于简单的数据格式通常是存储在 ini 配置文件等文本文件中,复杂的格式则采用自定义的文件格式,因此对于每种文件格式都要有专门的解析程序. XML 出现以后解决了这个问题,程序面对的是有固定格式的 XML 文件,只要通过标准 API 就可以进行 XML 文件的处理. XML 文件在案例系统中应用是很广泛的,比如 ClientConfig.xml . ServerConfig.xml 文件就是使用 X

XML引入,DOM 方式解析XML 原理,SAX 方式解析XML

XML 简介 Xml(eXtensible Markup Language) 即可扩展标记语言.提供了一套跨平台.跨网络.跨程序的语言的数据描述方式,使用XML 可以方便地实现数据交换.系统配置.内容管理等常见功能. 元素VS 节点 节点包括元素节点.属性节点.文本节点:元素一定是节点,但是节点不一定是元素: <?xml version="1.0" encoding="UTF-8"?> <emp> <empName empNo=&quo

java中的xml简介与DOM解析xml

1. xml简介 XML:指可扩展标记语言, Extensible Markup Language:类似HTML.XML的设计宗旨是传输数据,而非显示数据. 一个xml文档实例: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <company name="Tencent" address="深圳市南山区"> 3 <department deptNo=&quo

Java xml 操作(Dom4J修改xml &#160;&#160;+ xPath技术 &#160;+ SAX解析 + XML约束)

1 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空格,区分大小写.有且仅有一个根标签. 属性: 可有多个属性,但属性值必须用引号(单引号或双引号)包含,但不能省略,也不能单 双混用. 文档声明: <?xml version="1.0" encoding="utf-8"?> encoding="utf-8&q

XML专题:使用NSXMLParser解析xml文件

使用NSXMLParser解析xml文件 1. 设置委托对象,开始解析     NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做:     // It's also possible to have NSXMLParser download the data, by passing it a URL, but this

iOS学习 - 21 系统自带解析 XML

准备工作: new -> file -> other -> Empty ,在 Save As: 中随便起个名字后缀为 .xml 拷贝下面 <person> <student> <pid>1001</pid> <name>小明</name> <sex>男</sex> <age>12</age> </student> </person> 完整代码 /

dom4j解析Xml,dom4j解析带命名空间的Xml内容,dom4j解析xml为实体类

首先引入maven: <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version> </dependency> <dependency> <groupId>jaxen</groupId> <artifactId>jaxen</arti

xml简介和dom4j解析xml重要方法

1.xml(可扩展标记语言)的概述 与html的区别: xml: 描述数据,用于存储和传输数据.标签都是自定义的 html:显示数据,标签都是预定义的 注意事项: 文档声明必须在第一行 只有一个根标签 元素只能包裹嵌套,不能交叉嵌套 注释不能嵌套 标签命名规则:字母.数字.下划线.减号.英文句点组成,严格区分大小写 属性值要用单引号或双引号 2.约束文档 1.DTD(Document tyte definition)--->约束xml的书写规范 a DTD文件的书写 <?xml version