<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 55,comments - 89,trackbacks - 0
    oracle 10g默認(rèn)需要微軟的網(wǎng)絡(luò)適配器配置。新建一個(gè)就行了。
    方法,打開控制面板,選者添加硬件—選擇是,我已經(jīng)連接了此硬件,下一步選者最后一項(xiàng)添加新的硬件設(shè)備,下一步選擇 安裝我手動(dòng)從列表選者的硬件(高級(jí)),下一步選者網(wǎng)絡(luò)適配器,下一步選者M(jìn)icrosoft Loopback
    Adapter,按向?qū)崾鞠乱徊骄托辛恕M瓿梢院蟠蜷_你的網(wǎng)上鄰居看看是不是多了一個(gè)網(wǎng)上連接(2),然后設(shè)置它的IP地址如。192.168.1.1.隨便就行了,這樣在安裝oracle的時(shí)候就可以用這一個(gè)假的網(wǎng)絡(luò)來(lái)連接,蒙騙一下 oracle了。一定可以驗(yàn)證過(guò)去
    posted @ 2012-08-18 13:38 jiafang83 閱讀(915) | 評(píng)論 (0)編輯 收藏
        摘自:http://article.pchome.net/content-330924.html

           在過(guò)去幾年里,Hibernate不斷發(fā)展,幾乎成為Java數(shù)據(jù)庫(kù)持久性的事實(shí)標(biāo)準(zhǔn)。它非常強(qiáng)大、靈活,而且具備了優(yōu)異的性能。在本文中,我們將了解如何使用Java 5 注釋來(lái)簡(jiǎn)化Hibernate代碼,并使持久層的編碼過(guò)程變得更為輕松。

      傳統(tǒng)上,Hibernate的配置依賴于外部 XML 文件:數(shù)據(jù)庫(kù)映射被定義為一組 XML 映射文件,并且在啟動(dòng)時(shí)進(jìn)行加載。創(chuàng)建這些映射有很多方法,可以從已有數(shù)據(jù)庫(kù)模式或Java類模型中自動(dòng)創(chuàng)建,也可以手工創(chuàng)建。無(wú)論如何,您最終將獲得大量的 Hibernate 映射文件。此外,還可以使用工具,通過(guò)javadoc樣式的注釋生成映射文件,盡管這樣會(huì)給您的構(gòu)建過(guò)程增加一個(gè)步驟。

      在最近發(fā)布的幾個(gè)Hibernate版本中,出現(xiàn)了一種基于 Java 5 注釋的更為巧妙的新方法。借助新的 Hibernate Annotation 庫(kù),即可一次性地分配所有舊映射文件——一切都會(huì)按照您的想法來(lái)定義——注釋直接嵌入到您的 Java 類中,并提供一種強(qiáng)大及靈活的方法來(lái)聲明持久性映射。籍由自動(dòng)代碼完成和語(yǔ)法突出顯示功能,最近發(fā)布的Java IDE也為其提供了有力的支持。

      Hibernate Annotation還支持新的 EJB 3 持久性規(guī)范。這些規(guī)范旨在提供一種標(biāo)準(zhǔn)化的 Java 持久性機(jī)制。由于 Hibernate 3 還提供了一些擴(kuò)展,因此您可以十分輕松地遵從這些標(biāo)準(zhǔn),并使用 EJB 3 編程模型來(lái)對(duì) Hibernate 持久層進(jìn)行編碼。

      現(xiàn)在,讓我們來(lái)動(dòng)手使用Hibernate Annotation。

    安裝 Hibernate Annotation

      要使用 Hibernate Annotation,您至少需要具備 Hibernate 3.2和Java 5。可以從 Hibernate 站點(diǎn) 下載 Hibernate 3.2 和 Hibernate Annotation庫(kù)。除了標(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ì)話工廠。盡管無(wú)需驚天的修改,但這一工作與使用 Hibernate Annotations有所不同。您需要使用 AnnotationConfiguration 類來(lái)建立會(huì)話工廠:

    sessionFactory = new
    AnnotationConfiguration().buildSessionFactory();

      盡管通常使用 元素來(lái)聲明持久性類,您還是需要在 Hibernate 配置文件(通常是 hibernate.cfg.xml)中聲明持久性類:

    
    
    
    
    
    
    

      近期的許多 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
    ...
    
    
    
    

    第一個(gè)持久性類

      既然已經(jīng)知道了如何獲得注釋所支持的 Hibernate 會(huì)話,下面讓我們來(lái)了解一下帶注釋的持久性類的情況:

      像在其他任何 Hibernate應(yīng)用程序中一樣,帶注釋的持久性類也是普通 POJO。差不多可以說(shuō)是。您需要向 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)”)。例如,您無(wú)需說(shuō)明每個(gè)屬性的持久性——任何屬性都被假定為持久的,除非您使用 @Transient 注釋來(lái)說(shuō)明其他情況。這簡(jiǎn)化了代碼,相對(duì)使用老的 XML 映射文件而言也大幅地減少了輸入工作量。

    生成主鍵

      Hibernate 能夠出色地自動(dòng)生成主鍵。Hibernate/EBJ 3 注釋也可以為主鍵的自動(dòng)生成提供豐富的支持,允許實(shí)現(xiàn)各種策略。下面的示例說(shuō)明了一種常用的方法,其中 Hibernate 將會(huì)根據(jù)底層數(shù)據(jù)庫(kù)來(lái)確定一種恰當(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ù)庫(kù),那么這種方法很有效,通過(guò)省略代碼可以大大簡(jiǎn)化代碼維護(hù)。然而,這并不能滿足所有人的需求。有些應(yīng)用程序需要訪問(wèn)外部數(shù)據(jù)庫(kù),而另一些可能需要遵從公司的數(shù)據(jù)庫(kù)命名慣例。如果有必要,您可以使用 @Table 和 @Column 注釋來(lái)定制您自己的持久性映射,如下所示:

    @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
    )
    

      也可以使用其他圖和列的屬性來(lái)定制映射。這使您可以指定諸如列長(zhǎng)度、非空約束等詳細(xì)內(nèi)容。Hibernate支持大量針對(duì)這些注釋的屬性。下例中就包含了幾種屬性:

     ...
    @Column(name="PLANE_ID", length=80, nullable=true)
    public String getName() {
    return name;
    }
    ...
    

    映射關(guān)系

      Java 持久性映射過(guò)程中最重要和最復(fù)雜的一環(huán)就是確定如何映射表間的關(guān)系。像其他產(chǎn)品一樣, Hibernate 在該領(lǐng)域中提供了高度的靈活性,但卻是以復(fù)雜度的增加為代價(jià)。我們將通過(guò)研究幾個(gè)常見案例來(lái)了解如何使用注釋來(lái)處理這一問(wèn)題。

      其中一種最常用的關(guān)系就是多對(duì)一的關(guān)系。假定在以上示例中每個(gè) ModelPlane 通過(guò)多對(duì)一的關(guān)系(也就是說(shuō),每個(gè)飛機(jī)模型只與一種飛機(jī)類型建立聯(lián)系,盡管指定的飛機(jī)類型可以與七種飛機(jī)模型建立聯(lián)系)來(lái)與 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 List getModelPlanes() {
    return modelPlanes;
    }
    

    命名查詢

      Hibernate 最優(yōu)秀的功能之一就在于它能夠在您的映射文件中聲明命名查詢。隨后即可通過(guò)代碼中的名稱調(diào)用此類查詢,這使您可以專注于查詢,而避免了 SQL 或者 HQL 代碼分散于整個(gè)應(yīng)用程序中的情況。

      也可以使用注釋來(lái)實(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)用其他任何其他命名查詢一樣來(lái)調(diào)用它們。

    結(jié)束語(yǔ)

      Hibernate 3 注釋提供了強(qiáng)大而精致的 API,簡(jiǎn)化了 Java 數(shù)據(jù)庫(kù)中的持久性代碼,本文中只進(jìn)行了簡(jiǎn)單的討論。您可以選擇遵從標(biāo)準(zhǔn)并使用 Java 持久性 API,也可以利用特定于 Hibernate的擴(kuò)展,這些功能以損失可移植性為代價(jià)提供了更為強(qiáng)大的功能和更高的靈活性。無(wú)論如何,通過(guò)消除對(duì) XML 映射文件的需求,Hibernate 注釋將簡(jiǎn)化應(yīng)用程序的維護(hù),同時(shí)也可以使您對(duì)EJB 3 有初步認(rèn)識(shí)。來(lái)試試吧!

    posted @ 2009-07-26 14:00 jiafang83 閱讀(333) | 評(píng)論 (0)編輯 收藏
    摘自:http://www.javaeye.com/topic/95822

    school和userMember是一對(duì)多關(guān)系:

    SchoolInfo.java

     1import javax.persistence.CascadeType;   
     2import javax.persistence.Column;   
     3import javax.persistence.Entity;   
     4import javax.persistence.FetchType;   
     5import javax.persistence.GeneratedValue;   
     6import javax.persistence.Id;   
     7import javax.persistence.OneToMany;   
     8import javax.persistence.Table;   
     9import javax.persistence.Temporal;   
    10import javax.persistence.TemporalType;   
    11   
    12import org.hibernate.annotations.Formula;   
    13import org.hibernate.annotations.GenericGenerator;   
    14   
    15@Entity   
    16@Table(name = "school_info")   
    17public class SchoolInfo implements java.io.Serializable {   
    18   
    19    @Id   
    20    @GeneratedValue(generator = "system-uuid")   
    21    @GenericGenerator(name = "system-uuid", strategy = "uuid")   
    22    private String id;//hibernate的uuid機(jī)制,生成32為字符串   
    23   
    24    @Column(name = "actcodeId", updatable = false, nullable = true, length = 36)   
    25    private String actcodeId;   
    26   
    27    @Formula("select COUNT(*) from school_info")   
    28    private int count;   
    29   
    30    @Temporal(TemporalType.TIMESTAMP)//不用set,hibernate會(huì)自動(dòng)把當(dāng)前時(shí)間寫入   
    31    @Column(updatable = false, length = 20)   
    32    private Date createTime;   
    33   
    34    @Temporal(TemporalType.TIMESTAMP)   
    35    private Date updateTime;// 剛開始我默認(rèn)insertable=false,但會(huì)讀取出錯(cuò)提示如下:   
    36    // Value '0000-00-00' can not be represented as java.sql.Timestamp   
    37   
    38    // mappedBy="school"就相當(dāng)于inverse=true,(mappedBy指定的是不需要維護(hù)關(guān)系的一端)   
    39    // 應(yīng)該注意的是mappedBy值對(duì)應(yīng)@ManyToOne標(biāo)注的屬性,我剛開始寫成"schoolId",讓我郁悶了好一會(huì) 
    40    @OneToMany(mappedBy = "school", cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = UserMember.class)   
    41    // 用范性的話,就不用targetEntity了   
    42    private List<usermember> users = </usermember>new ArrayList<usermember>();  </usermember> 
    43       
    44}
       
    45

    @GeneratedValue(strategy=GenerationType.AUTO)我們常用的自增長(zhǎng)機(jī)制,我這里采用的是hibernate的uuid生成機(jī)制.
    需要注意的是import javax.xx.Entity ,而不是org.hibernate.xx.Entity。

    郁悶的是我上面用到@Formula,生成的sql竟然是'select COUNT(*) from school_info as formula0_ from school_info schoolinfo0_,當(dāng)然不能執(zhí)行了,尋求正解中~!!!!!!!!!

    UserMember.java(前面引入的包已經(jīng)貼過(guò)了,下面就不貼了)
     1 @Entity   
     2 @Table(name = "teacher_info")//實(shí)體類和數(shù)據(jù)庫(kù)表名不一致時(shí),才用這個(gè)   
     3 public class UserMember implements java.io.Serializable {   
     4    
     5     @Id   
     6     @GeneratedValue(generator = "system-uuid")   
     7     @GenericGenerator(name = "system-uuid", strategy = "uuid")   
     8     private String id;   
     9    
    10     @Column(updatable = false, nullable = false, length = 20)   
    11     private String logonName;   
    12        
    13     @Temporal(TemporalType.TIMESTAMP)   
    14     @Column(updatable = false, length = 20)   
    15     private Date createTime;   
    16    
    17     @Temporal(TemporalType.TIMESTAMP)   
    18     private Date updateTime;   
    19    
    20     @ManyToOne(cascade = { CascadeType.MERGE })   
    21     @JoinColumn(name = "schoolId")   
    22     private SchoolInfo school;   
    23     //注意該類就不用聲明schoolId屬性了,如果不用@JoinColumn指明關(guān)聯(lián)的字段,hibernate默認(rèn)會(huì)是school_id.   
    24    
    25 }   

    posted @ 2009-07-26 13:40 jiafang83 閱讀(3184) | 評(píng)論 (1)編輯 收藏
    posted @ 2009-07-20 22:31 jiafang83 閱讀(257) | 評(píng)論 (0)編輯 收藏
    轉(zhuǎn)載:http://www.cnblogs.com/Truly/archive/2006/12/31/608896.html

    JSON定義

        JSON(JavaScript Object Notation) 是一種輕量級(jí)的數(shù)據(jù)交換格式,易于閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。它基于ECMA262語(yǔ)言規(guī)范(1999-12第三版)中JavaScript編程語(yǔ)言的一個(gè)子集。 JSON采用與編程語(yǔ)言無(wú)關(guān)的文本格式,但是也使用了類C語(yǔ)言(包括C, C++, C#, Java, JavaScript, Perl, Python等)的習(xí)慣,這些特性使JSON成為理想的數(shù)據(jù)交換格式。

    JSON的結(jié)構(gòu)基于下面兩點(diǎn)

    • 1. "名稱/值"對(duì)的集合 不同語(yǔ)言中,它被理解為對(duì)象(object),記錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),鍵列表(keyed list)等
    • 2. 值的有序列表 多數(shù)語(yǔ)言中被理解為數(shù)組(array)
    JSON使用

    JSON以一種特定的字符串形式來(lái)表示 JavaScript 對(duì)象。如果將具有這樣一種形式的字符串賦給任意一個(gè) JavaScript 變量,那么該變量會(huì)變成一個(gè)對(duì)象引用,而這個(gè)對(duì)象就是字符串所構(gòu)建出來(lái)的,好像有點(diǎn)拗口,我們還是用實(shí)例來(lái)說(shuō)明。

     這里假設(shè)我們需要?jiǎng)?chuàng)建一個(gè)User對(duì)象,并具有以下屬性

  • 用戶ID
  • 用戶名
  • 用戶Email

    您可以使用以下JSON形式來(lái)表示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è)頁(yè)面需要一個(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í)上除了使用"."引用屬性外,我們還可以使用下面語(yǔ)句:

    alert(UserList[0]["Name"]["FirstName"]); 或者 alert(UserList[0].Name["FirstName"]); 

    現(xiàn)在讀者應(yīng)該對(duì)JSON的使用有點(diǎn)認(rèn)識(shí)了,歸納為以下幾點(diǎn):

  • 對(duì)象是屬性、值對(duì)的集合。一個(gè)對(duì)象的開始于“{”,結(jié)束于“}”。每一個(gè)屬性名和值間用“:”提示,屬性間用“,”分隔。
  • 數(shù)組是有順序的值的集合。一個(gè)數(shù)組開始于"[",結(jié)束于"]",值之間用","分隔。
  • 值可以是引號(hào)里的字符串、數(shù)字、true、false、null,也可以是對(duì)象或數(shù)組。這些結(jié)構(gòu)都能嵌套。
  • 字符串和數(shù)字的定義和C或Java基本一致。

    小節(jié)

    本文通過(guò)一個(gè)實(shí)例演示,初步了解了JSON 的強(qiáng)大用途。可以歸結(jié)如下:

  • JSON 提供了一種優(yōu)秀的面向?qū)ο蟮姆椒ǎ员銓⒃獢?shù)據(jù)緩存到客戶機(jī)上。
  • JSON 幫助分離了驗(yàn)證數(shù)據(jù)和邏輯。
  • JSON 幫助為 Web 應(yīng)用程序提供了 Ajax 的本質(zhì)。
  • posted @ 2009-06-16 01:03 jiafang83 閱讀(330) | 評(píng)論 (0)編輯 收藏
     轉(zhuǎn)載:http://blog.csdn.net/sdlcn/

    前提 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)頁(yè)</title>
    </head>
    <body>
    <c:out value="歡迎測(cè)試你的第一個(gè)使用到JSTL 的網(wǎng)頁(yè)"/>
    </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)頁(yè)
    你使用的瀏覽器是:
    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) David O'Davies

    posted @ 2009-06-14 18:02 jiafang83 閱讀(855) | 評(píng)論 (0)編輯 收藏

    轉(zhuǎn)載:http://blog.csdn.net/mtzai/archive/2009/05/24/4212490.aspx

    在大多數(shù)情況下,為事件處理函數(shù)返回false,可以防止默認(rèn)的事件行為.例如,默認(rèn)情況下點(diǎn)擊一個(gè)<a>元素,頁(yè)面會(huì)跳轉(zhuǎn)到該元素href屬性指定的頁(yè).
     Return False 就相當(dāng)于終止符,Return True 就相當(dāng)于執(zhí)行符。

    在js中return false的作用一般是用來(lái)取消默認(rèn)動(dòng)作的。比如你單擊一個(gè)鏈接除了觸發(fā)你的
    onclick時(shí)間(如果你指定的話)以外還要觸發(fā)一個(gè)默認(rèn)事件就是執(zhí)行頁(yè)面的跳轉(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í)行頁(yè)面處理的事情(xxxx.do?...然傳遞參數(shù)到服務(wù)器),頁(yè)面不會(huì)跳轉(zhuǎn)。    .

    最近做的項(xiàng)目,通過(guò)綁定在 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等效的語(yǔ)句為:window.event.returnValue = false,你可以把return false替換為此語(yǔ)句并進(jìn)行驗(yàn)證。

    最后說(shuō)明一下,此種方式只適用于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)度不能超過(guò)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();;">

    為何?

    原來(lái)onsubmit屬性就像是<form>這個(gè)html對(duì)象的一個(gè)方法名,其值(一字符串)就是其方法體,默認(rèn)返回true;

    和Java一樣,在該方法體中你可以寫任意多個(gè)語(yǔ)句,包括內(nèi)置函數(shù)和自定義函數(shù),如

    view plaincopy to clipboardprint?
    onsubmit="  
        alert('haha');; // 內(nèi)置函數(shù)   
        submitTest();;  // 自定義函數(shù)  
        alert(this.tagName);; // 用到了this關(guān)鍵詞  
        ......(任意多條語(yǔ)句);      
        return false;  

    onsubmit="
        alert('haha');; // 內(nèi)置函數(shù)
        submitTest();;  // 自定義函數(shù)
        alert(this.tagName);; // 用到了this關(guān)鍵詞
        ......(任意多條語(yǔ)句);   
        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)鍵詞  
        ......(任意多條語(yǔ)句);      
        return false;  
    }; 

    Form.prototype.onsubmit = function(); {
        alert('haha');; // 內(nèi)置函數(shù)
        submitTest();;  // 自定義函數(shù)
        alert(this.tagName);; // 用到了this關(guān)鍵詞
        ......(任意多條語(yǔ)句);   
        return false;
    };
    這樣的話你就覆寫了(override)其默認(rèn)方法(默認(rèn)返回true)
    大家注意到方法體中可以用this這個(gè)關(guān)鍵詞,這里即代表了<form>的對(duì)象實(shí)例。

    經(jīng)過(guò)這樣的分析后,以上情況就不難理解了:

    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里的思維方式來(lái)思考模擬JavaScript中的類似情況(JavaScript中基于prototype的面向?qū)ο蠹夹g(shù)也確實(shí)是這樣做的),但他們畢竟還是有本質(zhì)上的區(qū)別,如Java是強(qiáng)類型的,有嚴(yán)格的語(yǔ)法限制,而JavaScript是松散型的。象上述方法:

    view plaincopy to clipboardprint?
    Form.prototype.onsubmit = function(); {    
    }; 

    Form.prototype.onsubmit = function(); { 
    };
    既可以有返回值,又可以沒有返回值,在Java里是通不過(guò)的,畢竟Java里面不能靠方法的返回值不同來(lái)重載(overload)方法,而JavaScript中的重載要松散得多。

    posted @ 2009-06-13 23:52 jiafang83 閱讀(1346) | 評(píng)論 (0)編輯 收藏

    一、 簡(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)頁(yè)時(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語(yǔ)法。

    一個(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

    posted @ 2009-06-12 14:53 jiafang83 閱讀(745) | 評(píng)論 (0)編輯 收藏

    轉(zhuǎn)載:http://www.sucai.com/Tech/List2/17830.htm

    javascript是弱類型的語(yǔ)言,所以強(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)換成字符串。

    我們先來(lái)看Boolean():在要轉(zhuǎn)換的值為“至少有一字符的字符串”、“非0的數(shù)字”或“對(duì)象”,那么Boolean()將返回true,如果要轉(zhuǎn)換的值為“空字符串”、“數(shù)字0”、“undefined”,“null”這些話,那么Boolean()會(huì)返回false。你可以用以下代碼來(lái)測(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ì)象

    再來(lái)看看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ò)

    posted @ 2009-06-09 16:03 jiafang83 閱讀(9629) | 評(píng)論 (2)編輯 收藏
         摘要:   閱讀全文
    posted @ 2009-06-08 14:28 jiafang83 閱讀(2192) | 評(píng)論 (3)編輯 收藏
         摘要:   閱讀全文
    posted @ 2009-06-05 15:52 jiafang83 閱讀(21690) | 評(píng)論 (0)編輯 收藏
         摘要:   閱讀全文
    posted @ 2009-06-02 16:58 jiafang83 閱讀(1741) | 評(píng)論 (0)編輯 收藏
         摘要:   閱讀全文
    posted @ 2009-06-02 16:50 jiafang83 閱讀(1562) | 評(píng)論 (0)編輯 收藏
    轉(zhuǎn)載:http://www.javaeye.com/topic/53526

    1、使用JdbcTemplate的execute()方法執(zhí)行SQL語(yǔ)句
    Java代碼 復(fù)制代碼
    1. jdbcTemplate.execute("CREATE TABLE USER (user_id integer, name varchar(100))");  

    2、如果是UPDATE或INSERT,可以用update()方法。
    Java代碼 復(fù)制代碼
    1. jdbcTemplate.update("INSERT INTO USER VALUES('"  
    2.            + user.getId() + "', '"  
    3.            + user.getName() + "', '"  
    4.            + user.getSex() + "', '"  
    5.            + user.getAge() + "')");  

    3、帶參數(shù)的更新
    Java代碼 復(fù)制代碼
    1. jdbcTemplate.update("UPDATE USER SET name = ? WHERE user_id = ?"new Object[] {name, id});  

    Java代碼 復(fù)制代碼
    1. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)"new Object[] {user.getId(), user.getName(), user.getSex(), user.getAge()});  

    4、使用JdbcTemplate進(jìn)行查詢時(shí),使用queryForXXX()等方法
    Java代碼 復(fù)制代碼
    1. int count = jdbcTemplate.queryForInt("SELECT COUNT(*) FROM USER");  


    Java代碼 復(fù)制代碼
    1. String name = (String) jdbcTemplate.queryForObject("SELECT name FROM USER WHERE user_id = ?"new Object[] {id}, java.lang.String.class);  


    Java代碼 復(fù)制代碼
    1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");  


    Java代碼 復(fù)制代碼
    1. List rows = jdbcTemplate.queryForList("SELECT * FROM USER");   
    2. Iterator it = rows.iterator();   
    3. while(it.hasNext()) {   
    4.     Map userMap = (Map) it.next();   
    5.     System.out.print(userMap.get("user_id") + "\t");   
    6.     System.out.print(userMap.get("name") + "\t");   
    7.     System.out.print(userMap.get("sex") + "\t");   
    8.     System.out.println(userMap.get("age") + "\t");   
    9. }  


       JdbcTemplate將我們使用的JDBC的流程封裝起來(lái),包括了異常的捕捉、SQL的執(zhí)行、查詢結(jié)果的轉(zhuǎn)換等等。spring大量使用Template Method模式來(lái)封裝固定流程的動(dòng)作,XXXTemplate等類別都是基于這種方式的實(shí)現(xiàn)。
        除了大量使用Template Method來(lái)封裝一些底層的操作細(xì)節(jié),spring也大量使用callback方式類回調(diào)相關(guān)類別的方法以提供JDBC相關(guān)類別的功能,使傳統(tǒng)的JDBC的使用者也能清楚了解spring所提供的相關(guān)封裝類別方法的使用。

    JDBC的PreparedStatement
    Java代碼 復(fù)制代碼
    1. final String id = user.getId();   
    2. final String name = user.getName();   
    3. final String sex = user.getSex() + "";   
    4. final int age = user.getAge();   
    5.   
    6. jdbcTemplate.update("INSERT INTO USER VALUES(?, ?, ?, ?)",   
    7.                      new PreparedStatementSetter() {   
    8.                          public void setValues(PreparedStatement ps) throws SQLException {   
    9.                              ps.setString(1, id);   
    10.                              ps.setString(2, name);             
    11.                              ps.setString(3, sex);   
    12.                              ps.setInt(4, age);   
    13.                          }   
    14.                      });  


    Java代碼 復(fù)制代碼
    1. final User user = new User();   
    2. jdbcTemplate.query("SELECT * FROM USER WHERE user_id = ?",   
    3.                     new Object[] {id},   
    4.                     new RowCallbackHandler() {   
    5.                         public void processRow(ResultSet rs) throws SQLException {   
    6.                             user.setId(rs.getString("user_id"));   
    7.                             user.setName(rs.getString("name"));   
    8.                             user.setSex(rs.getString("sex").charAt(0));   
    9.                             user.setAge(rs.getInt("age"));   
    10.                         }   
    11.                     });  




    Java代碼 復(fù)制代碼
    1. class UserRowMapper implements RowMapper {   
    2.     public Object mapRow(ResultSet rs, int index) throws SQLException {   
    3.         User user = new User();   
    4.   
    5.         user.setId(rs.getString("user_id"));   
    6.         user.setName(rs.getString("name"));   
    7.         user.setSex(rs.getString("sex").charAt(0));   
    8.         user.setAge(rs.getInt("age"));   
    9.   
    10.         return user;   
    11.     }   
    12. }   
    13.   
    14. public List findAllByRowMapperResultReader() {   
    15.     String sql = "SELECT * FROM USER";   
    16.     return jdbcTemplate.query(sql, new RowMapperResultReader(new UserRowMapper()));   
    17. }  


    在getUser(id)里面使用UserRowMapper
    Java代碼 復(fù)制代碼
    1. public User getUser(final String id) throws DataAccessException {   
    2.     String sql = "SELECT * FROM USER WHERE user_id=?";   
    3.     final Object[] params = new Object[] { id };   
    4.     List list = jdbcTemplate.query(sql, params, new RowMapperResultReader(new UserRowMapper()));   
    5.   
    6.     return (User) list.get(0);   
    7. }  


    網(wǎng)上收集
    org.springframework.jdbc.core.PreparedStatementCreator 返回預(yù)編譯SQL   不能于Object[]一起用
    Java代碼 復(fù)制代碼
    1. public PreparedStatement createPreparedStatement(Connection con) throws SQLException {   
    2.  return con.prepareStatement(sql);   
    3. }  

    1.增刪改
    org.springframework.jdbc.core.JdbcTemplate   類(必須指定數(shù)據(jù)源dataSource)
    Java代碼 復(fù)制代碼
    1. template.update("insert into web_person values(?,?,?)",Object[]);  

      或
    Java代碼 復(fù)制代碼
    1. template.update("insert into web_person values(?,?,?)",new PreparedStatementSetter(){ 匿名內(nèi)部類 只能訪問(wèn)外部最終局部變量   
    2.   
    3.  public void setValues(PreparedStatement ps) throws SQLException {   
    4.   ps.setInt(index++,3);   
    5. });  

    org.springframework.jdbc.core.PreparedStatementSetter 接口 處理預(yù)編譯SQL
    Java代碼 復(fù)制代碼
    1. public void setValues(PreparedStatement ps) throws SQLException {   
    2.  ps.setInt(index++,3);   
    3. }  

    2.查詢JdbcTemplate.query(String,[Object[]/PreparedStatementSetter],RowMapper/RowCallbackHandler)
    org.springframework.jdbc.core.RowMapper   記錄映射接口  處理結(jié)果集
    Java代碼 復(fù)制代碼
    1. public Object mapRow(ResultSet rs, int arg1) throws SQLException {   int表當(dāng)前行數(shù)   
    2.   person.setId(rs.getInt("id"));   
    3. }   
    4. List template.query("select * from web_person where id=?",Object[],RowMapper);  

    org.springframework.jdbc.core.RowCallbackHandler  記錄回調(diào)管理器接口 處理結(jié)果集
    Java代碼 復(fù)制代碼
    1. template.query("select * from web_person where id=?",Object[],new RowCallbackHandler(){   
    2.  public void processRow(ResultSet rs) throws SQLException {   
    3.   person.setId(rs.getInt("id"));   
    4. });  
    posted @ 2009-05-26 15:06 jiafang83| 編輯 收藏

        DecimalFormatNumberFormat 的一個(gè)具體子類,用于格式化十進(jìn)制數(shù)字。該類設(shè)計(jì)有各種功能,使其能夠分析和格式化任意語(yǔ)言環(huán)境中的數(shù),包括對(duì)西方語(yǔ)言、阿拉伯語(yǔ)和印度語(yǔ)數(shù)字的支持。它還支持不同類型的數(shù),包括整數(shù) (123)、定點(diǎn)數(shù) (123.4)、科學(xué)記數(shù)法表示的數(shù) (1.23E4)、百分?jǐn)?shù) (12%) 和金額 ($123)。所有這些內(nèi)容都可以本地化。

     1截取double類型的小數(shù)位:
     2public class Test {
     3   public static void main(String[] args){
     4      double a = 1.999999999999;
     5      //保留a的兩位小數(shù),注意不是四舍五入
     6      DecimalFormat df = new DecimalForma("#.00");
     7      a = Double.parseDouble(df.format(a));//format方法返回的是字符串類型
     8      System.out.println(a);
     9   }

    10}
    posted @ 2009-04-16 09:04 jiafang83 閱讀(244) | 評(píng)論 (0)編輯 收藏
    轉(zhuǎn)載:
    1.web打印控件的三種實(shí)現(xiàn)方法:http://www.tkk7.com/midstr/archive/2009/03/13/256597.html   ----“歲月如歌”的博客
    2.IEWebBrowser組件的execWB方法:http://dev.csdn.net/article/16/16938.shtm  ------haley_hj 的 Blog
    3.WEB打印大全:http://www.fangxun.net/tech/techfile/prog/asp/200610/2612.htm
    4.14個(gè)經(jīng)典的JavaScript代碼:http://www.vikecn.com/Skins/Skin3/blogview.asp?153078-27932.html
    posted @ 2009-04-15 14:42 jiafang83| 編輯 收藏
    轉(zhuǎn)載:http://hi.baidu.com/xeelytech/blog/item/b8e42cfdac841d1508244d42.html



    iframe 父窗口和子窗口的調(diào)用方法
    父窗口調(diào)用子窗口
    iframe_name.iframe_document_object.object_attribute = attribute_value
    例子:onClick="iframe_text.myH1.innerText='http://www.pint.com';"
    子窗口調(diào)用父窗口parent.parent_document_object.object_attribute = attribute_value
    例子:onclick="parent.myH1.innerText='http://www.pint.com';"
    上面在IE下沒有問(wèn)題,但在firefox下不正常。在firefox下,應(yīng)該是
    父窗口調(diào)用子窗口
    window.frames["iframe_name"].document.getElementById("iframe_document_object"-).object_attribute = attribute_value
    例子
    window.frames["iframe_text"].document.getElementById("myH1").innerHTML= " 子窗口調(diào)用父窗口
    parent.document.getElementById("parent_document_object").object_attribute = attribute_value
    例子
    parent.document.getElementById("myH1").innerHTML = "

     

    完整例子:
    start.html

    <html>
    <script type="text/javascript">
    function b(){
        alert(
    "父窗口編輯子窗口的內(nèi)容。。。");
        window.frames[
    "floater"].document.getElementById("bb").innerHTML="父窗口改變子窗口內(nèi)容";
        
    //下句只適合IE瀏覽器
        //floater.bb.innerText="父窗口修改子窗口內(nèi)容。。。";
    }

    </script>
    <body>
    <IFRAME name="floater" src="three.html" width=1000 height=600 hspace=20 vspace=20 align=right frameborder=1>
    </IFRAME><BR>
    <img src="星球大戰(zhàn).jpg" /><br>
    <id="aa" href="one.html" target="floater">Show one.htm</A><P> 
    <form id="a" action="#" method="post">
    <input type=button value="修改子窗口內(nèi)容" onclick="b()">
    </form>
    </body>
    </html>

    one.html

    <html>
    one.html
    </html>

    three.html

    <html>
    <script typt="text/javascript">
    function a(){
        alert(
    "子窗口編輯父窗口內(nèi)容parent表示父窗口");
        
    //下句只適合IE瀏覽器
        //parent.aa.innerText="ppppppppppppp";
        parent.document.getElementById("aa").innerHTML="修改父窗口內(nèi)容";
        
    //parent.frames["iframe的名稱"].document.getElementById("aa").innerText="修改父窗口內(nèi)容。。。。";
        //子窗口修改父窗口的另一個(gè)子窗口的內(nèi)容
    }

    </script>
    <body onload="a()">
    <h1 id="bb">改變父窗口的元素值。</h1>
    </body>
    </html>
    posted @ 2009-03-29 15:53 jiafang83| 編輯 收藏
    轉(zhuǎn)載:http://hi.baidu.com/wukongafei/blog/item/9e92e800923eca14728b6596.html

    把subversion加入windows服務(wù)
    sc create svnserver binPath= "E:\Program Files\Subversion\bin\svnserve.exe --service -r E:\cjf\repository" DisplayName= "subversion" depend= Tcpip start= auto
    posted @ 2009-03-23 09:01 jiafang83| 編輯 收藏
    轉(zhuǎn)載:
    http://blog.sina.com.cn/s/blog_49ee6e040100awbe.html

    posted @ 2009-03-23 09:00 jiafang83| 編輯 收藏

     

     1import java.util.ArrayList;
     2
     3public class Test01 {
     4    
     5    Test01() { }
     6
     7    /**
     8     * 除去字符串?dāng)?shù)組中重復(fù)次數(shù)超過(guò)整數(shù)n的數(shù)組元素.使用時(shí)請(qǐng)使用try{}catch(){}包含.或是使用throws聲明拋出異常
     9     */

    10    public String[] execute(String[] args, int n) throws Exception {
    11        //Arrays.sort(args); // 此行代碼可以不使用,使用得話會(huì)使數(shù)組工整,排序數(shù)據(jù).
    12        ArrayList<String> list = new ArrayList<String>(args.length);
    13        //count變量,記錄數(shù)組元素的重復(fù)次數(shù)
    14        int count = 0;
    15        for (int i = 0; i < args.length; i++{
    16            count = 0;
    17            for (int j = 0; j < args.length; j++{
    18                if (args[i].equals(args[j])) {
    19                    count++;
    20                }

    21            }

    22            //把重復(fù)次數(shù)小于等于n的數(shù)組元素放進(jìn)集合List中
    23            if (count <= n) {
    24                list.add(args[i]);
    25            }

    26
    27        }

    28        //新建一個(gè)數(shù)組,數(shù)組的長(zhǎng)度為集合list的長(zhǎng)度
    29        String[] retStrs = new String[list.size()];
    30        //然后把集合list的元素按照順序賦給新建的數(shù)組
    31        for (int i = 0; i < list.size(); i++{
    32            retStrs[i] = (String) list.get(i);
    33        }

    34        //返回該數(shù)組
    35        return retStrs;
    36    }

    37
    38    public static void main(String[] arguments) throws Exception {
    39
    40        String[] t = new Test01().execute(new String[] "aaaaa""ccccc",
    41                "aaaaa""aaaaa""ccccc""ddddd""ddddd""eeeee""aaaaa",
    42                "fffff""ddddd""fffff""ddddd" }
    3);
    43        for (String x : t) {
    44            System.out.println(x);
    45        }

    46    }

    47}

     

    posted @ 2009-03-11 21:17 jiafang83 閱讀(675) | 評(píng)論 (0)編輯 收藏
    轉(zhuǎn)載:http://zhidao.baidu.com/question/35054792.html

    Eclipse插件的安裝有兩種方法

    1、在eclipse的主目錄(ECLIPSE_HOME,比如在我的機(jī)器上安裝的目錄是:D:\JavaDev\3.1)有一個(gè)plugins的目錄,這種方法的插件安裝非常簡(jiǎn)單,只要將插件copy到這個(gè)目錄下就可以了。比如我有一個(gè)weblogic的插件(bea站點(diǎn)上可以下載),解壓縮之后得到得到一個(gè)目錄:【com.bea.eclipse.weblogic_1.1.1】,我就將這個(gè)目錄直接放到%ECLIPSE_HOME%\plugins目錄下,重新啟動(dòng)eclipse之后就看到Run->“Start Weblogic”的菜單。安裝之后,weblogic插件的全路徑為:D:\JavaDev\3.1\plugins\com.bea.eclipse.weblogic_1.1.1]

    2、在eclipse目錄(ECLIPSE_HOME)下創(chuàng)建一個(gè)links目錄,然后將你自己的插件放在你想放的任何地方,這個(gè)時(shí)候你放插件的目錄我稱她為插件目錄(PLUGIN_HOME),然后在你的%ECLIPSE_HOME%\links\目錄下創(chuàng)建一個(gè)link文件,比如我要安裝一個(gè)vss插件,我就在我的links目錄下創(chuàng)建了:VSS_1.6.1.link文件。而這個(gè)VSS_1.6.1.link文件則是指向的我的插件目錄(PLUGIN_HOME,比如在我的機(jī)器上插件目錄為D:\JavaDev\plugins)。VSS_1.6.1.link文件的內(nèi)容是:

    path=D:\\JavaDev\\plugins\\vssplugin_1.6.1

    第二種安裝插件的時(shí)候需要注意,如果你是一個(gè)單獨(dú)的jar文件,則最好在link文件指定的目錄下創(chuàng)建這樣級(jí)別的目錄:eclipse\plugins\xxx.xxx(插件名稱和版本號(hào)),然后將jar文件放在這個(gè)目錄下即可。比如vss插件在我的機(jī)器上的目錄是D:\JavaDev\plugins\vssplugin_1.6.1\eclipse\plugins\org.vssplugin_1.6.1,下有一個(gè)文件:vssplugin.jar

    兩種方法的插件安裝之后需要重新啟動(dòng)eclipse才能看到插件。如果某一個(gè)插件已經(jīng)安裝了想要重新安裝,只要將文件替換或者修改link文件的路徑即可。如果發(fā)現(xiàn)認(rèn)不到插件,可能是你的插件不支持你的當(dāng)前eclipse版本,請(qǐng)檢查。也有可能是系統(tǒng)配置引起的,我出現(xiàn)過(guò)一次,我的解決方法是將ECLIPSE_HOME下的configuration目錄下的所有文件刪除,剩下config.ini文件。

    13.Eclipse插件使用links目錄的用法:
    假設(shè)把插件安裝在d:\myplugin目錄中,則myplugin的目錄結(jié)構(gòu)一定要是這樣的:
    d:\\myplugin\\eclipse\\plugins\\插件 及 d:\\myplugin\\eclipse\\features\\插件
    例如安裝EclipseME插件到d:\myplugin目錄中,則目錄結(jié)構(gòu)

    d:\\myplugin\\eclipse\\plugins\\eclipseme_0.4.5。
    再假設(shè)eclipse安裝在d:\eclipse目錄中,則在eclipse目錄中創(chuàng)建名稱為links的目錄,在links目

    錄中建立一個(gè)link文件,比如myplugin.link,該文件內(nèi)容為path=d:\\myplugin。
    啟動(dòng)eclipse,插件即安裝上了,如果想暫時(shí)不啟動(dòng)插件,只需把myplugin.link文件刪除即可。
    補(bǔ)充說(shuō)明:
    1. 插件可以分別安裝在多個(gè)自定義的目錄中。
    2. 一個(gè)自定義目錄可以安裝多個(gè)插件。
    3. link文件的文件名及擴(kuò)展名可以取任意名稱,比如myplugin.txt,goodplugin都可以。
    4. link文件可以有多行path=插件目錄,對(duì)應(yīng)多個(gè)自定義插件目錄,每一行的path參數(shù)都將生效。
    5. 在links目錄也可以有多個(gè)link文件,每個(gè)link文件中的path參數(shù)都將生效。
    6. 插件目錄可以使用相對(duì)路徑,如果我們把myplugin目錄創(chuàng)建在eclipse安裝目錄中,如上例中的

    d:\eclipse目錄中,則只需設(shè)置path=myplugin即可。
    posted @ 2009-02-18 21:36 jiafang83 閱讀(136) | 評(píng)論 (0)編輯 收藏
    http://hi.baidu.com/menglinxi%5Fa/blog/item/cf492e4532f85821cffca383.html

    1. 介紹

    1)DOM(JAXP Crimson解析器)
            DOM是用與平臺(tái)和語(yǔ)言無(wú)關(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使用起來(lái)也要簡(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ì)于大型文檔來(lái)說(shuō)是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來(lái)說(shuō),SAX還比它的替代者DOM快許多。
      選擇DOM還是選擇SAX? 對(duì)于需要自己編寫代碼來(lái)處理XML文檔的開發(fā)人員來(lái)說(shuō), 選擇DOM還是SAX解析模型是一個(gè)非常重要的設(shè)計(jì)決策。 DOM采用建立樹形結(jié)構(gòu)的方式訪問(wèn)XML文檔,而SAX采用的事件模型。

      DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對(duì)樹進(jìn)行遍歷。用DOM解析模型的優(yōu)點(diǎn)是編程容易,開發(fā)人員只需要調(diào)用建樹的指令,然后利用navigation APIs訪問(wèn)所需的樹節(jié)點(diǎn)來(lái)完成任務(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ā)人員自己來(lái)決定所要處理的tag。特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)。但用SAX解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問(wèn)同一個(gè)文檔中的多處不同數(shù)據(jù)。

    3)JDOM          http://www.jdom.org/

              JDOM的目的是成為Java特定文檔模型,它簡(jiǎn)化與XML的交互并且比使用DOM實(shí)現(xiàn)更快。由于是第一個(gè)Java特定模型,JDOM一直得到大力推廣和促進(jìn)。正在考慮通過(guò)“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問(wèn)題”(根據(jù)學(xué)習(xí)曲線假定為20%)。JDOM對(duì)于大多數(shù)Java/XML應(yīng)用程序來(lái)說(shuō)當(dāng)然是有用的,并且大多數(shù)開發(fā)者發(fā)現(xiàn)API比DOM容易理解得多。JDOM還包括對(duì)程序行為的相當(dāng)廣泛檢查以防止用戶做任何在XML中無(wú)意義的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情況下的錯(cuò)誤)。這也許是比學(xué)習(xí)DOM或JDOM接口都更有意義的工作。

      JDOM自身不包含解析器。它通常使用SAX2解析器來(lái)解析和驗(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),它通過(guò)DOM4J API和標(biāo)準(zhǔn)DOM接口具有并行訪問(wèn)功能。從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問(wèn)題的目標(biāo)。在完成該目標(biāo)時(shí),它比JDOM更少?gòu)?qiáng)調(diào)防止不正確的應(yīng)用程序行為。

      DOM4J是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件。如今你可以看到越來(lái)越多的Java軟件都在使用DOM4J來(lái)讀寫XML,特別值得一提的是連Sun的JAXM也在用DOM4J。

    2.. 比較

    1)DOM4J性能最好,連Sun的JAXM也在用DOM4J。目前許多開源項(xiàng)目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J來(lái)讀取XML配置文件。如果不考慮可移植性,那就采用DOM4J.

    2)JDOM和DOM在性能測(cè)試時(shí)表現(xiàn)不佳,在測(cè)試10M文檔時(shí)內(nèi)存溢出。在小文檔情況下還值得考慮使用DOM和JDOM。雖然JDOM的開發(fā)者已經(jīng)說(shuō)明他們期望在正式發(fā)行版前專注性能問(wèn)題,但是從性能觀點(diǎn)來(lái)看,它確實(shí)沒有值得推薦之處。另外,DOM仍是一個(gè)非常好的選擇。DOM實(shí)現(xiàn)廣泛應(yīng)用于多種編程語(yǔ)言。它還是許多其它與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è)即將到來(lái)的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();
        }
    }

    posted @ 2009-02-18 21:27 jiafang83 閱讀(337) | 評(píng)論 (1)編輯 收藏
    http://hi.baidu.com/lc2tp/blog/item/477c3601aac1ca011c9583dc.html

    要使用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();
        }
    }

    posted @ 2009-02-18 21:25 jiafang83 閱讀(1026) | 評(píng)論 (1)編輯 收藏
    轉(zhuǎn)載:http://hi.baidu.com/flyx100/blog/item/ca403e2f8d73233f1f3089a7.html

    Eclipse的編輯功能非常強(qiáng)大,掌握了Eclipse快捷鍵功能,能夠大大提高開發(fā)效率。Eclipse中有如下一些和編輯相關(guān)的快捷鍵。
       1. 【ALT+/】
       此快捷鍵為用戶編輯的好幫手,能為用戶提供內(nèi)容的輔助,不要為記不全方法和屬性名稱犯愁,當(dāng)記不全類、方法和屬性的名字時(shí),多體驗(yàn)一下【ALT+/】快捷鍵帶來(lái)的好處吧。

       2. 【Ctrl+O】
       顯示類中方法和屬性的大綱,能快速定位類的方法和屬性,在查找Bug時(shí)非常有用。

       3. 【Ctrl+/】
       快速添加注釋,能為光標(biāo)所在行或所選定行快速添加注釋或取消注釋,在調(diào)試的時(shí)候可能總會(huì)需要注釋一些東西或取消注釋,現(xiàn)在好了,不需要每行進(jìn)行重復(fù)的注釋。

       4. 【Ctrl+D】
       刪除當(dāng)前行,這也是筆者的最愛之一,不用為刪除一行而按那么多次的刪除鍵。

       5. 【Ctrl+M】
       窗口最大化和還原,用戶在窗口中進(jìn)行操作時(shí),總會(huì)覺得當(dāng)前窗口小(尤其在編寫代碼時(shí)),現(xiàn)在好了,試試【Ctrl+M】快捷鍵。

       查看和定位快捷鍵

       在程序中,迅速定位代碼的位置,快速找到Bug的所在,是非常不容易的事,Eclipse提供了強(qiáng)大的查找功能,可以利用如下的快捷鍵幫助完成查找定位的工作。

       1. 【Ctrl+K】、【Ctrl++Shift+K】
       快速向下和向上查找選定的內(nèi)容,從此不再需要用鼠標(biāo)單擊查找對(duì)話框了。

       2. 【Ctrl+Shift+T】
       查找工作空間(Workspace)構(gòu)建路徑中的可找到Java類文件,不要為找不到類而痛苦,而且可以使用“*”、“?”等通配符。

       3. 【Ctrl+Shift+R】
       和【Ctrl+Shift+T】對(duì)應(yīng),查找工作空間(Workspace)中的所有文件(包括Java文件),也可以使用通配符。

       4. 【Ctrl+Shift+G】
       查找類、方法和屬性的引用。這是一個(gè)非常實(shí)用的快捷鍵,例如要修改引用某個(gè)方法的代碼,可以通過(guò)【Ctrl+Shift+G】快捷鍵迅速定位所有引用此方法的位置。

       5. 【Ctrl+Shift+O】
    快速生成import,當(dāng)從網(wǎng)上拷貝一段程序后,不知道如何import進(jìn)所調(diào)用的類,試試【Ctrl+Shift+O】快捷鍵,一定會(huì)有驚喜。

       6. 【Ctrl+Shift+F】
       格式化代碼,書寫格式規(guī)范的代碼是每一個(gè)程序員的必修之課,當(dāng)看見某段代碼極不順眼時(shí),選定后按【Ctrl+Shift+F】快捷鍵可以格式化這段代碼,如果不選定代碼則默認(rèn)格式化當(dāng)前文件(Java文件)。

       7. 【ALT+Shift+W】
       查找當(dāng)前文件所在項(xiàng)目中的路徑,可以快速定位瀏覽器視圖的位置,如果想查找某個(gè)文件所在的包時(shí),此快捷鍵非常有用(特別在比較大的項(xiàng)目中)。

       8. 【Ctrl+L】
       定位到當(dāng)前編輯器的某一行,對(duì)非Java文件也有效。

       9. 【Alt+←】、【Alt+→】
       后退歷史記錄和前進(jìn)歷史記錄,在跟蹤代碼時(shí)非常有用,用戶可能查找了幾個(gè)有關(guān)聯(lián)的地方,但可能記不清楚了,可以通過(guò)這兩個(gè)快捷鍵定位查找的順序。

       10. 【F3】
    快速定位光標(biāo)位置的某個(gè)類、方法和屬性。

       11. 【F4】
       顯示類的繼承關(guān)系,并打開類繼承視圖。

       調(diào)試快捷鍵

       Eclipse中有如下一些和運(yùn)行調(diào)試相關(guān)的快捷鍵。

       1. 【Ctrl+Shift+B】:在當(dāng)前行設(shè)置斷點(diǎn)或取消設(shè)置的斷點(diǎn)。
       2. 【F11】:調(diào)試最后一次執(zhí)行的程序。
       3. 【Ctrl+F11】:運(yùn)行最后一次執(zhí)行的程序。
       4. 【F5】:跟蹤到方法中,當(dāng)程序執(zhí)行到某方法時(shí),可以按【F5】鍵跟蹤到方法中。
       5. 【F6】:?jiǎn)尾綀?zhí)行程序。
       6. 【F7】:執(zhí)行完方法,返回到調(diào)用此方法的后一條語(yǔ)句。
       7. 【F8】:繼續(xù)執(zhí)行,到下一個(gè)斷點(diǎn)或程序結(jié)束。

       常用編輯器快捷鍵

       通常文本編輯器都提供了一些和編輯相關(guān)的快捷鍵,在Eclipse中也可以通過(guò)這些快捷鍵進(jìn)行文本編輯。
       1. 【Ctrl+C】:復(fù)制。
       2. 【Ctrl+X】:剪切。
       3. 【Ctrl+V】:粘貼。
       4. 【Ctrl+S】:保存文件。
       5. 【Ctrl+Z】:撤銷。
       6. 【Ctrl+Y】:重復(fù)。
       7. 【Ctrl+F】:查找。

       其他快捷鍵

       Eclipse中還有很多快捷鍵,無(wú)法一一列舉,可以通過(guò)幫助文檔找到它們的使用方式,另外還有幾個(gè)常用的快捷鍵如下。
       1. 【Ctrl+F6】:切換到下一個(gè)編輯器。
       2. 【Ctrl+Shift+F6】:切換到上一個(gè)編輯器。
       3. 【Ctrl+F7】:切換到下一個(gè)視圖。
       4. 【Ctrl+Shift+F7】:切換到上一個(gè)視圖。
       5. 【Ctrl+F8】:切換到下一個(gè)透視圖。
       6. 【Ctrl+Shift+F8】:切換到上一個(gè)透視圖。

       Eclipse中快捷鍵比較多,可以通過(guò)幫助文檔找到所有快捷鍵的使用,但要掌握所有快捷鍵的使用是不可能的,也沒有必要,如果花點(diǎn)時(shí)間熟悉本節(jié)列舉的快捷鍵,
    --------------------------------------------------------------------------------------------
    -----------------------------------------------------------------------------------------------
    1幾個(gè)最重要的快捷鍵

    代碼助手:Ctrl+Space(簡(jiǎn)體中文操作系統(tǒng)是Alt+/)
    快速修正:Ctrl+1
    單詞補(bǔ)全:Alt+/
    打開外部Java文檔:Shift+F2

    顯示搜索對(duì)話框:Ctrl+H
    快速Outline:Ctrl+O
    打開資源:Ctrl+Shift+R
    打開類型:Ctrl+Shift+T
    顯示重構(gòu)菜單:Alt+Shift+T

    上一個(gè)/下一個(gè)光標(biāo)的位置:Alt+Left/Right
    上一個(gè)/下一個(gè)成員(成員對(duì)象或成員函數(shù)):Ctrl+Shift+Up/Down
    選中閉合元素:Alt+Shift+Up/Down/Left/Right
    刪除行:Ctrl+D
    在當(dāng)前行上插入一行:Ctrl+Shift+Enter
    在當(dāng)前行下插入一行: Shift+Enter
    上下移動(dòng)選中的行:Alt+Up/Down


    組織導(dǎo)入:Ctrl+Shift+O

    2 定位
    2.1行內(nèi)定位
    行末/行首:End/Home
    前一個(gè)/后一個(gè)單詞:Ctrl+Right/Left
    2.2文件內(nèi)定位
    跳到某行:Ctrl+L
    上下滾屏:Ctrl+Up/Down
    上一個(gè)/下一個(gè)成員(成員對(duì)象或成員函數(shù)):Ctrl+Shift+Up/Down
    快速Outline:Ctrl+O
    2.3跨文件定位
    打開聲明:F3
    打開資源:Ctrl+Shift+R
    打開類型:Ctrl+Shift+T
    在workspace中搜索選中元素的聲明:Ctrl+G
    在workspace中搜索選中的文本:Ctrl+Alt+G
    在workspace中搜索選中元素的引用:Ctrl+Shift+G
    打開調(diào)用層次結(jié)構(gòu):Ctrl+Alt+H
    快速層次結(jié)構(gòu):Ctrl+T
    反悔:Ctrl+Z
    2.4其它
    上一個(gè)/下一個(gè)光標(biāo)所在位置:Alt+Left/Right
    上一個(gè)編輯的位置:Ctrl+Q

     

    3 選中
    3.1行內(nèi)選中
    選中到行末/行首:Shift+End/Home
    選中上一個(gè)/下一個(gè)單詞:Ctrl+Shift+Left/Right
    3.2文件內(nèi)選中
    選中閉合元素:Alt+Shift+Up
    恢復(fù)到上一個(gè)選中:Alt+Shift+Down
    選中下一個(gè)/上一個(gè)元素:Alt+Shift+Right/Left

     

    4 定位/選中/操作同時(shí)
    刪除行:Ctrl+D
    刪除下一個(gè)/上一個(gè)單詞:Ctrl+Delete/Backspace
    刪除到行末:Ctrl+Shift+Delete
    在當(dāng)前行上插入一行:Ctrl+Shift+Enter
    在當(dāng)前行下插入一行: Shift+Enter
    上下移動(dòng)選中的行:Alt+Up/Down
    拷貝選中的行:Ctrl+Alt+Up/Down

     

    5其它的代碼編輯類快捷鍵
    保存:Ctrl+S
    保存所有:Ctrl+Shift+S
    下一個(gè)命中的項(xiàng)(搜索之后):Ctrl+.
    注釋:Ctrl+/
    添加導(dǎo)入:Ctrl+Shift+M
    顯示快捷鍵幫助:Ctrl+Shift+L
    變?yōu)榇?小寫:Ctrl+Shift+X/Y

     

    6 重構(gòu)
    顯示重構(gòu)菜單:Alt+Shift+T
    重構(gòu)-改變方法簽名:Alt+Shift+C
    重構(gòu)-移動(dòng):Alt+Shift+V
    重構(gòu)-重命名:Alt+Shift+R

     

    7 編輯器、視圖、透視圖切換
    下一個(gè)編輯器:Ctrl+F6
    下一個(gè)視圖:Ctrl+F7
    下一個(gè)透視圖:Ctrl+F8
    最大化當(dāng)前視圖或編輯器:Ctrl+M
    激活編輯器:F12

     

    8 Debug
    F5:Step Into(debug)
    F6:Step over(debug)
    F7:Step return(debug)
    F8:Resume(debug)
    F11:debug上一個(gè)應(yīng)用(debug)

     

    9 Up/Down/Right/Left類快捷鍵
    Ctrl
    前一個(gè)/后一個(gè)單詞:Ctrl+Right/Left
    上下滾屏:Ctrl+Up/Down
    Alt
    上一個(gè)/下一個(gè)光標(biāo)的位置:Alt+Left/Right
    上下移動(dòng)選中的行:Alt+Up/Down
    Shift
    選中上一個(gè)/下一個(gè)字符:Shift+Left/Right
    選中上一行/下一行(從當(dāng)前光標(biāo)位置開始):Shift+Up/Down
    Ctrl+Shift
    上一個(gè)/下一個(gè)成員(成員對(duì)象或成員函數(shù)):Ctrl+Shift+Up/Down
    選中上一個(gè)/下一個(gè)單詞:Ctrl+Shift+Left/Right
    Alt+Shift
    選中閉合元素:Alt+Shift+Up
    恢復(fù)到上一個(gè)選中:Alt+Shift+Down
    選中下一個(gè)/上一個(gè)元素:Alt+Shift+Right/Left
    拷貝選中的行:Ctrl+Alt+Up/Down
    Ctrl+Alt
    拷貝選中的行:Ctrl+Alt+Up/Down

     

    10 F類快捷鍵
    F2:顯示提示/重命名
    F3:打開選中元素的聲明
    F4:打開選中元素的類型繼承結(jié)構(gòu)
    F5:刷新
    F5:Step Into(debug)
    F6:Step over(debug)
    F7:Step return(debug)
    F8:Resume(debug)
    F11:debug上一個(gè)應(yīng)用(debug)
    F12:激活編輯器
    ================================================================
    ================================================================
    MyEclipse使用技巧和快捷鍵2008-01-23 09:22Eclipse本身很快的,但是加上了myeclipse后,就狂占內(nèi)存,而且速度狂慢,那如何讓Eclipse拖著myeclipse狂飚呢?這里提供一個(gè)技巧:取消自動(dòng)validation
            validation有一堆,什么xml、jsp、jsf、js等等,我們沒有必要全部都去自動(dòng)校驗(yàn)一下,只是需要的時(shí)候才會(huì)手工校驗(yàn)一下,速度立馬提升好幾個(gè)檔次!
    取消方法: windows-->perferences-->myeclipse-->validation
            除開Manual下面的復(fù)選框全部選中之外,其他全部不選
            手工驗(yàn)證方法:
            在要驗(yàn)證的文件上,單擊鼠標(biāo)右鍵-->myeclipse-->run validation

    程序代碼自動(dòng)排版:Ctrl+Shift+F,會(huì)自動(dòng)把代碼進(jìn)行格式化的排版,非常方便
    快速執(zhí)行程序:Ctrl + F11第一次執(zhí)行時(shí),它會(huì)詢問(wèn)您執(zhí)行模式,設(shè)置好后,以后只要按這個(gè)熱鍵,它就會(huì)快速執(zhí)行。

    Ctrl+Shift+/ 加上段注釋/**/

    Ctrl+Shift+\ 取消段注釋/**/

    Ctrl+/ 加上行注釋或取消行注釋

    自動(dòng)匯入所需要的類別:Ctrl+Shift+M Ctrl+Shift+O 好象使用Ctrl+Shift+O 也可以

    按new Remote Site,Name填 svn , URL填http://subclipse.tigris.org/update,一直next到finished為止

    MyEclipse 快捷鍵
    (1)Ctrl+M切換窗口的大小
    (2)Ctrl+Q跳到最后一次的編輯處
    (3)F2當(dāng)鼠標(biāo)放在一個(gè)標(biāo)記處出現(xiàn)Tooltip時(shí)候按F2則把鼠標(biāo)移開時(shí)Tooltip還會(huì)顯示即Show Tooltip Description。
    F3跳到聲明或定義的地方。
    F5單步調(diào)試進(jìn)入函數(shù)內(nèi)部。
    F6單步調(diào)試不進(jìn)入函數(shù)內(nèi)部,如果裝了金山詞霸2006則要把“取詞開關(guān)”的快捷鍵改成其他的。
    F7由函數(shù)內(nèi)部返回到調(diào)用處。
    F8一直執(zhí)行到下一個(gè)斷點(diǎn)。
    (4)Ctrl+Pg~對(duì)于XML文件是切換代碼和圖示窗口
    (5)Ctrl+Alt+I看Java文件中變量的相關(guān)信息
    (6)Ctrl+PgUp對(duì)于代碼窗口是打開“Show List”下拉框,在此下拉框里顯示有最近曾打開的文件
    (7)Ctrl+/ 在代碼窗口中是這種//~注釋。
    Ctrl+Shift+/ 在代碼窗口中是這種/*~*/注釋,在JSP文件窗口中是<!--~-->。
    (8)Alt+Shift+O(或點(diǎn)擊工具欄中的Toggle Mark Occurrences按鈕) 當(dāng)點(diǎn)擊某個(gè)標(biāo)記時(shí)可使本頁(yè)面中其他地方的此標(biāo)記黃色凸顯,并且窗口的右邊框會(huì)出現(xiàn)白色的方塊,點(diǎn)擊此方塊會(huì)跳到此標(biāo)記處。
    (9)右擊窗口的左邊框即加斷點(diǎn)的地方選Show Line Numbers可以加行號(hào)。
    (10)Ctrl+I格式化激活的元素Format Active Elements。
    Ctrl+Shift+F格式化文件Format Document。
    (11)Ctrl+S保存當(dāng)前文件。
    Ctrl+Shift+S保存所有未保存的文件。
    (12)Ctrl+Shift+M(先把光標(biāo)放在需導(dǎo)入包的類名上) 作用是加Import語(yǔ)句。
    Ctrl+Shift+O作用是缺少的Import語(yǔ)句被加入,多余的Import語(yǔ)句被刪除。
    (13)Ctrl+Space提示鍵入內(nèi)容即Content Assist,此時(shí)要將輸入法中Chinese(Simplified)IME-Ime/Nonlme Toggle的快捷鍵(用于切換英文和其他文字)改成其他的。
    Ctrl+Shift+Space提示信息即Context Information。
    (14)雙擊窗口的左邊框可以加斷點(diǎn)。
    (15)Ctrl+D刪除當(dāng)前行

    posted @ 2008-12-10 14:30 jiafang83 閱讀(4782) | 評(píng)論 (0)編輯 收藏
    轉(zhuǎn)載:http://join-18.javaeye.com/blog/183051

    1.介紹
    1)DOM(JAXP Crimson解析器)
    DOM是用與平臺(tái)和語(yǔ)言無(wú)關(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使用起來(lái)也要簡(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ì)于大型文檔來(lái)說(shuō)是個(gè)巨大的優(yōu)點(diǎn)。事實(shí)上,應(yīng)用程序甚至不必解析整個(gè)文檔;它可以在某個(gè)條件得到滿足時(shí)停止解析。一般來(lái)說(shuō),SAX還比它的替代者DOM快許多。
    選擇DOM還是選擇SAX? 對(duì)于需要自己編寫代碼來(lái)處理XML文檔的開發(fā)人員來(lái)說(shuō), 選擇DOM還是SAX解析模型是一個(gè)非常重要的設(shè)計(jì)決策。 DOM采用建立樹形結(jié)構(gòu)的方式訪問(wèn)XML文檔,而SAX采用的事件模型。
    DOM解析器把XML文檔轉(zhuǎn)化為一個(gè)包含其內(nèi)容的樹,并可以對(duì)樹進(jìn)行遍歷。用DOM解析模型的優(yōu)點(diǎn)是編程容易,開發(fā)人員只需要調(diào)用建樹的指令,然后利用navigation APIs訪問(wèn)所需的樹節(jié)點(diǎn)來(lái)完成任務(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ā)人員自己來(lái)決定所要處理的tag.特別是當(dāng)開發(fā)人員只需要處理文檔中所包含的部分?jǐn)?shù)據(jù)時(shí),SAX這種擴(kuò)展能力得到了更好的體現(xiàn)。但用SAX解析器的時(shí)候編碼工作會(huì)比較困難,而且很難同時(shí)訪問(wèn)同一個(gè)文檔中的多處不同數(shù)據(jù)。
    3)JDOM http://www.jdom.org
    JDOM的目的是成為Java特定文檔模型,它簡(jiǎn)化與XML的交互并且比使用DOM實(shí)現(xiàn)更快。由于是第一個(gè)Java特定模型,JDOM一直得到大力推廣和促進(jìn)。正在考慮通過(guò)“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問(wèn)題”(根據(jù)學(xué)習(xí)曲線假定為20%)。JDOM對(duì)于大多數(shù)Java/XML應(yīng)用程序來(lái)說(shuō)當(dāng)然是有用的,并且大多數(shù)開發(fā)者發(fā)現(xiàn)API比DOM容易理解得多。JDOM還包括對(duì)程序行為的相當(dāng)廣泛檢查以防止用戶做任何在XML中無(wú)意義的事。然而,它仍需要您充分理解XML以便做一些超出基本的工作(或者甚至理解某些情況下的錯(cuò)誤)。這也許是比學(xué)習(xí)DOM或JDOM接口都更有意義的工作。
    JDOM自身不包含解析器。它通常使用SAX2解析器來(lái)解析和驗(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),它通過(guò)DOM4J API和標(biāo)準(zhǔn)DOM接口具有并行訪問(wèn)功能。從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問(wèn)題的目標(biāo)。在完成該目標(biāo)時(shí),它比JDOM更少?gòu)?qiáng)調(diào)防止不正確的應(yīng)用程序行為。
    DOM4J是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件。如今你可以看到越來(lái)越多的Java軟件都在使用DOM4J來(lái)讀寫XML,特別值得一提的是連Sun的JAXM也在用DOM4J.
    2、比較
    1)DOM4J性能最好,連Sun的JAXM也在用DOM4J.目前許多開源項(xiàng)目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J來(lái)讀取XML配置文件。如果不考慮可移植性,那就采用DOM4J.
    2)JDOM和DOM在性能測(cè)試時(shí)表現(xiàn)不佳,在測(cè)試10M文檔時(shí)內(nèi)存溢出。在小文檔情況下還值得考慮使用DOM和JDOM.雖然JDOM的開發(fā)者已經(jīng)說(shuō)明他們期望在正式發(fā)行版前專注性能問(wèn)題,但是從性能觀點(diǎn)來(lái)看,它確實(shí)沒有值得推薦之處。另外,DOM仍是一個(gè)非常好的選擇。DOM實(shí)現(xiàn)廣泛應(yīng)用于多種編程語(yǔ)言。它還是許多其它與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è)即將到來(lái)的XML流,但并沒有載入到內(nèi)存(當(dāng)然當(dāng)XML流被讀入時(shí),會(huì)有部分文檔暫時(shí)隱藏在內(nèi)存中)。

    3.四種XML操作方式的基本使用方法
    xml文件:
    <?xml version="1.0" encoding="GB2312"?>
    <RESULT>
    <VALUE>
    <NO>A1234</NO>
    <ADDR>四川省XX縣XX鎮(zhèn)XX路X段XX號(hào)</ADDR>
    </VALUE>
    <VALUE>
    <NO>B1234</NO>
       <ADDR>四川省XX市XX鄉(xiāng)XX村XX組</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();
    }
    )
    posted @ 2008-12-10 09:38 jiafang83 閱讀(184) | 評(píng)論 (0)編輯 收藏
        類Object是類層次結(jié)構(gòu)的根類,每一個(gè)類都使用Object作為超類,所有對(duì)象(包括數(shù)組)都實(shí)現(xiàn)這個(gè)類的方法。jdk1.5中,描述了該類中的11個(gè)方法

    1.getClass

    public final Class<? extends Object> getClass()
    返回一個(gè)對(duì)象的運(yùn)行時(shí)類。該 Class 對(duì)象是由所表示類的 static synchronized 方法鎖定的對(duì)象。

     

    返回:
    表示該對(duì)象的運(yùn)行時(shí)類的 java.lang.Class 對(duì)象。此結(jié)果屬于類型 Class<? extends X>,其中 X 表示清除表達(dá)式中的靜態(tài)類型,該表達(dá)式調(diào)用 getClass

    2.hashCode

    public int hashCode()
    返回該對(duì)象的哈希碼值。支持該方法是為哈希表提供一些優(yōu)點(diǎn),例如,java.util.Hashtable 提供的哈希表。

    hashCode 的常規(guī)協(xié)定是:

    • 在 Java 應(yīng)用程序執(zhí)行期間,在同一對(duì)象上多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是對(duì)象上 equals 比較中所用的信息沒有被修改。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無(wú)需保持一致。
    • 如果根據(jù) equals(Object) 方法,兩個(gè)對(duì)象是相等的,那么在兩個(gè)對(duì)象中的每個(gè)對(duì)象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。
    • 以下情況 是必需的:如果根據(jù) equals(java.lang.Object) 方法,兩個(gè)對(duì)象不相等,那么在兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用 hashCode 方法必定會(huì)生成不同的整數(shù)結(jié)果。但是,程序員應(yīng)該知道,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能。

    實(shí)際上,由 Object 類定義的 hashCode 方法確實(shí)會(huì)針對(duì)不同的對(duì)象返回不同的整數(shù)。(這一般是通過(guò)將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來(lái)實(shí)現(xiàn)的,但是 JavaTM 編程語(yǔ)言不需要這種實(shí)現(xiàn)技巧。)

     

    返回:
    此對(duì)象的一個(gè)哈希碼值。

    3.equals

    public boolean equals(Object obj)
    指示某個(gè)其他對(duì)象是否與此對(duì)象“相等”。

    equals 方法在非空對(duì)象引用上實(shí)現(xiàn)相等關(guān)系:

    • 自反性:對(duì)于任何非空引用值 xx.equals(x) 都應(yīng)返回 true
    • 對(duì)稱性:對(duì)于任何非空引用值 xy,當(dāng)且僅當(dāng) y.equals(x) 返回 true 時(shí),x.equals(y) 才應(yīng)返回 true
    • 傳遞性:對(duì)于任何非空引用值 xyz,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 應(yīng)返回 true
    • 一致性:對(duì)于任何非空引用值 xy,多次調(diào)用 x.equals(y) 始終返回 true 或始終返回 false,前提是對(duì)象上 equals 比較中所用的信息沒有被修改。
    • 對(duì)于任何非空引用值 xx.equals(null) 都應(yīng)返回 false

    Object 類的 equals 方法實(shí)現(xiàn)對(duì)象上差別可能性最大的相等關(guān)系;即,對(duì)于任何非空引用值 xy,當(dāng)且僅當(dāng) xy 引用同一個(gè)對(duì)象時(shí),此方法才返回 truex == y 具有值 true)。

    注意:當(dāng)此方法被重寫時(shí),通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼。

     

    參數(shù):
    obj - 要與之比較的引用對(duì)象。
    返回:
    如果此對(duì)象與 obj 參數(shù)相同,則返回 true;否則返回 false

    4.clone

    protected Object clone()
    throws CloneNotSupportedException
    創(chuàng)建并返回此對(duì)象的一個(gè)副本。“副本”的準(zhǔn)確含義可能依賴于對(duì)象的類。一般來(lái)說(shuō),對(duì)于任何對(duì)象 x,如果表達(dá)式:
    x.clone() != x
    是正確的,則表達(dá)式:
    x.clone().getClass() == x.getClass()
    將為 true,但這些不是絕對(duì)條件。一般情況下是:
    x.clone().equals(x)
    將為 true,但這不是絕對(duì)條件。

    按照慣例,返回的對(duì)象應(yīng)該通過(guò)調(diào)用 super.clone 獲得。如果一個(gè)類及其所有的超類(Object 除外)都遵守此約定,則 x.clone().getClass() == x.getClass()

    按照慣例,此方法返回的對(duì)象應(yīng)該獨(dú)立于該對(duì)象(正被克隆的對(duì)象)。要獲得此獨(dú)立性,在 super.clone 返回對(duì)象之前,有必要對(duì)該對(duì)象的一個(gè)或多個(gè)字段進(jìn)行修改。這通常意味著要復(fù)制包含正在被克隆對(duì)象的內(nèi)部“深層結(jié)構(gòu)”的所有可變對(duì)象,并使用對(duì)副本的引用替換對(duì)這些對(duì)象的引用。如果一個(gè)類只包含基本字段或?qū)Σ蛔儗?duì)象的引用,那么通常不需要修改 super.clone 返回的對(duì)象中的字段。

    Object 類的 clone 方法執(zhí)行特定的克隆操作。首先,如果此對(duì)象的類不能實(shí)現(xiàn)接口 Cloneable,則會(huì)拋出 CloneNotSupportedException。注意:所有的數(shù)組都被視為實(shí)現(xiàn)接口 Cloneable。否則,此方法會(huì)創(chuàng)建此對(duì)象的類的一個(gè)新實(shí)例,并像通過(guò)分配那樣,嚴(yán)格使用此對(duì)象相應(yīng)字段的內(nèi)容初始化該對(duì)象的所有字段;這些字段的內(nèi)容沒有被自我克隆。所以,此方法執(zhí)行的是該對(duì)象的“淺表復(fù)制”,而不“深層復(fù)制”操作。

    Object 類本身不實(shí)現(xiàn)接口 Cloneable,所以在類為 Object 的對(duì)象上調(diào)用 clone 方法將會(huì)導(dǎo)致在運(yùn)行時(shí)拋出異常。

     

    返回:
    此實(shí)例的一個(gè)克隆。
    拋出:
    CloneNotSupportedException - 如果對(duì)象的類不支持 Cloneable 接口,則重寫 clone 方法的子類也會(huì)拋出此異常,以指示無(wú)法克隆某個(gè)實(shí)例。

    5.toString

    public String toString()
    返回該對(duì)象的字符串表示。通常,toString 方法會(huì)返回一個(gè)“以文本方式表示”此對(duì)象的字符串。結(jié)果應(yīng)是一個(gè)簡(jiǎn)明但易于讀懂。建議所有子類都重寫此方法。

    Object 類的 toString 方法返回一個(gè)字符串,該字符串由類名(對(duì)象是該類的一個(gè)實(shí)例)、at 標(biāo)記符“@”和此對(duì)象哈希碼的無(wú)符號(hào)十六進(jìn)制表示組成。換句話說(shuō),該方法返回一個(gè)字符串,它的值等于:

    getClass().getName() + '@' + Integer.toHexString(hashCode())
    

     

    返回:
    該對(duì)象的字符串表示形式。

    6.notify

    public final void notify()
    喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程。如果所有線程都在此對(duì)象上等待,則會(huì)選擇喚醒其中一個(gè)線程。選擇是任意性的,并在對(duì)實(shí)現(xiàn)做出決定時(shí)發(fā)生。線程通過(guò)調(diào)用其中一個(gè) wait 方法,在對(duì)象的監(jiān)視器上等待。

    直到當(dāng)前的線程放棄此對(duì)象上的鎖定,才能繼續(xù)執(zhí)行被喚醒的線程。被喚醒的線程將以常規(guī)方式與在該對(duì)象上主動(dòng)同步的其他所有線程進(jìn)行競(jìng)爭(zhēng);例如,喚醒的線程在作為鎖定此對(duì)象的下一個(gè)線程方面沒有可靠的特權(quán)或劣勢(shì)。

    此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。通過(guò)以下三種方法之一,線程可以成為此對(duì)象監(jiān)視器的所有者:

    • 通過(guò)執(zhí)行此對(duì)象的同步 (Sychronized) 實(shí)例方法。
    • 通過(guò)執(zhí)行在此對(duì)象上進(jìn)行同步的 synchronized 語(yǔ)句的正文。
    • 對(duì)于 Class 類型的對(duì)象,可以通過(guò)執(zhí)行該類的同步靜態(tài)方法。

    一次只能有一個(gè)線程擁有對(duì)象的監(jiān)視器。

     

    拋出:
    IllegalMonitorStateException - 如果當(dāng)前的線程不是此對(duì)象監(jiān)視器的所有者。

    7.notifyAll

    public final void notifyAll()
    喚醒在此對(duì)象監(jiān)視器上等待的所有線程。線程通過(guò)調(diào)用其中一個(gè) wait 方法,在對(duì)象的監(jiān)視器上等待。

    直到當(dāng)前的線程放棄此對(duì)象上的鎖定,才能繼續(xù)執(zhí)行被喚醒的線程。被喚醒的線程將以常規(guī)方式與在該對(duì)象上主動(dòng)同步的其他所有線程進(jìn)行競(jìng)爭(zhēng);例如,喚醒的線程在作為鎖定此對(duì)象的下一個(gè)線程方面沒有可靠的特權(quán)或劣勢(shì)。

    此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。請(qǐng)參閱 notify 方法,了解線程能夠成為監(jiān)視器所有者的方法的描述。

     

    拋出:
    IllegalMonitorStateException - 如果當(dāng)前的線程不是此對(duì)象監(jiān)視器的所有者。

    8.finalize

    protected void finalize()
    throws Throwable
    當(dāng)垃圾回收器確定不存在對(duì)該對(duì)象的更多引用時(shí),由對(duì)象的垃圾回收器調(diào)用此方法。子類重寫 finalize 方法,以配置系統(tǒng)資源或執(zhí)行其他清除。

    finalize 的常規(guī)協(xié)定是:當(dāng) JavaTM 虛擬機(jī)已確定尚未終止的任何線程無(wú)法再通過(guò)任何方法訪問(wèn)此對(duì)象時(shí),將調(diào)用此方法,除非由于準(zhǔn)備終止的其他某個(gè)對(duì)象或類的終結(jié)操作執(zhí)行了某個(gè)操作。finalize 方法可以采取任何操作,其中包括再次使此對(duì)象對(duì)其他線程可用;不過(guò),finalize 的主要目的是在不可撤消地丟棄對(duì)象之前執(zhí)行清除操作。例如,表示輸入/輸出連接的對(duì)象的 finalize 方法可執(zhí)行顯式 I/O 事務(wù),以便在永久丟棄對(duì)象之前中斷連接。

    Object 類的 finalize 方法執(zhí)行非特殊性操作;它僅執(zhí)行一些常規(guī)返回。Object 的子類可以重寫此定義。

    Java 編程語(yǔ)言不保證哪個(gè)線程將調(diào)用某個(gè)給定對(duì)象的 finalize 方法。但可以保證在調(diào)用 finalize 時(shí),調(diào)用 finalize 的線程將不會(huì)持有任何用戶可見的同步鎖定。如果 finalize 方法拋出未捕獲的異常,那么該異常將被忽略,并且該對(duì)象的終結(jié)操作將終止。

    在啟用某個(gè)對(duì)象的 finalize 方法后,將不會(huì)執(zhí)行進(jìn)一步操作,直到 Java 虛擬機(jī)再次確定尚未終止的任何線程無(wú)法再通過(guò)任何方法訪問(wèn)此對(duì)象,其中包括由準(zhǔn)備終止的其他對(duì)象或類執(zhí)行的可能操作,在執(zhí)行該操作時(shí),對(duì)象可能被丟棄。

    對(duì)于任何給定對(duì)象,Java 虛擬機(jī)最多只調(diào)用一次 finalize 方法。

    finalize 方法拋出的任何異常都會(huì)導(dǎo)致此對(duì)象的終結(jié)操作停止,但可以通過(guò)其他方法忽略它。

     

    拋出:
    Throwable - 此方法拋出的 Exception

    9.wait

    public final void wait(long timeout)
    throws InterruptedException
    導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法,或者超過(guò)指定的時(shí)間量。

    當(dāng)前的線程必須擁有此對(duì)象監(jiān)視器。

    此方法導(dǎo)致當(dāng)前線程(稱之為 T)將其自身放置在對(duì)象的等待集中,然后放棄此對(duì)象上的所有同步要求。出于線程調(diào)度目的,線程 T 被禁用,且處于休眠狀態(tài),直到發(fā)生以下四種情況之一:

    • 其他某個(gè)線程調(diào)用此對(duì)象的 notify 方法,并且線程 T 碰巧被任選為被喚醒的線程。
    • 其他某個(gè)線程調(diào)用此對(duì)象的 notifyAll 方法。
    • 其他某個(gè)線程中斷線程 T
    • 已經(jīng)到達(dá)指定的實(shí)際時(shí)間。但是,如果 timeout 為零,則不考慮實(shí)際時(shí)間,該線程將一直等待,直到獲得通知。
    然后,從對(duì)象的等待集中刪除線程 T,并重新進(jìn)行線程調(diào)度。然后,該線程以常規(guī)方式與其他線程競(jìng)爭(zhēng),以獲得在該對(duì)象上同步的權(quán)利;一旦獲得對(duì)該對(duì)象的控制權(quán),該對(duì)象上的所有其同步聲明都將被還原到以前的狀態(tài) - 這就是調(diào)用 wait 方法時(shí)的情況。然后,線程 Twait 方法的調(diào)用中返回。所以,從 wait 方法返回時(shí),該對(duì)象和線程 T 的同步狀態(tài)與調(diào)用 wait 方法時(shí)的情況完全相同。

    在沒有被通知、中斷或超時(shí)的情況下,線程還可以喚醒一個(gè)所謂的虛假喚醒 (spurious wakeup)。雖然這種情況在實(shí)踐中很少發(fā)生,但是應(yīng)用程序必須通過(guò)以下方式防止其發(fā)生,即對(duì)應(yīng)該導(dǎo)致該線程被提醒的條件進(jìn)行測(cè)試,如果不滿足該條件,則繼續(xù)等待。換句話說(shuō),等待應(yīng)總是發(fā)生在循環(huán)中,如下面的示例:

    synchronized (obj) {
    while (<condition does not hold>)
    obj.wait(timeout);
    ... // Perform action appropriate to condition
    }
    
    (有關(guān)這一主題的更多信息,請(qǐng)參閱 Doug Lea 撰寫的《Concurrent Programming in Java (Second Edition)》(Addison-Wesley, 2000) 中的第 3.2.3 節(jié)或 Joshua Bloch 撰寫的《Effective Java Programming Language Guide》(Addison-Wesley, 2001) 中的第 50 項(xiàng)。

    如果當(dāng)前線程在等待時(shí)被其他線程中斷,則會(huì)拋出 InterruptedException。在按上述形式恢復(fù)此對(duì)象的鎖定狀態(tài)時(shí)才會(huì)拋出此異常。

    注意,由于 wait 方法將當(dāng)前的線程放入了對(duì)象的等待集中,所以它只能解除此對(duì)象的鎖定;可以同步當(dāng)前線程的任何其他對(duì)象在線程等待時(shí)仍處于鎖定狀態(tài)。

    此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。請(qǐng)參閱 notify 方法,了解線程能夠成為監(jiān)視器所有者的方法的描述。

     

    參數(shù):
    timeout - 要等待的最長(zhǎng)時(shí)間(以毫秒為單位)。
    拋出:
    IllegalArgumentException - 如果超時(shí)值為負(fù)。
    IllegalMonitorStateException - 如果當(dāng)前的線程不是此對(duì)象監(jiān)視器的所有者。
    InterruptedException - 如果在當(dāng)前線程等待通知之前或者正在等待通知時(shí),另一個(gè)線程中斷了當(dāng)前線程。在拋出此異常時(shí),當(dāng)前線程的中斷狀態(tài) 被清除。

    10.wait

    public final void wait(long timeout,
    int nanos)
    throws InterruptedException
    導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法,或者其他某個(gè)線程中斷當(dāng)前線程,或者已超過(guò)某個(gè)實(shí)際時(shí)間量。

    此方法類似于一個(gè)參數(shù)的 wait 方法,但它允許更好地控制在放棄之前等待通知的時(shí)間量。用毫微秒度量的實(shí)際時(shí)間量可以通過(guò)以下公式計(jì)算出來(lái):

    1000000*timeout+nanos

    在其他所有方面,此方法執(zhí)行的操作與帶有一個(gè)參數(shù)的 wait(long) 方法相同。需要特別指出的是,wait(0, 0)wait(0) 相同。

    當(dāng)前的線程必須擁有此對(duì)象監(jiān)視器。該線程發(fā)布對(duì)此監(jiān)視器的所有權(quán),并等待下面兩個(gè)條件之一發(fā)生:

    • 其他線程通過(guò)調(diào)用 notify 方法,或 notifyAll 方法通知在此對(duì)象的監(jiān)視器上等待的線程醒來(lái)。
    • timeout 毫秒值與 nanos 毫微秒?yún)?shù)值之和指定的超時(shí)時(shí)間已用完。

    然后,該線程等到重新獲得對(duì)監(jiān)視器的所有權(quán)后才能繼續(xù)執(zhí)行。

    對(duì)于某一個(gè)參數(shù)的版本,實(shí)現(xiàn)中斷和虛假喚醒是有可能的,并且此方法應(yīng)始終在循環(huán)中使用:

    synchronized (obj) {
    while (<condition does not hold>)
    obj.wait(timeout, nanos);
    ... // Perform action appropriate to condition
    }
    
    此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。請(qǐng)參閱 notify 方法,了解線程能夠成為監(jiān)視器所有者的方法的描述。

     

    參數(shù):
    timeout - 要等待的最長(zhǎng)時(shí)間(以毫秒為單位)。
    nanos - 額外時(shí)間(以毫微秒為單位,范圍是 0-999999)。
    拋出:
    IllegalArgumentException - 如果超時(shí)值是負(fù)數(shù),或者毫微秒值不在 0-999999 范圍內(nèi)。
    IllegalMonitorStateException - 如果當(dāng)前線程不是此對(duì)象監(jiān)視器的所有者。
    InterruptedException - 如果在當(dāng)前線程等待通知之前或者正在等待通知時(shí),其他線程中斷了當(dāng)前線程。在拋出此異常時(shí),當(dāng)前線程的中斷狀態(tài) 被清除。

    11.wait

    public final void wait()
    throws InterruptedException
    導(dǎo)致當(dāng)前的線程等待,直到其他線程調(diào)用此對(duì)象的 notify() 方法或 notifyAll() 方法。換句話說(shuō),此方法的行為就好像它僅執(zhí)行 wait(0) 調(diào)用一樣。

    當(dāng)前的線程必須擁有此對(duì)象監(jiān)視器。該線程發(fā)布對(duì)此監(jiān)視器的所有權(quán)并等待,直到其他線程通過(guò)調(diào)用 notify 方法,或 notifyAll 方法通知在此對(duì)象的監(jiān)視器上等待的線程醒來(lái)。然后該線程將等到重新獲得對(duì)監(jiān)視器的所有權(quán)后才能繼續(xù)執(zhí)行。

    對(duì)于某一個(gè)參數(shù)的版本,實(shí)現(xiàn)中斷和虛假喚醒是可能的,而且此方法應(yīng)始終在循環(huán)中使用:

    synchronized (obj) {
    while (<condition does not hold>)
    obj.wait();
    ... // Perform action appropriate to condition
    }
    
    此方法只應(yīng)由作為此對(duì)象監(jiān)視器的所有者的線程來(lái)調(diào)用。請(qǐng)參閱 notify 方法,了解線程能夠成為監(jiān)視器所有者的方法的描述。

     

    拋出:
    IllegalMonitorStateException - 如果當(dāng)前的線程不是此對(duì)象監(jiān)視器的所有者。
    InterruptedException - 如果在當(dāng)前線程等待通知之前或者正在等待通知時(shí),另一個(gè)線程中斷了當(dāng)前線程。在拋出此異常時(shí),當(dāng)前線程的中斷狀態(tài) 被清除。
    posted @ 2008-12-05 10:25 jiafang83 閱讀(8166) | 評(píng)論 (0)編輯 收藏

        今天忽然想起這么個(gè)問(wèn)題:在eclipse下運(yùn)行的java程序,它們的字節(jié)碼文件跑哪去啦,怎么在項(xiàng)目中看不到呢?在網(wǎng)上查了一下,終于找到了原因所在。
        原來(lái)classes文件夾所在的目錄是程序編譯輸出的路徑,只有在eclipse下的Resource透視圖下,才能顯示出來(lái),在其它透視圖下都不能顯示。

                     
    posted @ 2008-12-05 10:02 jiafang83 閱讀(3363) | 評(píng)論 (0)編輯 收藏
         摘要: 轉(zhuǎn)載:http://download.csdn.net/source/245338   1. Jdbc的六個(gè)編程步驟 1. 注冊(cè)一個(gè)驅(qū)動(dòng) 注冊(cè)驅(qū)動(dòng)程序有三種方式:                &nbs...  閱讀全文
    posted @ 2008-12-01 17:00 jiafang83 閱讀(1037) | 評(píng)論 (0)編輯 收藏
         摘要:   轉(zhuǎn)載:http://www.builder.com.cn/2007/1211/678982.shtml 目前,國(guó)內(nèi)外信息化建設(shè)已經(jīng)進(jìn)入基于Web應(yīng)用為核心的階段, Java作為應(yīng)用于網(wǎng)絡(luò)的最好語(yǔ)言,前景無(wú)限看好。然而,就算用Java建造一個(gè)不是很煩瑣的web應(yīng)用,也不是件輕松的事情。概括一下,實(shí)施Java的WEB項(xiàng)目需要掌握的技術(shù)如下: l  &...  閱讀全文
    posted @ 2008-12-01 16:23 jiafang83 閱讀(195) | 評(píng)論 (0)編輯 收藏
         摘要: 轉(zhuǎn)載:http://www.tkk7.com/rongxh7      分頁(yè)顯示一直是web開發(fā)中一大煩瑣的難題,傳統(tǒng)的網(wǎng)頁(yè)設(shè)計(jì)只在一個(gè)JSP或者ASP頁(yè)面中書寫所有關(guān)于數(shù)據(jù)庫(kù)操作的代碼,那樣做分頁(yè)可能簡(jiǎn)單一點(diǎn),但當(dāng)把網(wǎng)站分層開發(fā)后,分頁(yè)就比較困難了,下面是我做Spring+Hibernate+Struts2項(xiàng)目時(shí)設(shè)計(jì)的分頁(yè)代碼,與大家分享交流。 ...  閱讀全文
    posted @ 2008-12-01 14:08 jiafang83 閱讀(1410) | 評(píng)論 (2)編輯 收藏
    主站蜘蛛池模板: 精品亚洲成AV人在线观看| 一级毛片成人免费看免费不卡 | 亚洲ts人妖网站| 久久精品毛片免费观看| 亚洲一区二区影院| 三年片在线观看免费大全电影| 亚洲爱情岛论坛永久| 久久一本岛在免费线观看2020| 中文字幕亚洲综合久久| 每天更新的免费av片在线观看| 久久亚洲AV无码精品色午夜麻豆 | 亚洲国产主播精品极品网红| 色婷婷精品免费视频| 亚洲国产精品无码久久青草 | 亚洲天天在线日亚洲洲精| 三年片在线观看免费大全电影| 久久亚洲AV成人无码软件| 99re在线这里只有精品免费| 亚洲精品mv在线观看| 一二三四视频在线观看中文版免费 | 美女尿口扒开图片免费| 亚洲精品NV久久久久久久久久| 成年网站免费入口在线观看| 亚洲无人区一区二区三区| 久久爰www免费人成| 亚洲成人免费电影| 成人最新午夜免费视频| 免费人成视频在线观看免费| 亚洲乱码无码永久不卡在线| 免费无码毛片一区二区APP| 亚洲性一级理论片在线观看| 午夜dj在线观看免费视频| 黄页网站在线免费观看| 国产亚洲精品福利在线无卡一| 免费在线看黄的网站| 亚洲国产精品xo在线观看| 大陆一级毛片免费视频观看| 黄色大片免费网站| 国产AV无码专区亚洲AVJULIA| 30岁的女人韩剧免费观看| 亚洲日韩精品无码专区加勒比☆|