javawebserver-反射webxml

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

创新互联提供网站制作、成都网站设计、网页设计,品牌网站制作广告投放等致力于企业网站建设与公司网站制作,十载的网站开发和建站经验,助力企业信息化建设,成功案例突破成百上千,是您实现网站建设的好选择.

web.xml

  
 
 
    login
    hello.RegisterServlet
 
     
    reg
    hello.LoginServlet
    
 
    login
    /login 
    /g 
   
 
    reg
    /reg 
 
 

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 entitys  = new ArrayList();
    private List mappings = new ArrayList();
    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 getEntitys() {
    return entitys;
}

public List getMappings() {
    return mappings;
}   

}

webContext:

public class WebContext {
    private List entitys=null;
    private List mappings=null;
    //key:servlet-name   value:servlet-class
    private Map entityMap=new HashMap();
    //key:url-pattern value :servlet-name
    private Map mappingMap=new HashMap();

public WebContext(List entitys,List 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 patterns ;
    public Mapping() {
        patterns = new HashSet();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Set getPatterns() {
        return patterns;
    }
    public void setPatterns(Set patterns) {
        this.patterns = patterns;
    }
    public void addPattern(String pattern) {
        this.patterns.add(pattern);
    }
}

文章标题:javawebserver-反射webxml
网站链接:http://pwwzsj.com/article/ipogoo.html