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

          在網(wǎng)上搜Annotation的學(xué)習(xí)資料不是很多,還是用的人不多,比較經(jīng)典的入門就是這個(gè):實(shí)戰(zhàn)篇:設(shè)計(jì)自己的Annotation,很清楚,通俗易懂,這里我就不贅述了。然而僅僅是弄懂它是怎么回事,具體還是沒什么用處,這也是大多數(shù)開發(fā)人員的感覺。

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

          后來公司接了個(gè)ERP的單子,技術(shù)總監(jiān)馬上意識(shí)到框架該升級(jí)了,他技術(shù)很牛,我們公司的框架就是他一人寫的,兩周之后,新框架出爐,xml只保留三分之一:Action跳轉(zhuǎn)、Form表單都不再使用xml配置,而是Annotation橫空出世,給我的感覺:它就像一個(gè)救世主,讓我們的框架重生,它就是這次升級(jí)的最大亮點(diǎn),只有sqlmapper依然保留,這無可厚非,因?yàn)樗臼莍batis封裝的,Action控制器既不是Struts1,Struts2,也不是Webwork,是總監(jiān)自己封裝的Servlet,F(xiàn)orm表單都由后臺(tái)生成js組件拋到前端,通過反編譯看到源碼,其實(shí)還是很基礎(chǔ)的,貼些代碼上來看下吧:

          1.Action請(qǐng)求部分:
              /**
               * 顯示新增頁面
               * 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");
              }
          可能大家看得不太明白(每個(gè)公司都有自己框架),沒有關(guān)系,就兩句:
          @Action("/add.shtml")
          它就是負(fù)責(zé)請(qǐng)求顯示新增的頁面,就這一句,不需要像我們以前的action.xml(類似Struts2的跳轉(zhuǎn)),干凈利索吧,當(dāng)然底層后臺(tái)有處理,但是公共的,不需我們管,至于
          @Permission("client.ContractType.add")
          就是用來處理權(quán)限管理的,也是Annotation的使用,就這一句。就權(quán)限管理,后面我也會(huì)記述。。。

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

          import java.lang.annotation.Annotation;

          public interface Action
              
          extends Annotation
          {

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

          3.JavaBean生成表單:
              @Widget(value="TextBox")
              @Valider({
          "notempty","len(2,8)"})
              
          public void setName(String name) {
                  
          this.name = name;
              }
          給setter方法加Annotation,@Widget是組件,@Valider是驗(yàn)證
          意思就是給name字段生成TextBox組件,并做驗(yàn)證處理,后臺(tái)有相應(yīng)的公共js組件,驗(yàn)證控件庫調(diào)用,我們所有的表單組件都是這樣生成的,說實(shí)話,這樣生成一個(gè)頁面真有點(diǎn)繁鎖,既要寫js,又要寫后臺(tái),前端還要配,還真是有技術(shù)含量,呵呵。。。但是它保證一致性,所有表單組件,驗(yàn)證控件,如TextBox我們只有一套,所有人都去調(diào)用這一套,不得再重造,因?yàn)樗强蚣?。。?br />
          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類似,當(dāng)然這些都只是定義、聲明,具體怎么用,這里就不貼了,畢竟是人家東西嘛

          怎么樣,看到這些,似乎覺得Annotation開始起作用了,其實(shí)我一直覺得,Annotation就是為xml所生,因?yàn)樗鼈儌z是死對(duì)頭,不管單一地用誰,都有缺陷,
          只有結(jié)合才是完善,正所謂,沒有最好,只有更好,合理就行。

          在這里我可能沒有貼出什么@Annotation技術(shù)含量的東西,但是我想要表達(dá)的是一種思想,一種框架的思想,并不是什么地方都能用到Annotation,一般的中小型項(xiàng)目根本沒必要用它,因?yàn)閤ml就搞定,所以用在需要用的地方,將它的能量發(fā)揮到最大。。。

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

          posted @ 2010-08-10 16:47 獨(dú)孤行 閱讀(1714) | 評(píng)論 (1)編輯 收藏
               摘要: 在項(xiàng)目中使用ibatis有一段時(shí)間了,之前一直用jdbc、hibernate。自我感覺ibatis是介于jdbc和hibernate之間的非常實(shí)用的輕量級(jí)框架,相信用過的人都有同感吧。對(duì)搞java的來說,上手是非常快的,只要你具備sql基礎(chǔ),再加一點(diǎn)ORM的思想,夏昕的《ibatis開發(fā)指南》是不錯(cuò)的選擇。 今天項(xiàng)目搞完了,我就把所學(xué)的,以及在項(xiàng)目中用到拿來貼一番,也是對(duì)我個(gè)人技術(shù)的總結(jié)吧,怎樣...  閱讀全文
          posted @ 2010-04-01 11:35 獨(dú)孤行 閱讀(3355) | 評(píng)論 (0)編輯 收藏
          thickbox是jQuery的一個(gè)插件,其作用是彈出對(duì)話框、網(wǎng)頁框,使用戶體驗(yàn)度更加愉悅,下面就來簡(jiǎn)單介紹它的幾種用法。
          聲明一下:這只是個(gè)人的總結(jié)記載而已。
          準(zhǔn)備工作:你需要三個(gè)文件:thickbox.js、thickbox.css、jquery.js,網(wǎng)上到處可下
          具體使用:
          第一步:將這三個(gè)文件引入到你要使用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" />
          第二步:一般簡(jiǎn)單使用就是給<a>標(biāo)簽和Button添加樣式:class=thickbox
          還有就是通過thickbox函數(shù)調(diào)用:如tb_init()、tb_show();見下文。
          幾種不同用法:
          1.點(diǎn)擊顯示圖片:
           <a href="001.jpg" class="thickbox"><img src="001.jpg"/></a>
          ok,就這樣搞定
          2.點(diǎn)擊按鈕或鏈接:
          <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>
               這是一個(gè)非模式對(duì)話框。
             
          </P>
             
          </div>

             
          <div id="div2" style="display:none">
             
          <P>
               這是一個(gè)模式對(duì)話框。
               
          <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是顯示彈出對(duì)話框的大小參數(shù),inlineId是你要顯示的標(biāo)簽或組件,modal是模式與非模式的選擇,當(dāng)然你還可以接很多你自定義的參數(shù)
          3.一般在項(xiàng)目中用得比較多的就是加載form的頁面,如添加,編輯在同一個(gè)list列表頁面,這時(shí)我們就可以將添加和編輯都做成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的元素,不使用樣式,可以用函數(shù),如:
          <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樣式會(huì)失效,解決辦法:
          只要在AJAX載入HTML并更新到頁面后執(zhí)行下以下代碼:
          tb_init('.thickbox');
          6.自定義函數(shù)調(diào)用:
          如點(diǎn)擊縮圖,要顯示大圖,縮略圖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改成你想觸發(fā)thickbox的事件。
          下班勒,大概記錄到這,以后再加吧。。。


          posted @ 2010-03-26 17:47 獨(dú)孤行 閱讀(4645) | 評(píng)論 (2)編輯 收藏

          在域模型(實(shí)體域)中,關(guān)聯(lián)關(guān)系是類與類之間最普遍的關(guān)系。根據(jù)UML語言,關(guān)系是有方向的。下面以客戶(Customer)和訂單(Order)的關(guān)系為例,闡述一下ORM的中的一對(duì)多映射:
          我們知道,在關(guān)系數(shù)據(jù)庫中,只存在外鍵參照關(guān)系,而且總是由“many”方參照“one“方。
          1.建立多對(duì)一單向關(guān)聯(lián)——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;
             
             
          //構(gòu)造方法及set方法get方法
             
          }
          在以上代碼中customer屬性要使用<many-to-one>來映射:
          多對(duì)一單向關(guān)聯(lián)(many方)
          <many-to-one>
              name 
          = "customer"   --待映射的持久化類屬性名
              column 
          = "customer_Id"  --數(shù)據(jù)庫外鍵字段
              
          class = "mypack.Customer"  --持久化類
              not
          -null = "true"/>
          a.  <many-to-one>的not-null屬性 
          not-null屬性會(huì)影響Hiberntae的運(yùn)行時(shí)行為,Hibernate在保存Order對(duì)象時(shí),會(huì)先檢查它的customer屬性是否為null:
          若為null:在執(zhí)行session.save(Order)時(shí)會(huì)拋出PropertyValueException異常;
          原因很簡(jiǎn)單:既然Customer為null,那么對(duì)應(yīng)的外鍵Customer_Id也為null,試問外鍵都沒有,Order表的數(shù)據(jù)能插得進(jìn)去嗎
          若將not-null 屬性設(shè)為false:表示外鍵引用可以為null,試想一下,數(shù)據(jù)庫數(shù)據(jù)可以插進(jìn)去嗎?
          我們來看:在執(zhí)行session.save(Order)時(shí),發(fā)出了sql語句:insert into......
          但是當(dāng)Hibernate自動(dòng)清理(flush)緩存時(shí),拋出新的異常:TransientObjectException
          所謂清理是提交事務(wù)或手動(dòng)Flush,將session與數(shù)據(jù)庫保持同步,很顯然不可能同步嘛,Order對(duì)象雖然持久化,但Customer沒有.
              注:是否應(yīng)該把<many-to-one>的not-null屬性設(shè)為true,這根據(jù)實(shí)際業(yè)務(wù)而定。通常,訂單總是由客戶自己發(fā)出,因此建議設(shè)為true.
          b.  級(jí)聯(lián)保存與更新
          默認(rèn)情況下,Hibernate持久化一個(gè)對(duì)象,不會(huì)自動(dòng)持久化所關(guān)聯(lián)的其它臨時(shí)對(duì)象,因此會(huì)有TransientObjectException,
          想它關(guān)聯(lián)也可以,<many-to-one>中加個(gè)屬性cascade="save-update"即可.

          2.建立一對(duì)多關(guān)聯(lián)——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();

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

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


          posted @ 2009-10-16 00:29 獨(dú)孤行 閱讀(3347) | 評(píng)論 (2)編輯 收藏

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

          首先來說使用步驟:

          1.在My97DatePicker主頁下載控件,

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

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

          2.將文件解壓包(一個(gè)文件都不要?jiǎng)h除)拷貝到classpath/webroot下

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

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

          4.在<input type="text"/>中調(diào)用:

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

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

          1.IE中 無法打開internet站點(diǎn) 。。。。。已終止操作

          這個(gè)問題搞了好半天,網(wǎng)上到處查,最后才在csdn上看到解決辦法:

          a.如果頁面有<base/>標(biāo)簽的:則要在第3步j(luò)s引入后添加<base target="_self" />;

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

          2.在步驟4中調(diào)用了,結(jié)果不出來:

          開始以為是stuts1.2 標(biāo)簽的原因,結(jié)果不是,后來反復(fù)測(cè)試,才搞定了

          其實(shí)調(diào)用的時(shí)候有很多方法,然而有的方法不一定出得來,所以要反復(fù)測(cè)試

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

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

          posted @ 2009-05-14 00:28 獨(dú)孤行 閱讀(10475) | 評(píng)論 (9)編輯 收藏
               摘要: 七、AJAX開發(fā)   到這里,已經(jīng)可以清楚的知道AJAX是什么,AJAX能做什么,AJAX什么地方不好。如果你覺得AJAX真的能給你的開發(fā)工作帶來改進(jìn)的話,那么繼續(xù)看看怎么使用AJAX吧。 7.1、AJAX應(yīng)用到的技術(shù)   AJAX涉及到的7項(xiàng)技術(shù)中,個(gè)人認(rèn)為Javascript、XMLHttpRequest、DOM、XML比較有用。 A、XMLHttpRequest對(duì)象   XML...  閱讀全文
          posted @ 2009-03-29 20:11 獨(dú)孤行 閱讀(253) | 評(píng)論 (0)編輯 收藏

          因?yàn)檎谧詫W(xué)Ajax,看到作者柯自聰的這篇《AJAX開發(fā)簡(jiǎn)略》寫得不錯(cuò),就拿來轉(zhuǎn)載一下:

                   在使用瀏覽器瀏覽網(wǎng)頁的時(shí)候,當(dāng)頁面刷新很慢的時(shí)候,你的瀏覽器在干什么?你的屏幕內(nèi)容是什么?是的,你的瀏覽器在等待刷新,而你的屏幕內(nèi)容是一片空白,而你在屏幕前苦苦的等待瀏覽器的響應(yīng)。開發(fā)人員為了克服這種尷尬的局面,不得不在每一個(gè)可能需要長(zhǎng)時(shí)間等待響應(yīng)的頁面上增加一個(gè)DIV,告訴用戶“系統(tǒng)正在處理您的請(qǐng)求,請(qǐng)稍候……”。

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

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

            使用XHTML和CSS標(biāo)準(zhǔn)化呈現(xiàn),使用DOM實(shí)現(xiàn)動(dòng)態(tài)顯示和交互,使用XML和XSTL進(jìn)行數(shù)據(jù)交換與處理,使用XMLHttpRequest對(duì)象進(jìn)行異步數(shù)據(jù)讀取,使用Javascript綁定和處理所有數(shù)據(jù)。

            在AJAX提出之前,業(yè)界對(duì)于上述技術(shù)都只是單獨(dú)的使用,沒有綜合使用,也是由于之前的技術(shù)需求所決定的。隨著應(yīng)用的廣泛,AJAX也成為香餑餑了。

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

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

          三、為什么使用AJAX
            與傳統(tǒng)的Web應(yīng)用不同,AJAX采用異步交互過程。AJAX在用戶與服務(wù)器之間引入一個(gè)中間媒介,從而消除了網(wǎng)絡(luò)交互過程中的處理—等待—處理—等待缺點(diǎn)。用戶的瀏覽器在執(zhí)行任務(wù)時(shí)即裝載了AJAX引擎。AJAX引擎用JavaScript語言編寫,通常藏在一個(gè)隱藏的框架中。它負(fù)責(zé)編譯用戶界面及與服務(wù)器之間的交互。AJAX引擎允許用戶與應(yīng)用軟件之間的交互過程異步進(jìn)行,獨(dú)立于用戶與網(wǎng)絡(luò)服務(wù)器間的交流。現(xiàn)在,可以用Javascript調(diào)用AJAX引擎來代替產(chǎn)生一個(gè)HTTP的用戶動(dòng)作,內(nèi)存中的數(shù)據(jù)編輯、頁面導(dǎo)航、數(shù)據(jù)校驗(yàn)這些不需要重新載入整個(gè)頁面的需求可以交給AJAX來執(zhí)行。

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

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

          四、誰在使用AJAX
            在應(yīng)用AJAX開發(fā)上面,Google當(dāng)仁不讓是表率。Orkut、Gmail、Google Groups、Google Maps、Google Suggest都應(yīng)用了這項(xiàng)技術(shù)。Amazon的A9.com搜索引擎也采用了類似的技術(shù)。

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

            微軟最近宣布Atlas客戶腳本框架將包含如下內(nèi)容(詳細(xì)資料請(qǐng)?jiān)L問Atlas計(jì)劃網(wǎng)站):

          • 一個(gè)可擴(kuò)展的核心框架,它添加了JavaScript功能:如生命同時(shí)期管理、繼承管理、多點(diǎn)傳送處理器和界面管理。
          • 一個(gè)常見功能的基本類庫,有豐富的字符串處理、計(jì)時(shí)器和運(yùn)行任務(wù)。
          • 為HTML附加動(dòng)態(tài)行為的用戶界面框架。
          • 一組用來簡(jiǎn)化服務(wù)器連通和網(wǎng)絡(luò)訪問的網(wǎng)絡(luò)堆棧。
          • 一組豐富的用戶界面開發(fā)控件,如:自動(dòng)完成的文本框、動(dòng)畫和拖放。
          • 處理瀏覽器腳本行為差異的瀏覽器兼容層面。

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

            目前,AJAX應(yīng)用最普遍的領(lǐng)域是GIS-Map方面。GIS的區(qū)域搜索強(qiáng)調(diào)快速響應(yīng),AJAX的特點(diǎn)正好符合這種需求。

          五、用AJAX改進(jìn)你的設(shè)計(jì)
             AJAX雖然可以實(shí)現(xiàn)無刷新更新頁面內(nèi)容,但是也不是什么地方都可以用,主要應(yīng)用在交互較多、頻繁讀數(shù)據(jù)、數(shù)據(jù)分類良好的Web應(yīng)用中?,F(xiàn)在,讓我們舉兩個(gè)例子,看看如何用AJAX改進(jìn)你的設(shè)計(jì)。

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

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

          例子3:讀取外部數(shù)據(jù)
            AJAX可以調(diào)用外部數(shù)據(jù),因此,可以對(duì)一些開發(fā)的數(shù)據(jù)比如XML文檔、RSS文檔進(jìn)行二次加工,實(shí)現(xiàn)數(shù)據(jù)整合或者開發(fā)應(yīng)用程序。

          六、AJAX的缺陷

          AJAX不是完美的技術(shù)。使用AJAX,它的一些缺陷不得不權(quán)衡一下:

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

           

          posted @ 2009-03-29 16:27 獨(dú)孤行 閱讀(259) | 評(píng)論 (0)編輯 收藏
          Struts中有四種不同Action,分別如下:
          1.Action
          2.DispatchAction
          3.LookupDispatchAction
          4.MappingDispatchAction
          關(guān)于Action在Struts中的工作流程,這里我就不多說了,只針對(duì)各種不同的Action詳解
              第一種Action:是最普通、也是我們最先接觸的一種,但它僅支持一種業(yè)務(wù)方法,Action中只能允許有一個(gè)execute(),所有比較單一,有局限性,平時(shí)的項(xiàng)目中也用的少,或者說,它針對(duì)的是一個(gè)表單,一個(gè)Submit;
          關(guān)于用法:Action中就一個(gè)execute(),而strut-config.xml也只需配置一具最普通的<action/>節(jié)點(diǎn),就夠了
          <!-- 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:這是我們?cè)谄綍r(shí)的學(xué)習(xí)和項(xiàng)目中用的最多的一種,因?yàn)樗С侄鄠€(gè)業(yè)務(wù)方法的擴(kuò)展,使用起來也方便,或者說,它針對(duì)的是一個(gè)表單,多個(gè)Button
          關(guān)于用法:Action中需要幾個(gè)業(yè)務(wù)方法,就復(fù)制幾個(gè)execute(),然后改名即可,比如我們做加、減、乘、除,有四個(gè)方法,即:add(),sub(),mul(),div();而struts-config.xml中也只需配一個(gè)<action/>節(jié)點(diǎn);當(dāng)然,在涉及到有的業(yè)務(wù)是否需要表單驗(yàn)證時(shí),可以單獨(dú)再添加節(jié)點(diǎn)嘛
          <!-- 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參數(shù)對(duì)應(yīng)的就是我們的業(yè)務(wù)方法了,在三種DispatchAction中都要用到它,因?yàn)橛辛怂?就可實(shí)現(xiàn)多業(yè)務(wù)的調(diào)用;
          哪我們?cè)谝晥D層,是如何調(diào)用的呢?很簡(jiǎn)單:/cal.do?method=方法名(add、sub)
          <script type="text/javascript">
                  function dosubmit(url)
          {
                      var myform 
          = document.myform;
                      myform.action 
          = url;
                      myform.submit();
                  }

              
          </script>
            
          </head>
            
            
          <body>
            
          <!-- 一個(gè)表單多個(gè)按鈕 -->
            
          <form method="post" name="myform">
                 第一個(gè)數(shù):
          <input type="text" name="num1"><br>
                 第二個(gè)數(shù):
          <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恐怕是我們平時(shí)用的最少的一種了,盡管它也支持多業(yè)務(wù),或者說,它針對(duì)的是一個(gè)表單,多個(gè)Submit;
          但用起來非常麻煩,需要struts標(biāo)簽,資源文件,Action中要Map集合;這里就大概說一下
          Actoin中業(yè)務(wù)方法跟上面一樣,只不過多一個(gè)包含Map的方法:
          //通過資源文件的key(button.add),來找到業(yè)務(wù)方法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也跟上面一樣,根據(jù)method來找;
          哪視圖組件如何來調(diào)用呢?
          <!-- 一個(gè)表單多個(gè)提交 -->
              
          <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:我自認(rèn)為它比DispatchAction差不多好用,只是它夠靈活(這里針對(duì)<action/>節(jié)點(diǎn),想咋配咋配),或者說,它針對(duì)的是多個(gè)表單,多個(gè)Submit;
          關(guān)于用法,也比較簡(jiǎn)單:
          Action中的業(yè)務(wù)實(shí)現(xiàn)跟DispatchAction一樣,strut-config.xml則要靈活些,針對(duì)每一個(gè)業(yè)務(wù)方法,配一個(gè)<action/>節(jié)點(diǎn):
          <!-- 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>
          視圖組件的調(diào)用就很能夠方便了:直接跟/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用法基本完畢,此純屬本人在學(xué)習(xí)過程中自己的總結(jié),若有不當(dāng)之處,愿不令賜教!!!
          posted @ 2009-03-16 10:43 獨(dú)孤行 閱讀(2018) | 評(píng)論 (7)編輯 收藏

          常用的Struts標(biāo)簽庫有以下五大類:

          1.HTML Tag:

          用來創(chuàng)建能夠和Struts框架以及其它相應(yīng)的HTML標(biāo)簽交互的HTML輸入表單;

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

          2.Bean Tag

          該標(biāo)簽庫包含的標(biāo)簽可以用來創(chuàng)建bean、訪問bean和訪問bean的屬性。

           如:<bean:write/>:用于將bean的屬性輸送到j(luò)sp頁面,<bean:define/>定義一個(gè)新的bean

          3.Logic Tag

          該標(biāo)簽庫包含的標(biāo)簽可以用來進(jìn)行邏輯判斷、集合迭代和流程控制。

          如:<logic:iterate/>:用來循環(huán)迭代,<logic:eaual/>:用來進(jìn)行邏輯判斷

          4.Nested:增強(qiáng)對(duì)其他Struts標(biāo)簽的嵌套使用能力

          該標(biāo)簽庫建立在前三個(gè)標(biāo)簽庫的基礎(chǔ)上,具有前三個(gè)標(biāo)簽庫的所有功能,只是允許標(biāo)簽間的嵌套。

          5.Template Tag

          隨著Titles框架包的出現(xiàn),此標(biāo)記已開始減少使用

          下面介紹幾個(gè)最常用的標(biāo)簽:

          <html:check box/>一般用于一個(gè)選項(xiàng)的復(fù)選框

          <html:multibox/>一般用于多個(gè)選項(xiàng)的復(fù)選框

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

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

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

          <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 />標(biāo)簽是用來判斷是否為空的。如果為空,該標(biāo)簽體中嵌入的內(nèi)容就會(huì)被處理

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

          1.下面給一個(gè)表單的完整代碼:

          <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="">請(qǐng)選擇</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標(biāo)簽作為表單輸入,可以方便的使用驗(yàn)證框架即:<html:errors property="username">

          2.下面給一個(gè)顯示數(shù)據(jù)的代碼:

          <table align="center" border="1" width="600">
                  
          <caption>用戶注冊(cè)信息</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>

          作為顯示數(shù)據(jù),Struts標(biāo)簽并不比Jstl與EL方便,因此,本人更習(xí)慣用后者

          其實(shí)Struts標(biāo)簽的好處,并不是上面這些,而是它可利用ActionForm來填充數(shù)據(jù)

          比如我們?cè)谧鲰撁鏀?shù)據(jù)修改的時(shí)候,會(huì)讓當(dāng)前頁面數(shù)據(jù)顯示到顯示修改頁面,這樣利于客戶端修改

          以前我們這樣做的:根據(jù)id從數(shù)據(jù)庫查出,然后使用html的value屬性填充,現(xiàn)在有了Struts標(biāo)簽,就不需要那么麻煩了

          直接在Action里填充ActionForm的數(shù)據(jù)就搞定了

          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");
              }
          然后在修改頁面顯示,請(qǐng)往下看:
          <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="">請(qǐng)選擇</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>
          怎么樣,簡(jiǎn)單方便吧,其實(shí)Struts標(biāo)簽還是有它的好處的。
          posted @ 2009-03-14 23:47 獨(dú)孤行 閱讀(1596) | 評(píng)論 (1)編輯 收藏

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

          1.ActionForm

          2.ValidatorForm

          3.ValidatorActionForm

          4.DynaActionForm

          5.DynaValidatorForm

          6.DynaValidatorActionForm

          7.LazyValidatorForm

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

          1.帶有Validator的,但都可使用驗(yàn)證框架;

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

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

          下面按規(guī)律逐個(gè)介紹:

          1.ActionForm,DynaActionForm此類不支持驗(yàn)證框架,需手動(dòng)創(chuàng)建form,并實(shí)現(xiàn)自定義的validate()方法

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

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

          ValidatorForm,DynaValidatorForm,LazyValidatorForm  沒有Action,是針對(duì)form來驗(yàn)證的,即凡是用到該form的頁面,都必須驗(yàn)證;

          反之,ValidatorActionForm,DynaValidatorActionForm,則是針對(duì)Action的,要驗(yàn)證哪個(gè)Action,就跟那個(gè)/path路徑,validation.xml代碼如下:

          <form-validation>
              
          <formset>
                  
          <!-- 此時(shí)針對(duì)Action驗(yàn)證,name跟/path路徑--!>
                  
          <!--如果是針對(duì)form驗(yàn)證,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>

          針對(duì)七種ActionForm,我們要靈活運(yùn)用,需要驗(yàn)證誰,就讓它停下,不需要的,讓它通過。

           另外介紹下驗(yàn)證框架的使用步驟

          1.在validator-rules.xml中引入驗(yàn)證插件的代碼:

          <!--引入驗(yàn)證框架--!>
          <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.創(chuàng)建并配置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資源文件,來指明驗(yàn)證提示,當(dāng)然也可不用,直接聲明變量
          # Resources for parameter 'ApplicationResources'
          # Project ch07
          username
          =username is null
          pwd
          =pwd is null
          pwd1
          =pwd is less than 6
          以上來自各方面的學(xué)習(xí),加上自己的整合,希望與各位豪杰共同探討
          posted @ 2009-03-13 17:03 獨(dú)孤行 閱讀(510) | 評(píng)論 (0)編輯 收藏
          主站蜘蛛池模板: 文山县| 渭源县| 志丹县| 乾安县| 沙湾县| 小金县| 柳河县| 通山县| 海淀区| 依安县| 宜章县| 遵义县| 吴旗县| 黎平县| 井研县| 南雄市| 电白县| 永年县| 锦屏县| 禹城市| 神池县| 清水县| 中方县| 库车县| 佛山市| 昭通市| 巴林右旗| 蒲城县| 商水县| 白山市| 青岛市| 丰县| 冕宁县| 新平| 寿光市| 安福县| 许昌县| 元阳县| 宜州市| 湟中县| 临洮县|