java—在struts2中设置响应的内容类型

ltskdhd1  于 2021-06-30  发布在  Java
关注(0)|答案(5)|浏览(312)

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

yfjy0ee7

yfjy0ee71#

或者,如果您喜欢注解:

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

vsaztqbk2#

也可以在struts.xml中进行设置

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

5w9g7ksd3#

在action类中,实现ServletResponseWare接口,并使用简单的:

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

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

6ovsh4lw

6ovsh4lw4#

实施 ServletResponseAware 可能在其他情况下也适用,但对freemarker和struts2没有帮助。:-(我用调试器查了一下,发现。。。
通过实施 ServletResponseAware ,我获得了对响应的访问权限,并且可以从我的操作更改内容类型。很好。
一旦我的行动完成,控制很快就结束了 org.apache.struts2.views.freemarker.FreemarkerResult ,它将呈现模板
方法 preTemplateProcess() 设置响应的内容类型,忽略我设置的值:-(
显然有一个“自定义属性”可以用来覆盖它,但我还没有在google中找到任何解释
这个 FreemarkerResult 类本身可以将内容类型设置为覆盖默认值,但是。。。还不确定可以从哪里设置,也许是在struts配置中?
到目前为止,似乎操作还不能设置内容类型,但幸运的是,正如thomas在上面所指出的,这会覆盖所有这些: ${response.setContentType("text/xml")} 所以至少从模板上是可能的。当然,给一组生成xml的操作提供一个处理这些操作的公共超类会更简单、更安全。。。

2hh7jdfx

2hh7jdfx5#

回答了我自己的问题:
在模板的类型处使用以下代码:

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

相关问题