2013-06-24 113 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"; 
} 

當它運行在服務器抱怨的內容類型不是「text/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。應用程序結構有一個portlet來處理登錄,然後有三個web應用程序來處理應用程序的各個方面。我在處理電子表格生成的web應用程序中修改了 portlet,但未在登錄portlet中修改該portlet。

我的下一步是更改(登錄portlet.xml),但我不確定它會工作。

我還能看到其他地方嗎?

回答

2

你會想要實現ResourceServingPortlet並讓你的portlet類實現serveResource。在其中,您可以設置內容類型和其他標題,就像您嘗試操作並呈現響應一樣。只有這一次,您的portlet纔會擁有迴應,而不是僅僅爲此做出貢獻。您需要呈現一個鏈接,例如,您可以從doView()中的RenderResponse獲取資源URL。

末到最後,你會做這樣的事情:

  1. 在的doView(),獲得ResourceURL您的serveResource從的renderResponse()方法。
  2. 使用例如「下載CSV」超鏈接呈現HTML片段,其超鏈接的href是您獲得的ResourceURL。當瀏覽器請求它時,你的serveResource()方法將被調用。
  3. 設置您的標題並將您的二進制/流寫入響應。

希望這有助於

  • 斯科特