荐 手写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("登录完毕");
}
}
本文地址:https://blog.csdn.net/qq_44620773/article/details/107272406