0305 xml
web编程
可以通过浏览器访问web服务器上的资源了
什么是xml
xml是可扩展标记语言,XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的
xml格式:
文档声明必须为<?xml开头,以?>结束
元素:
普通元素的结构开始标签、元素体、结束标签组成。例如:<hello>大家好</hello
元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a ></b>
空元素:空元素只有开始标签,而没有结束标签,但元素必须自己闭介,例如:<c/>
元素命名:
区分大小写
不能使用空格,不能使用冒号
不建议以XML, xml, Xml开头
格式化良好的XML文档,必须只有一个根元素
属性:
属性的定义格式:属性名=属性值,其中属性值必须使用单引或双引
一个元素可以有O ~ N个属性,但一个元素中不能出现同名属性
属性名不能使用空格、冒号等特殊字符,且必须以字母开头
注释:
XML的注释与HTML相同,即以“<!--”开始,以“-->”结束
因为很多符号己经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:"<"、”>”、” ’ ”、” ” ”、”&”
那么我们就要采用CDATA区 将代码包裹起来
我们先写一个简单的,创建一个demo01.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version= "1.0" encoding= "UTF-8" ?> <school> <class1> <student name= "张三" age= "18" ></student> <student name= "李斯" age= "18" ></student> </class1> <class2> <student name= "小红" age= "18" ></student> <student name= "小绿" age= "18" ></student> </class2> <class3> <![CDATA[ if (a<b&&a> 100 ){ a= 1 ; } ]]> </class3> </school> |
像上述代码中我们自定义了一些标签,但是感觉并没有什么任何意义,所以提供了DTD约束和Schema约束,去约束xml文件的代码编写
1、DTD约束,我们将web-app_2_3.dtd文件打开发现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version= "1.0" encoding= "UTF-8" ?> <!-- 模拟servlet2. 3 规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。 格式如下: <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd" > --> <!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) > <!ELEMENT servlet (servlet-name,description?,(servlet- class |jsp-file))> <!ELEMENT servlet-mapping (servlet-name,url-pattern+) > <!ELEMENT servlet-name (#PCDATA)> <!ELEMENT servlet- class (#PCDATA)> <!ELEMENT url-pattern (#PCDATA)> <!ELEMENT description (#PCDATA)> <!ELEMENT jsp-file (#PCDATA)> <!ELEMENT welcome-file-list (welcome-file+)> <!ELEMENT welcome-file (#PCDATA)> <!ATTLIST web-app version CDATA #IMPLIED> |
上述DTD约束中规定了xml文件 的根标签 子标签的书写规范,什么标签下必须有什么标签,那我们再创建一个web.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd" > <web-app> <servlet> <servlet-name>MyServlet</servlet-name> <servlet- class >com.oracle.demo01.MyServlet</servlet- class > </servlet> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping> </web-app> |
我们只需要将web-app_2_3.dtd文件中的<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">这句代码粘贴到我们创建的xml文件中,按照提示将标签点出来就OK了
2、Schema约束,和DTD约束用法是一样的。Schema约束比DTD约束要强大一点
那么我们将完整包名加类名写在了xml文件的标签中,那我们只能获取到他的内容我们才能去进行反射 获取他的类对象,从而操作类的方法
依旧采用dom树的思路去获取标签内容,那么久用到了dom4jjar包
dom4j必须使用核心类SaxReader加载xml文档获得Document通过Document对象获得文档的根元素
SaxReader类中有一个read方法 用于加载xml文件,返回值是一个document对象,
document类中有一个getRootElement方法获取根元素,返回值是Element对象
Element中
elements获取指定名称的所有子元素
element 获取指定名称的第一个子元素
getName 获取当前元素的元素名称
attributeValue 获取指定属性名的属性值
elementText获取指定子元素的文本值
getTxt获取当然元素的文本内容
代码展示
先将jar包导入到项目中
将Schema约束文件放在同一个包中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <?xml version= "1.0" encoding= "UTF-8" ?> <!-- 模拟servlet2. 5 规范,如果开发人员需要在xml使用当前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" > --> <xsd:schema xmlns= "http://www.w3.org/2001/XMLSchema" targetNamespace= "http://www.example.org/web-app_2_5" xmlns:xsd= "http://www.w3.org/2001/XMLSchema" xmlns:tns= "http://www.example.org/web-app_2_5" elementFormDefault= "qualified" > <xsd:element name= "web-app" > <xsd:complexType> <xsd:choice minOccurs= "0" maxOccurs= "unbounded" > <xsd:element name= "servlet" > <xsd:complexType> <xsd:sequence> <xsd:element name= "servlet-name" ></xsd:element> <xsd:element name= "servlet-class" ></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name= "servlet-mapping" > <xsd:complexType> <xsd:sequence> <xsd:element name= "servlet-name" ></xsd:element> <xsd:element name= "url-pattern" maxOccurs= "unbounded" ></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name= "welcome-file-list" > <xsd:complexType> <xsd:sequence> <xsd:element name= "welcome-file" maxOccurs= "unbounded" ></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:choice> <xsd:attribute name= "version" type= "double" use= "optional" ></xsd:attribute> </xsd:complexType> </xsd:element> </xsd:schema> |
将上述代码中的
1 2 3 4 | <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" ><br><br> |
1 | 复制到创建的web.xml中 |
创建web.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?xml version= "1.0" encoding= "UTF-8" ?> <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" > <servlet> <servlet-name>HelloServlet</servlet-name> <servlet- class >com.oracle.demo02.HelloServlet</servlet- class > </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/HelloServlet</url-pattern> </servlet-mapping> </web-app> |
创建HelloServlet类
1 2 3 4 5 6 7 8 9 10 11 12 | public class HelloServlet { public void init(){ System.out.println( "Servlet创建啦" ); } public void service(){ System.out.println( "Servlet被访问了" ); } public void destory(){ System.out.println( "Servlet被销毁了" ); } } |
创建测试类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public class Demo01 { public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException { //加载xml文档 获取整个文档对象 SAXReader sax= new SAXReader(); Document doc=sax.read( "src/com/oracle/demo02/web.xml" ); //获取根元素对象 Element root=doc.getRootElement(); //获取servlet标签 Element servlet=root.element( "servlet" ); //获取servlet-class元素对象 Element servletClass=servlet.element( "servlet-class" ); //获取当前元素文本内容 String className=servletClass.getText(); //获取字节码文件 Class c=Class.forName(className); //快速创建对象 HelloServlet hello=(HelloServlet)c.newInstance(); //获取成员方法对象 hello.init(); hello.service(); hello.destory(); } } |
运行结果
Servlet创建啦
Servlet被访问了
Servlet被销毁了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!