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 }