posts - 241,  comments - 116,  trackbacks - 0
最近学习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里获得值,就像点运算符一样。)
&nbsp;                */
        
        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.println("start.......");
        Map map = new HashMap();
        map.put("one", 1);
        map.put("two", 2);
        model.put("m", map); //父类的变量
        return getResult();
    }
结束,有些地方时项目中内容,牵扯类很多不好粘贴,如果大家有更好的办法,告知一下,学习。
posted on 2011-11-02 10:21 墙头草 阅读(5238) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航:
 
人人游戏网 软件开发网 货运专家