门户网站控制器的setContentType失败

时间:2013-06-24 02:46:12

标签: java spring-mvc portal websphere-portal

我正在尝试编写一个生成CSV电子表格的控制器,以保存为文件。

我写了以下动作并渲染方法

/**
 * 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.xml),但我不相信它会起作用。

我还能看到其他地方吗?

1 个答案:

答案 0 :(得分:2)

您需要实现ResourceServingPortlet并让您的portlet类实现serveResource。在其中,您可以像尝试操作和呈现响应一样设置内容类型和其他标题。只有这一次,您的portlet才会拥有响应,而不仅仅是对它做出贡献。您需要渲染一个链接,例如您可以从doView()中的RenderResponse获取的资源URL。

端到端,你会做这样的事情:

  1. 在doView()中,从RenderResponse获取您的serveResource()方法的ResourceURL。
  2. 使用例如“下载CSV”超链接呈现HTML片段,其超链接是您获得的ResourceURL。当浏览器请求它时,将调用serveResource()方法。
  3. 设置标题并将二进制文件/流写入响应。
  4. 希望这有帮助,

    • 斯科特