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

Posted

技术标签:

【中文标题】在 Struts2 中设置响应的内容类型【英文标题】:Setting the content-type of a response in Struts2 【发布时间】:2010-12-12 21:51:45 【问题描述】:

所以,我使用带有 Struts2 的 freemarker 模板来制定我的回复。但是,由于我也在尝试使用 taconite,因此我需要使用“text/xml”的内容类型发送响应。我似乎找不到使用 freemarker 指令设置内容类型的方法,而且我对 struts 的了解还不够,不知道是否有办法通过它来做到这一点。

那么,我该怎么办呢?

【问题讨论】:

【参考方案1】:

或者你可以在struts.xml中设置

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

【讨论】:

这描述了我需要为速度做些什么:blog.bielu.com/2008/05/…【参考方案2】:

在你的 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

【讨论】:

【参考方案3】:

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

通过实现ServletResponseAware,我可以访问响应,并且可以从我的操作中更改内容类型。很好。

一旦我的动作完成,控制很快就会在org.apache.struts2.views.freemarker.FreemarkerResult 中结束,它会呈现模板

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

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

FreemarkerResult 类本身可以设置一个 content-type 来覆盖默认值,但是...不确定可以从哪里设置,也许是在 struts 配置中?

李>

到目前为止,该操作似乎无法设置内容类型,但幸运的是,正如 Thomas 上面所说,这会覆盖所有内容:

$response.setContentType("text/xml")

所以至少可以从模板中获得。当然,为一组生成 xml 的操作提供一个通用的超类来处理这个问题会更容易、更安全……

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

回答了我自己的问题:

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

$response.setContentType("text/xml")

【讨论】:

以上是关于在 Struts2 中设置响应的内容类型的主要内容,如果未能解决你的问题,请参考以下文章

如何强制浏览器在内容类型 http 标头中设置字符集

如何在 Ktor 客户端中设置内容类型字符集(不是接受字符集)

在嵌入式Jetty中设置默认字符编码和内容类型

如何在角度的数组类型变量中设置响应?

无法在 axios 中设置标题

在css中设置主要内容相对于响应侧边栏宽度的边距[重复]