posts - 55,comments - 89,trackbacks - 0
          oracle 10g默認需要微軟的網絡適配器配置。新建一個就行了。
          方法,打開控制面板,選者添加硬件—選擇是,我已經連接了此硬件,下一步選者最后一項添加新的硬件設備,下一步選擇 安裝我手動從列表選者的硬件(高級),下一步選者網絡適配器,下一步選者Microsoft Loopback
          Adapter,按向導提示下一步就行了。完成以后打開你的網上鄰居看看是不是多了一個網上連接(2),然后設置它的IP地址如。192.168.1.1.隨便就行了,這樣在安裝oracle的時候就可以用這一個假的網絡來連接,蒙騙一下 oracle了。一定可以驗證過去
          posted @ 2012-08-18 13:38 jiafang83 閱讀(916) | 評論 (0)編輯 收藏
              摘自:http://article.pchome.net/content-330924.html

                 在過去幾年里,Hibernate不斷發展,幾乎成為Java數據庫持久性的事實標準。它非常強大、靈活,而且具備了優異的性能。在本文中,我們將了解如何使用Java 5 注釋來簡化Hibernate代碼,并使持久層的編碼過程變得更為輕松。

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

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

            Hibernate Annotation還支持新的 EJB 3 持久性規范。這些規范旨在提供一種標準化的 Java 持久性機制。由于 Hibernate 3 還提供了一些擴展,因此您可以十分輕松地遵從這些標準,并使用 EJB 3 編程模型來對 Hibernate 持久層進行編碼。

            現在,讓我們來動手使用Hibernate Annotation。

          安裝 Hibernate Annotation

            要使用 Hibernate Annotation,您至少需要具備 Hibernate 3.2和Java 5。可以從 Hibernate 站點 下載 Hibernate 3.2 和 Hibernate Annotation庫。除了標準的 Hibernate JAR 和依賴項之外,您還需要 Hibernate Annotations .jar 文件(hibernate-annotations.jar)、Java 持久性 API (lib/ejb3-persistence.jar)。如果您正在使用 Maven,只需要向 POM 文件添加相應的依賴項即可,如下所示:

           ...
          
          org.hibernate
          hibernate
          3.2.1.ga
          
          
          org.hibernate
          hibernate-annotations
          3.2.0.ga
          
          
          javax.persistence
          persistence-api
          1.0
          
          ...
          

            下一步就是獲取 Hibernate 會話工廠。盡管無需驚天的修改,但這一工作與使用 Hibernate Annotations有所不同。您需要使用 AnnotationConfiguration 類來建立會話工廠:

          sessionFactory = new
          AnnotationConfiguration().buildSessionFactory();

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

          
          
          
          
          
          
          

            近期的許多 Java 項目都使用了輕量級的應用框架,例如 Spring。如果您正在使用 Spring 框架,可以使用 AnnotationSessionFactoryBean 類輕松建立一個基于注釋的 Hibernate 會話工廠,如下所示:

          
          
          
          
          
          
          
          org.hibernate.dialect.DerbyDialect
          create
          ...
          
          
          
          
          com.onjava.modelplanes.domain.PlaneType
          com.onjava.modelplanes.domain.ModelPlane
          ...
          
          
          
          

          第一個持久性類

            既然已經知道了如何獲得注釋所支持的 Hibernate 會話,下面讓我們來了解一下帶注釋的持久性類的情況:

            像在其他任何 Hibernate應用程序中一樣,帶注釋的持久性類也是普通 POJO。差不多可以說是。您需要向 Java 持久性 API (javax.persistence.*)添加依賴項,如果您正在使用任何特定于 Hibernate的擴展,那很可能就是 Hibernate Annotation 程序包(org.hibernate.annotations.*),但除此之外,它們只是具備了持久性注釋的普通 POJO 。下面是一個簡單的例子:

          @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;
          }
          }
          

            正像我們所提到的,這非常簡單。@Entity 注釋聲明該類為持久類。@Id 注釋可以表明哪種屬性是該類中的獨特標識符。事實上,您既可以保持字段(注釋成員變量),也可以保持屬性(注釋getter方法)的持久性。后文中將使用基于屬性的注釋。基于注釋的持久性的優點之一在于大量使用了默認值(最大的優點就是 “慣例優先原則(convention over configuration)”)。例如,您無需說明每個屬性的持久性——任何屬性都被假定為持久的,除非您使用 @Transient 注釋來說明其他情況。這簡化了代碼,相對使用老的 XML 映射文件而言也大幅地減少了輸入工作量。

          生成主鍵

            Hibernate 能夠出色地自動生成主鍵。Hibernate/EBJ 3 注釋也可以為主鍵的自動生成提供豐富的支持,允許實現各種策略。下面的示例說明了一種常用的方法,其中 Hibernate 將會根據底層數據庫來確定一種恰當的鍵生成策略:

          @Id
          @GeneratedValue(strategy=GenerationType.AUTO)
          public Long getId() {
          return id;
          }
          

          定制表和字段映射

            默認情況下,Hibernate 會將持久類以匹配的名稱映射到表和字段中。例如,前一個類可以與映射到以如下代碼創建的表中:

          CREATE TABLE MODELPLANE
          (
          ID long,
          NAME varchar
          )
          

            如果您是自己生成并維護數據庫,那么這種方法很有效,通過省略代碼可以大大簡化代碼維護。然而,這并不能滿足所有人的需求。有些應用程序需要訪問外部數據庫,而另一些可能需要遵從公司的數據庫命名慣例。如果有必要,您可以使用 @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;
          }
          }
          

            該內容將映射到下表中:

          CREATE TABLE T_MODEL_PLANE
          (
          PLANE_ID long,
          PLANE_NAME varchar
          )
          

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

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

          映射關系

            Java 持久性映射過程中最重要和最復雜的一環就是確定如何映射表間的關系。像其他產品一樣, Hibernate 在該領域中提供了高度的靈活性,但卻是以復雜度的增加為代價。我們將通過研究幾個常見案例來了解如何使用注釋來處理這一問題。

            其中一種最常用的關系就是多對一的關系。假定在以上示例中每個 ModelPlane 通過多對一的關系(也就是說,每個飛機模型只與一種飛機類型建立聯系,盡管指定的飛機類型可以與七種飛機模型建立聯系)來與 PlaneType 建立聯系。可如下進行映射:

           @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
          public PlaneType getPlaneType() {
          return planeType;
          }
          

            CascadeType 值表明 Hibernate 應如何處理級聯操作。

            另一種常用的關系與上述關系相反:一對多再對一關系,也稱為集合。在老式的 Hibernate 版本中進行映射或使用注釋時,集合令人頭疼,這里我們將簡要加以探討,以使您了解如何處理集合,例如,在以上示例中每個 PlaneType 對象都可能會包含一個 ModelPlanes 集合。可映射如下:

           @OneToMany(mappedBy="planeType",
          cascade=CascadeType.ALL,
          fetch=FetchType.EAGER)
          @OrderBy("name")
          public List getModelPlanes() {
          return modelPlanes;
          }
          

          命名查詢

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

            也可以使用注釋來實現命名查詢,可以使用 @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"
          )
          }
          )
          

            一旦完成了定義,您就可以像調用其他任何其他命名查詢一樣來調用它們。

          結束語

            Hibernate 3 注釋提供了強大而精致的 API,簡化了 Java 數據庫中的持久性代碼,本文中只進行了簡單的討論。您可以選擇遵從標準并使用 Java 持久性 API,也可以利用特定于 Hibernate的擴展,這些功能以損失可移植性為代價提供了更為強大的功能和更高的靈活性。無論如何,通過消除對 XML 映射文件的需求,Hibernate 注釋將簡化應用程序的維護,同時也可以使您對EJB 3 有初步認識。來試試吧!

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

          school和userMember是一對多關系:

          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機制,生成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會自動把當前時間寫入   
          31    @Column(updatable = false, length = 20)   
          32    private Date createTime;   
          33   
          34    @Temporal(TemporalType.TIMESTAMP)   
          35    private Date updateTime;// 剛開始我默認insertable=false,但會讀取出錯提示如下:   
          36    // Value '0000-00-00' can not be represented as java.sql.Timestamp   
          37   
          38    // mappedBy="school"就相當于inverse=true,(mappedBy指定的是不需要維護關系的一端)   
          39    // 應該注意的是mappedBy值對應@ManyToOne標注的屬性,我剛開始寫成"schoolId",讓我郁悶了好一會 
          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)我們常用的自增長機制,我這里采用的是hibernate的uuid生成機制.
          需要注意的是import javax.xx.Entity ,而不是org.hibernate.xx.Entity。

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

          UserMember.java(前面引入的包已經貼過了,下面就不貼了)
           1 @Entity   
           2 @Table(name = "teacher_info")//實體類和數據庫表名不一致時,才用這個   
           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指明關聯的字段,hibernate默認會是school_id.   
          24    
          25 }   

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

          JSON定義

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

          JSON的結構基于下面兩點

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

          JSON以一種特定的字符串形式來表示 JavaScript 對象。如果將具有這樣一種形式的字符串賦給任意一個 JavaScript 變量,那么該變量會變成一個對象引用,而這個對象就是字符串所構建出來的,好像有點拗口,我們還是用實例來說明。

           這里假設我們需要創建一個User對象,并具有以下屬性

        1. 用戶ID
        2. 用戶名
        3. 用戶Email

          您可以使用以下JSON形式來表示User對象:

          {"UserID":11, "Name":"Truly", "Email":"zhuleipro◎hotmail.com"};

          然后如果把這一字符串賦予一個JavaScript變量,那么就可以直接使用對象的任一屬性了。

          完整代碼:

          <script>
          var User = {"UserID":11, "Name":"Truly", "Email":"zhuleipro◎hotmail.com"}; alert(User.Name); </script>

          實際使用時可能更復雜一點,比如我們為Name定義更詳細的結構,使它具有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>

          現在我們增加一個新的需求,我們某個頁面需要一個用戶列表,而不僅僅是一個單一的用戶信息,那么這里就需要創建一個用戶列表數組。
          下面代碼演示了使用JSON形式定義這個用戶列表:

          [
          {"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>

          事實上除了使用"."引用屬性外,我們還可以使用下面語句:

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

          現在讀者應該對JSON的使用有點認識了,歸納為以下幾點:

        4. 對象是屬性、值對的集合。一個對象的開始于“{”,結束于“}”。每一個屬性名和值間用“:”提示,屬性間用“,”分隔。
        5. 數組是有順序的值的集合。一個數組開始于"[",結束于"]",值之間用","分隔。
        6. 值可以是引號里的字符串、數字、true、false、null,也可以是對象或數組。這些結構都能嵌套。
        7. 字符串和數字的定義和C或Java基本一致。

          小節

          本文通過一個實例演示,初步了解了JSON 的強大用途。可以歸結如下:

        8. JSON 提供了一種優秀的面向對象的方法,以便將元數據緩存到客戶機上。
        9. JSON 幫助分離了驗證數據和邏輯。
        10. JSON 幫助為 Web 應用程序提供了 Ajax 的本質。
        11. posted @ 2009-06-16 01:03 jiafang83 閱讀(332) | 評論 (0)編輯 收藏
           轉載:http://blog.csdn.net/sdlcn/

          前提 OS: WIN2000
               tomcat已經配置好(tomcat可以到http://jakarta.apache.org/tomcat 下載)
          開始實戰啦
          1.準備jstl
             到http://apache.towardex.com/jakarta/taglibs/standard/下載jakarta-taglibs-standard-current.zip
          解壓后成為jakarta-taglibs-standard-1.1.1

          2.準備web開發目錄
             比如我的web目錄為h:\webapp\myweb\(當然可以把你的web應用放在%tomcat_home%\webapps\),稱為工作目錄Working folder,在工作目錄h:\webapp\myweb\下建立WEB-INF\lib,WEB-INF\classes

          3.拷貝.jar文件
             將jakarta-taglibs-standard-1.1.1\lib\下的兩個jar文件:standard.jar和jstl.jar文件拷貝到\WEB-INF\lib\下

          4.拷貝.tld文件
           將jakarta-taglibs-standard-1.1.1\tld\下的8個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.建立一個名為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>測試你的第一個使用到JSTL 的網頁</title>
          </head>
          <body>
          <c:out value="歡迎測試你的第一個使用到JSTL 的網頁"/>
          </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,進行調試,我的輸出結果是

          歡迎測試你的第一個使用到JSTL 的網頁
          你使用的瀏覽器是:
          Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) David O'Davies

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

          轉載:http://blog.csdn.net/mtzai/archive/2009/05/24/4212490.aspx

          在大多數情況下,為事件處理函數返回false,可以防止默認的事件行為.例如,默認情況下點擊一個<a>元素,頁面會跳轉到該元素href屬性指定的頁.
           Return False 就相當于終止符,Return True 就相當于執行符。

          在js中return false的作用一般是用來取消默認動作的。比如你單擊一個鏈接除了觸發你的
          onclick時間(如果你指定的話)以外還要觸發一個默認事件就是執行頁面的跳轉。所以如果
          你想取消對象的默認動作就可以return false。return false應用比較多的場合有:
          <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();'>超級鏈接 </a>
          2, <input type="button" onclick='test()' value="提交">
          3, <form name="form1"  onsubmIT="return test();">
          內容
          <input type="submIT" value="提交">
          </form>
          </body>

          <a href="xxxx.do?....." target=dolink>連接abcd </a>
          <iframe id=dolink src=about:blank style=display:none> </iframe>

           
          點了上面的那個連接后,dolink幀執行頁面處理的事情(xxxx.do?...然傳遞參數到服務器),頁面不會跳轉。    .

          最近做的項目,通過綁定在 button 的 onclick 事件的函數提交表單。發現 return false 也是很重要的。比如:

           <input type="submit" onclick="submitAction(); return false;" />

           submitAction 方法里面有提交表單的動作。如果不加 return false,在執行完 submitAction 之后,submit 按鈕還會繼續執行它的默認事件,就會再次提交表單。這可能就是很多錯誤的根源。

          的確,return false的含義不是阻止事件繼續向頂層元素傳播,而是阻止瀏覽器對事件的默認處理。你可以這樣試驗:首先將所有的js腳本注釋掉,在IE瀏覽器中嘗試拖動一下圖片,你會發現鼠標會成為禁止操作的樣式,圖片是被禁止拖動的,它是瀏覽器針對mousemove事件所提供的默認行為。return false就是為了去掉這種行為,否則就會出現你描述的中斷事件連續執行。

          另外,和return false等效的語句為:window.event.returnValue = false,你可以把return false替換為此語句并進行驗證。

          最后說明一下,此種方式只適用于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("名稱輸入長度不能超過15個字符!");
          return false;
          }
          }
          </script>
          </head>
          <body>
          <form name="xx">
          <input name="assetName" type="text"/>
                                  <--根據return 返回值的TRUE或FALSE 判定是否提交表單--->
          <input type="submit" onclick="return verifyForm()"/>
          </form>
          </body>
          </html>

          潛水看了眾大蝦的精彩帖子,今也貢獻一點心得。其聞共欣賞,疑義相與析。有不對之處請不吝拍磚。

          眾所周知,在表單中加上onsubmit="return false;"可以阻止表單提交。
          下面是簡單的一小段代碼:

          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>
          大家判斷像上面的寫法,點擊submit按鈕該表單是否提交?

          若答案為是,就不用往下看了。

          若答案為否,錯了。實際情況是表單正常提交,若想它不提交,應該將

          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>這個html對象的一個方法名,其值(一字符串)就是其方法體,默認返回true;

          和Java一樣,在該方法體中你可以寫任意多個語句,包括內置函數和自定義函數,如

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

          onsubmit="
              alert('haha');; // 內置函數
              submitTest();;  // 自定義函數
              alert(this.tagName);; // 用到了this關鍵詞
              ......(任意多條語句);   
              return false;
          "
          就相當于

          view plaincopy to clipboardprint?
          Form.prototype.onsubmit = function(); {  
              alert('haha');; // 內置函數  
              submitTest();;  // 自定義函數  
              alert(this.tagName);; // 用到了this關鍵詞  
              ......(任意多條語句);      
              return false;  
          }; 

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

          經過這樣的分析后,以上情況就不難理解了:

          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,但我們只執行了此函數,沒有對其結果進行任何處理。而

          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();;
          };
          這樣,我們利用到了它的返回值,達到了預期效果。
          這樣理解的話我想印象會深刻得多,就不易出錯了

          結論:
          我們可以用Java里的思維方式來思考模擬JavaScript中的類似情況(JavaScript中基于prototype的面向對象技術也確實是這樣做的),但他們畢竟還是有本質上的區別,如Java是強類型的,有嚴格的語法限制,而JavaScript是松散型的。象上述方法:

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

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

          posted @ 2009-06-13 23:52 jiafang83 閱讀(1349) | 評論 (0)編輯 收藏
          主站蜘蛛池模板: 无锡市| 赤壁市| 南乐县| 锦州市| 来宾市| 玉溪市| 嵩明县| 清水县| 洛扎县| 柯坪县| 商南县| 阳江市| 始兴县| 平昌县| 安陆市| 大丰市| 永靖县| 田林县| 铜鼓县| 屯门区| 万源市| 沙河市| 岑巩县| 长乐市| 视频| 泰宁县| 陆良县| 惠东县| 张掖市| 玛沁县| 双城市| 老河口市| 佛教| 木兰县| 舟山市| 扎鲁特旗| 贞丰县| 双流县| 宜兰县| 平阳县| 顺昌县|