Nomad & His Life

          博觀而約取,厚積而薄發
          posts - 15, comments - 88, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          選DWR,還是A4J,這是一個問題

          Posted on 2006-08-10 08:58 Nomad 閱讀(3591) 評論(14)  編輯  收藏 所屬分類: Java
          原創文章,轉載請注明作者:Nomad,出處: www.jialing.net

          ??? 在網上找了一圈Ajax的Java框架,感覺不錯的只有兩個,一個是被提到比較多的DWR(Direct Web Remoting),另一個是剛剛1.0的Ajax4JSF。本文先用代碼說話,各用兩個框架開發同樣功能的Ajax輸入驗證的小程序。在最后表達一下鄙人對這兩個框架的淺見。

          ·程序功能

          ??? 頁面上有兩個輸入框,一個填用戶名,一個填密碼。兩個框空著時提示“請填寫”;用戶名字符長度小于3時提示“長度應大于3”;當用戶名是“root”,密碼是“123”時提示密碼正確,否則提示密碼錯誤。

          ·DWR的實現
          ??? Java邏輯: 這是提供給頁面異步調用的Java代碼

          ?1?package?net.jialing;
          ?2?
          ?3?public?class?ValidateBean?{
          ?4?
          ?5?????public?String?checkName(String?name)?{
          ?6?????????if(name?==?null?||?name.equals(""))?return?"請填入用戶名";
          ?7?????????
          ?8?????????if(name.length()<3)?return?"用戶名長度須大于3";
          ?9?????????
          10?????????return?"";
          11?????}
          12?
          13?????public?String?checkPwd(String?name,String?password)?{
          14?????????if(password?==?null?||?password.equals(""))?return?"請填入密碼";
          15?????????
          16?????????if(name?!=?null?&&?password?!=?null)?{
          17?????????????if(name.equals("root")?&&?password.equals("123"))
          18?????????????????return?"密碼正確!";
          19?????????????else
          20?????????????????return?"密碼不正確!";
          21?????????}
          22?????????
          23?????????return?"";
          24?????}
          25?
          26?}



          ??? DWR的配置:

          <dwr>
          ??
          <allow>
          ????
          <create?creator="new"?javascript="JValidate">
          ????????
          <param?name="class"?value="net.jialing.ValidateBean"/>
          ????
          </create>
          ??
          </allow>
          </dwr>



          ??? JSP頁面:在頁面中寫了四個函數來調用各自的Java驗證代碼。

          <%@?page?contentType="text/html;?charset=gb2312"?language="java"?errorPage=""?%>
          <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN"?"http://www.w3.org/TR/html4/loose.dtd">
          <html>
          <head>
          <meta?http-equiv="Content-Type"?content="text/html;?charset=gb2312">
          <title>Struts?+?DWR?AJAX?Validation</title>
          <script?type='text/javascript'?src='dwr/engine.js'></script>
          <script?type='text/javascript'?src='dwr/util.js'></script>
          <script?type='text/javascript'?src='dwr/interface/JValidate.js'></script>
          <script>
          function?changeName()?{
          ????
          var?name?=?document.getElementById("name").value;
          ????JValidate.checkName(name,validateName);
          }

          function?validateName(data)?{
          ????document.getElementById(
          "name_message").innerHTML?=?data;
          }

          function?changePwd()?{
          ????
          var?name?=?document.getElementById("name").value;
          ????
          var?pwd?=?document.getElementById("password").value;
          ????JValidate.checkPwd(name,pwd,validatePwd);
          }

          function?validatePwd(data)?{
          ????document.getElementById(
          "password_message").innerHTML?=?data;
          }
          </script>
          </head>
          <body>
          Struts?+?DWR?AJAX?Validation:?
          <br>
          Name:
          <input?name="name"?type="text"?id="name"?onkeyup="changeName()">?<label?id="name_message"></label><br>
          Password:
          <input?name="password"?type="password"?id="password"?onkeyup="changePwd()">?<label?id=?password_message"></label>
          </body>
          </html>

          ?? ?

          ·A4J的實現

          ??? Java邏輯:這是JSF控制下的JavaBean

          package?net.jialing;

          public?class?ValidateBean?{
          ????
          private?String?name;

          ????
          private?String?password;

          ????
          private?String?name_message;

          ????
          private?String?password_message;

          ????
          public?String?getName()?{
          ????????
          return?name;
          ????}

          ????
          public?void?setName(String?name)?{
          ????????
          this.name?=?name;
          ????}

          ????
          public?String?getName_message()?{
          ????????
          if(name?==?null?||?name.equals(""))?return?"請填入用戶名";
          ????????
          ????????
          if(name.length()<3)?return?"用戶名長度須大于3";
          ????????
          ????????
          return?"";
          ????}

          ????
          public?void?setName_message(String?name_message)?{
          ????????
          this.name_message?=?name_message;
          ????}

          ????
          public?String?getPassword()?{
          ????????
          return?password;
          ????}

          ????
          public?void?setPassword(String?password)?{
          ????????
          this.password?=?password;
          ????}

          ????
          public?String?getPassword_message()?{
          ????????
          if(password?==?null?||?password.equals(""))?return?"請填入密碼";
          ????????
          ????????
          if(name?!=?null?&&?password?!=?null)?{
          ????????????
          if(name.equals("root")?&&?password.equals("123"))
          ????????????????
          return?"密碼正確!";
          ????????????
          else
          ????????????????
          return?"密碼不正確!";
          ????????}
          ????????
          ????????
          return?"";
          ????}

          ????
          public?void?setPassword_message(String?password_message)?{
          ????????
          this.password_message?=?password_message;
          ????}

          }



          ??? JSF的配置:

          <faces-config>
          <managed-bean>
          ????????
          <managed-bean-name>validate</managed-bean-name>
          ????????
          <managed-bean-class>
          ????????????net.jialing.ValidateBean
          ????????
          </managed-bean-class>
          ????????
          <managed-bean-scope>request</managed-bean-scope>
          ????????
          <managed-property>
          ????????????
          <property-name>name</property-name>
          ????????????
          <null-value/>
          ????????
          </managed-property>
          ????????
          <managed-property>
          ????????????
          <property-name>password</property-name>
          ????????????
          <null-value/>
          ????????
          </managed-property>
          ????????
          <managed-property>
          ????????????
          <property-name>name_message</property-name>
          ????????????
          <null-value/>
          ????????
          </managed-property>
          ????????
          <managed-property>
          ????????????
          <property-name>password_message</property-name>
          ????????????
          <null-value/>
          ????????
          </managed-property>
          </managed-bean>
          </faces-config>



          ??? JSP頁面:

          <%@?page?language="java"?pageEncoding="ISO-8859-1"%>
          <%@?taglib?uri="https://ajax4jsf.dev.java.net/ajax"?prefix="a4j"%>
          <%@?taglib?uri="http://java.sun.com/jsf/html"?prefix="h"?%>
          <%@?taglib?uri="http://java.sun.com/jsf/core"?prefix="f"?%>

          <!DOCTYPE?HTML?PUBLIC?"-//W3C//DTD?HTML?4.01?Transitional//EN">
          <html>
          <head>
          ????
          <title>Ajax4JSF?Validate?Page</title>
          </head>
          <body>
          ????
          <f:view>
          ????????This?is?my?Ajax4JSF?Validate?page.?
          <br>
          ????????
          <h:form>
          ????????????Name:
          <h:inputText?id="name"?value="#{validate.name}"?>
          ????????
          <a4j:support?event="onkeyup"?reRender="rename"?/>
          ????????
          </h:inputText>?<h:outputText?id="rename"?value="#{validate.name_message}"?/><br>
          ????????
          ????????????Password:
          <h:inputSecret?id="password"?value="#{validate.password}"?>
          ????????
          <a4j:support?event="onkeyup"?reRender="repwd"?/>
          ??????????
          </h:inputSecret>?<h:outputText?id="repwd"?value="#{validate.password_message}"?/>
          ????????
          </h:form>
          ????
          </f:view>
          </body>
          </html>



          ·對比


          1.代碼量
          ??? 這是程序員最關心問題,哪個框架能減輕我們更多的負擔呢。首先看Java代碼,DWR似乎比A4J少一點,其實不然,因為A4J是基于JSF的Managed Bean上開發的,所以Bean里的其它代碼都可以用到JSF其它的地方,所以Java的開發量是相同的。其次看配置量,A4J稍有一些優勢,只要在JSF中配置了就不用在配置,而DWR還需要再配置一個XML文件。最后看頁面的代碼量,這一點A4J的優勢更加明顯,程序員完全不用寫JavaScript代碼,只需將要異步刷新的地方加入a4j的標簽即可。
          ??? 總的來說,在節省代碼量這個方面A4J是勝利的。

          2.靈活性
          ??? 這一點DWR是明顯的贏家,DWR適合各種框架,在設計時都考慮到了如Spring、JSF、Struts等的集成。而A4J僅適合JSF框架,對應用范圍做了很大的限制。在集成方面不僅僅是Java框架,還有現在越來越流行的JavaScript框架(如Dojo、Qooxdoo等),因為A4J封裝了JavaScript代碼,開發者無法像DWR一樣可以自由的使用JavaScript。當開發者習慣于將一些邏輯寫在JavaScipt中時,使用A4J可能會造成很多的不便。

          3.風險性
          ??? A4J以標簽為開發手段,減去了應用程序開發者在JavaScript和DHTML等方面開發的時間,但同時也可能埋下風險的隱患。在開發一個Web應用的時候,開發者需要全面的評估應用中會使用到的技術功能,確定利用A4J可以實現,畢竟這是一個新成長起來的框架,需要更加留意。另外在安全方面,兩個框架都還無從考證。

          4.前景
          ??? DWR在2.0里實現了Ajax的反轉,即在Java中執行JavaScript代碼,似乎標志著一種新的開發方式。A4J則搭上了JSF這趟快車,各個大公司都在謀劃著將應用開發進一步的分工,上游廠商制定組件,下游的公司使用組件為企業提供服務,JSF是它們賺錢的一個好工具,一定會繼續推而廣之,而A4J也會隨著JSF的成長而成長。


          ·總結
          ??? 也許還不到總結的時候。我想用DWR還是A4J,可以參考究竟使用Struts還是JSF,DWR的靈活性和Struts是對應的,兩者結合可以開發出靈活性很高的程序。A4J則肯定和JSF搭配,JSF的組件樹也可以讓開發的速度加快。


          ·參考
          DWR:http://getahead.ltd.uk/dwr
          Ajax4jsf: https://ajax4jsf.dev.java.net/

          ·示例下載
          基于DWR的示例:http://www.jialing.net/download/ajax/Struts_DWR_Validate.rar
          基于A4J的示例:http://www.jialing.net/download/ajax/A4J_Validate.rar

          評論

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2006-08-10 19:31 by 坎井之蛙
          呵呵 不錯不錯 學習 仰慕中。。。。,從你這可以學到許多想要的,3Q

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2006-08-10 20:53 by dfjinn
          問一下,/interface/JValidate.js,這個JS在哪里啊?找不到.

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2006-08-10 22:40 by 一農
          還有json-rpc-java

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2006-08-10 23:41 by 龍卷風驛站
          lz,dwr只用來做這些事情就太大才小用了,如果只是驗證這些簡單,沒必要這么搞


          還是結合spring和hibernate來發揮dwr的最大功能

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2006-08-11 01:25 by 楊一
          很多觀點我并不贊成,然而作者的筆觸很專業

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2006-08-11 08:36 by Nomad
          @dfjinn

          #問一下,/interface/JValidate.js,這個JS在哪里啊?找不到.

          JValidate是DWR中自動生成的對ValidateBean的映射,用來執行ValidateBean的邏輯。
          見:<create creator="new" javascript="JValidate">
          <param name="class" value="net.jialing.ValidateBean"/>
          </create>

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2006-08-12 10:35 by 火線生存
          感謝!

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2006-09-25 22:59 by 有貓相伴的日子
          不贊成可以討論,我覺得樓主寫得挺可以,他是他的想法,只是把自己的想法寫出來?。。。。。。。。。。。。。。。。?!
          DWR 的靈活靈是無可否認的,DWR還有很多優點是其它AJAX框架所不具有的

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2007-05-29 16:18 by liang
          用dwr 一般不和jsf結全在一起,但與spring結合在一起
          jsf +spring
          + hibernate
          dwr+spring

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2007-05-29 16:20 by liang
          唉上面怎么成那個樣子呀,
          dwr + jsf + spring + hibernate 我一般不把dwr與jsf結合,而是dwr與spring, jsf與spring,就是這個樣子。

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2008-08-25 09:29 by libaiyu
          dwr是非常得靈活的,在你的項目中可全部用,也可之在某部分用的都沒問題,還有就是使用暴露的方式非常好,想用哪個就暴露哪個,這就很好了。對dwr是很有信心的,ajax實現必然會出現一個進化,而dwr模式將是一個很有希望的方向。對dwr也有些研究,若大家有什么問題一塊討論。qq:94168424

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2008-08-25 09:35 by libaiyu
          # re: 選DWR,還是A4J,這是一個問題 回復 更多評論
          2006-08-11 08:36 by Nomad
          @dfjinn

          #問一下,/interface/JValidate.js,這個JS在哪里啊?找不到.

          JValidate是DWR中自動生成的對ValidateBean的映射,用來執行ValidateBean的邏輯。
          見:<create creator="new" javascript="JValidate">
          <param name="class" value="net.jialing.ValidateBean"/>
          </create>


          在項目中是找不到的,但可以使用在火狐中使用插件firebug來調試可查看,這個文件就是暴露的java類的js形式,你用firebug將很容易讀取到頁面中使用的所有js文件,firebug怎么用我在這就不多說了,在firebug主頁上都講的很好了

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2008-10-29 14:59 by
          不錯,正是我想要的東西。。。

          # re: 選DWR,還是A4J,這是一個問題  回復  更多評論   

          2013-01-24 23:04 by Super9527
          謝謝了,樓主,解了我疑惑
          主站蜘蛛池模板: 武山县| 辽阳市| 马尔康县| 廉江市| 濮阳县| 延边| 文安县| 昔阳县| 雅安市| 临沭县| 武山县| 江阴市| 东乡族自治县| 息烽县| 平罗县| 德惠市| 上栗县| 祁阳县| 台北县| 进贤县| 黔江区| 德昌县| 上杭县| 湖北省| 遂川县| 镶黄旗| 融水| 龙胜| 龙口市| 隆德县| 来宾市| 克东县| 乡城县| 定州市| 白玉县| 葵青区| 漳平市| 铜梁县| 新源县| 高安市| 义马市|