2009-08-09 4 views
5

Deseo enviar cadena como respuesta al método AJAX xhrPOST. Estoy usando Struts2 para implementar el procesamiento del lado del servidor. Pero no entiendo cómo enviar el resultado "tipo" como cadena y la asignación que se debe hacer para enviar la cadena de la clase de acción struts2 a la respuesta AJAX.Tipo de resultado de cadena de retorno de Struts2

Respuesta

2

Puede crear un StringResult simple con bastante facilidad extendiendo StrutsResultSupport, pero hasta ahora no existe nada incorporado al marco.

Aquí es una implementación que he utilizado en el pasado de una simple 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; 
} 

}

He utilizado el json plugin hacer cosas similares. Si utiliza esto, puede utilizar el siguiente para exponer una sola propiedad de cuerdas en su acción:

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

usted puede tener su método de acción de retorno no un resultado de cuerdas, sino el resultado de tipo StreamResult.

En otras palabras:

class MyAction { 

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

Usted no necesariamente tiene que devolver una cadena a partir de un método de acción Struts2. Siempre puede devolver una implementación de la interfaz de resultados de xwork.

+2

Probablemente significaba * devolver nueva StreamResult (nuevo ByteArrayInputStream ("mystring" .getBytes())); * Esto ayudó, gracias –

3

copia esto en clase de la acción

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> 

Esto funciona cuando queremos enviar un solo dato en respuesta

+0

¿Qué hacemos para obtener este valor de cadena en jsp page.plz ayuda. –

+0

StringBufferInputStream está en desuso. intente en su lugar: ByteArrayInputStream ("some ... response" .getBytes()); – fishjd

Cuestiones relacionadas