目錄
- 系統體系結構
- J2EE
- Servlet
- JSP
- JSP VS Servlet
- XML
系統體系結構
兩層體系結構

缺點:
l client/server結構通常在第一次部署的時候比較容易,但難于升級或改進。
l 經常基于某種專有的協議―通常是某種數據庫協議。
l 它使得重用業務邏輯和界面邏輯非常困難。
l 更重要的是,在Web時代,二層化應用通常不能體現出很好的伸縮性,因而很難適應Internet的要求。
N層體系結構

客戶端/WEB服務層/應用服務層/數據庫服務層
優點:
l 應用程序各部分之間松耦合,從而應用程序各部分的更新相互獨立
l 業務邏輯集中放在服務器上由所有用戶共享,使得系統的維護和更新變得簡單,也更安全。降低了部署與維護的開銷,提高了靈活性、可伸縮性。
l 引入瘦客戶端,計算被集中至服務器端,使性能提高成為可能。數據庫不再和每一個活動的用戶保持一個連接,而是由應用程序組件負責與數據庫打交道,降低數據庫服務器的負擔,提高了性能。
J2EE
J2EE架構

J2EE提供了一套完整的解決所有這些問題的框架方案:
l 提供了分布式、可移植構件的框架
l 為構件與應用服務器提供標準API
l 簡化了服務器端中間層構件的設計
開放的、基于標準的平臺,用以開發、部署和管理N層結構、面向Web的,以服務器為中心的企業級應用
J2EE的13種核心技術
EJB、 CORBA、 RMI、JSP、
Java Servlet、JavaBean、JDBC
XML、JMS……
Servlet
l Servlets(=Server +Applet):是一些運行于Web服務器端的Java小程序,用來擴展Web服務器的功能。
l Servlet是一種擴展Web服務器功能的技術,而且由于它是用Java編寫的,所以能夠訪問整個Java API庫,包括用于訪問企業數據庫的JDBC API。
l Servlets用特定的Java解決方案替代了其它的Web服務器方編程模式(如:CGI,ISAPI等),因而繼承了Java的所有特性(跨平臺、多線程、OO)。
l 用來編寫Servlets的Servlet API對于服務器環境和協議沒有任何特殊的要求,所以Servlets具有很強的可移植性,也不像利用CGI程序等其它方式那樣具有性能局限。
l Servlets也同樣使用HTTP協議與客戶端進行通訊,所以有時也稱Sevlets為“HTTP Servlets”。
與傳統的CGI和許多其他類似CGI的技術相比,Java Servlet具有更高的效率,更容易使用,功能更強大,具有更好的可移植性,更節省投資
l 高效
在傳統的CGI中,每個請求都要啟動一個新的進程,如果CGI程序本身的執行時間較短,啟動進程所需要的開銷很可能反而超過實際執行時間。而在Servlet中,每個請求由一個輕量級的Java線程處理(而不是重量級的操作系統進程)。
在傳統CGI中,如果有N個并發的對同一CGI程序的請求,則該CGI程序的代碼在內存中重復裝載了N次;而對于Servlet,處理請求的是N個線程,只需要一份Servlet類代碼。在性能優化方面,Servlet也比CGI有著更多的選擇,比如緩沖以前的計算結果,保持數據庫連接的活動,等等。
l 方便
Servlet提供了大量的實用工具例程,例如自動地解析和解碼HTML表單數據、讀取和設置HTTP頭、處理Cookie、跟蹤會話狀態等。
l 功能強大
在Servlet中,許多使用傳統CGI程序很難完成的任務都可以輕松地完成。例如,Servlet能夠直接和Web服務器交互,而普通的CGI程序不能。Servlet還能夠在各個程序之間共享數據,使得數據庫連接池之類的功能很容易實現。
l 可移植性好
Servlet用Java編寫,Servlet API具有完善的標準。因此,為I-Planet Enterprise Server寫的Servlet無需任何實質上的改動即可移植到Apache、Microsoft IIS或者WebStar。幾乎所有的主流服務器都直接或通過插件支持Servlet。
l 節省投資
不僅有許多廉價甚至免費的Web服務器可供個人或小規模網站使用,而且對于現有的服務器,如果它不支持Servlet的話,要加上這部分功能也往往是免費的(或只需要極少的投資)。
|
當一個servlet接收來自客戶端的調用請求,它接收兩個對象: 一個是ServletRequest,另外一個是ServletResponse。 這個ServletRequest class 概括從客戶端到服務器之間的聯系, 而 ServletResponse class 概括從servlet 返回客戶端的聯系。
ServletRequest interface 可以獲取到這樣一些信息如由客戶端傳送的闡述名稱,客戶端正在使用的協議, 產生請求并且接收請求的服務器遠端主機名。它也提供獲取數據流的servlet, ServletInputStream,這些數據是客戶端引用中使用HTTP POST 和 PUT 方法遞交的。 一個ServletRequest的子類可以讓 servlet獲取更多的協議特性數據。 例如: HttpServletRequest 包含獲取 HTTP-specific頭部信息的方法。更重要的是,我們能從HttpServletRequest中獲取用戶提交的表單數據。
ServletResponse interface 給出相應客戶端的servlet方法。 它允許servlet 設置內容長度和回應的mime類型, 并且提供輸出流,ServletOutputStream, 通過編寫者可以發回相應數據。 ServletResponse子類可以給出更多 protocol-specific容量的信息。 例如: HttpServletResponse 包含允許servlet 操作HTTP-specific頭部信息的方法。
HttpServletRequest
封裝了客戶端請求的細節
1) 繼承自ServletRequest的方法:
l Object getAttribute(String name) 返回具有指定名字的請求屬性,如果不存在則返回null。屬性可由servlet引擎設置或使用setAttribute()顯式加入。
l Enumeration getAttributeName() 返回請求中所有屬性名的枚舉。如果不存在屬性,則返回一個空的枚舉。
l String getCharacteEncoding() 返回請求所用的字符編碼。
l Int getContentLength() 指定輸入流的長度,如果未知則返回-1。
l ServletInputStream getInputStream()throws IOException 返回與請求相關的(二進制)輸入流。可以調用getInputStream()或getReader()方法之一。
l String getParameter(String name) 返回指定輸入參數,如果不存在,返回null。
l Enumeration getParameterName() 返回請求中所有參數名的一個可能為空的枚舉。
l String[] getParameterValues(String name) 返回指定輸入參數名的取值數組,如果取值不存在則返回null。它在參數具有多個取值的情況下十分有用。
l String get Protocol() 返回請求使用協議的名稱和版本。
l String getScheme() 返回請求URI的子串,但不包含第一個冒號前的內容。
l String getServerName() 返回處理請求的服務器的主機名。
l String getServerPort() 返回接收主機正在偵聽的端口號。
l BufferedReader getReader()throws IOException 返回與請求相關輸入數據的一個字符解讀器。此方法與getInputStream()只可分別調用,不能同時使用。
l String getRemoteAddr() 返回客戶端主機的數字型IP地址。
l String getRemoteHost() 如果知道,返回客戶端主機名。
l void setAttribute(String name,Object obj) 以指定名稱保存請求中指定對象的引用。
l void removeAttribute(String name) 從請求中刪除指定屬性
l Locale getLocale() 如果已知,返回客戶端的第一現場或者為null。
l Enumeration getLocales() 如果已知,返回客戶端的第一現場的一個枚舉,否則返回服務器第一現場。
l boolean isSecure() 如果請求使用了如HTTPS安全隧道,返回true
l RequestDispatcher getRequestDispatcher(String name) 返回指定源名稱的RequsetDispatcher對象。
2) HttpServletRequest自身的方法:
l String getAuthType() 如果servlet由一個鑒定方案所保護,如HTTP基本鑒定,則返回方案名稱。
l String getContextPath() 返回指定servlet上下文(web應用)的URL的前綴。
l Cookie[] getCookies() 返回與請求相關cookie的一個數組。
l Long getDateHeader(String name) 將輸出轉換成適合構建Date對象的long類型取值的getHeader()的簡化版。
l String getHeader(String name) 返回指定的HTTP頭標指。如果其由請求給出,則名字應為大小寫不敏感。
l Enumeration getHeaderNames() 返回請求給出的所有HTTP頭標名稱的權舉值。
l Enumeration getHeaders(String name) 返回請求給出的指定類型的所有HTTP頭標的名稱的枚舉值,它對具有多取值的頭標非常有用。
l int getIntHeader(String name) 將輸出轉換為int取值的getHeader()的簡化版。
l String getMethod() 返回HTTP請求方法(例如GET、POST等等)
l String getPathInfo() 返回在URL中指定的任意附加路徑信息。
l String getPathTranslated() 返回在URL中指定的任意附加路徑信息,被子轉換成一個實際路徑。
l String getQueryString() 返回查詢字符串,即URL中?后面的部份。
l String getRemoteUser() 如果用戶通過鑒定,返回遠程用戶名,否則為null。
l String getRequestedSessionId() 返回客戶端的會話ID
l String getRequestURI() 返回URL中一部分,從“/”開始,包括上下文,但不包括任意查詢字符串。
l String getServletPath() 返回請求URI上下文后的子串
l HttpSession getSession() 調用getSession(true)的簡化版。
l HttpSession getSession(boolean create) 返回當前HTTP會話,如果不存在,則創建一個新的會話,create參數為true。
l Principal getPrincipal() 如果用戶通過鑒定,返回代表當前用戶的java.security.Principal對象,否則為null。
l boolean isRequestedSessionIdFromCookie() 如果請求的會話ID由一個Cookie對象提供,則返回true,否則為false。
l boolean isRequestedSessionIdFromURL() 如果請求的會話ID在請求URL中解碼,返回true,否則為false
l boolean isRequestedSessionIdValid() 如果客戶端返回的會話ID仍然有效,則返回true。
l Boolean isUserInRole(String role) 如果當前已通過鑒定用戶與指定角色相關,則返回true,如果不是或用戶未通過鑒定,則返回false。
HttpServletResponse
將一個servlet生成的結果傳到發出請求的客戶端
1) 繼承自ServletResponse的方法:
l void flushBuffer()throws IOException 發送緩存到客戶端的輸出內容。因為HTTP需要頭標在內容前被發送,調用此方法發送狀態行和響應頭標,以確認請求。
l int getBufferSize() 返回響應使用的緩存大小。如果緩存無效則返加0。
l String getCharacterEncoding() 返回響應使用字符解碼的名字。除非顯式設置,否則為ISO-8859-1
l Locale getLocale() 返回響應使用的現場。除非用setLocale()修改,否則缺省為服務器現場。
l OutputStream getOutputStream()throws IOException 返回用于將返回的二進制輸出寫入客戶端的流,此方法和getWrite()方法二者只能調用其一。
l Writer getWriter()throws IOException 返回用于將返回的文本輸出寫入客戶端的一個字符寫入器,此方法和getOutputStream()二者只能調用其一。
l boolean isCommitted() 如果狀態和響應頭標已經被發回客戶端,則返回true,在響應被確認后發送響應頭標毫無作用。
l void reset() 清除輸出緩存及任何響應頭標。如果響應已得到確認,則引發事件IllegalStateException。
l void setBufferSize(int nBytes) 設置響應的最小緩存大小。實際緩存大小可以更大,可以通過調用getBufferSize()得到。如果輸出已被寫入,則產生IllegalStateException。
l void setContentLength(int length) 設置內容體的長度。
l void setContentType(String type) 設置內容類型。在HTTP servlet中即設置Content-Type頭標。
l void setLocale(Locale locale) 設置響應使用的現場。在HTTP servlet中,將對Content-Type頭標取值產生影響。
2) HttpServletResponse自身的方法:
l void addCookie(Cookie cookie) 將一個Set-Cookie頭標加入到響應。
l void addDateHeader(String name,long date) 使用指定日期值加入帶有指定名字(或代換所有此名字頭標)的響應頭標的方法。
l void setHeader(String name,String value) 設置具有指定名字和取值的一個響應頭標。
l void addIntHeader(String name,int value) 使用指定整型值加入帶有指定名字的響應頭標(或代換此名字的所有頭標)。
l boolean containsHeader(String name) 如果響應已包含此名字的頭標,則返回true。
l String encodeRedirectURL(String url) 如果客戶端不知道接受cookid,則向URL加入會話ID。第一種形式只對在sendRedirect()中使用的URL進行調用。其他被編碼的URLs應被傳遞到encodeURL()
l String encodeURL(String url)
l void sendError(int status) 設置響應狀態碼為指定值(可選的狀態信息)。HttpServleetResponse定義了一個完整的整數常量集合表示有效狀態值。
l void sendError(int status,String msg)
l void setStatus(int status) 設置響應狀態碼為指定指。只應用于不產生錯誤的響應,而錯誤響應使用sendError()。
HttpSession
HttpSession類似于哈希表的接口,它提供了setAttribute()和getAttribute()方法存儲和檢索對象。HttpSession提供了一個會話ID關鍵字,一個參與會話行為的客戶端在同一會話的請求中存儲和返回它。servlet引擎查找適當的會話對象,并使之對當前請求可用。
HttpSession接口中的方法
l Object getAttribute(String name) 將會話中一個對象保存為指定名字,返回或刪除前面保存的此名稱對象。
l void setAttribute(String name,Object value)
l void removeAttribute(String name)
l Enumeration getAttributeName() 返回捆綁到當前會話的所有屬性名的枚舉值。
l long getCreationTime() 返回表示會話創建和最后訪問日期和時間的一個長整型,該整型形式為java.util.Date()構造器中使用的形式。
l long getLastAccessedTime()
l String getId() 返回會話ID,servlet引擎設置的一個唯一關鍵字。
l ing getMaxInactiveInterval() 如果沒有與客戶端發生交互,設置和返回會話存活的最大秒數。
l void setMasInactiveInterval(int seconds)
l void invalidate() 使得會話被終止,釋放其中任意對象。
l boolean isNew() 如果客戶端仍未加入到會話,返回true。當會話首次被創建,會話ID被傳入客戶端,但客戶端仍未進行包含此會話ID的第二次請示時,返回true。
ServletConfig
通過servlet還可以獲得ServletConfig對象,一個ServletConfig對象是servlet container在servlet initialization的時候傳遞給servlet的。其中包含ServletContext 和 一些 來自于配置描述的 名稱/值 對。ServletContext接口封裝了Web應用程序的上下文概念。
l Object getAttribute(String name) 返回servlet上下文中具有指定名字的對象,或使用已指定名捆綁一個對象。從Web應用的標準觀點看,這樣的對象是全局對象,因為它們可以被同一servlet在另一時刻訪問。或上下文中任意其他servlet訪問。
l void setAttribute(String name,Object obj) 設置servlet上下文中具有指定名字的對象。
l Enumeration getAttributeNames() 返回保存在servlet上下文中所有屬性名字的枚舉。
l ServletContext getContext(String uripath) 返回映射到另一URL的servlet上下文。在同一服務器中URL必須是以“/”開頭的絕對路徑。
l String getInitParameter(String name) 返回指定上下文范圍的初始化參數值。此方法與ServletConfig方法名稱不一樣,后者只應用于已編碼的指定servlet。此方法應用于上下文中所有的參數。
l Enumeration getInitParameterNames() 返回(可能為空)指定上下文范圍的初始化參數值名字的枚舉值。
l int getMajorVersion() 返回此上下文中支持servlet API級別的最大和最小版本號。
l int getMinorVersion()
l String getMimeType(String fileName) 返回指定文件名的MIME類型。典型情況是基于文件擴展名,而不是文件本身的內容(它可以不必存在)。如果MIME類型未知,可以返回null。
l RequestDispatcher getNameDispatcher(String name) 返回具有指定名字或路徑的servlet或JSP的RequestDispatcher。如果不能創建RequestDispatch,返回null。如果指定路徑,必須心“/”開頭,并且是相對于servlet上下文的頂部。
l RequestDispatcher getNameDispatcher(String path)
l String getRealPath(String path) 給定一個URI,返回文件系統中URI對應的絕對路徑。如果不能進行映射,返回null。
l URL getResource(String path) 返回相對于servlet上下文或讀取URL的輸入流的指定絕對路徑相對應的URL,如果資源不存在則返回null。
l InputStream getResourceAsStream(String path)
l String getServerInfo() 返順servlet引擎的名稱和版本號。
l void log(String message)
l void log(String message,Throwable t) 將一個消息寫入servlet注冊,如果給出Throwable參數,則包含棧軌跡。
l void removeAttribute(String name) 從servlet上下文中刪除指定屬性。
示例
JSP
JSP的基礎知識
__
_____ | directive (指令)
| |-- scripting (腳本)
JSP -------| |__ action (動作)
|
|_____Template data :除JSP語法外,JSP引擎不能解讀的東西
在JSP中使用的directive(指令):
l page指令
功能:設定整個JSP網頁的屬性和相關功能。
語法:<%@ page attribute1="value1" attribute2="value2" %>
標簽元素:
page指令元素的屬性
language="language" 指定JSP Container要用什么語言來編譯JSP網頁。目前只可以使用Java語言,不過不排除增加其它語言。默認值為Java。
extends="className" 定義此JSP頁面產生的Servlet是繼承自哪個父類。必須為實現HttpJspPage接口的類。JSP規范對不完全理解其隱意的情況下使用此屬性提出警告。
import ="importList" 定義此JSP頁面可以使用哪些Java API。用逗號分隔列出一個或多個全質類名。此列表用于在生成的 java servlet中創建相應的導入語句。以下包是自動包含的,不必被指出:java.lang.*;java.servlet.*; java.servlet.jsp.*;java.servlet.htt.*
session="true|false" 指明JSP頁面是否需要一個HTTP會話,如果為true,那么產生的servlet將包含創建一個HTTP會話(或訪問一個HTTP會話)的代碼,缺省為true。
buffer="none|size in kb" 指定輸出流緩存的大小。有效值是nkb或沒有。缺省為8kb。
authflush="true|false: 決定輸出流的緩沖區是否要自動清除。當值為true時緩存滿時將被自動刷新,當值為false時,緩沖區滿會拋出溢出異常。缺省值為true。
isThreadSafe ="true" 此JSP頁面能處理來自多個線程的同步請求,此值為true,否則為false,生成的servlet表明它實現了 SingleThreadMode接口。SingleThreadMode已經聲明不贊成使用(deprecate)
info="text" 表示此JSP頁面的相關信息,由getServletInfo()方法返回的。
isErrorPage ="true|false" 如果此頁面被用作處理異常錯誤的頁面,則為true。在這種情況下,頁面可被指定為另一頁面page指令元素中 errorPage屬性的取值。指定此屬性為true將使exception隱含變量對此頁面可用。缺省值為false。
errorPage="error_url" 表示如果發生異常錯誤,網頁會被重新指向一個URL頁面。錯誤頁面必須在其page指令元素中指定isErrorPage="true"
contentType="ctinfo" 表示將在生成servlet中使用的MIME類型和可選字符解碼。
pageEncoding="ctinfo" 表示JSP頁面的編碼方式。
isELIgnored="true|false" 表示是否在此JSP網頁中執行或忽略EL表達式。如果為true時JSP Container將忽略EL表達式。
在JSP的任何地方,以任何順序,一個頁面可以包含任意數量的page指令
l include指令
功能:在JSP編譯時插入包含一個文件。包含的過程是靜態的,包含的文件可以是JSP、HTML、文本或是Java程序。
語法:<%@ include file="relativeURLspec" %>
標簽元素:
注意:include指令元素和行為元素主要有兩個方面的不同點。
1.include指令是靜態包含,執行時間是在編譯階段執行,引入的內容為靜態文要,在編譯成servlet時就和包含者融合到一起。所以file不能是一個變量,也不能在file后接任何參數。
2.include行為是動態包含,執行時間是在請求階段執行,引入的內容在執行頁面時被請求時動態生成再包含到頁面中
l taglib指令
功能:使用標簽庫定義新的自定義標簽,在JSP頁面中啟用定制行為。
語法:<%@ taglib uri="tabLibraryURI" prefix"tagPrefix" %>
Scripting(腳本)包括三種類型
l 聲明語法
<%!declaraction %>
聲明變量和方法(函數)
例:
<%!int a, b ; double c ; %>
<%! Circle a = new circle(2.0) ; %>
l 腳本語法
<% scriptlet %>
可以操作聲明、表達式和其他類型合法的代碼段在頁腳本語言
例:
<% String name=null ;
If (request.getParmeter("name")==null){
…….
}
%>
l 表達式語法
<%= expression %>
定義腳本語言表達式
例:
<%= Math.sqrt(2) %>
<%= item[I] %>
<%= a+b+c %>
<%= new java.util.date() %>
action(動作)
標準的動作類型有:
<jsp:useBean>
<jsp:setProperty>
<jsp:getProperty>
<jsp:param>
<jsp:include>
<jsp:forward>
<jsp:plugin>
JSP中的JavaBean
JSP三種bean的類型
頁面bean
會話bean
應用bean
大多數的系統會使用一個會話bean來保持狀態,而對每一個頁面使用一個頁面bean 來對復雜的數據進行表示。
頁面bean是一個模型,而JSP是一個視圖。
Custom tag
bean是信息的攜帶者,
而tag更適用于處理信息。
標記庫包含一個標記庫描述符(TLD)和用于實現Custom tag的Java類
在翻譯階段,JSP容器將使用TLD來驗證頁面中的所有的tag是否都被正確的使用。
標記處理程序只是一個簡單的適配器,而真正的邏輯是在另一個類中實現的,標記處理程序只是提供了一個供其他的可復用的類的JSP接口
示例
Model1
Model 1結構圖
mode1 1是一個以JSP文件為中心的模式,在這種模式中JSP頁面不僅負責表現邏輯,也負責控制邏輯。專業書籍上稱之為邏輯耦合在頁面中,這種處理方式,對一些規模很小的項目如:一個簡單的留言簿,也沒什么太大的壞處,實際上,人們開始接觸一些對自己來說是新的東西的時候,比如,用JSP訪問數據庫時,往往喜歡別人能提供一個包含這一切的單個JSP頁面,因為這樣在一個頁面上他就可以把握全局,便于理解。但是,用Model 1模式開發大型時,程序流向由一些互相能夠感知的頁面決定,當頁面很多時要清楚地把握其流向將是很復雜的事情,當您修改一頁時可能會影響相關的很多頁面,大有牽一發而動全身的感覺,使得程序的修改與維護變得異常困難;還有一個問題就是程序邏輯開發與頁面設計糾纏在一起,既不便于分工合作也不利于代碼的重用,這樣的程序其健壯性和可伸縮性都不好。
Model2

Model 2結構圖
Struts
WebWork
JSP VS Servlet
相似:
l 兩者都是基于Java的技術,所以都繼承了Java的所有特性(跨平臺、多線程、OO ),都可以使用Java強大的API。
l 兩者工作方式相似:JSP代碼先被JSP容器轉換為Servlet代碼再編譯為類。
l 兩者在J2EE體系結構中的工作層次相同,都負責與客戶端的連接。
不同:
l 編程方式不同。Servlets是一些運行于Web服務器端的Java小程序;而JSP是腳本,編寫起來更簡單容易。
l 應用目的不同。Servlet主要用于從客戶端接收請求信息,而JSP主要負責將服務器端信息傳送到客戶端。
l 使用JSP的真正意義在于:可以將界面設計和業務邏輯設計分離。
XML
XML基礎知識
簡介
XML是一種標記語言,設計用來描述數據(HTML設計用顯示數據),沒有預定義的標簽,它用Document Type Definition (DTD)或XML Schema描述數據,XML(帶著DTD或XML Schema )被設計成自描述的。
XML不是無所不能的,它只是用來描述數據的,至于數據如何顯示、或傳輸、或處理,那是別的程序或語言的事。
哪些用途
XML語法
XML文件的開頭,要用一個聲明行如:
<?xml version="1.0" encoding="ISO-8859-1"?>,用以說明版本和編碼。
XML的所有元素都必須有一個結束標簽,標簽大小寫敏感,標簽嵌套必須準確,每個XML文件必須有一個根元素,屬性值必須用雙/單引號括起(要成對使用),XML中的空格被保留,新起一行的回車換行統一用換行符一個,XML中的注釋跟HTML一樣。
XML元素
一個XML元素包括開始標簽和結束標簽以及它們之間的內容,可動態擴展,有父子關系或兄弟關系。一個元素的內容可以為空。
命名一個元素的要求:不能以數字、標點和XML(三個字符的大小組合,順序不變)開頭,不能有空格,由字母、數字或其它符構成的字符串。
不建議含有-或.或:或非英語字符,建議名字長度不要太長且要用描述性。
XML元素屬性
元素開始標簽中可以含有屬性,用以補充說明元素,但屬性的值可以用來描述數據內容,但盡量不要這么用而盡可能地用子元素來完成這個任務。
用屬性存放數據有以下弊端:不能含有多個值,不易擴展、不能描述數據結構、程序難以處理、不能用DTD來進行檢查。
這個作者習慣有一個例外,就是ID或名,可以放在屬性里。
XML檢查
一個好的XML文件,合于語法和DTD描述。
DTD定義了XML的合法元素,XML Schema是基于XML的DTD的替代物。
XML的錯誤,會終止處理程序。
IE和NetScape對XML的支持
瀏覽器中顯示XML文件,當XML有錯誤時會提示。
現實生活中的XML
命名空間
提供了一種避免元素命名沖突的機制。通過在元素名前增加一個前綴來區分不同的元素,同時在開始標簽中增xmlns屬性來描述不同的URI指定的命名空間。例如:
<f:table xmlns:f="http://www.w3schools.com/furniture">......</table>
<h:table xmlns:h="http://www.w3.org/TR/html4/">......</table>
xmlns屬性的語法是:
xmlns:namespace-prefix="namespace"
需要說明的是,這里的URL(即要求的URI)只是用來區別空間的不同,并不要求從那取得什么數據。
xmlns在現實中的典型應用是xsl,每個xsl中的非HTML標簽都要指明xmlns.
CDATA
除了CDATA片斷外,一個XML文檔中所有文本都要經過解析器解析,即使是兩個標簽中間的數據也不例外,這是因為標簽可以嵌套的緣故。
XML預定義了五個特殊字符,如下表所示,當在數據中出現這幾字符時,需要用一個串來代替,其中前兩個是必須的,后三個是建議的。
< < less than
> > greater than
& & ampersand
' ' apostrophe
" " quotation mark
一個CDATA片斷,由""結束,所以其中間的內容不能含有"]]>"字符串。
XML文檔編碼
在xml文檔第一行聲明中,指明文檔所用的編碼,如例:
<?xml version="1.0" encoding="UTF-8"?>
需要注意的是,所用文本編輯器要要可以指定編碼(如win2K的notepad),然后利用encoding屬性指明所用的編碼。win95/98的Notepad可不行。
IE5以上可支持XMLHTTP請求。
引用兩段javascript代碼,供參考吧。
var objHTTP = new ActiveXObject("Microsoft.XMLHTTP")
objHTTP.Open('GET','httprequest.asp',false)
objHTTP.Send()
......
document.all['A1'].innerText= objHTTP.status
document.all['A2'].innerText= objHTTP.statusText
document.all['A3'].innerText= objHTTP.responseText
這樣一來,跟服務器打交道,來去都可用XML了。
posted on 2008-09-09 11:25
黃小二 閱讀(569)
評論(0) 編輯 收藏 所屬分類:
J2EE