模擬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業務");
}
}