Nomad & His Life

博观而约取,厚积而薄发
posts - 15, comments - 88, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

选DWR,还是A4J,这是一个问题

Posted on 2006-08-10 08:58 Nomad 阅读(3578) 评论(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()<3return "用户名长度须大于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()<3return "用户名长度须大于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
谢谢了,楼主,解了我疑惑

只有注册用户登录后才能发表评论。


网站导航: