原创文章,转载请注明作者:Nomad,出处: www.jialing.net
在网上找了一圈Ajax的Java框架,感觉不错的只有两个,一个是被提到比较多的DWR(Direct Web Remoting),另一个是刚刚1.0的Ajax4JSF。本文先用代码说话,各用两个框架开发同样功能的Ajax输入验证的小程序。在最后表达一下鄙人对这两个框架的浅见。
·程序功能
页面上有两个输入框,一个填用户名,一个填密码。两个框空着时提示“请填写”;用户名字符长度小于3时提示“长度应大于3”;当用户名是“root”,密码是“123”时提示密码正确,否则提示密码错误。
·DWR的实现
Java逻辑: 这是提供给页面异步调用的Java代码
DWR的配置:
JSP页面:在页面中写了四个函数来调用各自的Java验证代码。
·A4J的实现
Java逻辑:这是JSF控制下的JavaBean
JSF的配置:
JSP页面:
·对比
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
在网上找了一圈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 }
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 >
< 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 >
<! 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;
}
}
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 >
< 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 >
<% @ 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