`

《研磨struts2》第十四章 对Ajax的支持 之 14.2 Struts2对Ajax的支持

 
阅读更多

14.2  Struts2Ajax的支持

14.2.1概述

Struts2对Ajax提供了非常好的支持,不但功能强劲,而且简单易用。

       Struts2并没有自行开发新的Ajax框架,而是使用了目前比较流行的Ajax框架——Dojo和DWR,在他们的基础之上实现了很多常见的功能。同时,Struts2也可以通过插件的形式来使用JSON,从而使得Ajax的实现更加灵活方便。

       看到这里,可能有些朋友会说:“Dojo和DWR都不会,这可怎么办?”。事实上,Struts2早替大家想好了,不需要大家直接去使用Dojo和DWR,而是直接使用Struts2提供的Ajax JSP tags即可。因此这里并不会涉及Dojo和DWR的知识,有需要的朋友,请参看相应的资料。

       当然,如果Ajax JSP tags的功能满足不了你的需要,你可以直接使用原始的Ajax技术,也可以直接使用Ajax的框架,诸如Dojo、JQuery、YUI等等。因为Struts2直接提供一个能直接向客户端返回一个输出流的Result,直接把后台处理后的数据输出回到前台,然后由Ajax来接受和处理这些数据。

14.2.2名为Stream的Result

       使用名为Stream的Result来实现跟前面直接使用Ajax的示例一样的功能。

1:实现Action

先看看Action的实现吧,功能跟前面的server.jsp类似,示例代码如下:

 

java代码:
  1. public class AjaxAction extends ActionSupport {  
  2.     public String account;  
  3.     public String password;  
  4.   
  5.     private InputStream inputStream;  
  6.     public InputStream getInputStream() {  
  7.         return inputStream;  
  8.     }  
  9.       
  10.     public String execute() throws Exception {  
  11.         //准备已经注册的数据,测试使用  
  12.         Set<String> set = new HashSet<String>();  
  13.         set.add("account1");  
  14.         set.add("account2");  
  15.         set.add("account3");  
  16.           
  17.         if(set.contains(account)){  
  18.             inputStream = new ByteArrayInputStream("输入不正确,请重新输入".getBytes("utf-8"));  
  19.         }else{  
  20.             inputStream = new ByteArrayInputStream("输入正确".getBytes("utf-8"));  
  21.         }         
  22.         return this.SUCCESS;  
  23.     }  
  24. }  

上面的实现中,属性account和password使用来接收前台页面传递过来的参数的,这个很简单,就不多说了。

要注意其中有一个inputstream,还提供了一个getter方法,如下:

 

java代码:
  1. private InputStream inputStream;  
  2.    public InputStream getInputStream() {  
  3.        return inputStream;  
  4.    }  

这是提供给result用的,result的type是“stream”,顾名思义,返回的不应该是普通的文本而是一个流了。

另外这个流要输出的内容,是在execute方法里面设置的,通过getBytes("utf-8")进行转换,不但得到了byte数组,还顺带解决了传输的中文问题。

2:配置struts.xml

Action实现好了,看看如何来配置它,需要注意result的type,示例代码如下:

 

java代码:
  1. <action name="ajaxAction" class="cn.javass.ajax.AjaxAction">  
  2.         <result  type="stream">  
  3.             <param name="contentType">text/html</param>  
  4.             <param name="inputName">inputStream</param>  
  5.         </result>  
  6.    </action>  

配置的参数contentType是指的返回的数据类型,而inputName配置的就是要返回的流,这个值和Action中定义的流类型的属性相对应。

3:修改客户端

客户端几乎没有什么变化,主要就是要修改Ajax提交到后台的路径,示例代码如下:

 

java代码:
  1. myRequest.open("GET","ajaxAction.action?account="+account,true);  

4:测试运行

       可以去测试运行一下了,效果应该和前面是一样的。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4129.html

欢迎访问http://sishuok.com获取更多内容

13
1
分享到:
评论
3 楼 zeyonq 2014-03-24  
非常感谢楼主的帮助!
2 楼 zjhptxl 2012-09-17  
leon709 写道
写得很不错啊,我测试过了,跑通了。不过我这里有个小小的疑惑:
myRequest.open("GET","ajaxAction.action?account="+account,true); 
传了变量account,在Action类中也定义了相应的变量,但是并没有account的setter和getter方法,而且使用的时候并没有获得Request,用getParameter来取请求变量,为什么能够顺利的在Action中取得这个account参数呢?

因为account的修饰符是public 不用get和set,
1 楼 leon709 2012-06-02  
写得很不错啊,我测试过了,跑通了。不过我这里有个小小的疑惑:
myRequest.open("GET","ajaxAction.action?account="+account,true); 
传了变量account,在Action类中也定义了相应的变量,但是并没有account的setter和getter方法,而且使用的时候并没有获得Request,用getParameter来取请求变量,为什么能够顺利的在Action中取得这个account参数呢?

相关推荐

Global site tag (gtag.js) - Google Analytics