3

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

那么,我该怎么做呢?

4

5 回答 5

7

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

于 2009-11-04T10:15:04.557 回答
7

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

<action name="..." class="...">
  <result name="SUCCESS">
    <param name="contentType">text/html</param>
于 2009-11-05T20:02:13.267 回答
2

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

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

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

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

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

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

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

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

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

于 2010-03-18T19:58:17.527 回答
1

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

@Result(name=SUCCESS, location="...", params={"contentType", "text/html"})
于 2011-03-09T20:21:45.957 回答
0

回答了我自己的问题:

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

${response.setContentType("text/xml")}
于 2009-11-04T06:02:13.107 回答