(八)——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 }