无法从liferay portlet生成word文档

无法从liferay portlet生成word文档,liferay,Liferay,我正在尝试从liferay portlet生成一个报告文档。我用于生成报告的方法已在使用我无法更改的OutputStream。下面是方法签名 公共void生成器报告(OutputStream输出); 我使用以下行将OutputStream传递给该方法: PortletResponse PortletResponse=(PortletResponse)externalContext.getResponse(); HttpServletResponse httpResponse=portal.ge

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

公共void生成器报告(OutputStream输出);
我使用以下行将
OutputStream
传递给该方法:

PortletResponse PortletResponse=(PortletResponse)externalContext.getResponse();
HttpServletResponse httpResponse=portal.getHttpServletResponse(portletResponse);
然后,我使用以下行调用该方法:

generateReport(httpResponse.getOutputStream());
这运行成功,但什么也没有发生


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

Portlet应该生成HTML代码片段并将其流式传输到输出流,因此这取决于获取输出流的位置和时间。可能已经有一些其他HTML(来自主题或其他portlet)通过该流发送。显然,不能在另一个HTML文档中间添加Word文档。

请在引用输出流的地方发布完整的方法,甚至是整个portlet类。它是在操作或渲染阶段,还是在资源服务方法中?在servlet中

编辑:很抱歉,您添加的内容并没有变得更加清晰-有几个主题混淆了。第一:Portlet没有任何按钮和ActionListener的概念,因此您似乎正在利用一些框架。更重要的是,一些实际的代码(和上下文)将是有益的

最重要的是:请记住,您不能仅仅获取OutputStream并向其发送一些Word文档:通常Portlet应该生成一些格式良好的HTML片段,因为输出嵌入在其他地方构建的页面中。阅读关于“portlet资源服务”的内容,了解更多有关生成非HTML内容的机制。您向输出流写入一些报告,然后尝试使用同一个流合并一些velocity模板,这表明您的示例代码描述中存在根本错误


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

我在这里做的事情如下

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

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

generateReport(httpResponse.getOutputStream())

在某些业务逻辑执行以下行后生成报告

上下文。put(…); ...

BufferedWriter=写入程序=新的BufferedWriter( 新的OutputStreamWriter(fos))//其中fos是输出流

如果(t!=null){//t是速度模板

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

writer.flush(); writer.close()

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

希望你能明白

编辑: 感谢您对Olaf的回复

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

2) 生成文档只是我的想法,因为最初我不知道portlet只显示标记而不显示其他内容。我的错误:)

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

4) 我对Portlet做了一些研究,发现JSR268中提供了“资源服务”功能,但JSR168中没有这种支持。但重要的是,我找到的解决方案都依赖于JSP,并且使用xhtml格式进行UI呈现

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

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

我真的很感谢你方的任何帮助,我希望你知道我在做什么,你应该这样做


感谢和问候,

由于某些限制,我已将我的回复作为答案发布。请查看我发布的答案。请参阅我的编辑。我想你可以编辑你自己的问题,对吗?