2009-08-09 5 views
5

Je souhaite envoyer une chaîne en réponse à la méthode AJAX xhrPOST. J'utilise Struts2 pour implémenter le traitement côté serveur. Mais, je ne comprends pas comment envoyer le résultat "type" sous forme de chaîne et le mappage qui devrait être fait pour envoyer la chaîne de la classe d'action struts2 à la réponse AJAX.Renvoyer le type de résultat de la chaîne à partir de Struts2

Répondre

2

Vous pouvez créer un simple StringResult assez facilement en étendant StrutsResultSupport, mais rien n'existe autant que je sache.

est ici une mise en œuvre que je l'ai utilisé dans le passé un 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; 
} 

}

Je l'ai utilisé le json plugin pour faire des choses semblables. Si vous utilisez, vous pouvez utiliser ce qui suit pour exposer une seule propriété String dans votre action:

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

Vous pouvez avoir votre méthode d'action retourne pas un résultat de chaîne, mais un résultat de type StreamResult.

En d'autres termes:

class MyAction { 

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

Vous ne devez pas nécessairement renvoyer une chaîne à partir d'une méthode d'action Struts2. Vous pouvez toujours renvoyer une implémentation de l'interface Result de xwork.

+2

Probablement que vous vouliez dire * return new StreamResult (new ByteArrayInputStream ("mystring" .getBytes())); * Cela a aidé, merci –

3

copie cette classe d'action en

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> 

Cela fonctionne quand nous voulons envoyer une seule donnée en réponse

+0

Que faisons-nous pour obtenir cette valeur de chaîne dans l'aide jsp page.plz. –

+0

StringBufferInputStream est obsolète. essayez à la place: ByteArrayInputStream ("some ... response" .getBytes()); – fishjd

Questions connexes