1

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

public void generateReport(OutputStream outPut);

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

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

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

generateReport(httpResponse.getOutputStream());

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

我必须在我的 portlet 中使用上述方法生成报告。任何想法?

4

2 回答 2

0

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

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

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

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

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

于 2009-10-20T18:04:37.563 回答
0

我在这里所做的如下。

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

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

generateReport(httpResponse.getOutputStream());

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

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 方法之后没有其他调用。请求在 generateReport 返回后完成,我希望它应该向我显示对话框,但事实并非如此。

希望你能明白这一点。

编辑:感谢您的回复奥拉夫

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

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

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

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

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

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

我将非常感谢您的任何帮助,我希望您对我在做什么以及应该做什么有所了解。

谢谢并恭祝安康,

于 2009-10-21T06:54:17.370 回答