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