java webserver-反射webxml

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java webserver-反射webxml相关的知识,希望对你有一定的参考价值。

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

以上是关于java webserver-反射webxml的主要内容,如果未能解决你的问题,请参考以下文章

python反射

JAVA远程的webserver

java webserver-http协议图

java webserver-封装响应协议

java webserver-封装请求协议2

java命令行编译webserver