六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 34|回复: 0

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

[复制链接]

升级  61.33%

40

主题

40

主题

40

主题

秀才

Rank: 2

积分
142
 楼主| 发表于 2013-1-23 02:54:45 | 显示全部楼层 |阅读模式
近来做了个小例子,前端使用YUI,后端使用struts2+spring,前后端完全通过AJAX技术完成数据交换,没有传统的页面提交,交换的数据格式采用JSON。为了处理 JSON,后端使用了json-lib。

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

下面贴出我做的例子的部分代码。
示例程序演示的是前端接收用户输入的人员信息,然后以JSON格式传输到后端,后端接收后,转成java对象然后进行处理,处理结果再以JSON格式传回前端。
人员信息的类如下:
public class Person {private String name;private Date birthday;public void setName(String name) {this.name = name;}public String getName() {return name;}public void setBirthday(Date birthday) {this.birthday = birthday;}public Date getBirthday() {return birthday;}}

处理结果信息的类如下:
public class JSONResult {static public final int RETCODE_OK = 0;static public final int RETCODE_ERR = -1;private int returnCode;private String errMessage;public JSONResult(int returnCode) {this.returnCode = returnCode;}public JSONResult(int returnCode, String errMessage) {this.returnCode = returnCode;this.errMessage = errMessage;}public void setReturnCode(int returnCode) {this.returnCode = returnCode;}public int getReturnCode() {return returnCode;}public void setErrMessage(String errMessage) {this.errMessage = errMessage;}public String getErrMessage() {return errMessage;}}

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


前端AJAX通讯使用的是YUI 的Connection Manager,JSON处理使用的是YUI 的 JSON。
【确定】按钮按下后,将用户输入的数据转换成JSON格式,然后调用struts中定义的RegisterPersonAction.action。【确定】按钮上绑定的处理函数如下:
function addButton_click() {//读取人员信息var person = new Object();person.name = document.getElementById("fullname").value;person.birthday = document.getElementById("birthday").value;//转换为JSON格式,并以"personData"做为属性名var strPerson = YAHOO.lang.JSON.stringify(person);var postData = "personData=" + strPerson;//准备回调函数(相应处理函数见下文)var callback = {success :responseSuccess,failure :responseFailure,argument : null};//AJAX异步调用var request = YAHOO.util.Connect.asyncRequest('POST', 'RegisterPersonAction.action', callback, postData);}

回调函数中将返回的JSON数据转成对象,然后根据返回值进行提示。代码如下:
function responseSuccess(o) {/* o.tId * o.status * o.statusText * o.getResponseHeader[ ] * o.getAllResponseHeaders * o.responseText * o.responseXML * o.argument *///将返回的JSON串转成对象var ret = YAHOO.lang.JSON.parse(o.responseText);if (ret.returnCode == 0) { //successedalert("成功");} else { //failedalert("失败 :" + ret.errMessage);}};function responseFailure(o) {alert("服务器处理失败 : " + o.statusText);}

struts.xml中对ajax异步调用中的url这样定义:
<action name="RegisterPersonAction" method="register" class="personAction"><result type="stream"><param name="contentType">text/html</param><param name="inputName">inputStream</param></result></action>

后台的PersonAction代码如下。其中属性personData用于接收来自前端的人员数据,属性inputStream用于向前端返回JSON格式的处理结果。
public class PersonAction extends ActionSupport {private InputStream inputStream;public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;}public InputStream getInputStream() {return inputStream;}private PersonService personService;public void setPersonService(PersonService personService) {this.personService = personService;}public PersonService getPersonService() {return personService;}private String personData;public void setPersonData(String personData) {this.personData = personData;}public String getPersonData() {return personData;}public String register() {//将JSON字符串转成java的Person对象JSONObject jsonPerson = JSONObject.fromObject(personData);String[] dateFormats = new String[] {"yyyy/MM/dd"};JSONUtils.getMorpherRegistry().registerMorpher(new DateMorpher(dateFormats));Person person = (Person)JSONObject.toBean(jsonPerson, Person.class);//处理人员数据,并根据处理结果生成返回对象JSONResult ret;try {personService.register(person);ret = new JSONResult(JSONResult.RETCODE_OK);} catch (BusinessException e) {ret = new JSONResult(JSONResult.RETCODE_ERR, e.getMessage());}//将返回对象转成JSON字符串JSONObject jsonRet = JSONObject.fromObject(ret);String strRet = jsonRet.toString();//返回JSON数据try {setInputStream(new ByteArrayInputStream(strRet.getBytes("utf-8")));} catch (UnsupportedEncodingException e) {//略:错误处理}return SUCCESS;}}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表