中国领先的IT技术网站
|
|

初析Struts2中的Ajax开发实例

Ajax作为WEB开发中的明星,自有其性能和开发上的优势。本文将给大家简单介绍Struts2中的Ajax开发实例,希望对大家有所帮助。

作者:小瓶子来源:博客园|2011-07-18 14:43

沙龙活动 | 去哪儿、陌陌、ThoughtWorks在自动化运维中的实践!10.28不见不散!


Web2.0的随波逐流,Ajax那是大放异彩,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单,并且可以简单的融入到Struts2框架中,当然这只是在我们需要JSON的时候才会显得流光溢彩。

首先不谈Struts2的原生支持,我们自己写一个ajax示例,使用异步请求,直接请求action动作:

InfoAction.java

  1. packagecn.codeplus.action;importcom.opensymphony.xwork2.ActionSupport;  
  2. publicclassInfoAction extendsActionSupport {
  3. privatestaticfinallongserialVersionUID =1359090410097337654L;  
  4. publicString loadInfo() {returnSUCCESS;  
  5. }  

InfoAction仅仅是简单的返回"success"。

index.jsp

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
  2. <html> 
  3. <head><base href="<%=basePath%>"> 
  4. <title>获取</title> 
  5. <script type="text/javascript"src="js/jquery.js"> 
  6. </script> 
  7. <script type="text/javascript"> 
  8. functionloadInfo() {  
  9. $("#info").load("loadInfo");  
  10. }</script> 
  11. </head> 
  12. <body> 
  13. <input type="button"value="获取"id="btnGet"onclick="loadInfo()"/> 
  14. <div id="info"></div> 
  15. </body> 
  16. </html> 

index.jsp包含一个按钮,点击按钮则会触发异步请求事件。

struts.xml

  1. <package name="ajaxDemo"extends="struts-default"> 
  2. <action name="loadInfo"class="cn.codeplus.action.InfoAction"method="loadInfo"> 
  3. <result name="success">/info.jsp</result> 
  4. </action> 
  5. </package> 

可见上面的异步请求的结果将会是加载info.jsp,info.jsp只是一个简单网页,不列出了。

运行效果如下:

单击获取之后:

此时的页面源代码:

<div>标签中嵌套了<title>标签,不符合规范,其实我们只要吧info.jsp写的没有<title>之类的标签,就不会出现这种情况了。

以上说的异步请求仅适用于请求单个文件,如果我们请求的是动态数据,并且数据需要以JSON格式返回,上面的方法将会显得力不从心,这是struts2的原生支持就得出马了。

使用struts2的ajax,必须在项目中引入struts2-json-plugin-2.2.1.jar,在版本2.1.7+都一句绑定在struts2发行包里面了(之前的版本可以在这下载)。记住,要引入struts2-json-plugin-2.2.1.jar。

这次我们使用另一个例子,模拟加载评论:

dto对象,Comment.java

  1. packagecn.codeplus.po;  
  2. publicclassComment {  
  3. privatelongid;privateString nickname;
  4. privateString content;publiclonggetId() {returnid;  
  5. }  
  6. publicvoidsetId(longid) {
  7. this.id =id;  
  8. }  
  9. publicString getNickname() {returnnickname;  
  10. }  
  11. publicvoidsetNickname(String nickname) {
  12. this.nickname =nickname;  
  13.  }  
  14. publicString getContent() {returncontent;  
  15. }  
  16. publicvoidsetContent(String content) {
  17. this.content =content;  
  18. }  

新的InfoAction.java 

  1. packagecn.codeplus.action;  
  2. importjava.util.ArrayList;importjava.util.List;  
  3. importcn.codeplus.po.Comment;  
  4. importcom.opensymphony.xwork2.ActionSupport;  
  5. publicclassInfoAction extendsActionSupport {  
  6. privatestaticfinallongserialVersionUID =1359090410097337654L;  
  7. privateList<Comment>comments =newArrayList<Comment>();//没getter and setter方法的属性不会被串行化到JSON  
  8. @SuppressWarnings("unused")  
  9. privateString title;//!!!使用transient修饰的属性也会被串行化到JSONprivatetransientString content;publicString loadInfo() {  
  10. title="123木头人";  
  11. content="你是木头人,哈哈。";  
  12. loadComments();returnSUCCESS;  
  13. }/*** 加载留言信息*/  
  14. privatevoidloadComments() {  
  15. Comment com1 =newComment();  
  16. com1.setContent("很不错嘛");  
  17. com1.setId(1);  
  18. com1.setNickname("纳尼");  
  19. Comment com2 =newComment();  
  20. com2.setContent("哟西哟西");  
  21. com2.setId(2);  
  22. com2.setNickname("小强");  
  23. comments.add(com1);  
  24. comments.add(com2);  
  25. }publicList<Comment>getComments() {returncomments;  
  26. }publicvoidsetComments(List<Comment>comments) {this.comments =comments;  
  27. }publicstaticlonggetSerialversionuid() {returnserialVersionUID;  
  28. }publicString getContent() {returncontent;  
  29. }publicvoidsetContent(String content) {this.content =content;  
  30. }  
  31. }  
  32. index.jsp还是那个index.jsp。(*^__^*) 嘻嘻……  
  33. struts.xml变化挺大:  
  34. <package name="ajaxDemo"extends="json-default"> 
  35. <action name="loadInfo"class="cn.codeplus.action.InfoAction"method="loadInfo"> 
  36. <result name="success"type="json"></result> 
  37. </action> 
  38. </package> 

在struts.xml中:

首先,package extends由struts-default转变为json-default,这是必须的,只用在json-default中才包含下面使用的result type为 json。

然后就是result类型需显示指明为json,result标签内,无需指明视图指向的界面。

最后就是运行结果啦:

点击“获取”按钮之后:

可见comments对象和content对象都被串行化到JSON数据了,不知道是不是版本的问题,很多资料都说使用transient修饰的属性不会被串行化到JSON的。

为了使content对象不被串行化到JSON,在不能舍弃其getter setter方法的时候,我们可以这样在content的getter方法上面加上注解:@JSON(serialize=false)

  1. ...  
  2. @JSON(serialize=false)publicString getContent() {returncontent;  
  3. }publicvoidsetContent(String content) {this.content =content;  
  4. }  
  5. ... 

这时的结果如下:

@JSON和json类型的result都还有很多可选项,无非就是串行化谁,不串行化谁,返回数据的MIME类型,读者可以自行参考相关文档。

获取到JSON数据了,下一步就是在前台使用js处理JSON数据了,本人JS不精,喜欢使用jQuery解析,如有兴趣,且听下回分解jQuery解析JSON数据。

原文链接:http://www.cnblogs.com/codeplus/archive/2011/07/18/2109316.html

【编辑推荐】

  1. 理解JSON:3分钟课程轻松搞定
  2. JSONP跨域原理和jQuery.getJSON用法
  3. 在PHP语言中使用JSON
  4. Jackson框架轻易转换JSON
  5. Ajax和WEB服务数据格式:JSON JSONP
【责任编辑:彭凡 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

PHP和MySQL Web开发(原书第3版)

本书将介绍如何创建可交互的Web站点,包括从最简单的订单表单到复杂的安全电子商务站点。而且,读者还将了解如何使用开放源代码技术来实现...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊
× Python最火的编程语言