在web编程阶段,我们可以实现浏览器通过地址访问服务器上的资源,但要想灵活实现不同的路径地址执行不同的服务器资源,就需要提到xml相关配置了。
XML的定义
可扩展的标记语言。和Html超文本标记语言相类似。标签也是成对出现的。
不同点:xml中可以自定义标签名,要区分大小写,要顶格写。
因为1.1版本的兼容性差,所以我们使用的是1.0版本的xml。
XML的作用
1、编写配置文件:实现浏览器和服务器的交互
2、存放数据:通过一定的规范,存放数据,达到多平台共享数据的目的。
XML语法
1、文档声明<? Xml version="1.0"encoding="utf-8" ?>
2、元素:开始标签标签体结束标签
<A><B>你好</B></A>
!!!必须只有一个根标签
3、属性
属性是元素的一部分,必须出现在开始标签中,属性名=属性值
可以有多个但是不能同名
4、注释
<!--注释内容-->
5、转义符:在xml中有很多符号已经被文档结构使用,这是元素体或者元素属性想使用这些符号的时候就需要进行转移。
&--&
>-->
<--<
"--&auto
'--&apos
CDATA区:书写大量的需要转移的符号,这样就无需我们一一进行转义,提高代码的可读性。
<script>
<![CDATA[
<>?>?>?><><><><><>
]]>
</script>
XML中的约束
xml虽然我们可以自己定义标签,但是如果我们各自一种定义,大家沟通起来难免太过于困难,因此我们要遵循一种大家约定俗成的规范来统一编写XML,这样阅读起来就方便多了,还可以共享。一般约束都是写好的,我们拿来用就可以,需要不同的约束即便引入不同的约束即可。
1、DTD约束
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
注意:,表示按照规定的属性添加标签体或属性; ?代码0-1次; +代表1到多次; *代表0-多次;PCDATA表示文本。
2、Schema约束
<web-app xmlns="http://www.example.org/web-app_2_5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
version="2.5">
</web-app>
注意:命名空间:防止引入多个schema约束存在相同名称无法辨别。
缺省:xmlns="名称"
声明:xmlns:别名="名称"
xmlns="http://www.example.org/demo"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
XML解析
通过程序获得xml中的内容
解析方式分类
1、DOM:将整个xml中的文档加载到内存中,解析成document对象。
优点:元素与元素之间保留结构关系,能够进行增删改查操作;
缺点:当xml文档过大会造成内存溢出。
2、SAX:将文档进行逐行扫描,事件驱动的方式进行解析。
优点:速度快,效率高;
缺点:只能读,逐行读完将释放,不能再找回来。
3、PULL:Android内置的解析方式。
DOM解析原理
采用dom4j解析工具包。通过核心类SaxReader获得document对象;然后由document对象得到根元素;再进行一系列操作。
dom解析---中心思想是元素
public static void main(String[] args) throws Exception {
//1、核心类
SAXReader reader = new SAXReader();
//类加载器
InputStream is = Dom.class.getClassLoader().getResourceAsStream("web.xml");
//2、获得document对象
Document document = reader.read(is);
//3、获得根元素
Element rootElement = document.getRootElement();
String value = rootElement.attributeValue("version");
System.out.println(value);
//获得所有元素
List<Element> list= rootElement.elements();
for (Element ele : list) {
if("servlet".equals(ele.getName())){
Element servletName = ele.element("servlet-name");
System.out.println(servletName.getText());
}
}
}
xpth解析---中心思想是节点
SAXReader saxReader = new SAXReader()
InputStream is = Xpath.class.getClassLoader().getResourceAsStream("web.xml");
Document document = saxReader.read(is);
Node node = document.selectSingleNode("//servlet-name");//@表示属性;/表示根目录;//表示任意目录开始
System.out.println(node);
//转换成元素
Element ele=(Element)node;
System.out.println(ele.getText());
模拟浏览器访问服务器
public static void main(String[] args) throws Exception {
//map集合中存放---浏览器中要输入的预定义的数据和相应的路径
Map<String,String> map=new HashMap<String,String>();
//核心类---加载xml文件
//通过反射获得流对象 SAXReader解析读取文件得到document对象
InputStream is = ReflectandXML.class.getClassLoader().getResourceAsStream("web.xml");
SAXReader saxReader=new SAXReader();
Document document = saxReader.read(is);
//document得到根元素
Element rootEle = document.getRootElement();
//得到根元素下的子元素
List <Element>list = rootEle.elements();
//遍历
for (Element ele : list) {
//判断servlet存放在map中
if("servlet".equals(ele.getName())){
String servletName = ele.elementText("servlet-name");//abc
String servletClass = ele.elementText("servlet-class");//com.itheima.b_reflect.Hello
map.put(servletName,servletClass);
}
//判断servlet-mapping下一个标签
if("servlet-mapping".equals(ele.getName())){
String servletName = ele.elementText("servlet-name");//abc
String urlPattern=ele.elementText("url-pattern");// /Hello浏览器输入的路径
//因为两个标签的servletName是相同的,根据servletName得到map中的真正路径
String servletClass = map.get(servletName);
//将浏览器输入的路径和真正的路径存在map中
map.put(urlPattern,servletClass);
//将第一次存放在map中数据删除,此时map中存放的正是解析后获得的数据----浏览器输入的路径和真正的路径
map.remove(servletName);
}
}
//模拟浏览器端---假设传入路径
String path="/Hello";
//从map中得到真正的路径下的类
String servletPath = map.get(path);
//反射得到Class对象
Class clazz = Class.forName(servletPath);
//实例化对象
Object object = clazz.newInstance();
//调用方法
clazz.getMethod("init").invoke(object);
}
总结:这就是通过解析xml获得浏览器访问地址的决定路径的过程,但以后我们无需手动解析,在服务器创建Servlet会自动在web.xml中配置好,浏览器就可以轻松访问需要的的资源啦。 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|