Java 模拟servlet执行、DTD约束、Schema约束、dom4j解析(读写xml)
模拟servlet执行
浏览器请求WEB服务器上的资源,WEB服务器返回给浏览器
浏览器的入口不同(访问路径),访问的资源也不同。
我们需要使用xml约束(DTD或schema);为了获得xml的内容,我们需要使用dom4j进行解析。
XML(不同路径(/hello)执行不同的资源( HeIIoMyServlet))
XML可扩展的标记语言 标签可自定义的
包下创建xml 文件 new → other → XMLFile
粘贴web-app_ 2_ 3.dtd文件
复制web-app_ 2_ 3.dtd的文档声明到xml文件
存放数据
<?xml version="1.0" encoding="UTF-8"?> XML文档声明第一行 顶格写
versioin:XML版本encoding:文档的编码 默认utf-8:
<school name="oracle" size="3"> 元素(不以XML,xml开头)一个根元素
<person> 属性值必须使用单引或双引
<name>张三<</name> 元素内容 转义符 写法与html相同
<age><![CDATA[18><]]></age>CDATA区<![CDATA[内容自动转义]]>
<c/> 空元素
</person> <!--注释-->
</school>
DTD约束 (约束元素名、子元素、顺序、元素属性等) web-app_2_3.dtd
<?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> |
定义元素语法:<!ELEMENT元素名 元素描述>
常见符号: ? {1} * {0,n} +{1.n} (a|b)或 (a,b,c)指定顺序
常见类型:#PCDATA表示内容是文本,不能是子标签
<!ATTLIST 元素名 属性1 属性类型1 约束1 属性2 属性类型2 约束2>
属性类型:ID/CDATA/(a|b) 标识唯一/文本类型/多选一
属性约束:#REQUIRED/#IMPLIED 属性必须有 /属性可选
内部:在XML文档内部嵌入DTD
<?xml version="1.0" encoding="UTF-8"? standalone="yes" ?>
<!DOCTYPE web-app [
...//具体语法
]>
<web-app>...</web-app>
外部:DTD文档在本地系统上
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app>...</web-app>
外部:DTD文档在网络上
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>...</web-app>
Schema约束 (功能多,数据类型更完善,命名空间)web-app_ 2_ 5.xsd
命名空间:解决多个约束文件同名元素冲突
包下创建xml 文件 new → other → XMLFile
粘贴web-app_ 2_ 5.xsd文件 到包
复制web-app_ 2_ 5.xsd的命名空间到xml文件
<?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>Hello</servlet-name>
<servlet-class>com.oracle.Hello</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Hello</servlet-name>
<url-pattern>/Hello</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>
dom4j解析(读写xml)
项目下新建lib文件夹 new → Folder→ FolderName:lib
粘贴dom4j-1.6.1.jar, jaxen-1.1-beta-6.jar 到lib文件夹
解析方式:
DOM:保留元素之间结构,可以进行增删改查操作。可能内存溢出
SAX:处理速度快,只能读
PULL: Android内置的XML解析方式
解析器(解析开发包):
JAXP: sun公司提供支持DOM和SAX开发包
JDom:dom4j兄弟
jsoup:一种处理HTML特定解析开发包
dom4j:比较常用的解析开发包,hibernate底层采用。
dom4j必须使用核心类SaxReader加载xml文档获得Document通过Document对象获得文档的根元素,然后就可以操作了。
public class Demo {//同包下 public static void main(String[] args) throws Exception { SAXReader saxReader=new SAXReader();//解析器对象 Document doc=saxReader.read("src/com/oracle/web.xml");//文档对象 Element root=doc.getRootElement(); //获取根元素 Element ser=root.element("ser"); //获取第一个"ser"子元素 String rootName=root.getName(); //获取元素名称 String rootAttr=root.attributeValue("version"); //获取元素属性值 String rootText=root.getText(); //获取元素文本内容 //List<Element> elements=root.elements(); //获取子元素 数组 List<Element> elements=root.elements("aaa");//获取子元素 数组 //Element ele1=e.element(); //获取第一个子元素 Element aaa=e.element("aaa"); //获取第一个子元素 叫"aaa"的 for(Element e:elements){ //遍历子元素 if(e.getName().equals("servlet")){ //元素名是否为servlet //获取servlet-name子元素 Element servletName=e.element("servlet-name"); //获取servlet-name子元素 的文本内容 String servletNameText=e.elementText("servlet-name"); //获取servlet-class子元素 Element servletClass=e.element("servlet-class"); System.out.println(servletName.getText()); System.out.println(servletClass.getText()); } } Class c=Class.forName(classText); //通过类全名获取字节码文件 Object obj=c.newInstance(); //创建实例对象 Hello add=(Hello)obj; //对象转型 add.init(); //调用方法 add.service(); } } public class Hello{ public void init(){ System.out.println("servlet初始化"); } public void service(){ System.out.println("servlet业务"); } }