YUI + struts2实现基于JSON通讯的AJAX例子

 近来做了个小例子,前端使用YUI,后端使用struts2+spring,前后端完全通过AJAX技术完成数据交换,没有传统的页面提交,交换的数据格式采用JSON。为了处理 JSON,后端使用了json-lib。

不知道大家现在在项目中使用AJAX到什么程度,如果全面使用AJAX而弃用传统的提交的话,大家觉得是否可取?有什么地方是不适用的?欢迎大家讨论一下。

 

下面贴出我做的例子的部分代码。
示例程序演示的是前端接收用户输入的人员信息,然后以JSON格式传输到后端,后端接收后,转成java对象然后进行处理,处理结果再以JSON格式传回前端。
人员信息的类如下:

  1. public class Person {
  2.     private String name;
  3.     private Date birthday;
  4.     public void setName(String name) {
  5.         this.name = name;
  6.     }
  7.     public String getName() {
  8.         return name;
  9.     }
  10.     public void setBirthday(Date birthday) {
  11.         this.birthday = birthday;
  12.     }
  13.     public Date getBirthday() {
  14.         return birthday;
  15.     }
  16. }

处理结果信息的类如下:

  1. public class JSONResult {
  2.     static public final int RETCODE_OK = 0;
  3.     static public final int RETCODE_ERR = -1;
  4.     
  5.     private int returnCode;
  6.     private String errMessage;
  7.     public JSONResult(int returnCode) {
  8.         this.returnCode = returnCode;
  9.     }
  10.     
  11.     public JSONResult(int returnCode, String errMessage) {
  12.         this.returnCode = returnCode;
  13.         this.errMessage = errMessage;
  14.     }
  15.     
  16.     public void setReturnCode(int returnCode) {
  17.         this.returnCode = returnCode;
  18.     }
  19.     public int getReturnCode() {
  20.         return returnCode;
  21.     }
  22.     
  23.     public void setErrMessage(String errMessage) {
  24.         this.errMessage = errMessage;
  25.     }
  26.     public String getErrMessage() {
  27.         return errMessage;
  28.     }
  29. }

前端页面如下图:人员信息实际程序中只用到了姓名和生日。

 

前端AJAX通讯使用的是YUI 的Connection Manager,JSON处理使用的是YUI 的 JSON。
【确定】按钮按下后,将用户输入的数据转换成JSON格式,然后调用struts中定义的RegisterPersonAction.action。【确定】按钮上绑定的处理函数如下:

  1. function addButton_click() {
  2.     //读取人员信息
  3.     var person = new Object();
  4.     person.name = document.getElementById("fullname").value;
  5.     person.birthday = document.getElementById("birthday").value;
  6.     
  7.     //转换为JSON格式,并以"personData"做为属性名
  8.     var strPerson = YAHOO.lang.JSON.stringify(person);
  9.     var postData = "personData=" + strPerson;
  10.     
  11.     //准备回调函数(相应处理函数见下文)
  12.     var callback = {
  13.         success :responseSuccess,
  14.         failure :responseFailure,
  15.         argument : null
  16.     };
  17.     //AJAX异步调用
  18.     var request = YAHOO.util.Connect.asyncRequest('POST''RegisterPersonAction.action', callback, postData);
  19. }

回调函数中将返回的JSON数据转成对象,然后根据返回值进行提示。代码如下:

  1. function responseSuccess(o) {
  2.     /* o.tId
  3.      * o.status
  4.      * o.statusText
  5.      * o.getResponseHeader[ ]
  6.      * o.getAllResponseHeaders
  7.      * o.responseText
  8.      * o.responseXML
  9.      * o.argument
  10.      */
  11.     
  12.     //将返回的JSON串转成对象
  13.     var ret = YAHOO.lang.JSON.parse(o.responseText);
  14.     
  15.     if (ret.returnCode == 0) { //successed
  16.         alert("成功");
  17.     } else { //failed
  18.         alert("失败 :" + ret.errMessage);
  19.     }
  20. };
  21. function responseFailure(o) {
  22.     alert("服务器处理失败 : " + o.statusText);
  23. }

struts.xml中对ajax异步调用中的url这样定义:

  1. <action name="RegisterPersonAction" method="register" class="personAction">
  2.     <result type="stream">
  3.         <param name="contentType">text/html</param>
  4.         <param name="inputName">inputStream</param>
  5.     </result>
  6. </action>

后台的PersonAction代码如下。其中属性personData用于接收来自前端的人员数据,属性inputStream用于向前端返回JSON格式的处理结果。

  1. public class PersonAction extends ActionSupport {
  2.     private InputStream inputStream;
  3.     
  4.     public void setInputStream(InputStream inputStream) {
  5.         this.inputStream = inputStream;
  6.     }
  7.     public InputStream getInputStream() {
  8.         return inputStream;
  9.     }
  10.     private PersonService personService;
  11.     
  12.     public void setPersonService(PersonService personService) {
  13.         this.personService = personService;
  14.     }
  15.     public PersonService getPersonService() {
  16.         return personService;
  17.     }
  18.     private String personData;
  19.     
  20.     public void setPersonData(String personData) {
  21.         this.personData = personData;
  22.     }
  23.     public String getPersonData() {
  24.         return personData;
  25.     }
  26.     public String register() {
  27.         //将JSON字符串转成java的Person对象
  28.         JSONObject jsonPerson = JSONObject.fromObject(personData);
  29.         String[] dateFormats = new String[] {"yyyy/MM/dd"};
  30.         JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats));
  31.         Person person = (Person)JSONObject.toBean(jsonPerson, Person.class);
  32.         
  33.         //处理人员数据,并根据处理结果生成返回对象
  34.         JSONResult ret;
  35.         try {
  36.             personService.register(person);
  37.             ret = new JSONResult(JSONResult.RETCODE_OK);
  38.         } catch (BusinessException e) {
  39.             ret = new JSONResult(JSONResult.RETCODE_ERR, e.getMessage());
  40.         }
  41.         
  42.         //将返回对象转成JSON字符串
  43.         JSONObject jsonRet = JSONObject.fromObject(ret);
  44.         String strRet = jsonRet.toString();
  45.         
  46.         //返回JSON数据
  47.         try {
  48.             setInputStream(new ByteArrayInputStream(strRet.getBytes("utf-8")));
  49.         } catch (UnsupportedEncodingException e) {
  50.             //略:错误处理
  51.         }
  52.         
  53.         return SUCCESS;
  54.     }
  55. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值