2013-06-24 80 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. 设置您的标题并将您的二进制/流写入响应。

希望这有助于

  • 斯科特