• 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 }
  • 相关阅读:
    递增一个指针
    ubuntu 系统 sudo apt-get update遇到问题sub-process returned an error code
    熟悉HDFS过程中遇到的问题
    大二暑假第八周进度报告
    大二暑假第七周进度报告
    oracle“ORA-00904”错误:标识符无效
    大学暑假第六周进度报告
    大二暑假第五周进度报告
    使用Navicat for Oracle新建表空间、用户及权限赋予
    大学暑假第四周进度报告
  • 原文地址:https://www.cnblogs.com/guodong-wang/p/7295971.html
Copyright © 2020-2023  润新知