Установка типа содержимого ответа в Struts2

Итак, я использую шаблоны freemarker со Struts2, чтобы сформулировать свои ответы. Однако, поскольку я также пытаюсь использовать таконит, мне нужно, чтобы ответ был отправлен с типом содержимого «text/xml». Кажется, я не могу найти способ использовать директивы freemarker для установки типа контента, и я недостаточно хорошо разбираюсь в стойках, чтобы знать, есть ли способ сделать это через это.

Итак, как мне поступить в этом случае?


person Thomas    schedule 04.11.2009    source источник


Ответы (5)


Или вы можете установить его в struts.xml

<action name="..." class="...">
  <result name="SUCCESS">
    <param name="contentType">text/html</param>
person Ulf Lindback    schedule 05.11.2009
comment
это описывает то, что мне нужно было сделать для скорости: блог. bielu.com/2008/05/ - person depsypher; 27.06.2012

В вашем классе 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

person Lastnico    schedule 04.11.2009

Реализация ServletResponseAware может работать в других ситуациях, но не помогает с Freemarker и Struts2. :-( Я только что проследил это с помощью отладчика и обнаружил, что...

  • реализовав ServletResponseAware, я получил доступ к ответу, и я мог изменить тип контента из своего действия. Хорошо.

  • как только мое действие было выполнено, управление вскоре оказалось в org.apache.struts2.views.freemarker.FreemarkerResult, которое отображает шаблон

  • метод preTemplateProcess() устанавливает тип содержимого ответа, игнорируя значение, которое я установил :-(

  • по-видимому, есть «настраиваемый атрибут», который можно использовать для переопределения этого, но я пока не нашел объяснения в Google.

  • сам класс FreemarkerResult может иметь тип содержимого, установленный для переопределения значения по умолчанию, но... еще не уверен, откуда это можно установить, может быть, в конфигурации struts?

Пока не кажется, что действие может установить тип содержимого, но, к счастью, как отмечает Томас выше, это переопределяет все это:

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

Так что по крайней мере это возможно из шаблонов. Конечно, было бы проще и безопаснее дать набору действий, создающих xml, общий суперкласс, который позаботится об этом...

person Rodney Gitzel    schedule 18.03.2010

Или, если вы предпочитаете аннотации:

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

Ответил на свой вопрос:

Используйте следующий код в типе шаблона:

${response.setContentType("text/xml")}
person Thomas    schedule 04.11.2009