利用ActionContext类完成页面与服务器之间的通信(需引入com.opensymphony.xwork2.ActionContext包)
通过ActionContext.getContext()得到一个ActionContext对象
例如: ActionContext ac = ActionContext.getContext()
这个对象可以很方便地得到页面请求过来的参数,
页面传参可以异步也可以同步,这里主要记录通过ajax向服务器发送异步请求,这种方式记住两类参数传递:
1、json传递 2、serialize()序列化传递
这两类传参方式都可以通过ac.getParameters()方法获得请求参数,返回一个Map<String,Object>
json传递举例:(jquery实现)
$.ajax({ type:'post',//请求方式 (相对应的是get方式) dataType:'json',//请求参数格式 data:{//请求参数 "username":"ggg", "password":"123" }//json格式的参数 key:value对 url:'/mynamespace/myaction.action'//请求url success:function(data){//为请求返回成功后绑定处理函数 do something; } });
在服务端通过ac.getParameters()方法得到的Map<String,Object>,其中string就是json数据中的key,Object就是Value,但是不知道为什么如果value是String类型的话,这里对应的Object都成了String[ ]类型的数据, 即传过去的是String同样会被封装成String [ ]
我经常用一个Map来存放请求参数:
public Map<String, String> formatParamter(ActionContext ac) { Map<String, String> outMap = null; Map<String, Object> inputMap = ac.getParameters(); if (null != inputMap) { outMap = new HashMap<String, String>(); } Iterator<Entry<String, Object>> it = inputMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Object> entry = it.next(); String key = entry.getKey(); Object value = entry.getValue(); //log.debug(value.getClass()); if (value instanceof String[]) { String strArray = CommUtil.strJoin((String[]) value, ","); outMap.put(key, CommUtil.getNotNull(strArray)); log.debug("format field[" + key + ", " + CommUtil.getNotNull(strArray) + "]"); } else { log.debug("非字符串数组类型"); } } return outMap; }
有俩工具方法:
CommUtil.strJoin((String[]) value, ",");作用是将value字符数组转换成字符串,不同元素间用逗号连接
CommUtil.getNotNull(strArray)); 作用是确保得到的参数不是NULL, 即使是个空串;
这里需要让被请求的ACTION的结果类型是JSON类型,配置文件:
<action name="initDate" class="GCSubplateAction" method="initDate"> <result type="json"> <param name="includeProperties"> args123.* </param> </result> </action>
在ACTION类中设一个Map型变量,名字随便取,但要保证和上面配置文件中的一致,比如上面的args123.* ,args123就是我在ACTION类中声明的Map型变量可以使Map<String,String>也可以是Map<String,Object>
这里的Object可以是一个List,也可以是别的什么东西,这样你就可以把通过服务器处理得到的数据,传回页面上使用了,而且页面不刷新,jquery,和json技术很强大,使得 Map、json数据、数据库中的某条记录、还有javabean看上去如此相似。
序列化方式举例:(jquery实现)
$('#iq').click(function(){ $('#list').hide(); if(!validateDate()){return;} if(!validateUser()){return;} var url = '/subplate/query.action'; var param = $('#main select').serialize() + '&' + $('#main input').serialize() + '&option=query'; $('#body').load(url,encodeURI(param)); });
alert一下param你就知道了
他就是吧所有页面表单元素,以key=value&key1=value1&......的形式传过去,相当去在请求连接中带过去参数一样,也是用ac.getParameter()方法获取。