gpt4 book ai didi

java - 门户 Controller 的 setContentType 失败

转载 作者:行者123 更新时间:2023-12-02 06:56:26 24 4
gpt4 key购买 nike

我正在尝试编写一个 Controller 来生成 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),但我不相信它会起作用。

还有其他地方可以看吗?

最佳答案

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

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

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

希望这有帮助,

  • 斯科特

关于java - 门户 Controller 的 setContentType 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17267359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com