模拟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:
//加入Java开发交流君样:756584822一起吹水聊天
<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表示内容是文本,不能是子标签
属性类型: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>
//加入Java开发交流君样:756584822一起吹水聊天
</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());
}
}//加入Java开发交流君样:756584822一起吹水聊天
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业务");
}
}
来源:oschina
链接:https://my.oschina.net/u/4368960/blog/4863293