本文解析三个xml文件,难度依次增加
文件1:p1.xml
<?xml version="1.0" encoding="UTF-8" ?> <persons> <person> <name>张三</name> <age>22</age> </person> </persons>
文件2:p2.xml
<?xml version="1.0" encoding="UTF-8" ?> <persons> <person> <name>张三</name> <age>33</age> </person> <person> <name>李四</name> <age>44</age> </person> </persons>
文件3:p3.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>login</servlet-name> <servlet-class>cs.cwnu.servlet.LoginServlet </servlet-class> </servlet> <servlet> <servlet-name>reg</servlet-name> <servlet-class>cs.cwnu.servlet.RegisterServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> <url-pattern>/g</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>reg</servlet-name> <url-pattern>/reg</url-pattern> </servlet-mapping> </web-app>
首先解析文件1
public class XmlTest { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //SAX解析 //1、获取解析工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //2、从解析工厂获取解析器 SAXParser parse =factory.newSAXParser(); //3、编写处理器 //4、加载文档 Document 注册处理器 PHandler handler=new PHandler(); //5、解析 parse.parse(Thread.currentThread().getContextClassLoader() .getResourceAsStream("cs/cwnu/test/p1.xml") ,handler); } } class PHandler extends DefaultHandler{ @Override public void startDocument() throws SAXException { System.out.println("----解析文档开始----"); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println(qName+"元素解析开始"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { String contents = new String(ch,start,length).trim(); if(contents.length()>0) { System.out.println("内容为"+contents); }else { System.out.println("内容为空"); } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println(qName+"元素解析结束"); } @Override public void endDocument() throws SAXException { System.out.println("----解析文档结束----"); } }结果展示
----解析文档开始---- persons元素解析开始 内容为空 person元素解析开始 内容为空 name元素解析开始 内容为张三 name元素解析结束 内容为空 age元素解析开始 内容为22 age元素解析结束 内容为空 person元素解析结束 内容为空 内容为空 persons元素解析结束 ----解析文档结束----
其次解析文件2
public class XmlTest02 { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { //SAX解析 //1、获取解析工厂 SAXParserFactory factory=SAXParserFactory.newInstance(); //2、从解析工厂获取解析器 SAXParser parse =factory.newSAXParser(); //3、编写处理器 //4、加载文档 Document 注册处理器 PersonHandler handler=new PersonHandler(); //5、解析 parse.parse(Thread.currentThread().getContextClassLoader() .getResourceAsStream("cs/cwnu/test/p2.xml") ,handler); //获取数据 List<Person> persons = handler.getPersons(); for(Person p:persons) { System.out.println(p.getName()+"-->"+p.getAge()); } } } class PersonHandler extends DefaultHandler{ private List<Person> persons ; private Person person ; private String tag; //存储操作标签 @Override public void startDocument() throws SAXException { persons = new ArrayList<Person>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if(null!=qName) { tag = qName; //存储标签名 if(tag.equals("person")) { person = new Person(); } } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String contents = new String(ch,start,length).trim(); if(null!=tag) { //处理了空 if(tag.equals("name")) { person.setName(contents); }else if(tag.equals("age")) { if(contents.length()>0) { person.setAge(Integer.valueOf(contents)); } } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if(null!=qName) { if(qName.equals("person")) { persons.add(person); } } tag = null; //tag丢弃了 } @Override public void endDocument() throws SAXException { } public List<Person> getPersons() { return persons; } }结果为:
张三-->33
李四-->44
最后解析文件3:p3.xml
用户访问的网址不同,会访问不同的Servlet
比如:访问“/login或/g”,用户会跳转到LoginServlet
访问“/reg”,用户会跳转到RegisterServlet
具体代码如下:
创建Entity类用来存放<Servlet>元素的内容
package cs.cwnu.servlet; //<servlet> //<servlet-name>login</servlet-name> //<servlet-class>com.sxt.server.basic.servlet.LoginServlet //</servlet-class> //</servlet> public class Entity { private String name; private String clz; public Entity(){ } /** * @param name * @param clz */ public Entity(String name, String clz) { super(); this.name = name; this.clz = clz; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClz() { return clz; } public void setClz(String clz) { this.clz = clz; } }
创建Mapping类来存放<ServletMapping>元素的内容
package cs.cwnu.servlet; import java.util.HashSet; import java.util.Set; //<servlet-mapping> //<servlet-name>login</servlet-name> //<url-pattern>/login</url-pattern> //<url-pattern>/g</url-pattern> //</servlet-mapping> public class Mapping { private String name; private Set<String> patterns; /** * @param name * @param patterns */ public Mapping() { patterns = new HashSet<String>(); } public Mapping(String name, Set<String> patterns) { super(); this.name = name; this.patterns = patterns; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<String> getPatterns() { return patterns; } public void setPatterns(Set<String> patterns) { this.patterns = patterns; } public void addPattern(String pattern){ this.patterns.add(pattern); } }
创建Servlet接口
package cs.cwnu.servlet; public interface Servlet { void service(); }
创建LoginServlet实现Servlet类
package cs.cwnu.servlet; public class LoginServlet implements Servlet { @Override public void service() { System.out.println("LoginServlet"); } }
创建RegisterServlet实现Servlet类
package cs.cwnu.servlet; public class RegisterServlet implements Servlet { @Override public void service() { System.out.println("RegisterServlet"); } }
创建WebContext类,功能是用户输入url通过匹配<servlet-mapping>中的<url-pattern>的值,找到同级<servlet-name>的值,再找到与<servlet>中<servlet-name>值相同且同级的<servlet-class>的值,即找到Servlet类
package cs.cwnu.servlet; import java.util.HashMap; import java.util.List; import java.util.Map; public class WebContext { private List<Entity> entitys=null; private List<Mapping> mappings=null; //key:servlet-name,value:servlet-class private Map<String,String> entityMap = new HashMap<String,String>(); //key:url-pattern,value:servlet-name private Map<String,String> mappingMap = new HashMap<String,String>(); /** * @param entitys * @param mappings */ public WebContext(List<Entity> entitys, List<Mapping> mappings) { super(); this.entitys = entitys; this.mappings = mappings; for (Entity entity : entitys) { entityMap.put(entity.getName(), entity.getClz()); } for (Mapping mapping : mappings) { for(String pattern:mapping.getPatterns()){ mappingMap.put(pattern, mapping.getName()); } } } public String getClz(String pattern){ String name = mappingMap.get(pattern); String clas = entityMap.get(name); return clas; } }
测试代码:
package cs.cwnu.servlet; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class XmlTest01 { public static void main(String[] args) throws Exception{ // SAX解析 // 1、获取解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // 2、从解析工厂获取解析器 SAXParser parse = factory.newSAXParser(); // 3、编写处理器 // 4、加载文档 Document 注册处理器 WebHandler handler = new WebHandler(); // 5、解析 parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("cs/cwnu/servlet/web.xml"), handler); List<Entity> entitys = handler.getEntitys(); List<Mapping> mappings = handler.getMappings(); WebContext wb = new WebContext(entitys, mappings); //假设登录 //String name = wb.getClz("/login");输出LoginServlet String name = wb.getClz("/g"); //String name = wb.getClz("/reg");输出RegisterServlet Class clazz = Class.forName(name); Servlet servlet = (Servlet)clazz.getConstructor().newInstance(); servlet.service(); } } class WebHandler extends DefaultHandler { private List<Entity> entitys; private List<Mapping> mappings; private Entity entity; private Mapping mapping; private String tag; private boolean isMapping = false; @Override public void startDocument() throws SAXException { entitys = new ArrayList<Entity>(); mappings = new ArrayList<Mapping>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { if (null != qName) { tag = qName; if (tag.equals("servlet")) { entity = new Entity(); isMapping = false; } else if (tag.equals("servlet-mapping")) { mapping = new Mapping(); isMapping = true; } } } @Override public void characters(char[] ch, int start, int length) throws SAXException { String contents = new String(ch, start, length).trim(); if (null != tag) { if (isMapping) { if (tag.equals("servlet-name")) { mapping.setName(contents); } else if (tag.equals("url-pattern")) { mapping.addPattern(contents); } } else { if (tag.equals("servlet-name")) { entity.setName(contents); } else if (tag.equals("servlet-class")) { entity.setClz(contents); } } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (null != qName) { if (qName.equals("servlet")) { entitys.add(entity); } else if (qName.equals("servlet-mapping")) { mappings.add(mapping); } } tag = null; } @Override public void endDocument() throws SAXException { } public List<Entity> getEntitys() { return entitys; } public List<Mapping> getMappings() { return mappings; } }
测试结果:LoginServlet
原文地址:https://www.cnblogs.com/5aixin/p/11100564.html
时间: 2024-10-10 07:54:56