所以,我正在使用Struts2的freemarker模板来制定我的回复。但是,由于我也尝试使用taconite,我需要使用“text / xml”的内容类型发送响应。我似乎无法找到一种方法来使用freemarker指令来设置内容类型,而且我不太了解struts是否有办法通过它来实现它。
那么,我应该怎么做呢?
答案 0 :(得分: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
答案 1 :(得分:6)
或者您可以在struts.xml中设置它
<action name="..." class="...">
<result name="SUCCESS">
<param name="contentType">text/html</param>
答案 2 :(得分:2)
实现ServletResponseAware
可能适用于其他情况,但它对Freemarker和Struts2没有帮助。 :-(我只是用调试器跟踪它,发现......
通过实施ServletResponseAware
,我获得了响应的访问权限,我可以从我的操作中更改内容类型。好。
一旦我的操作完成,控件很快就会在org.apache.struts2.views.freemarker.FreemarkerResult
中结束,这会呈现模板
方法preTemplateProcess()
设置响应的内容类型,忽略我设置的值: - (
显然有一个“自定义属性”可以用来覆盖它,但我还没有在谷歌找到任何解释
FreemarkerResult
类本身可以设置内容类型来覆盖默认值,但是......不确定可以在哪里设置,也许在struts配置中?
所以到目前为止,似乎动作不能设置内容类型,但幸运的是,正如托马斯上面所说,这取代了所有这些:
${response.setContentType("text/xml")}
所以至少可以从模板中获取。肯定会更容易和更安全地给一组xml生成动作一个共同的超类来处理这个......
答案 3 :(得分:1)
或者,如果您更喜欢注释:
@Result(name=SUCCESS, location="...", params={"contentType", "text/html"})
答案 4 :(得分:0)
回答了我自己的问题:
在模板类型中使用以下代码:
${response.setContentType("text/xml")}