修正webwork 2.2.7对json的支持的bug

  时隔1年半后,再次在csdn的blog中发表日志,sohu的blog也用着不爽。

  最近在用webwork+ext在做东西,发现webwork2.2.7版本虽然支持JSON,但存在bug,他默认是不支持设置返回json的charset的,所以需要自己修改一下webwork的源文件中的JSONResult文件。具体修改如下(红色部分):

 

/*
 * Copyright (c) 2002-2007 by OpenSymphony
 * All rights reserved.
 */
package com.opensymphony.webwork.dispatcher.json;

import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.webwork.WebWorkException;
import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ActionInvocation;
import com.opensymphony.xwork.Result;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
public class JSONResult implements Result {

    private static final Log LOG = LogFactory.getLog(JSONResult.class);

    private String jsonObjectProperty = "jsonObject";
    private String contentType = "application/json";
    private String charset = "utf-8";


    /**
     * Returns the property which will be used to lookup {@link JSONObject} in WebWork's ValueStack. Default to
     * 'jsonObject'.
     *
     * @return String
     */
    public String getJSONObjectProperty() {
        return jsonObjectProperty;
    }

    /**
     * Set the property which will be used to lookup {@link JSONObject} in WebWork's ValueStack. Default to
     * 'jsonObject'.
     * 
     * @param jsonObject
     */
    public void setJSONObjectProperty(String jsonObject) {
        this.jsonObjectProperty = jsonObject;
    }

    /**
     * Returns the content-type header to be used. Default to 'application/json'.
     * 
     * @return String
     */
    public String getContentType() {
        return contentType;
    }

    /**
     * Set the content-type header to be used. Default to 'application/json'.
     * 
     * @param contentType
     */
    public void setContentType(String contentType) {
        this.contentType = contentType;
    }


    /**
     * Writes the string representation of {@link JSONObject} defined through {@link #getJSONObjectProperty()}
     * to {@link javax.servlet.http.HttpServletResponse}'s outputstream. 
     *
     * @param invocation
     * @throws Exception
     */
    public void execute(ActionInvocation invocation) throws Exception {

        if (LOG.isDebugEnabled()) {
            LOG.debug("executing JSONResult");
        }

        JSONObject jsonObject = getJSONObject(invocation);
        if (jsonObject != null) {
            String json = jsonObject.toString();
            HttpServletResponse response = getServletResponse(invocation);
            response.setContentType(getContentType());
            byte[] bs = json.getBytes(charset);
            response.setContentLength(bs.length);

            OutputStream os = response.getOutputStream();
            os.write(bs);
            os.flush();

            if (LOG.isDebugEnabled()) {
                LOG.debug("written ["+json+"] to HttpServletResponse outputstream");
            }
        }
    }

    /**
     * Attempt to look up a {@link com.opensymphony.webwork.dispatcher.json.JSONObject} instance through the property
     * ({@link #getJSONObjectProperty()}) by looking up the property in WebWork's ValueStack. It shall be found if there's
     * accessor method for the property in WebWork's action itself.
     * 

* Returns null if one cannot be found. *

* We could override this method to return the desired JSONObject when writing testcases. * * @param invocation * @return {@link JSONObject} or null if one cannot be found */ protected JSONObject getJSONObject(ActionInvocation invocation) throws JSONException { ActionContext actionContext = invocation.getInvocationContext(); Object obj = actionContext.getValueStack().findValue(jsonObjectProperty); if (obj == null) { LOG.error("property ["+ jsonObjectProperty +"] returns null, expecting JSONObject", new WebWorkException()); return null; } if (! JSONObject.class.isInstance(obj)) { LOG.error("property ["+ jsonObjectProperty +"] is ["+obj+"] especting an instance of JSONObject", new WebWorkException()); return null; } return (JSONObject) obj; } /** * Returns a {@link javax.servlet.http.HttpServletResponse} by looking it up through WebWork's ActionContext Map. *

* We could override this method to return the desired Mock HttpServletResponse when writing testcases. * * @param invocation * @return {@link javax.servlet.http.HttpServletResponse} */ protected HttpServletResponse getServletResponse(ActionInvocation invocation) { return (HttpServletResponse) invocation.getInvocationContext().getContextMap().get(ServletActionContext.HTTP_RESPONSE); } public String getCharset() { return charset; } public void setCharset(String charset) { this.charset = charset; } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值