日期:2014-05-16 浏览次数:20383 次
最近学习JSON的时候,数据传输问题。以前比较迷惑JSON类型的数据,老是感觉就是JSON格式数据传输,不方便的很,也很反感。最近项目中用到了一个方法,所以就记录一下,也顺便接收接收大家的意见,完善代码、提高自己技术。
(注:我相信,在我之前肯定有人发过此类代码,我并不与他人相比,只是自己的代码,如果有哪些地方写的不对,不合理的地方,大家指正,虚心受教,但是请不要谩骂!)
?
json-lib-2.4-jdk15.jar JSON转换格式jar包。 在JSONObject的官网中就有。
?
Struts的配置
?
<!--自定议返回类型--> <result-types> <result-type name="jsonResult" class="base.web.result.JsonResult"/> </result-types> <action name="ajax" class="base.web.actions.week.WeekDataAction" method="ajax"> <!-- jsonResult自定义返回类型, --> <result name="success" type="jsonResult"> </result> </action>?
?
?
1.基础返回类型的抽象类 BaseResult
(1)在定义struts的返回类型时候,则必须继承StrutsResultSupport这个类
(2)调用父类的构造方法。
package base.web.result; import org.apache.struts2.dispatcher.StrutsResultSupport; import com.opensymphony.xwork2.ActionInvocation; /** * <ol> * date:2011-10-15 editor:Yq * <li>创建文档</li> * <li>返回结果类型基础类</li> * </ol> * <ol> * * @author YeQing * @version 2.0 * @since 1.6 */ public abstract class BaseResult extends StrutsResultSupport{ public BaseResult() { super(); } public BaseResult(String location) { super(location); } public boolean isAjax = false; }
?2.自定义返回类型的类 JsonResult
package base.web.result; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import org.apache.struts2.ServletActionContext; import base.web.actions.BaseAction; import com.opensymphony.xwork2.ActionInvocation; /** * <ol> * date:2011-10-15 editor:Yq * <li>创建文档</li> * <li>自定义返回类型JsonResult类</li> * </ol> * <ol> * * @author YeQing * @version 2.0 * @since 1.6 */ public class JsonResult extends BaseResult{ protected boolean isAjax = true; protected void doExecute(String arg0, ActionInvocation invocation) throws Exception { //定义上下文的环境 ServletContext sc = ServletActionContext.getServletContext(); HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); response.setCharacterEncoding(request.getCharacterEncoding()); System.out.println(request.getCharacterEncoding()); response.setContentType("application/json");//这里ContentType 需是application/json JS否则会出错。 PrintWriter output = response.getWriter();//获取响应打印 BaseAction baseAction = (BaseAction) invocation.getAction();//获得基础Action类 JSONObject js = new JSONObject();//JSON转换为对象 js.put("model", baseAction.getModel()); /*此处js作为一个对象就像map一样存储自己的数据 baseAction.getModel()是actiond的基础父类 所有的action都必须继承BaseAction,BaseAction的变量 Map model = new HashMap(); 则是所有action中数据存放的map, model则是放在struts2的值栈中的数据。 所有的数据,都必须放在model里,然后在jsp页面使用JSTL进行输出. (也就是,说我将数据放入了model,然后将model放入了JSONObject,成为了JSON对象, 然后在js里获得值,就像点运算符一样。) ? */ js.write(output);//打印 } }?
3.JS异步请求,在回调函数中获取数据。
this.ajax=function() { var request = new $WebRequest(basrUrl+"/psw/server/week/ajax.do",0,function(result) { alert(result.model.m.one); //从回调函数的result中 //获取存储的model 然后获取model中的m集合, //m.one map集合 中的oneKey 的值 }); request.Start(); };
?
4.补上WeekDataAction的方法。
public String ajax() { System.out