无法从liferay portlet生成word文档

时间:2009-10-20 10:50:28

标签: liferay

我正在尝试从liferay portlet生成报告文档。我用于报告生成的方法已经使用OutputStream,我无法更改。以下是方法签名。

public void generateReport(OutputStream outPut);

我使用以下行将OutputStream传递给方法:

PortletResponse portletResponse = (PortletResponse)externalContext.getResponse();
HttpServletResponse httpResponse = PortalUtil.getHttpServletResponse(portletResponse);

然后我使用以下行调用该方法:

generateReport(httpResponse.getOutputStream());

这成功运行但没有任何反应。

我必须在我的portlet中使用上面的方法生成报告。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

Portlet应该生成HTML代码片段并将它们流式传输到输出流 - 所以它取决于哪里和哪些?当你抓住输出流。可能已经有一些其他HTML(来自主题或其他portlet)已通过该流发送。显然,您无法在另一个(html)文档的中间添加word文档。

请发布完整方法,或者发布您引用输出流的整个portlet类。是在行动阶段还是渲染阶段还是资源服务方法?在servlet中?

修改:很抱歉,添加后它不会变得更清晰 - 有几个主题混淆了。首先:Portlet没有任何按钮和ActionListener的概念,所以你似乎在使用一些框架。更有甚者,一些实际的代码(和上下文)将是有益的。

最重要的是:请记住你不能只是抓住一个OutputStream并向它发送一些Word文档:通常,portlet应该生成一些结构良好的HTML片段,因为输出是嵌入在其他地方构建的页面中。阅读有关“portlet资源服务”的信息,以便在想要生成非HTML内容时了解有关机制的更多信息。事实上,您将一些报告写入输出流,然后尝试使用相同的流来合并某些速度模板,这表明您的示例代码描述中存在根本错误。

一些额外的提示:也许更容易编写“只是”一个servlet。当您生成用于下载的Word文档时,不必实现portlet(因为它将“仅”生成word文档)。一旦你开始工作,就可以添加portlet样板,但在这种环境下可能会更容易。另外,当您提供Word文档时,您可能想要设置Mimetype和其他一些元数据(文件名,强制“下载”,可能是缓存控制标题),因此您不会“只”将word文档流式传输到OutputStream 。也许你必须使用的代码就是这样,也许不是......希望你知道......

答案 1 :(得分:0)

我在这里做的事情如下。

我在屏幕上有一个commandButton,我附加了一个actionListener。单击该按钮时,将调用侦听器操作并执行以下行

PortletResponse portletResponse =(PortletResponse)externalContext.getResponse(); HttpServletResponse httpResponse = PortalUtil.getHttpServletResponse(portletResponse);

generateReport(httpResponse.getOutputStream());

generateReport在一些业务逻辑执行以下行之后。

context.put(...); ... ...

BufferedWriter writer = writer = new BufferedWriter(             new OutputStreamWriter(fos)); //其中fos是输出流

if(t!= null){// t是Velocity模板

t.merge(context, writer);//context is VelocityContext

}

writer.flush();   writer.close();

在generateReport方法之后没有其他调用。请求在generatReport返回后完成,我希望它应该显示对话框但不是。

希望你能得到这个想法。

修改: 感谢您对Olaf的回复

1)首先,我非常清楚portlet没有任何按钮或actionlisteners的概念。我肯定会使用一个名为Icefaces的框架或其中的任何一个。

2)这只是我的想法,生成文档,因为最初我不知道portlet只显示标记和nothjing其他事实。我的错 :)。

3)我想我已经提到我必须使用这种方法,甚至我根本无法改变它。所以无论代码是什么,我都必须实现功能,在这种情况下我给出的代码示例就足够了。

4)我对portlet进行了一些研究,发现在JSR 268中提供了“资源服务”功能,但在JSR 168中没有这样的支持。但重要的是我发现的解决方案都依赖于JSP,并且使用xhtml格式进行UI渲染。

5)我做的是我有一个portlet显示的事务,我需要在portlet上提供一个'打印事务'按钮,它实际上会打印该页面上显示的内容。为此,我提供了一个名为'generateReport'的方法,该方法目前在旧JSP环境中使用,即从JSP调用此方法。

6)我知道代码似乎从根本上是错误的,但实现一个单独的servlet是另一个错误,我将对代码。我已经做了相关研究,85%接近解决方案。 M考虑资源服务解决方案,我不认为单独的servlet是一个很优雅的解决方案。

我真的很感谢你身边的任何帮助,我希望你知道我在做什么,你应该做什么。

谢谢和问候,