从Struts2返回字符串结果类型

时间:2009-08-09 14:35:08

标签: struts2

我想发送String作为对AJAX xhrPOST方法的响应。我正在使用Struts2来实现服务器端处理。但是,我没有得到如何将结果“type”作为字符串发送以及应该执行的映射,以便将字符串从struts2操作类发送到AJAX响应。

3 个答案:

答案 0 :(得分:5)

您可以让action方法返回String结果,但返回StreamResult类型的结果。

换句话说:

class MyAction {

 public StreamResult method() {
   return new StreamResult(new ByteArrayInputStream("mystring".getBytes()));
 }
}

您不一定要从Struts2操作方法返回String。您始终可以从xwork返回Result接口的实现。

答案 1 :(得分:3)

在动作类

中复制此内容
private InputStream inputStream;
public InputStream getInputStream() {
    return inputStream;
} 

public String execute(){
    inputStream = new StringBufferInputStream("some data to send for ajax response");
    return SUCCESS;
}

struts.xml中

<action name=....>
<result type="stream">
                <param name="contentType">text/html</param>
                <param name="inputName">inputStream</param>
</result>   

当我们想要在响应中发送单个数据时,这是有效的

答案 2 :(得分:2)

你可以通过扩展StrutsResultSupport很容易地创建一个简单的StringResult,但据我所知,框架中没有任何内置的东西。

这是我在过去简单的StringResult中使用的实现:

public class StringResult extends StrutsResultSupport {
private static final Log log = LogFactory.getLog(StringResult.class);
private String charset = "utf-8";
private String property;
private String value;
private String contentType = "text/plain";


@Override
protected void doExecute(String finalLocation, ActionInvocation invocation)
        throws Exception {
    if (value == null) {
        value = (String)invocation.getStack().findValue(conditionalParse(property, invocation));
    }
    if (value == null) {
        throw new IllegalArgumentException("No string available in value stack named '" + property + "'");
    }
    if (log.isTraceEnabled()) {
        log.trace("string property '" + property + "'=" + value);
    }
    byte[] b = value.getBytes(charset);

    HttpServletResponse res = (HttpServletResponse) invocation.getInvocationContext().get(HTTP_RESPONSE);

    res.setContentType(contentType + "; charset=" + charset);
    res.setContentLength(b.length);
    OutputStream out  = res.getOutputStream();
    try {
        out.write(b);
        out.flush();
    } finally {
        out.close();    
    }
}


public String getCharset() {
    return charset;
}


public void setCharset(String charset) {
    this.charset = charset;
}


public String getProperty() {
    return property;
}


public void setProperty(String property) {
    this.property = property;
}


public String getValue() {
    return value;
}


public void setValue(String value) {
    this.value = value;
}


public String getContentType() {
    return contentType;
}


public void setContentType(String contentType) {
    this.contentType = contentType;
}

}

我使用json plugin做类似的事情。如果使用它,则可以使用以下内容在操作中公开单个String属性:

<result name="success" type="json">
  <param name="root">propertyToExpose</param>
</result>