Ajax框架中选DWR还是A4J |
发布: 2010-03-20
返回
|
在网上找了一圈Ajax的Java框架,感觉不错的只有两个,一个是被提到比较多的DWR(Direct Web Remoting),另一个是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 "请填入密码"; &nb sp; 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 "-//W 3C//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的组件树也可以让开发的速度加快。 在网上找了一圈Ajax的Java框架,感觉不错的只有两个,一个是被提到比较多的DWR(Direct Web Remoting),另一个是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="passwo rd" 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> &nbs p; <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 "-//W 3C//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:outputTex t 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的组件树也可以让开发的速度加快。 |