在Struts2中设置响应的内容类型

所以,我正在使用Struts2的freemarker模板来制定我的回复。 但是,由于我也尝试使用taconite,我需要使用“text / xml”的内容类型发送响应。 我似乎无法找到一种方法来使用freemarker指令来设置内容类型,而且我不太了解struts是否有办法通过它来实现它。

那么,我该怎么做呢?

或者您可以在struts.xml中设置它

  text/html 

在Action类中,实现ServletResponseAware接口,并使用一个简单的:

 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; } } 

更多信息请访问: http : //www.roseindia.net/struts/struts2/strutsresources/access-request-response.shtml

实现ServletResponseAware可能适用于其他情况,但它对Freemarker和Struts2没有帮助。 :-(我只是用调试器跟踪它,发现……

  • 通过实现ServletResponseAware ,我获得了响应的访问权限,我可以从我的操作中更改内容类型。 好。

  • 一旦我的行动完成,控制很快就会进入org.apache.struts2.views.freemarker.FreemarkerResult ,它会渲染模板

  • 方法preTemplateProcess()设置响应的内容类型,忽略我设置的值:-(

  • 显然有一个“自定义属性”可以用来覆盖这个,但我还没有在谷歌找到任何解释

  • FreemarkerResult类本身可以设置一个内容类型来覆盖默认值,但是……还不确定可以在哪里设置,也许是在struts配置中?

所以到目前为止,似乎动作不能设置内容类型,但幸运的是,正如托马斯上面所说,这取代了所有这些:

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

所以至少可以从模板中获得。 肯定会更容易和更安全地给一组xml生成动作一个共同的超类来处理这个……

或者,如果您更喜欢注释:

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

回答了我自己的问题:

在模板类型上使用以下代码:

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