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

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

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

    隨筆-10  評論-22  文章-1  trackbacks-0
      2010年8月10日
    Annotation是JavaSE5開始引入的,在Java的世界已是大行其道,各大開源框架Hibernate、Spring等都對它無縫集成,足見其份量了。。
    其實很早就出現在程序員的視野,只是關注的比較少:@Override、@SuppressWarnings("unchecked"),開始主要覺得沒什么用處,后來公司的框架用到它,感覺還不錯。。于是來一記:

    在網上搜Annotation的學習資料不是很多,還是用的人不多,比較經典的入門就是這個:實戰篇:設計自己的Annotation,很清楚,通俗易懂,這里我就不贅述了。然而僅僅是弄懂它是怎么回事,具體還是沒什么用處,這也是大多數開發人員的感覺。

    在現在的公司的經歷兩次框架升級,第一次沒有用到Annotation,xml配置文件大行其道:Action跳轉、Ibatis sqlmapper、Form表單(我們的表單都是從后臺生成的),整個項目xml眼花繚亂,每個模塊都有自己專屬的配置文件,然后集中到一起處理,而我們最痛苦的莫過于寫那大量重復的配置文件。

    后來公司接了個ERP的單子,技術總監馬上意識到框架該升級了,他技術很牛,我們公司的框架就是他一人寫的,兩周之后,新框架出爐,xml只保留三分之一:Action跳轉、Form表單都不再使用xml配置,而是Annotation橫空出世,給我的感覺:它就像一個救世主,讓我們的框架重生,它就是這次升級的最大亮點,只有sqlmapper依然保留,這無可厚非,因為它原本是ibatis封裝的,Action控制器既不是Struts1,Struts2,也不是Webwork,是總監自己封裝的Servlet,Form表單都由后臺生成js組件拋到前端,通過反編譯看到源碼,其實還是很基礎的,貼些代碼上來看下吧:

    1.Action請求部分:
        /**
         * 顯示新增頁面
         * author YuWenLin
         * date 2010-5-13 上午10:31:57
         * 
    @param data
         
    */
        @Action(
    "/add.shtml")
        @Permission(
    "client.ContractType.add")
        
    public void add(ActionData data){
            FormBuilder builder 
    = data.getService(FormBuilder.class);
            builder.append(Type.
    class);
            builder.setAction(
    "client/contract/type/add.do");
            data.put(
    "script", builder);
            
    //向頁面拋出cookie提示信息
            MessageUtil.putMessage(data);
            data.setResulter(
    "template");
            data.setPath(
    "client/contract/type/type.shtml");
        }
    可能大家看得不太明白(每個公司都有自己框架),沒有關系,就兩句:
    @Action("/add.shtml")
    它就是負責請求顯示新增的頁面,就這一句,不需要像我們以前的action.xml(類似Struts2的跳轉),干凈利索吧,當然底層后臺有處理,但是公共的,不需我們管,至于
    @Permission("client.ContractType.add")
    就是用來處理權限管理的,也是Annotation的使用,就這一句。就權限管理,后面我也會記述。。。

    2.再來看看@Action底層的定義:
    package org.plugbase.action;

    import java.lang.annotation.Annotation;

    public interface Action
        
    extends Annotation
    {

        
    public abstract String value();
    }
    說明下:extends Annotation跟 @interface是一樣的效果,只不過前者手動extends,后者自動的。
    怎么樣,很基礎吧,跟jdk源碼是一樣的。。。

    3.JavaBean生成表單:
        @Widget(value="TextBox")
        @Valider({
    "notempty","len(2,8)"})
        
    public void setName(String name) {
            
    this.name = name;
        }
    給setter方法加Annotation,@Widget是組件,@Valider是驗證
    意思就是給name字段生成TextBox組件,并做驗證處理,后臺有相應的公共js組件,驗證控件庫調用,我們所有的表單組件都是這樣生成的,說實話,這樣生成一個頁面真有點繁鎖,既要寫js,又要寫后臺,前端還要配,還真是有技術含量,呵呵。。。但是它保證一致性,所有表單組件,驗證控件,如TextBox我們只有一套,所有人都去調用這一套,不得再重造,因為它是框架。。。

    4.@Widget底層定義:
    import java.lang.annotation.Annotation;

    public interface Widget
        
    extends Annotation
    {

        
    public abstract String value();

        
    public abstract String defaultValue();

        
    public abstract String dataType();

        
    public abstract String dataSource();
    }
    @Valider類似,當然這些都只是定義、聲明,具體怎么用,這里就不貼了,畢竟是人家東西嘛

    怎么樣,看到這些,似乎覺得Annotation開始起作用了,其實我一直覺得,Annotation就是為xml所生,因為它們倆是死對頭,不管單一地用誰,都有缺陷,
    只有結合才是完善,正所謂,沒有最好,只有更好,合理就行。

    在這里我可能沒有貼出什么@Annotation技術含量的東西,但是我想要表達的是一種思想,一種框架的思想,并不是什么地方都能用到Annotation,一般的中小型項目根本沒必要用它,因為xml就搞定,所以用在需要用的地方,將它的能量發揮到最大。。。

    以上僅為一家之言,歡迎拍磚。。。

    posted @ 2010-08-10 16:47 獨孤行 閱讀(1712) | 評論 (1)編輯 收藏
      2010年4月1日
         摘要: 在項目中使用ibatis有一段時間了,之前一直用jdbc、hibernate。自我感覺ibatis是介于jdbc和hibernate之間的非常實用的輕量級框架,相信用過的人都有同感吧。對搞java的來說,上手是非常快的,只要你具備sql基礎,再加一點ORM的思想,夏昕的《ibatis開發指南》是不錯的選擇。 今天項目搞完了,我就把所學的,以及在項目中用到拿來貼一番,也是對我個人技術的總結吧,怎樣...  閱讀全文
    posted @ 2010-04-01 11:35 獨孤行 閱讀(3354) | 評論 (0)編輯 收藏
      2010年3月26日
    thickbox是jQuery的一個插件,其作用是彈出對話框、網頁框,使用戶體驗度更加愉悅,下面就來簡單介紹它的幾種用法。
    聲明一下:這只是個人的總結記載而已。
    準備工作:你需要三個文件:thickbox.js、thickbox.css、jquery.js,網上到處可下
    具體使用:
    第一步:將這三個文件引入到你要使用thickbox的頁面
    <script type="text/javascript" src="jquery.js"></script> 
        
    <script type="text/javascript" src="thickbox.js"></script>
        
    <link rel="stylesheet" href="thickbox.css" type="text/css" />
    第二步:一般簡單使用就是給<a>標簽和Button添加樣式:class=thickbox
    還有就是通過thickbox函數調用:如tb_init()、tb_show();見下文。
    幾種不同用法:
    1.點擊顯示圖片:
     <a href="001.jpg" class="thickbox"><img src="001.jpg"/></a>
    ok,就這樣搞定
    2.點擊按鈕或鏈接:
    <input alt="#TB_inline?height=300&width=400&inlineId=div1" title="shawnliu" class="thickbox" type="button" value="Show" />   
       
    <a href="#TB_inline?height=155&width=300&inlineId=div2&modal=true" class="thickbox">Show hidden modal content.</a>
       
       
    <div id="div1" style="display:none">
       
    <P>
         這是一個非模式對話框。
       
    </P>
       
    </div>

       
    <div id="div2" style="display:none">
       
    <P>
         這是一個模式對話框。
         
    <p style="TEXT-ALIGN: center"><INPUT id="Login" onclick="tb_remove()" type="submit" value="  Ok  " /></p>
       
    </P>
       
    </div>
    說明:給你要使用thickbox的<a>或button添加"#TB_inline?height=300&width=400&",#TB_inline是thickbox固定用法,height和width是顯示彈出對話框的大小參數,inlineId是你要顯示的標簽或組件,modal是模式與非模式的選擇,當然你還可以接很多你自定義的參數
    3.一般在項目中用得比較多的就是加載form的頁面,如添加,編輯在同一個list列表頁面,這時我們就可以將添加和編輯都做成thickbox形式,如下圖:

    怎樣做呢一樣的,給添加鏈接加thickbox樣式:
    <a href="add.shtml?width=300&height=250" class="thickbox">新增</a>
    前提是你得將要顯示的頁面(add.shtml)做好,然后指定你要顯示的大小
    編輯同樣是一樣:先將原信息提取出來,再讓用戶修改:

    代碼也一樣:
    <a href="edit.shtml?width=300&height=250&nid=item.nid" class="thickbox">編輯</a>
    4.能自己定位到需要用thickbox的元素,不使用樣式,可以用函數,如:
    <div id="PicList">
    <a href="Pic01.jpg"><img src="Pic01s.jpg" border="0"/></a>
    <a href="Pic02.jpg"><img src="Pic01s.jpg" border="0"/></a>
    </div>

    $(function() {
    tb_init(
    "#PicList a[img]");});
    5.通過ajax加載的頁面,thickbox樣式會失效,解決辦法:
    只要在AJAX載入HTML并更新到頁面后執行下以下代碼:
    tb_init('.thickbox');
    6.自定義函數調用:
    如點擊縮圖,要顯示大圖,縮略圖URL只不過在大圖URL的后綴前加了s:
    <div id="PicList">
    <img src="Pic01s.jpg" border="0"/>
    <img src="Pic01s.jpg" border="0"/>
    </div>

    $(function() {
    $(
    "#PicList img").click(function() {
    tb_show(
    "",this.src.substring(0,this.src.length-5)+'.jpg',false);
    });});
    另外,如果想用其它事件,還可以將click改成你想觸發thickbox的事件。
    下班勒,大概記錄到這,以后再加吧。。。


    posted @ 2010-03-26 17:47 獨孤行 閱讀(4643) | 評論 (2)編輯 收藏
      2009年10月16日

    在域模型(實體域)中,關聯關系是類與類之間最普遍的關系。根據UML語言,關系是有方向的。下面以客戶(Customer)和訂單(Order)的關系為例,闡述一下ORM的中的一對多映射:
    我們知道,在關系數據庫中,只存在外鍵參照關系,而且總是由“many”方參照“one“方。
    1.建立多對一單向關聯——Order(many)--->Customer(one):
    -------------------------------Order.java--------------------------------

    pack mypack;
    import java.io.Serializable;
    public class Order implements Serializable{
       
    private int id;
       
    private String orderNumber;
       
    private Customer customer;
       
       
    //構造方法及set方法get方法
       
    }
    在以上代碼中customer屬性要使用<many-to-one>來映射:
    多對一單向關聯(many方)
    <many-to-one>
        name 
    = "customer"   --待映射的持久化類屬性名
        column 
    = "customer_Id"  --數據庫外鍵字段
        
    class = "mypack.Customer"  --持久化類
        not
    -null = "true"/>
    a.  <many-to-one>的not-null屬性 
    not-null屬性會影響Hiberntae的運行時行為,Hibernate在保存Order對象時,會先檢查它的customer屬性是否為null:
    若為null:在執行session.save(Order)時會拋出PropertyValueException異常;
    原因很簡單:既然Customer為null,那么對應的外鍵Customer_Id也為null,試問外鍵都沒有,Order表的數據能插得進去嗎
    若將not-null 屬性設為false:表示外鍵引用可以為null,試想一下,數據庫數據可以插進去嗎?
    我們來看:在執行session.save(Order)時,發出了sql語句:insert into......
    但是當Hibernate自動清理(flush)緩存時,拋出新的異常:TransientObjectException
    所謂清理是提交事務或手動Flush,將session與數據庫保持同步,很顯然不可能同步嘛,Order對象雖然持久化,但Customer沒有.
        注:是否應該把<many-to-one>的not-null屬性設為true,這根據實際業務而定。通常,訂單總是由客戶自己發出,因此建議設為true.
    b.  級聯保存與更新
    默認情況下,Hibernate持久化一個對象,不會自動持久化所關聯的其它臨時對象,因此會有TransientObjectException,
    想它關聯也可以,<many-to-one>中加個屬性cascade="save-update"即可.

    2.建立一對多關聯——Customer(one)--->Order(many):
    -----------------------------Customer.java-------------------------------
    package mypack;
    import 
    public calss Customer implements Serlizliab;e{
        
    private int id;
        
    private String name;
        
    private Set orders = new HsahSet();

        
    //構造方法及set方法get方法
    }
    一對多關聯(one方)
    <set 
          name 
    = "orders"  --持久化對象的屬性
          cascade 
    = "save-update" --級聯操作
          
    <key cloumn = "customer_Id"/> --外鍵
          
    <one-to-many class = "mypack.Order"/> --持久化類
    </set>
    a.  <set>元素的inverse屬性
      在映射一對多的雙向關聯時,應該在“one”方把inverse屬性設為true,這樣可提高應用性能。
                        inverse:控制反轉,為true表示反轉,由它方負責;反之,不反轉,自己負責;
                        如果不設,one和many兩方都要負責控制,因此,會引發重復的sql語句以及重復添加數據,
            在建立兩個象的雙向關系時,應該同時修改關聯兩端的對象屬性:
                        customer.getOrders().add(order);
                        order.setCustomer(customer);

            這樣做可提高業務邏輯的獨立性,使業務邏輯的程序代碼不受Hibernate實現的影響。同理解除雙向關系也一樣。
    b.  級聯刪除(從數據庫刪除相關表記錄)
             當刪除Customer對象時,及聯刪除Order對象.只需將cascad屬性設為delete即可.
              注:刪除后的對象,依然存在于內存中,只不過由持久化態變為臨時態.
    c.  父子關系(邏輯刪除,只是解除了關聯關系)
             自動刪除不再和Customer對象關聯的Order對象.只需將cascade屬性設為delete-orphan.
                         customer.getOrders().remove(order);
                         order.setCustomer(null);
              注:當關聯雙方都存在父子關系,就可以把父方的cascade屬性設為delete-orphan,所謂父子關系,是由父方來控制子方的生命周期.
                         
           


    posted @ 2009-10-16 00:29 獨孤行 閱讀(3344) | 評論 (2)編輯 收藏
      2009年5月14日

    My97DatePicker是一款非常靈活好用的日期控件,在本次項目中我使用它暴露了很多問題:

    首先來說使用步驟:

    1.在My97DatePicker主頁下載控件,

    目前的版本是:4.2 正式版 發布于2008-12-03

    http://www.my97.net/dp/down.asp

    2.將文件解壓包(一個文件都不要刪除)拷貝到classpath/webroot下

    3.直接使用<script />引入:

    <script type="text/javascript" defer="defer" src="<%=request.getContextPath() %>/My97DatePicker/WdatePicker.js"></script>

    4.在<input type="text"/>中調用:

    <input type="text" name="time" onfocus="WdatePicker()">

    其次來說一下我在使用中碰到的問題:

    1.IE中 無法打開internet站點 。。。。。已終止操作

    這個問題搞了好半天,網上到處查,最后才在csdn上看到解決辦法:

    a.如果頁面有<base/>標簽的:則要在第3步js引入后添加<base target="_self" />;

    b.在<script/>中添加屬性defer="defer"; //就是這具屬性救了我

    2.在步驟4中調用了,結果不出來:

    開始以為是stuts1.2 標簽的原因,結果不是,后來反復測試,才搞定了

    其實調用的時候有很多方法,然而有的方法不一定出得來,所以要反復測試

    這是My97DatePicker的主頁:http://www.my97.net

    里面有控件下載,使用演示,問題解決等

    posted @ 2009-05-14 00:28 獨孤行 閱讀(10473) | 評論 (9)編輯 收藏
      2009年3月29日
         摘要: 七、AJAX開發   到這里,已經可以清楚的知道AJAX是什么,AJAX能做什么,AJAX什么地方不好。如果你覺得AJAX真的能給你的開發工作帶來改進的話,那么繼續看看怎么使用AJAX吧。 7.1、AJAX應用到的技術   AJAX涉及到的7項技術中,個人認為Javascript、XMLHttpRequest、DOM、XML比較有用。 A、XMLHttpRequest對象   XML...  閱讀全文
    posted @ 2009-03-29 20:11 獨孤行 閱讀(250) | 評論 (0)編輯 收藏

    因為正在自學Ajax,看到作者柯自聰的這篇《AJAX開發簡略》寫得不錯,就拿來轉載一下:

             在使用瀏覽器瀏覽網頁的時候,當頁面刷新很慢的時候,你的瀏覽器在干什么?你的屏幕內容是什么?是的,你的瀏覽器在等待刷新,而你的屏幕內容是一片空白,而你在屏幕前苦苦的等待瀏覽器的響應。開發人員為了克服這種尷尬的局面,不得不在每一個可能需要長時間等待響應的頁面上增加一個DIV,告訴用戶“系統正在處理您的請求,請稍候……”。

      現在,有一種越來越流行越熱的“老”技術,可以徹底改變這種窘迫的局面。那就是AJAX。如今,隨著Gmail、Google-maps的應用和各種瀏覽器的支持,AJAX正逐漸吸引全世界的眼球。

    一、AJAX定義
       AJAX(Asynchronous JavaScript and XML)其實是多種技術的綜合,包括Javascript、XHTML和CSS、DOM、XML和XSTL、XMLHttpRequest。其中:

      使用XHTML和CSS標準化呈現,使用DOM實現動態顯示和交互,使用XML和XSTL進行數據交換與處理,使用XMLHttpRequest對象進行異步數據讀取,使用Javascript綁定和處理所有數據。

      在AJAX提出之前,業界對于上述技術都只是單獨的使用,沒有綜合使用,也是由于之前的技術需求所決定的。隨著應用的廣泛,AJAX也成為香餑餑了。

    二、現狀與需要解決的問題
      傳統的Web應用采用同步交互過程,這種情況下,用戶首先向HTTP服務器觸發一個行為或請求的呼求。反過來,服務器執行某些任務,再向發出請求的用戶返回一個HTML頁面。這是一種不連貫的用戶體驗,服務器在處理請求的時候,用戶多數時間處于等待的狀態,屏幕內容也是一片空白。如下圖:

            自從采用超文本作為Web傳輸和呈現之后,我們都是采用這么一套傳輸方式。當負載比較小的時候,這并不會體現出有什么不妥。可是當負載比較大,響應時間要很長,1分鐘、2分鐘……數分鐘的時候,這種等待就不可忍受了。嚴重的,超過響應時間,服務器干脆告訴你頁面不可用。另外,某些時候,我只是想改變頁面一小部分的數據,那為什么我必須重新加載整個頁面呢?!當軟件設計越來越講究人性化的時候,這么糟糕的用戶體驗簡直與這種原則背道而馳。為什么老是要讓用戶等待服務器取數據呢?至少,我們應該減少用戶等待的時間。現在,除了程序設計、編碼優化和服務器調優之外,還可以采用AJAX。

    三、為什么使用AJAX
      與傳統的Web應用不同,AJAX采用異步交互過程。AJAX在用戶與服務器之間引入一個中間媒介,從而消除了網絡交互過程中的處理—等待—處理—等待缺點。用戶的瀏覽器在執行任務時即裝載了AJAX引擎。AJAX引擎用JavaScript語言編寫,通常藏在一個隱藏的框架中。它負責編譯用戶界面及與服務器之間的交互。AJAX引擎允許用戶與應用軟件之間的交互過程異步進行,獨立于用戶與網絡服務器間的交流。現在,可以用Javascript調用AJAX引擎來代替產生一個HTTP的用戶動作,內存中的數據編輯、頁面導航、數據校驗這些不需要重新載入整個頁面的需求可以交給AJAX來執行。

    使用AJAX,可以為ISP、開發人員、終端用戶帶來可見的便捷:

    • 減輕服務器的負擔。AJAX的原則是“按需取數據”,可以最大程度的減少冗余請求,和響應對服務器造成的負擔。
    • 無刷新更新頁面,減少用戶心理和實際的等待時間。特別的,當要讀取大量的數據的時候,不用像Reload那樣出現白屏的情況,AJAX使用XMLHTTP對象發送請求并得到服務器響應,在不重新載入整個頁面的情況下用Javascript操作DOM最終更新頁面。所以在讀取數據的過程中,用戶所面對的不是白屏,是原來的頁面內容(也可以加一個Loading的提示框讓用戶知道處于讀取數據過程),只有當數據接收完畢之后才更新相應部分的內容。這種更新是瞬間的,用戶幾乎感覺不到。
    • 帶來更好的用戶體驗。
    • 可以把以前一些服務器負擔的工作轉嫁到客戶端,利用客戶端閑置的能力來處理,減輕服務器和帶寬的負擔,節約空間和寬帶租用成本。
    • 可以調用外部數據。
    • 基于標準化的并被廣泛支持的技術,不需要下載插件或者小程序。
    • 進一步促進頁面呈現和數據的分離。

    四、誰在使用AJAX
      在應用AJAX開發上面,Google當仁不讓是表率。Orkut、Gmail、Google Groups、Google Maps、Google Suggest都應用了這項技術。Amazon的A9.com搜索引擎也采用了類似的技術。

      微軟也在積極開發更為完善的AJAX應用:它即將推出代號為Atlas的AJAX工具。Atlas的功能超越了AJAX本身,包括整合Visual Studio的調試功能。另外,新的ASP.NET控件將使客戶端控件與服務器端代碼的捆綁更為簡便。Atlas客戶腳本框架(Atlas Clent Script Framework)也使與網頁及相關項目的交互更為便利。但Visual Studio 2005中并不包含此項功能。

      微軟最近宣布Atlas客戶腳本框架將包含如下內容(詳細資料請訪問Atlas計劃網站):

    • 一個可擴展的核心框架,它添加了JavaScript功能:如生命同時期管理、繼承管理、多點傳送處理器和界面管理。
    • 一個常見功能的基本類庫,有豐富的字符串處理、計時器和運行任務。
    • 為HTML附加動態行為的用戶界面框架。
    • 一組用來簡化服務器連通和網絡訪問的網絡堆棧。
    • 一組豐富的用戶界面開發控件,如:自動完成的文本框、動畫和拖放。
    • 處理瀏覽器腳本行為差異的瀏覽器兼容層面。

            典型的,微軟將AJAX技術應用在MSN Space上面。很多人一直都對MS Space服務感到很奇怪,當提交回復評論以后,瀏覽器會暫時停頓一下,然后在無刷新的情況下把我提交的評論顯示出來。這個就是應用了AJAX的效果。試想,如果添加一個評論就要重新刷新整個頁面,那可真費事。

      目前,AJAX應用最普遍的領域是GIS-Map方面。GIS的區域搜索強調快速響應,AJAX的特點正好符合這種需求。

    五、用AJAX改進你的設計
       AJAX雖然可以實現無刷新更新頁面內容,但是也不是什么地方都可以用,主要應用在交互較多、頻繁讀數據、數據分類良好的Web應用中。現在,讓我們舉兩個例子,看看如何用AJAX改進你的設計。

    例子1:數據校驗
      在輸入form表單內容的時候,我們通常需要確保數據的唯一性。因此,常常在頁面上提供“唯一性校驗”按鈕,讓用戶點擊,打開一個校驗小窗口;或者等form提交到服務器端,由服務器判斷后在返回相應的校驗信息。前者,window.open操作本來就是比較耗費資源的,通常由window. showModalDialog代替,即使這樣也要彈出一個對話框;后者,需要把整個頁面提交到服務器并由服務器判斷校驗,這個過程不僅時間長而且加重了服務器負擔。而使用AJAX,這個校驗請求可以由XMLHttpRequest對象發出,整個過程不需要彈出新窗口,也不需要將整個頁面提交到服務器,快速又不加重服務器負擔。例子2:按需取數據—級聯菜單
      以前,為了避免每次對菜單的操作引起的重載頁面,不采用每次調用后臺的方式,而是一次性將級聯菜單的所有數據全部讀取出來并寫入數組,然后根據用戶的操作用JavaScript來控制它的子集項目的呈現,這樣雖然解決了操作響應速度、不重載頁面以及避免向服務器頻繁發送請求的問題,但是如果用戶不對菜單進行操作或只對菜單中的一部分進行操作的話,那讀取的數據中的一部分就會成為冗余數據而浪費用戶的資源,特別是在菜單結構復雜、數據量大的情況下(比如菜單有很多級、每一級菜又有上百個項目),這種弊端就更為突出。

      現在應用AJAX,在初始化頁面時我們只讀出它的第一級的所有數據并顯示,在用戶操作一級菜單其中一項時,會通過Ajax向后臺請求當前一級項目所屬的二級子菜單的所有數據,如果再繼續請求已經呈現的二級菜單中的一項時,再向后面請求所操作二級菜單項對應的所有三級菜單的所有數據,以此類推……這樣,用什么就取什么、用多少就取多少,就不會有數據的冗余和浪費,減少了數據下載總量,而且更新頁面時不用重載全部內容,只更新需要更新的那部分即可,相對于后臺處理并重載的方式縮短了用戶等待時間,也把對資源的浪費降到最低。

    例子3:讀取外部數據
      AJAX可以調用外部數據,因此,可以對一些開發的數據比如XML文檔、RSS文檔進行二次加工,實現數據整合或者開發應用程序。

    六、AJAX的缺陷

    AJAX不是完美的技術。使用AJAX,它的一些缺陷不得不權衡一下:

    • AJAX大量使用了Javascript和AJAX引擎,而這個取決于瀏覽器的支持。IE5.0及以上、Mozilla1.0、NetScape7及以上版本才支持,Mozilla雖然也支持AJAX,但是提供XMLHttpRequest的方式不一樣。所以,使用AJAX的程序必須測試針對各個瀏覽器的兼容性。
    • AJAX更新頁面內容的時候并沒有刷新整個頁面,因此,網頁的后退功能是失效的;有的用戶還經常搞不清楚現在的數據是舊的還是已經更新過的。這個就需要在明顯位置提醒用戶“數據已更新”。
    • 對流媒體的支持沒有FLASH、Java Applet好。
    • 一些手持設備(如手機、PDA等)現在還不能很好的支持Ajax。

     

    posted @ 2009-03-29 16:27 獨孤行 閱讀(256) | 評論 (0)編輯 收藏
      2009年3月16日
    Struts中有四種不同Action,分別如下:
    1.Action
    2.DispatchAction
    3.LookupDispatchAction
    4.MappingDispatchAction
    關于Action在Struts中的工作流程,這里我就不多說了,只針對各種不同的Action詳解
        第一種Action:是最普通、也是我們最先接觸的一種,但它僅支持一種業務方法,Action中只能允許有一個execute(),所有比較單一,有局限性,平時的項目中也用的少,或者說,它針對的是一個表單,一個Submit
    關于用法:Action中就一個execute(),而strut-config.xml也只需配置一具最普通的<action/>節點,就夠了
    <!-- Action -->
        
    <action
          attribute
    ="loginForm"
          name
    ="loginForm"
          path
    ="/login"
          scope
    ="request"
          type
    ="org.svse.struts.action.LoginAction">
          
    <forward name="ok" path="/ok.jsp"></forward>
          
    <forward name="error" path="/error.jsp"></forward>      
          
    </action>
        第二種DispatchAction:這是我們在平時的學習和項目中用的最多的一種,因為它支持多個業務方法的擴展,使用起來也方便,或者說,它針對的是一個表單,多個Button
    關于用法:Action中需要幾個業務方法,就復制幾個execute(),然后改名即可,比如我們做加、減、乘、除,有四個方法,即:add(),sub(),mul(),div();而struts-config.xml中也只需配一個<action/>節點;當然,在涉及到有的業務是否需要表單驗證時,可以單獨再添加節點嘛
    <!-- DispatchAction -->
        
    <action
          attribute
    ="calForm"
          name
    ="calForm"
          parameter
    ="method"
          path
    ="/cal"
          scope
    ="request"
          type
    ="org.svse.struts.action.CalAction">
          
    <forward name="result" path="/cal_result.jsp"></forward>
          
    </action>
    parameter參數對應的就是我們的業務方法了,在三種DispatchAction中都要用到它,因為有了它,就可實現多業務的調用;
    哪我們在視圖層,是如何調用的呢?很簡單:/cal.do?method=方法名(add、sub)
    <script type="text/javascript">
            function dosubmit(url)
    {
                var myform 
    = document.myform;
                myform.action 
    = url;
                myform.submit();
            }

        
    </script>
      
    </head>
      
      
    <body>
      
    <!-- 一個表單多個按鈕 -->
      
    <form method="post" name="myform">
           第一個數:
    <input type="text" name="num1"><br>
           第二個數:
    <input type="text" name="num2"><br>
           
    <input type="button" value="" onclick="dosubmit('cal.do?method=add')">
           
    <input type="button" value="" onclick="dosubmit('cal.do?method=sub')">
        
    <input type="button" value="" onclick="dosubmit('cal.do?method=mul')">
           
    <input type="button" value="" onclick="dosubmit('cal.do?method=div')"> 
      
    </form>
      
    </body>
        第三種LookupDispatchAction:此種Action恐怕是我們平時用的最少的一種了,盡管它也支持多業務,或者說,它針對的是一個表單,多個Submit;
    但用起來非常麻煩,需要struts標簽,資源文件,Action中要Map集合;這里就大概說一下
    Actoin中業務方法跟上面一樣,只不過多一個包含Map的方法:
    //通過資源文件的key(button.add),來找到業務方法add(),sub()
        protected Map getKeyMethodMap() {
            Map map 
    = new HashMap();
            map.put(
    "button.add","add");
            map.put(
    "button.sub","sub");
            
    return map;
        }
    資源文件:
    # Resources for parameter 'org.svse.struts.ApplicationResources'
    # Project ch03
    button.add
    =add
    button.sub
    =sub
    struts-config.xml也跟上面一樣,根據method來找;
    哪視圖組件如何來調用呢?
    <!-- 一個表單多個提交 -->
        
    <form action="cal2.do" method="post">
              num1:
    <input type="text" name="num1"/><br>
              num2:
    <input type="text" name="num2"/><br>
              
    <html:submit property="method">
                  
    <bean:message key="button.add"/>
              
    </html:submit>
              
    <html:submit property="method">
                  
    <bean:message key="button.sub"/>
              
    </html:submit>
        
    <form>
    怎么樣夠麻煩的吧。。。
        第四種MappingDispatchAction:我自認為它比DispatchAction差不多好用,只是它夠靈活(這里針對<action/>節點,想咋配咋配),或者說,它針對的是多個表單,多個Submit;
    關于用法,也比較簡單:
    Action中的業務實現跟DispatchAction一樣,strut-config.xml則要靈活些,針對每一個業務方法,配一個<action/>節點:
    <!-- MappingDispatchAction -->
        
    <!-- add -->
        
    <action
          attribute
    ="calForm"
          name
    ="calForm"
          parameter
    ="add"
          path
    ="/add"
          scope
    ="request"
          type
    ="org.svse.struts.action.Cal3Action">
          
    <forward name="result" path="/cal_result.jsp" />
        
    </action>
        
    <!-- sub -->
        
    <action
          attribute
    ="calForm"
          name
    ="calForm"
          parameter
    ="sub"
          path
    ="/sub"
          scope
    ="request"
          type
    ="org.svse.struts.action.Cal3Action">
          
    <forward name="result" path="/cal_result.jsp" />
        
    </action>
    視圖組件的調用就很能夠方便了:直接跟/path路徑名.do:
    <form action="add.do" method="post">
            num1:
    <input type="text" name="num1"><br>
            num2:
    <input type="text" name="num2"><br>
            
    <input type="submit" value="">
        
    </form>
    Struts中四種Action用法基本完畢,此純屬本人在學習過程中自己的總結,若有不當之處,愿不令賜教!!!
    posted @ 2009-03-16 10:43 獨孤行 閱讀(2016) | 評論 (7)編輯 收藏
      2009年3月14日

    常用的Struts標簽庫有以下五大類:

    1.HTML Tag:

    用來創建能夠和Struts框架以及其它相應的HTML標簽交互的HTML輸入表單;

    如:<html:form></html:form>,<html:text/>,<html:password/>,<html:radio/>,<html:checkbox/>,<htmlmultibox>

    2.Bean Tag

    該標簽庫包含的標簽可以用來創建bean、訪問bean和訪問bean的屬性。

     如:<bean:write/>:用于將bean的屬性輸送到jsp頁面,<bean:define/>定義一個新的bean

    3.Logic Tag

    該標簽庫包含的標簽可以用來進行邏輯判斷、集合迭代和流程控制。

    如:<logic:iterate/>:用來循環迭代,<logic:eaual/>:用來進行邏輯判斷

    4.Nested:增強對其他Struts標簽的嵌套使用能力

    該標簽庫建立在前三個標簽庫的基礎上,具有前三個標簽庫的所有功能,只是允許標簽間的嵌套。

    5.Template Tag

    隨著Titles框架包的出現,此標記已開始減少使用

    下面介紹幾個最常用的標簽:

    <html:check box/>一般用于一個選項的復選框

    <html:multibox/>一般用于多個選項的復選框

    <bean:write name="user" property="username"/>等同于EL表達示:${user.username}

    <bean:define id="inter" name="user" property="interest" type="java.lang.String"/>定義一個bean

    <bean:message key=" " arg0=" "/> key 定義在資源文件中,args0[1,2]為參數

    <logic:iterate name="list" id="user"> 等同于JSTL的:<c:foeach item=${list} var="user"/>

    <logic:equal name="user" property="sex" value="0"/>等同于JSTL的:<c:when test=""/>

    <logic:empty />標簽是用來判斷是否為空的。如果為空,該標簽體中嵌入的內容就會被處理

    <logic:empty name="listForm" property = "persons">
    <div>集合persons為空!</div>
    </logic:empty>

    1.下面給一個表單的完整代碼:

    <body>
        
    <center>
            
    <html:form action="/user">
            用戶名:
    <html:text property="user.username"></html:text><p/>
            密碼:
    <html:text property="user.pwd"></html:text><p/>
            性別:
    <html:radio property="user.sex" value=""></html:radio>
                
    <html:radio property="user.sex" value=""></html:radio><p/>
            城市:
    <html:select property="user.city">
                
    <html:option value="">請選擇</html:option>
                
    <html:option value="武漢">武漢</html:option>
                
    <html:option value="上海">上海</html:option>
                
    <html:option value="北京">北京</html:option>
            
    </html:select><p/>
            愛好:
    <html:multibox property="interest" value="看書"/>看書
                
    <html:multibox property="interest" value="游戲"/>游戲
                
    <html:multibox property="interest" value="睡覺"/>睡覺<p/>
                
    <html:submit/><html:cancel/>
            
    </html:form>
        
    </center>
        
    </body>

    使用html標簽作為表單輸入,可以方便的使用驗證框架即:<html:errors property="username">

    2.下面給一個顯示數據的代碼:

    <table align="center" border="1" width="600">
            
    <caption>用戶注冊信息</caption>
            
    <tr>
                
    <td>用戶名</td>
                
    <td>密碼</td>
                
    <td>性別</td>
                
    <td>城市</td>
                
    <td>愛好</td>
                
    <td colspan="2" align="center">操作</td>
            
    </tr>
            
    <logic:iterate name="list" id="user">
            
    <tr>
                
    <td><bean:write name="user" property="username"/></td>
                
    <td><bean:write name="user" property="pwd"/></td>
                
    <td><bean:write name="user" property="sex"/></td>
                
    <td><bean:write name="user" property="city"/></td>
                
    <td>
                    
    <bean:define id="interest" name="user" property="interest" type="java.lang.String"></bean:define>
                    
    <logic:iterate id="inter" collection="<%=StringUtil.stringChange2(interest)%>">
                        $
    {inter}
                    
    </logic:iterate>
                
    </td>
                
    <td><a href="del.do?userid=${user.userid}">刪除</a></td>
                
    <td><a href="upd.do?userid=${user.userid}">修改</a></td>
            
    </tr>
            
    </logic:iterate>
        
    </table>

    作為顯示數據,Struts標簽并不比Jstl與EL方便,因此,本人更習慣用后者

    其實Struts標簽的好處,并不是上面這些,而是它可利用ActionForm來填充數據

    比如我們在做頁面數據修改的時候,會讓當前頁面數據顯示到顯示修改頁面,這樣利于客戶端修改

    以前我們這樣做的:根據id從數據庫查出,然后使用html的value屬性填充,現在有了Struts標簽,就不需要那么麻煩了

    直接在Action里填充ActionForm的數據就搞定了

    public ActionForward upd(ActionMapping mapping, ActionForm form,
                HttpServletRequest request, HttpServletResponse response) 
    {
            UserForm userForm 
    = (UserForm) form;
            
    int userid = Integer.parseInt(request.getParameter("userid"));
            UserInfo user 
    = biz.findUser(userid);
            String[]interest 
    = StringUtil.stringChange2(user.getInterest());
            
    //將用戶信息填充到ActionForm
            userForm.setUser(user);
            userForm.setInterest(interest);
            
    return mapping.findForward("upd");
        }
    然后在修改頁面顯示,請往下看:
    <html:form action="/doupd">
            用戶名:
    <html:text property="user.username"></html:text><p/>
            密碼:
    <html:text property="user.pwd"></html:text><p/>
            性別:
    <html:radio property="user.sex" value=""></html:radio>
                
    <html:radio property="user.sex" value=""></html:radio><p/>
            城市:
    <html:select property="user.city">
                
    <html:option value="">請選擇</html:option>
                
    <html:option value="武漢">武漢</html:option>
                
    <html:option value="上海">上海</html:option>
                
    <html:option value="北京">北京</html:option>
            
    </html:select><p/>
            愛好:
    <html:multibox property="interest" value="看書"/>看書
                
    <html:multibox property="interest" value="游戲"/>游戲
                
    <html:multibox property="interest" value="睡覺"/>睡覺<p/>
                
    <html:submit value="修改"/>
            
    </html:form>
    怎么樣,簡單方便吧,其實Struts標簽還是有它的好處的。
    posted @ 2009-03-14 23:47 獨孤行 閱讀(1594) | 評論 (1)編輯 收藏
      2009年3月13日

    Struts中最常用的七種ActionForm如下:

    1.ActionForm

    2.ValidatorForm

    3.ValidatorActionForm

    4.DynaActionForm

    5.DynaValidatorForm

    6.DynaValidatorActionForm

    7.LazyValidatorForm

    由命名來看,就總體使用規律如下:

    1.帶有Validator的,但都可使用驗證框架;

    2.以Dyna開頭的,都是自動生成相應的form,只需在Struts-config.xml中配置屬性即可

    3.中間是否有Action的,表示validation.xml中的form的name名,是跟formbean的名稱,還是/path路徑

    下面按規律逐個介紹:

    1.ActionForm,DynaActionForm此類不支持驗證框架,需手動創建form,并實現自定義的validate()方法

    但DynaActionForm是特例(它自動生成form),所以沒有validate()方法,所以也就不能驗證
    2.ValidatorForm,ValidatorActionForm,DynaValidatorForm

    DynaValidatorActionForm,LazyValidatorForm 此大類都是支持驗證框架的,當然也可以完成自定義的validate()方法,來覆蓋驗證框架的方法,其中:

    ValidatorForm,DynaValidatorForm,LazyValidatorForm  沒有Action,是針對form來驗證的,即凡是用到該form的頁面,都必須驗證;

    反之,ValidatorActionForm,DynaValidatorActionForm,則是針對Action的,要驗證哪個Action,就跟那個/path路徑,validation.xml代碼如下:

    <form-validation>
        
    <formset>
            
    <!-- 此時針對Action驗證,name跟/path路徑--!>
            
    <!--如果是針對form驗證,name則跟formbean的名稱--!>
            
    <form name="/login">
                
    <field property="username" depends="required">
                    
    <msg name="required" key="username"/>
                
    </field>
                
    <field property="pwd" depends="required,minlength">
                    
    <msg name="required" key="pwd"/>
                    
    <msg name="minlength" key="pwd1"/>
                    
    <var>
                        
    <var-name>minlength</var-name>
                        
    <var-value>6</var-value>
                    
    </var>
                
    </field>
            
    </form>
        
    </formset>
    </form-validation>

    針對七種ActionForm,我們要靈活運用,需要驗證誰,就讓它停下,不需要的,讓它通過。

     另外介紹下驗證框架的使用步驟

    1.在validator-rules.xml中引入驗證插件的代碼:

    <!--引入驗證框架--!>
    <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
            
    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,
                                                      /WEB-INF/validation.xml"/>
          </plug-in>
    2.創建并配置validation.xml 文件,代碼如下:
    <!DOCTYPE form-validation PUBLIC
              
    "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
              
    "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">
    <form-validation>
        
    <formset>
            
    <form name="loginForm">
                
    <field property="username" depends="required">
                    
    <msg name="required" key="username"/>
                
    </field>
                
    <field property="pwd" depends="required,minlength">
                    
    <msg name="required" key="pwd"/>
                    
    <msg name="minlength" key="pwd1"/>
                    
    <var>
                        
    <var-name>minlength</var-name>
                        
    <var-value>6</var-value>
                    
    </var>
                
    </field>
            
    </form>
        
    </formset>
    </form-validation>
    3.描述.properties資源文件,來指明驗證提示,當然也可不用,直接聲明變量
    # Resources for parameter 'ApplicationResources'
    # Project ch07
    username
    =username is null
    pwd
    =pwd is null
    pwd1
    =pwd is less than 6
    以上來自各方面的學習,加上自己的整合,希望與各位豪杰共同探討
    posted @ 2009-03-13 17:03 獨孤行 閱讀(507) | 評論 (0)編輯 收藏
    僅列出標題  
    主站蜘蛛池模板: 国产成人亚洲合集青青草原精品| **真实毛片免费观看| 亚洲明星合成图综合区在线| 亚洲精品和日本精品| 无限动漫网在线观看免费 | 浮力影院第一页小视频国产在线观看免费| 最新亚洲成av人免费看| 国产亚洲综合精品一区二区三区| 亚洲性色高清完整版在线观看| 国产精品亚洲片在线观看不卡| 免费中文字幕在线观看| 亚洲国产成人一区二区精品区| 国产美女精品久久久久久久免费| 四虎免费影院ww4164h| 国产免费一区二区视频| 国产高清对白在线观看免费91| 国产精品无码亚洲一区二区三区| jlzzjlzz亚洲jzjzjz| 亚洲第一页在线播放| 亚洲天堂久久精品| 亚洲在成人网在线看| 午夜影视日本亚洲欧洲精品一区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 51午夜精品免费视频| 含羞草国产亚洲精品岁国产精品 | 一个人免费观看视频www| 2019中文字幕在线电影免费| 国产成人精品无码免费看| a级毛片无码免费真人久久| 三级黄色片免费看| a级片在线免费看| 免费国产在线视频| 免费A级毛片无码专区| 99视频有精品视频免费观看| 亚洲欧洲免费视频| 午夜精品一区二区三区免费视频 | 亚洲免费无码在线| 国产精品亚洲av色欲三区| 国产99久久亚洲综合精品| 久久久久亚洲国产AV麻豆| 亚洲女子高潮不断爆白浆|