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

Java 在Struts2中设置响应的内容类型,java,xml,struts2,freemarker,taconite,Java,Xml,Struts2,Freemarker,Taconite,所以,我使用freemarker模板和Struts2来表达我的回答。但是,因为我也在尝试使用taconite,所以我需要发送内容类型为“text/xml”的响应。我似乎找不到一种使用freemarker指令来设置内容类型的方法,而且我对struts还不够精通,不知道是否有办法做到这一点 那么,我应该怎么做呢?回答了我自己的问题: 在模板类型处使用以下代码: ${response.setContentType("text/xml")} 在Action类中,实现接口,并使用简单的 package

所以,我使用freemarker模板和Struts2来表达我的回答。但是,因为我也在尝试使用taconite,所以我需要发送内容类型为“text/xml”的响应。我似乎找不到一种使用freemarker指令来设置内容类型的方法,而且我对struts还不够精通,不知道是否有办法做到这一点


那么,我应该怎么做呢?

回答了我自己的问题:

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

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

在Action类中,实现接口,并使用简单的

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

此处的更多信息:

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

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

文本/html

实现
ServletResponseAware
可能在其他情况下工作,但对Freemarker和Struts2没有帮助:-(我只是用调试器跟踪了一下,发现

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

  • 一旦我的操作完成,控件很快就会出现在呈现模板的
    org.apache.struts2.views.freemarker.FreemarkerResult

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

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

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

到目前为止,似乎操作无法设置内容类型,但幸运的是,正如Thomas在上文中所指出的,这覆盖了所有内容:


${response.setContentType(“text/xml”)}


因此,至少从模板中是可能的。为一组生成xml的操作提供一个通用的超类来处理这一点,肯定会更容易、更安全…

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

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

这描述了我需要为velocity做什么: