(八)——WebHandler

  1 package my.tomcat2;
  2 
  3 import org.xml.sax.Attributes;
  4 import org.xml.sax.SAXException;
  5 import org.xml.sax.helpers.DefaultHandler;
  6 
  7 import javax.xml.parsers.ParserConfigurationException;
  8 import javax.xml.parsers.SAXParser;
  9 import javax.xml.parsers.SAXParserFactory;
 10 import java.io.IOException;
 11 import java.util.ArrayList;
 12 import java.util.List;
 13 
 14 /**
 15  * 在解析一个node节点结束标签(例如</name>)时,会触发endElement和characters方法,要在endElement方法内,将currentTag = null .
 16  * 这里是 解析xml 文档所需的一个 处理器,这里不懂的同学可以学习一下 Java 如何解析 xml
 17  */
 18 public class WebHandler extends DefaultHandler {
 19     //这是用来,存放 web.xml 中<servlet></servlet>里的信息的,因为多条信息,所以将其存入 List 中
 20     private List<Entity> entities;
 21     //这是用来,存放 web.xml 中<servlet>...</servlet>里的信息的
 22     private Entity entity;
 23     //这里用来,存放 web.xml 中<servlet-mapping>...</servlet-mapping>里的信息的
 24     private Mapping mapping;
 25     //同理
 26     private List<Mapping> mappings;
 27     //这个是用来在  public void characters(char[] ch, int start, int length),执行这个方法的时候,需要知道他的标签值,因为我们只是要存储<servlet-name>...</servlet-name>
 28     //<servlet-class>...</servlet-class> 和 <servlet-name>...</servlet-name><url-pattern>...</url-pattern>,需要判断,在这里至于为什么 在endElement()是需要将flag = null,请看类之前的注释
 29     private String flag;
 30     //判断是 servlet 还是 servlet-mapping
 31     private boolean isMapping;
 32 
 33     @Override
 34     public void startDocument() throws SAXException {
 35         super.startDocument();
 36         //文档开始,进行初始化
 37         entities = new ArrayList<>();
 38         mappings = new ArrayList<>();
 39         System.out.println("文档开始");
 40     }
 41 
 42     @Override
 43     public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
 44         super.startElement(uri, localName, qName, attributes);
 45         //元素开始,判断
 46         System.out.println("元素开始" + qName);
 47         if(null != qName){
 48             flag = qName;
 49 
 50             if(qName.equals("servlet")){
 51                 isMapping = false;
 52                 entity = new Entity();
 53             }else if(qName.equals("servlet-mapping")){
 54                 isMapping = true;
 55                 mapping = new Mapping();
 56             }
 57         }
 58     }
 59 
 60     @Override
 61     public void characters(char[] ch, int start, int length) throws SAXException {
 62         super.characters(ch, start, length);
 63         //元素
 64         String str = new String(ch, start, length);
 65         //开始 存储 信息了
 66         if(null != flag){
 67             if(isMapping){
 68                 if(flag.equals("servlet-name")){
 69                     mapping.setServletName(str);
 70                 }else if(flag.equals("url-pattern")){
 71                     mapping.getUrlList().add(str);
 72                 }
 73             }
 74             if(!isMapping){
 75                 if(flag.equals("servlet-name")){
 76                     entity.setServletName(str);
 77                 }else if(flag.equals("servlet-class")){
 78                     entity.setServletClass(str);
 79                 }
 80             }
 81         }
 82     }
 83 
 84     @Override
 85     public void endElement(String uri, String localName, String qName) throws SAXException {
 86         super.endElement(uri, localName, qName);
 87         //元素结束,将 对象 add进 List中去
 88         if(null != qName){
 89             if(qName.equals("servlet")){
 90                 entities.add(entity);
 91             }else if(qName.equals("servlet-mapping")){
 92                 mappings.add(mapping);
 93             }
 94         }
 95 
 96         flag = null;
 97     }
 98 
 99     @Override
100     public void endDocument() throws SAXException {
101         super.endDocument();
102         //文档结束
103     }
104 
105 /*    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
106         SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
107         SAXParser saxParser = saxParserFactory.newSAXParser();
108 
109         WebHandler webHandler = new WebHandler();
110         saxParser.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("web.xml"), webHandler);
111         System.out.println(webHandler.getEntities());
112         for(Entity temp : webHandler.getEntities()){
113             System.out.println(temp.toString());
114         }
115     }*/
116 
117     //你需要 在 WebApp 中将这里的 List 存入到 它里面的 Map 中去
118     public List<Entity> getEntities() {
119         return entities;
120     }
121 
122     public List<Mapping> getMappings() {
123         return mappings;
124     }
125 }

 

posted @ 2018-09-07 20:43  一凡夫一俗子  阅读(1531)  评论(0编辑  收藏  举报