2013-06-24 3 views
0

Я пытаюсь написать контроллер, который создает таблицу CSV для сохранения в виде файла.setContentType не работает для контроллера портала

Я написал следующее действие и оказывают методы

/** 
* Get the stats for the search. 
*/ 
@ActionMapping(params={"controller=exportView","action=csv"}) 
public void viewInstance(ActionRequest request, ActionResponse response){ 
    response.setRenderParameter("controller", "exportView"); 
    response.setRenderParameter("action","csv"); 
} 


@RenderMapping(params={"controller=exportView","action=csv"}) 
public String viewInstance(@RequestParam(value = "id", required = true) final String viewInstanceId, RenderRequest request, RenderResponse response, Model model) throws Exception { 
    ApplicationContext ctx = ThreadApplicationContextHolder.getApplicationContext(); 

    .. do some stuff 

    String filename = getFilename(); 

    response.setContentType("text/csv"); // go bang here 

    response.addProperty(ExportViewInstanceAsCsvFileController.HEADER_CONTENT_DISPOSITION, "attachment;filename=" + filename + ExportViewInstanceAsCsvFileController.FILE_EXT); 

    viewInstanceFileRenderer.renderSearchResultNodesToFile(getData(), response.getPortletOutputStream()); 

    return "portlet/exportView"; 
} 

Когда запускается сервер жалуется, что тип содержимого не «текст/html», поэтому я внес изменения в portlet.xml иметь

<supports> 
    <mime-type>text/html</mime-type> 
    <portlet-mode>VIEW</portlet-mode> 
</supports> 
<supports> 
    <mime-type>text/csv</mime-type> 
    <portlet-mode>VIEW</portlet-mode> 
</supports> 

но websphere, кажется, игнорирует это.

Когда я отлаживаю и запускаю request.getResponseContentTypes(), в коллекции есть только text/html. Структура приложения имеет портлет для входа в систему, а затем три веб-приложения для обработки различных аспектов приложения. Я изменил портлет в веб-приложении, которое обрабатывает генерацию электронной таблицы, но не в портлете входа в систему.

Мой следующий шаг - изменить это (logon portlet.xml), но я не уверен, что он сработает.

Есть ли другие места, которые я могу посмотреть?

ответ

2

Вы должны реализовать ResourceServingPortlet и реализовать свой класс портлета serveResource. В нем вы можете установить тип контента и другие заголовки так же, как вы пытались в действии и откликать ответы. Только на этот раз ваш портлет будет иметь ответ, а не только его вклад. Вам нужно будет отобразить ссылку, например, на URL вашего ресурса, который вы можете получить из своего RenderResponse в doView().

конца в конец, вы будете делать что-то вроде этого:

  1. В doView(), получим ResourceURL к вашему serveResource() метод от RenderResponse.
  2. визуализируйте фрагмент HTML, например, с гиперссылкой «загрузить CSV», чей href является полученным вами ResourceURL. Когда браузер запрашивает, будет вызван ваш метод serveResource().
  3. Задайте свои заголовки и напишите свой двоичный файл/поток для ответа.

Надеется, что это помогает,

  • Скотт

 Смежные вопросы

  • Нет связанных вопросов^_^