1.WebApp
解析web.xml文件,并通过路径获取servlet
public class WebApp {private static WebContext webContext;//解析xml文件static {try {SAXParserFactory factory = SAXParserFactory.newInstance();SAXParser parse = factory.newSAXParser();WebHandler handler = new WebHandler();parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("web.xml"), handler);List<Entity> entitys = handler.getEntitys();List<Mapping> mappings = handler.getMappings();webContext = new WebContext(entitys, mappings);}catch(Exception e) {System.out.println("解析配置文件错误");}}public static Servlet getServletFromUrl(String url){String name = webContext.getClz("/" + url);Class clz;try {clz = Class.forName(name);Servlet servlet = (Servlet)clz.getConstructor().newInstance();return servlet;} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return null;}}
2.handler处理器
public class WebHandler extends DefaultHandler{private List<Entity> entitys;private List<Mapping> mappings;private Entity entity;private Mapping mapping;//存储当前标签名private String tag;//判断当前标签是否为servlet-mappingprivate boolean isMapping;@Overridepublic void startDocument() throws SAXException {entitys = new ArrayList<Entity>();mappings = new ArrayList<Mapping>();}@Overridepublic void endDocument() throws SAXException { }@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {if(null != qName) {tag = qName;if(qName.equals("servlet")) {entity = new Entity();isMapping = false;}else if(qName.equals("servlet-mapping")) {mapping = new Mapping();isMapping = true;}}}@Overridepublic void endElement(String uri, String localName, String qName) throws SAXException {if(qName != null) {if(qName.equals("servlet")) {entitys.add(entity);}else if(qName.equals("servlet-mapping")) {mappings.add(mapping);}}//避免结束标签与另外的开始标签之间的空内容覆盖标签内容tag = null;}@Override//读取标签之间的内容,不管标签是否一一对应public void characters(char[] ch, int start, int length) throws SAXException {String msg = new String(ch, start, length).trim();if(tag != null) {if(isMapping) {//操作servlet-mappingif(tag.equals("servlet-name")) {mapping.setName(msg);}if(tag.equals("url-pattern")) {mapping.add(msg);}}else {//操作servletif(tag.equals("servlet-name")) {entity.setName(msg);}if(tag.equals("servlet-class")) {entity.setClz(msg);}}}}public List<Entity> getEntitys() {return entitys;}public List<Mapping> getMappings() {return mappings;}}
3.修改receive代码
