思路:通过解析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;


@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) { //操作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);
			}
		}			
	}
}

@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; //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);
	}
}