您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 工作范文 > Struts 2系列之十三---Struts 2与AJAX(第1部分)
Struts2系列之十三Struts2与AJAX(第一部分)在当今——Web2.0概念铺天盖地的Internet环境下,简易的AJAX集成对于一个成功的WEB框架来说是不可或缺的。因此,Struts2其中的一个重要的功能(Feature)就是“First-classAJAXsupport-AddinteractivityandflexibilitywithAJAXtagsthatlookandfeeljustlikestandardStrutstags(大意:一流的AJAX支持——通过AJAX标志增加互动性和灵活性,而且使用这些AJAX标志与普通的Struts标志同样简单)”。实现原理基于不重新发明轮子的原则,Struts2并没有开发新的AJAX框架,而是使用时下JavaEE平台中比较流行的AJAX框架——Dojo和DWR。最近在MusachyBarroso等同志的无私奉献下,开发了Struts2的JSON插件(Plugin),极大地方便了我们输出JSON结果(Result)。JSON插件(Plugin)在Struts2的showcase中的AJAX部分,JSON的结果输出是通过Freemaker模板实现。这种方法在简易性和灵活性上都比不上JSON插件,所以JSON插件值得向大家五星推荐。下面让我们看一个JSON插件的例子。首先到以下网址下载JSON插件的JAR包,并将其加入你的WebContent\WEB-INF\lib下。接下是本例子的Action代码:packagetutorial;importjava.util.ArrayList;importjava.util.List;importcom.googlecode.jsonplugin.annotations.JSON;importcom.opensymphony.xwork2.ActionSupport;publicclassJsonPluginActionextendsActionSupport{privatestaticfinallongserialVersionUID=-6784977600668791997L;privateintbookId;privateStringtitle;privatedoubleprice;privateListStringcomments;privatetransientStringsecret1;privateStringsecret2;@JSON(name=ISBN)publicintgetBookId(){returnbookId;}publicvoidsetBookId(intbookId){this.bookId=bookId;}publicListStringgetComments(){returncomments;}publicvoidsetComments(ListStringcomments){this.comments=comments;}publicdoublegetPrice(){returnprice;}publicvoidsetPrice(doubleprice){this.price=price;}publicStringgetTitle(){returntitle;}publicvoidsetTitle(Stringtitle){this.title=title;}@OverridepublicStringexecute(){bookId=15645912;title=MaxOnJava;price=0.9999d;comments=newArrayListString(3);comments.add(It'snobad!);comments.add(WOW!);comments.add(Nocomment!);secret1=Youcan'tseeme!;secret2=Iaminvisible!;returnSUCCESS;}}清单1src/tutorial/JsonPluginAction.java以上代码值得注意的是,通过@JSON的JAVA注释(Annotation),我们可以改变JSON结果的属性名称,另外带有transient修饰符与没有Getter方法的字段(field)都不会被串行化为JSON。然后,我们来配置一下此Action,代码如下:?xmlversion=1.0encoding=UTF-8?!DOCTYPEstrutsPUBLIC-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN=Struts2_AJAX_DEMOextends=json-defaultactionname=JsonPluginclass=tutorial.JsonPluginActionresulttype=json//action/package/struts清单2src/struts.xml上面配置文件的“package”元素和以往不同的是,它扩展了“json-default”而不是“struts-default”。“json-default”是在jsonplugin-0.11.jar包里的struts-plugin.xml中定义的。该文件同时定义了“json”的结果类型,有兴趣的朋友可以打开此文件看看。发布运行应用程序,在浏览器中键入:,出现下载文件对话框,原因是JSON插件将HTTP响应(Response)的MIME类型设为“application/json”。把文件下载下来,用记事本打开,内容如下:{ISBN:15645912,comments:[It'snobad!,WOW!,Nocomment!],price:0.9999,title:MaxOnJava}清单3例子1输出的JSON串当然这还不是一个完整的AJAX的例子,下面让我们写一个HTML文件将其完成,HTML代码如下:!DOCTYPEhtmlPUBLIC-//W3C//DTDXHTML1.0Transitional//EN==text/javascriptvarbXmlHttpSupport=(typeofXMLHttpRequest!=undefined||window.ActiveXObject);if(typeofXMLHttpRequest==undefined&&window.ActiveXObject){functionXMLHttpRequest(){vararrSignatures=[MSXML2.XMLHTTP.5.0,MSXML2.XMLHTTP.4.0,MSXML2.XMLHTTP.3.0,MSXML2.XMLHTTP,Microsoft.XMLHTTP];for(vari=0;iarrSignatures.length;i++){try{varoRequest=newActiveXObject(arrSignatures[i]);returnoRequest;}catch(oError){/*ignore*/}}thrownewError(MSXMLisnotinstalledonyoursystem.);}}functionretrieveBook(){if(bXmlHttpSupport){varsUrl='JsonPlugin.action';varoRequest=newXMLHttpRequest();oRequest.onreadystatechange=function(){if(oRequest.readyState==4){varoBook=eval('('+oRequest.responseText+')');varbookHolder=document.getElementById('bookHolder');varsBook='pbISBN:/b'+oBook.ISBN+'/p';sBook+=('pbTitle:/b'+oBook.title+'/p');sBook+=('pbPrice:/b$'+oBook.price+'/p');sBook+=('biComments:/i/bhr/');for(i=0;ioBook.comments.length;i++){sBook+=('pb#'+(i+1)+'/b'+oBook.comments[i]+'/p');}bookHolder.innerHTML=sBook;}};oRequest.open('POST',sUrl);oRequest.send(null);}}/script/headbodyinputtype=buttonvalue=RetrieveBookonclick=retrieveBook()/divid=bookHolder/div/body/html清单4WebContent/JsonPlugin.html以上代码中,我没有使用任何的AJAX的Javascript包,而是参考《ProfessionalJavascriptForWebDeveloper》手工创建XHR(XMLHttpRequest),并在XHR完成后使用eval()方法将JSON字符串变为JSON对象。需要注意的是,要调用eval函数时,必须使用“(”和“)”将JSON字符串括起来,否则会出错的。打开,点击“RetrieveBook”按钮,页面如下图所示:图1JsonPlugin.html页面输出Struts2与DojoDojo是开源Javascript工具包,它引了Widget的概念,方便了Javascript面向对象编程(OOP),改进Javascript的事件模型。在此我不打算对此进行深入的讲解,有兴趣的朋友的可以找网上找一些关于Dojo的资料学习。Struts2基于Dojo编写一些AJAX标志(在Dojo中称为Widget),要使用这些标志的AJAX功能,需要将标志的“theme”属性设为“ajax”。同时,亦需要将加入在head与/head之间加入s:headtheme=ajax/。当使用这些标志的AJAX功能,有些属性可能会经常用到,所以我会对这些属性稍作解释。名称描述hrefXHR(XMLHttpRequest)请求的地址listenTopics监听的Dojo话题(Topic)以触发自身,如可以在可以通过发布(Publish)相应的话题,通知s:autocompleter/重新加载其备选项(Options)notifyTopics完成远程调用后,发出通知,触发相应的Javascript函数或DojoWidgetformId需要提交到服务器的表单的IDformFilter过滤表单字段的Javascript函数名称indicator在XHR处理过程中,包含用户提示的信息的HTML元素的ID,如图片或DIV等表1常用的AJAX标志属性这些标志包括:s:a/、s:submit/、
本文标题:Struts 2系列之十三---Struts 2与AJAX(第1部分)
链接地址:https://www.777doc.com/doc-3364142 .html