手写webserver服务器

博客介绍了反射概念,重点阐述XML。XML是可扩展标记语言,可作为数据存储格式或存储软件参数,程序解析配置文件能在不修改代码的情况下修改程序。还提及了XmlTest02、Mapping、servlet等解析类及xml文档。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,反射
有对象
没有,但是知道内部结构
定位

/**
 * 反射:吧java中的各种而机构(方法,属性,构造器,类名)映射成一个个的java对象
 * 1,获取Class对象
 * 三种方式:Class.forName
 * 2,可以动态创建
 */
public class ReflectTest {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
        //三种方式
        //1,对象.getClass
        Iphone iphone=new Iphone();
        Class clz=iphone.getClass();
        //2,类.class
        clz=Iphone.class;
        //3,定位Class.forNmae("报名.类名")
        clz=Class.forName("base.Iphone");

        //创建对象
        Iphone iphone2=(Iphone)clz.newInstance();
        System.out.println(iphone2);

        //jdk9的创建方式
        Iphone iphone3=(Iphone)clz.getConstructor().newInstance();
        System.out.println(iphone3);

    }
}
class Iphone{
    public Iphone() {

    }
}

XML:可扩展标记语言,作为数据的一种存储格式或用于存储软件的参数,程序解析此配置文件,达到不修改代码,修改程序的目的。

/**
 * 熟悉Sax解析流程l
 */
public class XmlTest02 {
    public static void main(String[] args) throws Exception {
        //实例化工厂
        SAXParserFactory factory=SAXParserFactory.newInstance();
        //2,从解析工厂获取解析器
        SAXParser parse=factory.newSAXParser();
        //3,编写处理器
        //加载文档Document注册处理器
        Webhandler phandler=new Webhandler();
        parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("servlet/web.xml"),phandler);
        List<Entity> persons=phandler.getEntitys();
        for(Entity p:persons){
            System.out.println(p.getName()+" "+p.getClz());
        }
        List<Mapping> mappings=phandler.getMappings();
        for(Mapping p:mappings){
            System.out.println(p.getName()+" "+p.getPattrens().toString());
        }
        WebContext webContext=new WebContext(persons,mappings);
        //输入 /login
        String className=webContext.getClz("/reg");
        Class clz=Class.forName(className);
//        Servlet servlet=(Servlet)clz.newInstance();
        Servlet servlet=(Servlet)clz.getConstructor().newInstance();
        System.out.println(servlet);
        servlet.service();
    }
}

class Webhandler extends DefaultHandler{
    private List<Entity> entitys;
    private List<Mapping> mappings;
    private Entity entity;
    private Mapping mapping;
    private String tag;//存储操作标签
    private boolean isMpping=false;//存储操作标签
    @Override
    public void startDocument() throws SAXException {
        entitys=new ArrayList<>();
        mappings=new ArrayList<>();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println(qName+"---->解析开始");
        if(null!=qName){
            tag=qName;
            if(tag.equals("servlet")){
                entity=new Entity();
                isMpping=false;
            }else if(tag.equals("servlet-mapping")){
                mapping=new Mapping();
                isMpping=true;
            }
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println(qName+"---->解析结束");
        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 contents=new String(ch,start,length).trim();
        if(null!=tag){
            if(isMpping){//c操作mapping
                if(tag.equals("servlet-name")){
                    mapping.setName(contents);
                }else if(tag.equals("url-pattren")){
                    mapping.addPatterns(contents);
                }
            }else{
                if(tag.equals("servlet-name")){
                    entity.setName(contents);
                }else if(tag.equals("servlet-class")){
                    entity.setClz(contents);
                }
            }

        }
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("解析文档结束");
    }

    public List<Entity> getEntitys() {
        return entitys;
    }

    public List<Mapping> getMappings() {
        return mappings;
    }
}

xml解析:

XmlTest02:解析类:

/**
 * 熟悉Sax解析流程l
 */
public class XmlTest02 {
    public static void main(String[] args) throws Exception {
        //实例化工厂
        SAXParserFactory factory=SAXParserFactory.newInstance();
        //2,从解析工厂获取解析器
        SAXParser parse=factory.newSAXParser();
        //3,编写处理器
        //加载文档Document注册处理器
        Webhandler phandler=new Webhandler();
        parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("servlet/web.xml"),phandler);
        List<Entity> persons=phandler.getEntitys();
        for(Entity p:persons){
            System.out.println(p.getName()+" "+p.getClz());
        }
        List<Mapping> mappings=phandler.getMappings();
        for(Mapping p:mappings){
            System.out.println(p.getName()+" "+p.getPattrens().toString());
        }
        WebContext webContext=new WebContext(persons,mappings);
        //输入 /login
        String className=webContext.getClz("/reg");
        Class clz=Class.forName(className);
//        Servlet servlet=(Servlet)clz.newInstance();
        Servlet servlet=(Servlet)clz.getConstructor().newInstance();
        System.out.println(servlet);
        servlet.service();
    }
}

class Webhandler extends DefaultHandler{
    private List<Entity> entitys;
    private List<Mapping> mappings;
    private Entity entity;
    private Mapping mapping;
    private String tag;//存储操作标签
    private boolean isMpping=false;//存储操作标签
    @Override
    public void startDocument() throws SAXException {
        entitys=new ArrayList<>();
        mappings=new ArrayList<>();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        System.out.println(qName+"---->解析开始");
        if(null!=qName){
            tag=qName;
            if(tag.equals("servlet")){
                entity=new Entity();
                isMpping=false;
            }else if(tag.equals("servlet-mapping")){
                mapping=new Mapping();
                isMpping=true;
            }
        }
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        System.out.println(qName+"---->解析结束");
        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 contents=new String(ch,start,length).trim();
        if(null!=tag){
            if(isMpping){//c操作mapping
                if(tag.equals("servlet-name")){
                    mapping.setName(contents);
                }else if(tag.equals("url-pattren")){
                    mapping.addPatterns(contents);
                }
            }else{
                if(tag.equals("servlet-name")){
                    entity.setName(contents);
                }else if(tag.equals("servlet-class")){
                    entity.setClz(contents);
                }
            }

        }
    }

    @Override
    public void endDocument() throws SAXException {
        System.out.println("解析文档结束");
    }

    public List<Entity> getEntitys() {
        return entitys;
    }

    public List<Mapping> getMappings() {
        return mappings;
    }
}

Mapping:selvlet-mapping解析类:

public class Mapping {
    private String name;
    private Set<String> pattrens;

    public Mapping() {
        pattrens=new HashSet<>();
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Set<String> getPattrens() {
        return pattrens;
    }

    public void setPattrens(Set<String> pattrens) {
        this.pattrens = pattrens;
    }

    public void addPatterns(String pattren){
        this.pattrens.add(pattren);
    }
}

servlet:解析类:

public class Entity {
    private String name;
    private String Clz;

    public Entity() {
    }

    public Entity(String name, String clz) {
        this.name = name;
        Clz = clz;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClz() {
        return Clz;
    }

    public void setClz(String clz) {
        Clz = clz;
    }
}

public interface Servlet {
    void service();
}
public class LoginServlet implements Servlet {
    @Override
    public void service() {
        System.out.println("LoginServlet");
    }
}

xml文档:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>reg</servlet-name>
        <servlet-class>servlet.RegisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattren>/login</url-pattren>
        <url-pattren>/g</url-pattren>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>reg</servlet-name>
        <url-pattren>/reg</url-pattren>
        <url-pattren>/g</url-pattren>
    </servlet-mapping>
</web-app>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值