手写webserver之xml解析与数据处理

上一章节反射

可扩展标记语言(eXtensible Markup Language)

思路

xml解析步骤

1.获取解析工厂

SAXParserFactory factor=SAXParserFactory.newInstance();

2.从解析工厂获取解析器

SAXParser parse=factor.newSAXParser();

3.编写处理器及加载

重点 手写该类,并继承DefaultHandler类
其中satrtDocument,endDocument 指文档的开始
startElement (常用来初始化储存数据信息的类)endElement(常用来将储存数据信息的类放入容器) 指标签(qName)
characters 内容的处理

Handle handle=new Handle();
class Handle extends DefaultHandler{//处理器	 
	private String top;
	infor t;
	ArrayList<infor> list=new ArrayList<infor>();
	@Override
		public void startDocument() throws SAXException {
			System.out.println("---文档开始解析 ---");
		}
	@Override
		public void endDocument() throws SAXException {
			System.out.println("---终止解析 ---");
		}
	@Override
		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.println(qName+"-->开始解析");
			top=qName;
		}
	@Override
		public void endElement(String uri, String localName, String qName) throws SAXException {
			System.out.println(qName+"-->终止解析");
		}
	@Override
		public void characters(char[] ch, int start, int length) throws SAXException {
		String str=new String(ch,start,length).trim();
		
		if(top=="person") {		
			t=new infor();
			list.add(t);
		}
		if(top=="name") {		
			t.setName(str);
			top=null;
		}
		if(top=="age") {		
			t.setAge(str);
			top=null;
		}
					
		}

4.使用加载器解析

parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("解析1/z.XML"), handle);

整体步骤

1.使用xml解析,这种在处理器的编写
2.要准备用于存储被解析出的数据的类
3.准备一个类用于将数据进行处理的类
4.将类进行反射取的资源

代码

对xml进行解析和反射取得服务

XML文档

<?xml version="1.0" encoding="utf-8" ?>
<web-app>
   <servlet>
    <servlet-name>login</servlet-name>
	<servlet-class>解析二.loginservlet</servlet-class>//包名.类名
   </servlet>
   <servlet>
    <servlet-name>reg</servlet-name>
	<servlet-class>解析二.registerservlet</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>  
   

JAVA代码及运行结果

1.主类

public class xml {
public static void main(String[] args) throws Exception{
	//1.获取解析工厂
		SAXParserFactory factor=SAXParserFactory.newInstance();
		//2.从解析工厂获取解析器
		SAXParser parse=factor.newSAXParser();
		//3.编写处理器 及加载
		Handle handle=new Handle();
		//使用加载器解析
		parse.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream("解析二/p.XML"), handle);
		
		System.out.println("------------------------------");
		//输出
		for (ser1 s : handle.getList1()) {
			System.out.println(s.getName());
			System.out.println(s.getClz());
		}
		for (ser2 s : handle.getList2()) {
			System.out.println(s.getName());
			for (String url : s.getUrl()) {
				System.out.println(url);
			}
		}
		System.out.println("------------------------------");
		webContext web=new webContext(handle.getList1(), handle.getList2());//通过输入标识符来获取资源 包名.类名 
		String resource1	=web.geturl("/reg");//此处标识符为  /reg   resource=包名.类名 
		String resource2	=web.geturl("/login");//此处标识符为  /login   resource=包名.类名 
		//通过反射来处理
		Class cls =Class.forName(resource1);
		Servlet servelet=(Servlet)cls.getConstructor().newInstance();
		System.out.println(servelet);
		servelet.service();
		
		Class cls1 =Class.forName(resource2);
		Servlet servelet1=(Servlet)cls1.getConstructor().newInstance();
		System.out.println(servelet1);
		servelet1.service();
	
	
}
}
class Handle extends DefaultHandler{
	

	private ArrayList<ser1> list1;
	private ArrayList<ser2> list2;
	private ser1 s1;
	private ser2 s2;
	private String top;//标签
	private boolean isS1;//判断是否为url
	@Override
	public void startDocument() throws SAXException {
		 list1=new ArrayList<ser1>();
		 list2=new ArrayList<ser2>();
	}
	@Override
		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.println(qName+"-->开始解析");
		//实例化 s1 s2
			if(null!=qName) {
				top=qName;//储存标签名
				if(qName.equals("servlet")) {
					s1=new ser1();
					isS1=true;
					
				}else if(qName.equals("servlet-mapping")){
					s2=new ser2();
					isS1=false;
				}
			}
		}
	@Override
		public void endElement(String uri, String localName, String qName) throws SAXException {
			System.out.println(qName+"-->终止解析");
			//将s1 s2加到 容器中
			if(null!=qName) {
				
				if(qName.equals("servlet")) {
					list1.add(s1);
					
				}else if(qName.equals("servlet-mapping")){
					list2.add(s2);
				}
			}
		}
	@Override
		public void characters(char[] ch, int start, int length) throws SAXException {
			String str=new String(ch,start,length).trim();
			if(top!=null) {//
				if(isS1) {//是s1的情况下
					if(top.equals("servlet-name")) {
						s1.setName(str);
						top=null;
					}else if((top.equals("servlet-class"))){
						s1.setClz(str);
						top=null;
					}
				}else{//是s2的情况下
					if(top.equals("servlet-name")) {
						s2.setName(str);
						top=null;
					}else if((top.equals("url-pattern"))){
						s2.add(str);
						top=null;
					}
				}
			}
			
		
		}
	public ArrayList<ser1> getList1() {
		return list1;
	}

	public ArrayList<ser2> getList2() {
		return list2;
	}

}

2.储存数据的两个类

package 解析二;

public class ser1 {
private String name;
private String clz;
ser1(){
	
}
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;
}

}
package 解析二;

public class ser2 {
private String name;
private Set<String> url;//用于从放多个url
ser2(){
	url=new HashSet<String>() ;//初始化
}

public String getName() {
	return name;
}

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

public Set<String> getUrl() {
	return url;
}

public void setUrl(Set<String> url) {
	this.url = url;
}

public void add(String s) {
	url.add(s);
}
}

3.处理数据的类

package 解析二;

public class webContext {
	private ArrayList<ser1> s1;
	private ArrayList<ser2> s2;
	private Map<String, String> ms2= new HashMap<String, String>();
	private Map<String, String> ms1= new HashMap<String, String>();
	webContext(ArrayList<ser1> s1,ArrayList<ser2> s2){
		this.s1=s1;
		this.s2=s2;
		//将s1 s2改为字典 方便通过输入信息来找到对应的资源
		for (ser1 ser1 : s1) {//将s2改为字典
			ms1.put( ser1.getName(),ser1.getClz());
		}
		for (ser2 ser2 : s2) {//将s2改为字典
			for (String url : ser2.getUrl()) {
				ms2.put(url, ser2.getName());
			}
		}
	}
	
	String geturl(String url) {//输入信息,通过s2找到s1中的资源
		String name=ms2.get(url);
		return ms1.get(name);//这里返回的是一个资源 包名.类名 通过反射来处理
	}
}

4.服务的类

package 解析二;

public interface Servlet {//接口 
	void service();
}
package 解析二;

public class registerservlet implements Servlet {

	@Override
	public void service() {//web所调用的服务
		System.out.println("正在注册");

	}

}
package 解析二;

public class loginservlet implements Servlet {

	@Override
	public void service() {//web所调用的服务
		System.out.println("登录完毕");
		
	}

	

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值