2009-11-04 6 views
3

Donc, j'utilise des modèles Freemarker avec Struts2 pour formuler mes réponses. Cependant, puisque j'essaye d'employer aussi la taconite, j'ai besoin que la réponse soit envoyée avec le type de contenu "text/xml". Je n'arrive pas à trouver un moyen d'utiliser des directives Freemarker pour définir le type de contenu, et je ne connais pas assez les struts pour savoir s'il existe un moyen de le faire.Définir le type de contenu d'une réponse dans Struts2

Alors, comment dois-je m'y prendre?

Répondre

6

O r vous pouvez le configurer dans le struts.xml

<action name="..." class="..."> 
    <result name="SUCCESS"> 
    <param name="contentType">text/html</param> 
+0

Cela a fonctionné pour moi, je ne sais pas pourquoi d'autres ont dit que non. – 3urdoch

+0

cela décrit ce que j'avais besoin de faire pour la vélocité: http://blog.bielu.com/2008/05/struts-velocity-and-flexible-content.html – depsypher

0

a répondu à ma propre question:

Utilisez le code suivant au type du modèle:

${response.setContentType("text/xml")} 
7

Dans votre classe d'action, implémente l'interface ServletResponseAware, et d'utiliser un simple:

package your.package; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import com.opensymphony.xwork2.ActionSupport; 
import org.apache.struts2.interceptor.ServletRequestAware; 
import org.apache.struts2.interceptor.ServletResponseAware; 

public class YourAction extends ActionSupport implements 
       ServletResponseAware { 

    private HttpServletResponse response; 

    public String execute() throws Exception{ 
    response.setContentType("image/png"); 
    return SUCCESS; 
    } 

    public void setServletResponse(HttpServletResponse response){ 
    this.response = response; 
    } 

    public HttpServletResponse getServletResponse(){ 
    return response; 
    } 
} 

Plus d'informations ici: http://www.roseindia.net/struts/struts2/strutsresources/access-request-response.shtml

+2

Cela a fonctionné pour moi - pas accepté un. – Fakrudeen

+0

Solution plus générique. – mac

2

La mise en œuvre ServletResponseAware pourrait fonctionner dans d'autres situations, mais cela ne contribue pas à Freemarker et Struts2. :-(Je viens de tracer à travers avec un débogueur, et a constaté que ...

  • en mettant en œuvre ServletResponseAware, on m'a donné accès à la réponse, et je pouvais changer le type de contenu de mon action. Bonne .

  • une fois que mon action a été fait, le contrôle bientôt fini en org.apache.struts2.views.freemarker.FreemarkerResult, ce qui rend le modèle

  • la méthode preTemplateProcess() définit le contenu de type de la réponse, sans tenir compte de la valeur que j'avais mis :-(

  • apparemment il y a un « attribut personnalisé » qui pourrait être utilisé pour remplacer, mais je n'ai trouvé aucune explication dans google encore

  • la classe FreemarkerResult elle-même peut avoir un type de contenu mis à remplacer la valeur par défaut, mais ... je ne sais pas encore où cela peut être réglé, peut-être dans une configuration de jambes de force?

donc jusqu'à présent, il ne semble pas que l'action peut définir le type de contenu, mais heureusement, comme le note Thomas ci-dessus, cela outrepasse tout ce qui:

${response.setContentType("text/xml")}

Donc, au moins il est possible à partir des modèles. Bien sûr, serait plus facile et plus sûr de donner un ensemble d'actions productrices xml une superclasse commune qui prend soin de cette ...

1

Ou, si vous préférez les annotations:

@Result(name=SUCCESS, location="...", params={"contentType", "text/html"}) 
Questions connexes