我正在尝试从liferay portlet生成报告文档。我用于报告生成的方法已经使用OutputStream
,我无法更改。以下是方法签名。
public void generateReport(OutputStream outPut);
我使用以下行将OutputStream
传递给方法:
PortletResponse portletResponse = (PortletResponse)externalContext.getResponse();
HttpServletResponse httpResponse = PortalUtil.getHttpServletResponse(portletResponse);
然后我使用以下行调用该方法:
generateReport(httpResponse.getOutputStream());
这成功运行但没有任何反应。
我必须在我的portlet中使用上面的方法生成报告。有什么想法吗?
答案 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是一个很优雅的解决方案。
我真的很感谢你身边的任何帮助,我希望你知道我在做什么,你应该做什么。
谢谢和问候,