傳統(tǒng)上,Hibernate的配置依賴于外部 XML 文件:數(shù)據(jù)庫映射被定義為一組 XML 映射文件,并且在啟動(dòng)時(shí)進(jìn)行加載。創(chuàng)建這些映射有很多方法,可以從已有數(shù)據(jù)庫模式或Java類模型中自動(dòng)創(chuàng)建,也可以手工創(chuàng)建。無論如何,您最終將獲得大量的 Hibernate 映射文件。此外,還可以使用工具,通過javadoc樣式的注釋生成映射文件,盡管這樣會(huì)給您的構(gòu)建過程增加一個(gè)步驟。
在最近發(fā)布的幾個(gè)Hibernate版本中,出現(xiàn)了一種基于 Java 5 注釋的更為巧妙的新方法。借助新的 Hibernate Annotation 庫,即可一次性地分配所有舊映射文件——一切都會(huì)按照您的想法來定義——注釋直接嵌入到您的 Java 類中,并提供一種強(qiáng)大及靈活的方法來聲明持久性映射。籍由自動(dòng)代碼完成和語法突出顯示功能,最近發(fā)布的Java IDE也為其提供了有力的支持。
Hibernate Annotation還支持新的 EJB 3 持久性規(guī)范。這些規(guī)范旨在提供一種標(biāo)準(zhǔn)化的 Java 持久性機(jī)制。由于 Hibernate 3 還提供了一些擴(kuò)展,因此您可以十分輕松地遵從這些標(biāo)準(zhǔn),并使用 EJB 3 編程模型來對(duì) Hibernate 持久層進(jìn)行編碼。
現(xiàn)在,讓我們來動(dòng)手使用Hibernate Annotation。
要使用 Hibernate Annotation,您至少需要具備 Hibernate 3.2和Java 5。可以從 Hibernate 站點(diǎn) 下載 Hibernate 3.2 和 Hibernate Annotation庫。除了標(biāo)準(zhǔn)的 Hibernate JAR 和依賴項(xiàng)之外,您還需要 Hibernate Annotations .jar 文件(hibernate-annotations.jar)、Java 持久性 API (lib/ejb3-persistence.jar)。如果您正在使用 Maven,只需要向 POM 文件添加相應(yīng)的依賴項(xiàng)即可,如下所示:
...org.hibernate hibernate 3.2.1.ga org.hibernate hibernate-annotations 3.2.0.ga ... javax.persistence persistence-api 1.0
下一步就是獲取 Hibernate 會(huì)話工廠。盡管無需驚天的修改,但這一工作與使用 Hibernate Annotations有所不同。您需要使用 AnnotationConfiguration 類來建立會(huì)話工廠:
sessionFactory = new
AnnotationConfiguration().buildSessionFactory();
盡管通常使用
近期的許多 Java 項(xiàng)目都使用了輕量級(jí)的應(yīng)用框架,例如 Spring。如果您正在使用 Spring 框架,可以使用 AnnotationSessionFactoryBean 類輕松建立一個(gè)基于注釋的 Hibernate 會(huì)話工廠,如下所示:
org.hibernate.dialect.DerbyDialect create ...
com.onjava.modelplanes.domain.PlaneType com.onjava.modelplanes.domain.ModelPlane ...
既然已經(jīng)知道了如何獲得注釋所支持的 Hibernate 會(huì)話,下面讓我們來了解一下帶注釋的持久性類的情況:
像在其他任何 Hibernate應(yīng)用程序中一樣,帶注釋的持久性類也是普通 POJO。差不多可以說是。您需要向 Java 持久性 API (javax.persistence.*)添加依賴項(xiàng),如果您正在使用任何特定于 Hibernate的擴(kuò)展,那很可能就是 Hibernate Annotation 程序包(org.hibernate.annotations.*),但除此之外,它們只是具備了持久性注釋的普通 POJO 。下面是一個(gè)簡(jiǎn)單的例子:
@Entity public class ModelPlane { private Long id; private String name; @Id public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
正像我們所提到的,這非常簡(jiǎn)單。@Entity 注釋聲明該類為持久類。@Id 注釋可以表明哪種屬性是該類中的獨(dú)特標(biāo)識(shí)符。事實(shí)上,您既可以保持字段(注釋成員變量),也可以保持屬性(注釋getter方法)的持久性。后文中將使用基于屬性的注釋。基于注釋的持久性的優(yōu)點(diǎn)之一在于大量使用了默認(rèn)值(最大的優(yōu)點(diǎn)就是 “慣例優(yōu)先原則(convention over configuration)”)。例如,您無需說明每個(gè)屬性的持久性——任何屬性都被假定為持久的,除非您使用 @Transient 注釋來說明其他情況。這簡(jiǎn)化了代碼,相對(duì)使用老的 XML 映射文件而言也大幅地減少了輸入工作量。
Hibernate 能夠出色地自動(dòng)生成主鍵。Hibernate/EBJ 3 注釋也可以為主鍵的自動(dòng)生成提供豐富的支持,允許實(shí)現(xiàn)各種策略。下面的示例說明了一種常用的方法,其中 Hibernate 將會(huì)根據(jù)底層數(shù)據(jù)庫來確定一種恰當(dāng)?shù)逆I生成策略:
@Id @GeneratedValue(strategy=GenerationType.AUTO) public Long getId() { return id; }
默認(rèn)情況下,Hibernate 會(huì)將持久類以匹配的名稱映射到表和字段中。例如,前一個(gè)類可以與映射到以如下代碼創(chuàng)建的表中:
CREATE TABLE MODELPLANE ( ID long, NAME varchar )
如果您是自己生成并維護(hù)數(shù)據(jù)庫,那么這種方法很有效,通過省略代碼可以大大簡(jiǎn)化代碼維護(hù)。然而,這并不能滿足所有人的需求。有些應(yīng)用程序需要訪問外部數(shù)據(jù)庫,而另一些可能需要遵從公司的數(shù)據(jù)庫命名慣例。如果有必要,您可以使用 @Table 和 @Column 注釋來定制您自己的持久性映射,如下所示:
@Entity @Table(name="T_MODEL_PLANE") public class ModelPlane { private Long id; private String name; @Id @Column(name="PLANE_ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Column(name="PLANE_NAME") public String getName() { return name; } public void setName(String name) { this.name = name; } }
該內(nèi)容將映射到下表中:
CREATE TABLE T_MODEL_PLANE ( PLANE_ID long, PLANE_NAME varchar )
也可以使用其他圖和列的屬性來定制映射。這使您可以指定諸如列長(zhǎng)度、非空約束等詳細(xì)內(nèi)容。Hibernate支持大量針對(duì)這些注釋的屬性。下例中就包含了幾種屬性:
... @Column(name="PLANE_ID", length=80, nullable=true) public String getName() { return name; } ...
Java 持久性映射過程中最重要和最復(fù)雜的一環(huán)就是確定如何映射表間的關(guān)系。像其他產(chǎn)品一樣, Hibernate 在該領(lǐng)域中提供了高度的靈活性,但卻是以復(fù)雜度的增加為代價(jià)。我們將通過研究幾個(gè)常見案例來了解如何使用注釋來處理這一問題。
其中一種最常用的關(guān)系就是多對(duì)一的關(guān)系。假定在以上示例中每個(gè) ModelPlane 通過多對(duì)一的關(guān)系(也就是說,每個(gè)飛機(jī)模型只與一種飛機(jī)類型建立聯(lián)系,盡管指定的飛機(jī)類型可以與七種飛機(jī)模型建立聯(lián)系)來與 PlaneType 建立聯(lián)系。可如下進(jìn)行映射:
@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} ) public PlaneType getPlaneType() { return planeType; }
CascadeType 值表明 Hibernate 應(yīng)如何處理級(jí)聯(lián)操作。
另一種常用的關(guān)系與上述關(guān)系相反:一對(duì)多再對(duì)一關(guān)系,也稱為集合。在老式的 Hibernate 版本中進(jìn)行映射或使用注釋時(shí),集合令人頭疼,這里我們將簡(jiǎn)要加以探討,以使您了解如何處理集合,例如,在以上示例中每個(gè) PlaneType 對(duì)象都可能會(huì)包含一個(gè) ModelPlanes 集合。可映射如下:
@OneToMany(mappedBy="planeType", cascade=CascadeType.ALL, fetch=FetchType.EAGER) @OrderBy("name") public ListgetModelPlanes() { return modelPlanes; }
Hibernate 最優(yōu)秀的功能之一就在于它能夠在您的映射文件中聲明命名查詢。隨后即可通過代碼中的名稱調(diào)用此類查詢,這使您可以專注于查詢,而避免了 SQL 或者 HQL 代碼分散于整個(gè)應(yīng)用程序中的情況。
也可以使用注釋來實(shí)現(xiàn)命名查詢,可以使用 @NamedQueries 和 @NamedQuery 注釋,如下所示:
@NamedQueries( { @NamedQuery( name="planeType.findById", query="select p from PlaneType p left join fetch p.modelPlanes where id=:id" ), @NamedQuery( name="planeType.findAll", query="select p from PlaneType p" ), @NamedQuery( name="planeType.delete", query="delete from PlaneType where id=:id" ) } )
一旦完成了定義,您就可以像調(diào)用其他任何其他命名查詢一樣來調(diào)用它們。
Hibernate 3 注釋提供了強(qiáng)大而精致的 API,簡(jiǎn)化了 Java 數(shù)據(jù)庫中的持久性代碼,本文中只進(jìn)行了簡(jiǎn)單的討論。您可以選擇遵從標(biāo)準(zhǔn)并使用 Java 持久性 API,也可以利用特定于 Hibernate的擴(kuò)展,這些功能以損失可移植性為代價(jià)提供了更為強(qiáng)大的功能和更高的靈活性。無論如何,通過消除對(duì) XML 映射文件的需求,Hibernate 注釋將簡(jiǎn)化應(yīng)用程序的維護(hù),同時(shí)也可以使您對(duì)EJB 3 有初步認(rèn)識(shí)。來試試吧!
摘自:http://www.javaeye.com/topic/95822JSON的結(jié)構(gòu)基于下面兩點(diǎn)
這里假設(shè)我們需要?jiǎng)?chuàng)建一個(gè)User對(duì)象,并具有以下屬性
您可以使用以下JSON形式來表示User對(duì)象:
{"UserID":11, "Name":"Truly", "Email":"zhuleipro◎hotmail.com"};
然后如果把這一字符串賦予一個(gè)JavaScript變量,那么就可以直接使用對(duì)象的任一屬性了。
完整代碼:
<script>
var User = {"UserID":11, "Name":"Truly", "Email":"zhuleipro◎hotmail.com"}; alert(User.Name); </script>
實(shí)際使用時(shí)可能更復(fù)雜一點(diǎn),比如我們?yōu)镹ame定義更詳細(xì)的結(jié)構(gòu),使它具有FirstName和LastName:
{"UserID":11, "Name":{"FirstName":"Truly","LastName":"Zhu"}, "Email":"zhuleipro◎hotmail.com"}
完整代碼:
<script>
var User = {"UserID":11, "Name":{"FirstName":"Truly","LastName":"Zhu"}, "Email":"zhuleipro◎hotmail.com"}; alert(User.Name.FirstName); </script>
現(xiàn)在我們?cè)黾右粋€(gè)新的需求,我們某個(gè)頁面需要一個(gè)用戶列表,而不僅僅是一個(gè)單一的用戶信息,那么這里就需要?jiǎng)?chuàng)建一個(gè)用戶列表數(shù)組。
下面代碼演示了使用JSON形式定義這個(gè)用戶列表:
[ {"UserID":11, "Name":{"FirstName":"Truly","LastName":"Zhu"}, "Email":"zhuleipro◎hotmail.com"}, {"UserID":12, "Name":{"FirstName":"Jeffrey","LastName":"Richter"}, "Email":"xxx◎xxx.com"}, {"UserID":13, "Name":{"FirstName":"Scott","LastName":"Gu"}, "Email":"xxx2◎xxx2.com"} ]
完整代碼:
<script> var UserList = [ {"UserID":11, "Name":{"FirstName":"Truly","LastName":"Zhu"}, "Email":"zhuleipro◎hotmail.com"}, {"UserID":12, "Name":{"FirstName":"Jeffrey","LastName":"Richter"}, "Email":"xxx◎xxx.com"}, {"UserID":13, "Name":{"FirstName":"Scott","LastName":"Gu"}, "Email":"xxx2◎xxx2.com"} ]; alert(UserList[0].Name.FirstName); </script>
事實(shí)上除了使用"."引用屬性外,我們還可以使用下面語句:
alert(UserList[0]["Name"]["FirstName"]); 或者 alert(UserList[0].Name["FirstName"]);
現(xiàn)在讀者應(yīng)該對(duì)JSON的使用有點(diǎn)認(rèn)識(shí)了,歸納為以下幾點(diǎn):
小節(jié):
本文通過一個(gè)實(shí)例演示,初步了解了JSON 的強(qiáng)大用途。可以歸結(jié)如下:
前提 OS: WIN2000
tomcat已經(jīng)配置好(tomcat可以到http://jakarta.apache.org/tomcat 下載)
開始實(shí)戰(zhàn)啦
1.準(zhǔn)備jstl
到http://apache.towardex.com/jakarta/taglibs/standard/下載jakarta-taglibs-standard-current.zip
解壓后成為jakarta-taglibs-standard-1.1.1
2.準(zhǔn)備web開發(fā)目錄
比如我的web目錄為h:\webapp\myweb\(當(dāng)然可以把你的web應(yīng)用放在%tomcat_home%\webapps\),稱為工作目錄Working folder,在工作目錄h:\webapp\myweb\下建立WEB-INF\lib,WEB-INF\classes
3.拷貝.jar文件
將jakarta-taglibs-standard-1.1.1\lib\下的兩個(gè)jar文件:standard.jar和jstl.jar文件拷貝到\WEB-INF\lib\下
4.拷貝.tld文件
將jakarta-taglibs-standard-1.1.1\tld\下的8個(gè)tld類型文件拷到"Working folder\WEB-INF\"下
5.在\WEB-INF\下建立web.xml文件:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>
<taglib-location>/WEB-INF/fmt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/fmt-rt</taglib-uri>
<taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/core</taglib-uri>
<taglib-location>/WEB-INF/c.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/core-rt</taglib-uri>
<taglib-location>/WEB-INF/c-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>
<taglib-location>/WEB-INF/sql.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/sql-rt</taglib-uri>
<taglib-location>/WEB-INF/sql-rt.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/x</taglib-uri>
<taglib-location>/WEB-INF/x.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>http://java.sun.com/jstl/x-rt</taglib-uri>
<taglib-location>/WEB-INF/x-rt.tld</taglib-location>
</taglib>
</web-app>
6.建立一個(gè)名為test.jsp文件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ page contentType="text/html;charset=GB2312" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>測(cè)試你的第一個(gè)使用到JSTL 的網(wǎng)頁</title>
</head>
<body>
<c:out value="歡迎測(cè)試你的第一個(gè)使用到JSTL 的網(wǎng)頁"/>
</br>你使用的瀏覽器是:</br>
<c:out value="${header['User-Agent']}"/>
<c:set var="a" value="David O'Davies" />
<c:out value="David O'Davies" escapeXml="true"/>
</body>
</html>
7.開啟tomcat,進(jìn)行調(diào)試,我的輸出結(jié)果是
歡迎測(cè)試你的第一個(gè)使用到JSTL 的網(wǎng)頁
你使用的瀏覽器是:
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) David O'Davies
轉(zhuǎn)載:http://blog.csdn.net/mtzai/archive/2009/05/24/4212490.aspx
在大多數(shù)情況下,為事件處理函數(shù)返回false,可以防止默認(rèn)的事件行為.例如,默認(rèn)情況下點(diǎn)擊一個(gè)<a>元素,頁面會(huì)跳轉(zhuǎn)到該元素href屬性指定的頁.
Return False 就相當(dāng)于終止符,Return True 就相當(dāng)于執(zhí)行符。
在js中return false的作用一般是用來取消默認(rèn)動(dòng)作的。比如你單擊一個(gè)鏈接除了觸發(fā)你的
onclick時(shí)間(如果你指定的話)以外還要觸發(fā)一個(gè)默認(rèn)事件就是執(zhí)行頁面的跳轉(zhuǎn)。所以如果
你想取消對(duì)象的默認(rèn)動(dòng)作就可以return false。return false應(yīng)用比較多的場(chǎng)合有:
<form name="form1" onsubmIT="return youfunction();">...... </form>
<a href="www.***.com" onclick="...;return false;">dddd </a> .
<script>
function test()
{
alert("test");
return false();
}
</script>
</head>
<body>
1, <a href='a.JSP' onclick='test();'>超級(jí)鏈接 </a>
2, <input type="button" onclick='test()' value="提交">
3, <form name="form1" onsubmIT="return test();">
內(nèi)容
<input type="submIT" value="提交">
</form>
</body>
<a href="xxxx.do?....." target=dolink>連接abcd </a>
<iframe id=dolink src=about:blank style=display:none> </iframe>
點(diǎn)了上面的那個(gè)連接后,dolink幀執(zhí)行頁面處理的事情(xxxx.do?...然傳遞參數(shù)到服務(wù)器),頁面不會(huì)跳轉(zhuǎn)。 .
最近做的項(xiàng)目,通過綁定在 button 的 onclick 事件的函數(shù)提交表單。發(fā)現(xiàn) return false 也是很重要的。比如:
<input type="submit" onclick="submitAction(); return false;" />
submitAction 方法里面有提交表單的動(dòng)作。如果不加 return false,在執(zhí)行完 submitAction 之后,submit 按鈕還會(huì)繼續(xù)執(zhí)行它的默認(rèn)事件,就會(huì)再次提交表單。這可能就是很多錯(cuò)誤的根源。
的確,return false的含義不是阻止事件繼續(xù)向頂層元素傳播,而是阻止瀏覽器對(duì)事件的默認(rèn)處理。你可以這樣試驗(yàn):首先將所有的js腳本注釋掉,在IE瀏覽器中嘗試拖動(dòng)一下圖片,你會(huì)發(fā)現(xiàn)鼠標(biāo)會(huì)成為禁止操作的樣式,圖片是被禁止拖動(dòng)的,它是瀏覽器針對(duì)mousemove事件所提供的默認(rèn)行為。return false就是為了去掉這種行為,否則就會(huì)出現(xiàn)你描述的中斷事件連續(xù)執(zhí)行。
另外,和return false等效的語句為:window.event.returnValue = false,你可以把return false替換為此語句并進(jìn)行驗(yàn)證。
最后說明一下,此種方式只適用于IE瀏覽器。
<html>
<head>
<script language="javascript">
function verifyForm(){
var ass=document.getElementsByName("assetName");
if(ass[0].value.length==0){
alert("名稱輸入為空!");
return false;
}
if(ass[0].value.length>15){
alert("名稱輸入長(zhǎng)度不能超過15個(gè)字符!");
return false;
}
}
</script>
</head>
<body>
<form name="xx">
<input name="assetName" type="text"/>
<--根據(jù)return 返回值的TRUE或FALSE 判定是否提交表單--->
<input type="submit" onclick="return verifyForm()"/>
</form>
</body>
</html>
潛水看了眾大蝦的精彩帖子,今也貢獻(xiàn)一點(diǎn)心得。其聞共欣賞,疑義相與析。有不對(duì)之處請(qǐng)不吝拍磚。
眾所周知,在表單中加上onsubmit="return false;"可以阻止表單提交。
下面是簡(jiǎn)單的一小段代碼:
view plaincopy to clipboardprint?
<form action="index.jsp" method="post" onsubmit="submitTest();;">
<INPUT value="www">
<input type="submit" value="submit">
</form>
<SCRIPT LANGUAGE="JavaScript">
<!--
function submitTest(); {
// 一些邏輯判斷
return false;
}
//-->
</SCRIPT>
<form action="index.jsp" method="post" onsubmit="submitTest();;">
<INPUT value="www">
<input type="submit" value="submit">
</form>
<SCRIPT LANGUAGE="JavaScript">
<!--
function submitTest(); {
// 一些邏輯判斷
return false;
}
//-->
</SCRIPT>
大家判斷像上面的寫法,點(diǎn)擊submit按鈕該表單是否提交?
若答案為是,就不用往下看了。
若答案為否,錯(cuò)了。實(shí)際情況是表單正常提交,若想它不提交,應(yīng)該將
view plaincopy to clipboardprint?
<form action="index.jsp" method="post" onsubmit="submitTest();;">
<form action="index.jsp" method="post" onsubmit="submitTest();;">改為
view plaincopy to clipboardprint?
<form action="index.jsp" method="post" onsubmit="return submitTest();;">
<form action="index.jsp" method="post" onsubmit="return submitTest();;">
為何?
原來onsubmit屬性就像是<form>這個(gè)html對(duì)象的一個(gè)方法名,其值(一字符串)就是其方法體,默認(rèn)返回true;
和Java一樣,在該方法體中你可以寫任意多個(gè)語句,包括內(nèi)置函數(shù)和自定義函數(shù),如
view plaincopy to clipboardprint?
onsubmit="
alert('haha');; // 內(nèi)置函數(shù)
submitTest();; // 自定義函數(shù)
alert(this.tagName);; // 用到了this關(guān)鍵詞
......(任意多條語句);
return false;
"
onsubmit="
alert('haha');; // 內(nèi)置函數(shù)
submitTest();; // 自定義函數(shù)
alert(this.tagName);; // 用到了this關(guān)鍵詞
......(任意多條語句);
return false;
"
就相當(dāng)于
view plaincopy to clipboardprint?
Form.prototype.onsubmit = function(); {
alert('haha');; // 內(nèi)置函數(shù)
submitTest();; // 自定義函數(shù)
alert(this.tagName);; // 用到了this關(guān)鍵詞
......(任意多條語句);
return false;
};
Form.prototype.onsubmit = function(); {
alert('haha');; // 內(nèi)置函數(shù)
submitTest();; // 自定義函數(shù)
alert(this.tagName);; // 用到了this關(guān)鍵詞
......(任意多條語句);
return false;
};
這樣的話你就覆寫了(override)其默認(rèn)方法(默認(rèn)返回true)
大家注意到方法體中可以用this這個(gè)關(guān)鍵詞,這里即代表了<form>的對(duì)象實(shí)例。
經(jīng)過這樣的分析后,以上情況就不難理解了:
view plaincopy to clipboardprint?
<form action="index.jsp" method="post" onsubmit="submitTest();;">
<form action="index.jsp" method="post" onsubmit="submitTest();;">這樣寫,override方法的效果為:
view plaincopy to clipboardprint?
Form.prototype.onsubmit = function(); {
submitTest();;
};
Form.prototype.onsubmit = function(); {
submitTest();;
};
在這里submitTest()雖然返回false,但我們只執(zhí)行了此函數(shù),沒有對(duì)其結(jié)果進(jìn)行任何處理。而
view plaincopy to clipboardprint?
<form action="index.jsp" method="post" onsubmit="return submitTest();;">
<form action="index.jsp" method="post" onsubmit="return submitTest();;">
override方法的效果為:
view plaincopy to clipboardprint?
Form.prototype.onsubmit = function(); {
return submitTest();;
};
Form.prototype.onsubmit = function(); {
return submitTest();;
};
這樣,我們利用到了它的返回值,達(dá)到了預(yù)期效果。
這樣理解的話我想印象會(huì)深刻得多,就不易出錯(cuò)了
結(jié)論:
我們可以用Java里的思維方式來思考模擬JavaScript中的類似情況(JavaScript中基于prototype的面向?qū)ο蠹夹g(shù)也確實(shí)是這樣做的),但他們畢竟還是有本質(zhì)上的區(qū)別,如Java是強(qiáng)類型的,有嚴(yán)格的語法限制,而JavaScript是松散型的。象上述方法:
view plaincopy to clipboardprint?
Form.prototype.onsubmit = function(); {
};
Form.prototype.onsubmit = function(); {
};
既可以有返回值,又可以沒有返回值,在Java里是通不過的,畢竟Java里面不能靠方法的返回值不同來重載(overload)方法,而JavaScript中的重載要松散得多。
一、 簡(jiǎn)單的對(duì)比
request.getParameter用的比較多,相對(duì)熟悉
request.getParameterValues(String name)是獲得如checkbox類(名字相同,但值有多個(gè))的數(shù)據(jù)。 接收數(shù)組變量 ,如checkobx類型
request.getParameter(String name)是獲得相應(yīng)名的數(shù)據(jù),如果有重復(fù)的名,則返回第一個(gè)的值 . 接收一般變量 ,如text類型
例:
1. 三個(gè)名字相同的text標(biāo)簽
<input type="text" name="test" value="1" />
<input type="text" name="test" value="2" />
<input type="text" name="test" value="3" />
request.getParameterValues("test") ----------------- [1, 2, 3]
request.getParameter("test") ------------------ 1
${paramValues.test}
${param.test}
2. checkbox
<input type="checkbox" name="habit" value="read">看書
<input type="checkbox" name="habit" value="movie">電影
<input type="checkbox" name="habit" value="game">游戲
request.getParameterValues("habit")
二、與此相關(guān)的話題------隱含對(duì)象
1. JSP隱含對(duì)象(Implicit Object)
所謂隱含對(duì)象,是指當(dāng)編寫jsp網(wǎng)頁時(shí),不必做任何聲明就可以直接使用的對(duì)象。 JSP2.0定義了九個(gè)隱含對(duì)象
request response pageContext session application out conifg page exception
這里只提一下request 和 response 兩個(gè)對(duì)象
request 對(duì)象表示客戶端請(qǐng)求的內(nèi)容,比如我們從request中取得了用戶輸入的內(nèi)容,實(shí)現(xiàn)了javax.servlet.http.HttpServletRequest接口
response對(duì)象表示響應(yīng)客戶端的結(jié)果。
上面我們使用了request的兩個(gè)方法getParameter 和 getParameterValues,其實(shí)request還有其他幾個(gè)比較重要的方法,這里只涉及幾個(gè)獲取請(qǐng)求參數(shù)的方法
String getParameter(String name) 取得name的參數(shù)值
String[] getParameterValues(String name) 取得所有name的參數(shù)值
Enumeration getParameterNames() 取得所有的參數(shù)名稱
Map<String, String[]> getParameterMap() 取得request的所有參數(shù)的一個(gè)映射
//
Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.
Returns:
an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.
//
response等其他幾個(gè)隱含對(duì)象也有非常重要的身份,有機(jī)會(huì)專門整理一下,宣揚(yáng)一下它們的顯赫地位。
2. EL隱含對(duì)象
EL即Experssion Language,自JSP2.0后正式成為JSP的標(biāo)準(zhǔn)規(guī)范之一,支持Servlet2.4/JSP2.0的Container也就相應(yīng)的支持EL語法。
一個(gè)常見的形式如,<c:out value="${ 3 + 7 * 4}" />
EL的隱藏對(duì)象有11個(gè) PageContext PageScope RequestScope sessionScope applicationScope
param paramValues header headerValues cookie initParam
其中param 和 paramValues即對(duì)相應(yīng)ServletRequest.getParameter(String name)和ServletRequest.getParameterValues(String name)
轉(zhuǎn)載:http://blog.csdn.net/moreorless/archive/2009/05/18/4199677.aspx
轉(zhuǎn)載:http://www.sucai.com/Tech/List2/17830.htm
javascript是弱類型的語言,所以強(qiáng)制類型轉(zhuǎn)換還是比較重要的,下面看一下它的幾個(gè)強(qiáng)制轉(zhuǎn)換的函數(shù):
1. Boolean(value):把值轉(zhuǎn)換成Boolean類型;
2. Nnumber(value):把值轉(zhuǎn)換成數(shù)字(整型或浮點(diǎn)數(shù));
3. String(value):把值轉(zhuǎn)換成字符串。
我們先來看Boolean():在要轉(zhuǎn)換的值為“至少有一字符的字符串”、“非0的數(shù)字”或“對(duì)象”,那么Boolean()將返回true,如果要轉(zhuǎn)換的值為“空字符串”、“數(shù)字0”、“undefined”,“null”這些話,那么Boolean()會(huì)返回false。你可以用以下代碼來測(cè)試
var t1 = Boolean("");//返回false,空字符串
var t2 = Boolean("s");//返回true,非空字符串
var t3 = Boolean(0);//返回false,數(shù)字0
var t3 = Boolean(1),t4 = Boolean(-1);//返回true,非0數(shù)字
var t5 = Boolean(null),t6 = Boolean(undefined);//返回false
var t7 = Boolean(new Object());//返回true,對(duì)象
再來看看Number():Number()與parseInt()和parseFloat()類似,它們區(qū)別在于Number()轉(zhuǎn)換是整個(gè)值,而parseInt()和parseFloat()則可以只轉(zhuǎn)換開頭的數(shù)字部分,例如:Number("1.2.3"),Number("123abc")會(huì)返回NaN,而parseInt("1.2.3")返回1、parseInt("123abc")返回123、parseFloat("1.2.3")返回1.2、parseFloat("123abc")返回123。Number()會(huì)先判斷要轉(zhuǎn)換的值能否被完整的轉(zhuǎn)換,然后再判斷是調(diào)用parseInt()或parseFloat()。下面列了一些值調(diào)用Number()之后的結(jié)果:
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number("1.2") 1.2
Number("12") 12
Number("1.2.3") NaN
Number(new Object()) NaN
Number(123) 123
最后是String():這個(gè)以比較簡(jiǎn)單了,它可以把所有類型的數(shù)據(jù)轉(zhuǎn)換成字符串,如:String(false)---"false"、String(1)---"1"。它和toString()方法有些不同,區(qū)別在于:
var t1 = null;
var t2 = String(t1);//t2的值 "null"
var t3 = t1.toString();//這里會(huì)報(bào)錯(cuò)
var t4;
var t5 = String(t4);//t5的值 "undefined"
var t6 = t4.toString();//這里會(huì)報(bào)錯(cuò)
DecimalFormat
是 NumberFormat
的一個(gè)具體子類,用于格式化十進(jìn)制數(shù)字。該類設(shè)計(jì)有各種功能,使其能夠分析和格式化任意語言環(huán)境中的數(shù),包括對(duì)西方語言、阿拉伯語和印度語數(shù)字的支持。它還支持不同類型的數(shù),包括整數(shù) (123)、定點(diǎn)數(shù) (123.4)、科學(xué)記數(shù)法表示的數(shù) (1.23E4)、百分?jǐn)?shù) (12%) 和金額 ($123)。所有這些內(nèi)容都可以本地化。
轉(zhuǎn)載:http://zhidao.baidu.com/question/35054792.html
1. 介紹
1)DOM(JAXP Crimson解析器)
DOM是用與平臺(tái)和語言無關(guān)的方式表示XML文檔的官方W3C標(biāo)準(zhǔn)。DOM是以層次結(jié)構(gòu)組織的節(jié)點(diǎn)或信息片斷的集合。這個(gè)層次結(jié)構(gòu)允許開發(fā)人員在樹中尋找特定信息。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造層次結(jié)構(gòu),然后才能做任何工作。由于它是基于信息層次的,因而DOM被認(rèn)為是基于樹或基于對(duì)象的。DOM以及廣義的基于樹的處理具有幾個(gè)優(yōu)點(diǎn)。首先,由于樹在內(nèi)存中是持久的,因此可以修改它以便應(yīng)用程序能對(duì)數(shù)據(jù)和結(jié)構(gòu)作出更改。它還可以在任何時(shí)候在樹中上下導(dǎo)航,而不是像SAX那樣是一次性的處理。DOM使用起來也要簡(jiǎn)單得多。
2)SAX
SAX處理的優(yōu)點(diǎn)非常類似于流媒體的優(yōu)點(diǎn)。分析能夠立即開始,而不是等待所有的數(shù)據(jù)被處理。而且,由于應(yīng)用程序只是在讀取數(shù)據(jù)時(shí)檢查數(shù)據(jù),因此不需要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中。這對(duì)于大型文檔來說是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來說,SAX還比它的替代者DOM快許多。
選擇DOM還是選擇SAX? 對(duì)于需要自己編寫代碼來處理XML文檔的開發(fā)人員來說, 選擇DOM還是SAX解析模型是一個(gè)非常重要的設(shè)計(jì)決策。 DOM采用建立樹形結(jié)構(gòu)的方式訪問XML文檔,而SAX采用的事件模型。
DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對(duì)樹進(jìn)行遍歷。用DOM解析模型的優(yōu)點(diǎn)是編程容易,開發(fā)人員只需要調(diào)用建樹的指令,然后利用navigation APIs訪問所需的樹節(jié)點(diǎn)來完成任務(wù)。可以很容易的添加和修改樹中的元素。然而由于使用DOM解析器的時(shí)候需要處理整個(gè)XML文檔,所以對(duì)性能和內(nèi)存的要求比較高,尤其是遇到很大的XML文件的時(shí)候。由于它的遍歷能力,DOM解析器常用于XML文檔需要頻繁的改變的服務(wù)中。
SAX解析器采用了基于事件的模型,它在解析XML文檔的時(shí)候可以觸發(fā)一系列的事件,當(dāng)發(fā)現(xiàn)給定的tag的時(shí)候,它可以激活一個(gè)回調(diào)方法,告訴該方法制定的標(biāo)簽已經(jīng)找到。SAX對(duì)內(nèi)存的要求通常會(huì)比較低,因?yàn)樗岄_發(fā)人員自己來決定所要處理的tag。特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)。但用SAX解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問同一個(gè)文檔中的多處不同數(shù)據(jù)。
3)JDOM http://www.jdom.org/
JDOM的目的是成為Java特定文檔模型,它簡(jiǎn)化與XML的交互并且比使用DOM實(shí)現(xiàn)更快。由于是第一個(gè)Java特定模型,JDOM一直得到大力推廣和促進(jìn)。正在考慮通過“Java規(guī)范請(qǐng)求JSR-102”將它最終用作“Java標(biāo)準(zhǔn)擴(kuò)展”。從2000年初就已經(jīng)開始了JDOM開發(fā)。
JDOM與DOM主要有兩方面不同。首先,JDOM僅使用具體類而不使用接口。這在某些方面簡(jiǎn)化了API,但是也限制了靈活性。第二,API大量使用了Collections類,簡(jiǎn)化了那些已經(jīng)熟悉這些類的Java開發(fā)者的使用。
JDOM文檔聲明其目的是“使用20%(或更少)的精力解決80%(或更多)Java/XML問題”(根據(jù)學(xué)習(xí)曲線假定為20%)。JDOM對(duì)于大多數(shù)Java/XML應(yīng)用程序來說當(dāng)然是有用的,并且大多數(shù)開發(fā)者發(fā)現(xiàn)API比DOM容易理解得多。JDOM還包括對(duì)程序行為的相當(dāng)廣泛檢查以防止用戶做任何在XML中無意義的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情況下的錯(cuò)誤)。這也許是比學(xué)習(xí)DOM或JDOM接口都更有意義的工作。
JDOM自身不包含解析器。它通常使用SAX2解析器來解析和驗(yàn)證輸入XML文檔(盡管它還可以將以前構(gòu)造的DOM表示作為輸入)。它包含一些轉(zhuǎn)換器以將JDOM表示輸出成SAX2事件流、DOM模型或XML文本文檔。JDOM是在Apache許可證變體下發(fā)布的開放源碼。
4)DOM4J http://dom4j.sourceforge.net/
雖然DOM4J代表了完全獨(dú)立的開發(fā)結(jié)果,但最初,它是JDOM的一種智能分支。它合并了許多超出基本XML文檔表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文檔或流化文檔的基于事件的處理。它還提供了構(gòu)建文檔表示的選項(xiàng),它通過DOM4J API和標(biāo)準(zhǔn)DOM接口具有并行訪問功能。從2000下半年開始,它就一直處于開發(fā)之中。
為支持所有這些功能,DOM4J使用接口和抽象基本類方法。DOM4J大量使用了API中的Collections類,但是在許多情況下,它還提供一些替代方法以允許更好的性能或更直接的編碼方法。直接好處是,雖然DOM4J付出了更復(fù)雜的API的代價(jià),但是它提供了比JDOM大得多的靈活性。
在添加靈活性、XPath集成和對(duì)大文檔處理的目標(biāo)時(shí),DOM4J的目標(biāo)與JDOM是一樣的:針對(duì)Java開發(fā)者的易用性和直觀操作。它還致力于成為比JDOM更完整的解決方案,實(shí)現(xiàn)在本質(zhì)上處理所有Java/XML問題的目標(biāo)。在完成該目標(biāo)時(shí),它比JDOM更少強(qiáng)調(diào)防止不正確的應(yīng)用程序行為。
DOM4J是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件。如今你可以看到越來越多的Java軟件都在使用DOM4J來讀寫XML,特別值得一提的是連Sun的JAXM也在用DOM4J。
2.. 比較
1)DOM4J性能最好,連Sun的JAXM也在用DOM4J。目前許多開源項(xiàng)目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J來讀取XML配置文件。如果不考慮可移植性,那就采用DOM4J.
2)JDOM和DOM在性能測(cè)試時(shí)表現(xiàn)不佳,在測(cè)試10M文檔時(shí)內(nèi)存溢出。在小文檔情況下還值得考慮使用DOM和JDOM。雖然JDOM的開發(fā)者已經(jīng)說明他們期望在正式發(fā)行版前專注性能問題,但是從性能觀點(diǎn)來看,它確實(shí)沒有值得推薦之處。另外,DOM仍是一個(gè)非常好的選擇。DOM實(shí)現(xiàn)廣泛應(yīng)用于多種編程語言。它還是許多其它與XML相關(guān)的標(biāo)準(zhǔn)的基礎(chǔ),因?yàn)樗将@得W3C推薦(與基于非標(biāo)準(zhǔn)的Java模型相對(duì)),所以在某些類型的項(xiàng)目中可能也需要它(如在JavaScript中使用DOM)。
3)SAX表現(xiàn)較好,這要依賴于它特定的解析方式-事件驅(qū)動(dòng)。一個(gè)SAX檢測(cè)即將到來的XML流,但并沒有載入到內(nèi)存(當(dāng)然當(dāng)XML流被讀入時(shí),會(huì)有部分文檔暫時(shí)隱藏在內(nèi)存中)。
3. 四種xml操作方式的基本使用方法
xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<Result>
<VALUE>
<NO DATE="2005">A1</NO>
<ADDR>GZ</ADDR>
</VALUE>
<VALUE>
<NO DATE="2004">A2</NO>
<ADDR>XG</ADDR>
</VALUE>
</Result>
1)DOM
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;i<nl.getLength();i++){
System.out.print("車牌號(hào)碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2)SAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("運(yùn)行時(shí)間:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("車牌號(hào)碼:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));
}
}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}
}
3) JDOM
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data_10k.xml"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i<allChildren.size();i++) {
System.out.print("車牌號(hào)碼:" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("車主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4)DOM4J
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("data_10k.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
foo = (Element) i.next();
System.out.print("車牌號(hào)碼:" + foo.elementText("NO"));
System.out.println("車主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
要使用dom4j讀寫XML文檔,需要先下載dom4j包,dom4j官方網(wǎng)站在 http://www.dom4j.org/
目前最新dom4j包下載地址:http://nchc.dl.sourceforge.net/sourceforge/dom4j/dom4j-1.6.1.zip
解開后有兩個(gè)包,僅操作XML文檔的話把dom4j-1.6.1.jar加入工程就可以了,如果需要使用XPath的話還需要加入包jaxen-1.1-beta-7.jar.
以下是相關(guān)操作:
一.Document對(duì)象相關(guān)
1.讀取XML文件,獲得document對(duì)象.
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
2.解析XML形式的文本,得到document對(duì)象.
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
3.主動(dòng)創(chuàng)建document對(duì)象.
Document document = DocumentHelper.createDocument();
Element root = document.addElement("members");// 創(chuàng)建根節(jié)點(diǎn)
二.節(jié)點(diǎn)相關(guān)
1.獲取文檔的根節(jié)點(diǎn).
Element rootElm = document.getRootElement();
2.取得某節(jié)點(diǎn)的單個(gè)子節(jié)點(diǎn).
Element memberElm=root.element("member");// "member"是節(jié)點(diǎn)名
3.取得節(jié)點(diǎn)的文字
String text=memberElm.getText();
也可以用:
String text=root.elementText("name");這個(gè)是取得根節(jié)點(diǎn)下的name字節(jié)點(diǎn)的文字.
4.取得某節(jié)點(diǎn)下名為"member"的所有字節(jié)點(diǎn)并進(jìn)行遍歷.
List nodes = rootElm.elements("member");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
// do something
}
5.對(duì)某節(jié)點(diǎn)下的所有子節(jié)點(diǎn)進(jìn)行遍歷.
for(Iterator it=root.elementIterator();it.hasNext();){
Element element = (Element) it.next();
// do something
}
6.在某節(jié)點(diǎn)下添加子節(jié)點(diǎn).
Element ageElm = newMemberElm.addElement("age");
7.設(shè)置節(jié)點(diǎn)文字.
ageElm.setText("29");
8.刪除某節(jié)點(diǎn).
parentElm.remove(childElm);// childElm是待刪除的節(jié)點(diǎn),parentElm是其父節(jié)點(diǎn)
三.屬性相關(guān).
1.取得某節(jié)點(diǎn)下的某屬性
Element root=document.getRootElement();
Attribute attribute=root.attribute("size");// 屬性名name
2.取得屬性的文字
String text=attribute.getText();
也可以用:
String text2=root.element("name").attributeValue("firstname");這個(gè)是取得根節(jié)點(diǎn)下name字節(jié)點(diǎn)的屬性firstname的值.
3.遍歷某節(jié)點(diǎn)的所有屬性
Element root=document.getRootElement();
for(Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text=attribute.getText();
System.out.println(text);
}
4.設(shè)置某節(jié)點(diǎn)的屬性和文字.
newMemberElm.addAttribute("name", "sitinspring");
5.設(shè)置屬性的文字
Attribute attribute=root.attribute("name");
attribute.setText("sitinspring");
6.刪除某屬性
Attribute attribute=root.attribute("size");// 屬性名name
root.remove(attribute);
四.將文檔寫入XML文件.
1.文檔中全為英文,不設(shè)置編碼,直接寫入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();
2.文檔中含有中文,設(shè)置編碼格式寫入的形式.
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK"); // 指定XML編碼
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
writer.write(document);
writer.close();
五.字符串與XML的轉(zhuǎn)換
1.將字符串轉(zhuǎn)化為XML
String text = "<members> <member>sitinspring</member> </members>";
Document document = DocumentHelper.parseText(text);
2.將文檔或節(jié)點(diǎn)的XML轉(zhuǎn)化為字符串.
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
Element root=document.getRootElement();
String docXmlText=document.asXML();
String rootXmlText=root.asXML();
Element memberElm=root.element("member");
String memberXmlText=memberElm.asXML();
六.使用XPath快速找到節(jié)點(diǎn).
讀取的XML文檔示例
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>MemberManagement</name>
<comment></comment>
<projects>
<project>PRJ1</project>
<project>PRJ2</project>
<project>PRJ3</project>
<project>PRJ4</project>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
使用XPath快速找到節(jié)點(diǎn)project.
public static void main(String[] args){
SAXReader reader = new SAXReader();
try{
Document doc = reader.read(new File("sample.xml"));
List projects=doc.selectNodes("/projectDescription/projects/project");
Iterator it=projects.iterator();
while(it.hasNext()){
Element elm=(Element)it.next();
System.out.println(elm.getText());
}
}
catch(Exception ex){
ex.printStackTrace();
}
}