2009-08-09 6 views
5

Chcę wysłać ciąg jako odpowiedź na metodę xxPOST AJAX. Używam Struts2 do implementacji przetwarzania po stronie serwera. Ale nie mam pojęcia, jak wysłać wynik "typ" jako ciąg znaków i mapowanie, które należy wykonać, aby wysłać ciąg znaków z klasy działania struts2 do odpowiedzi AJAX.Powrót Typ wyniku String z Struts2

Odpowiedz

2

Możesz łatwo stworzyć prosty StringResult, rozszerzając StrutsResultSupport, ale nic nie jest wbudowane w framework, o ile wiem.

Oto implementacja że użyłem w przeszłości prostego 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; 
} 

}

Użyłem json plugin robić podobne rzeczy. Jeśli używasz, że można korzystać z następujących czynności, aby odsłonić jedną właściwość String w swoim działaniu:

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

Możesz mieć swój sposób działania powrotu nie wynik String, ale efektem typu StreamResult.

Innymi słowy:

class MyAction { 

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

Nie koniecznie trzeba zwracać ciąg od sposobu działania Struts2. Zawsze możesz zwrócić implementację interfejsu wyników z xwork.

+2

Prawdopodobnie oznaczało * powrót nowego StreamResult (nowy ByteArrayInputStream ("mystring" .getBytes())); * Pomogło to, dzięki –

3

kopia tego w klasie działania

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> 

To działa, gdy chcemy wysłać pojedynczą dane w odpowiedzi

+0

Co zrobić, aby uzyskać tę wartość ciągu w pomocy jsp page.plz. –

+0

StringBufferInputStream jest przestarzałe. spróbuj zamiast tego: ByteArrayInputStream ("some ... response" .getBytes()); – fishjd