思路:通过解析xml将各个类存入容器内,然后通过map存放各个标签的内容,通过
url-pattern的内容找到servlet-name,通过servlet-name的内容,找到对应的类servlet-class,然后通过servlet-class内的内容(包名.类名)反射得到对应的类,然后输出

web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> <servlet-name>login</servlet-name> <servlet-class>hello.RegisterServlet</servlet-class> </servlet> <servlet> <servlet-name>reg</servlet-name> <servlet-class>hello.LoginServlet</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>

xml:

public class xmll {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("hello\\web.xml") ,handler); //获取数据 WebContext context=new WebContext(handler.getEntitys(),handler.getMappings()); //假设你输入了 /login String className=context.getClz("/login"); //反射 Class clz=Class.forName(className); //className返回的是servlet-class的内容,即包名.类名 Servlet servlet=(Servlet)clz.getConstructor().newInstance(); servlet.service();}}class WebHandler extends DefaultHandler{ private List<Entity> entitys = new ArrayList<Entity>(); private List<Mapping> mappings = new ArrayList<Mapping>(); private Entity entity ; private Mapping mapping ; private String tag; //存储操作标签 private boolean isMapping = false;@Overridepublic 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; } }}@Overridepublic void characters(char[] ch, int start, int length) throws SAXException { String contents = new String(ch,start,length).trim(); if(null!=tag) { //处理了空 if(isMapping) { //操作servlet-mapping if(tag.equals("servlet-name")) { mapping.setName(contents); }else if(tag.equals("url-pattern")) { mapping.addPattern(contents); //添加的是url对应的内容,不是标签,并且内容不能相同 //因为一个类有多个url的内容,所以加入集合,要不然要两个变量来保存,且这两个url都是对应的一个name一个class } }else { //操作servlet if(tag.equals("servlet-name")) { entity.setName(contents); }else if(tag.equals("servlet-class")) { entity.setClz(contents); } } }}@Overridepublic 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; //tag丢弃了}public List<Entity> getEntitys() { return entitys;}public List<Mapping> getMappings() { return mappings;} }

webContext:

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>();public WebContext(List<Entity> entitys,List<Mapping> mappings){ 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); return entityMap.get(name);}}

Servlet:

public interface Servlet {void service();}

LoginServlet:

public class LoginServlet implements Servlet {public void service(){ System.out.println("LoginServlet");}}

RegisterServlet:

public class RegisterServlet implements Servlet { public void service() { System.out.println("RegisterServlet"); }}

Entity

public class Entity { private String name; private String clz; public Entity() { // TODO Auto-generated constructor stub } 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

public class Mapping { private String name; private Set<String> patterns ; public Mapping() { patterns = new HashSet<String>(); } 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); }}