欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-09-06 11:40:10
上一章节反射可扩展标记语言(eXtensible Markup Language)目录思路xml解析步骤整体步骤代码XML文档JAVA代码及运行结果思路xml解析步骤1.获取解析工厂SAXParserFactory factor=SAXParserFactory.newInstance();2.从解析工厂获取解析器SAXParser parse=factor.newSAXParser();3.编写处理器及加载重点 手写该类,并继承DefaultHandler类其中sat...

上一章节反射

可扩展标记语言(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("登录完毕");
		
	}

	

}

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

本文地址:https://blog.csdn.net/qq_44620773/article/details/107272406