6

有没有人有一个简明摘要的链接,说明什么使 portlet “符合 JSR-286”与仅是“符合 JSR-168”。我有一份规范的副本,这并不简洁,因此链接规范不是一个有用的答案。我已经在网上搜索了一个小时,但没有发现任何明确的内容(除了规范,这当然要求您也阅读以前的规范,然后从“必需”中剔除“新功能”遵守”。

特别是我发现 web.xml 的必要性存在相当多的混淆,这似乎来自使用 Liferay 的人,而没有意识到 Liferay 正在为他们添加 web.xml。

JSR-286 portlet 的 WAR 文件中是否需要 web.xml 文件?

我真正想要的是包含以下一个或多个列表的东西:

  • 您必须对 JSR-168 执行的操作以使其符合 JSR-286
  • 您不能做的事情会导致原本符合 JSR-286 的 portlet 被视为仅 JSR-168。

您可以将“使用 portlet-app_2_0.xsd”从列表中删除,因为我认为这部分很明显。

除了 portlet.xml 的 DTD/xsd 之外,两个列表都是空的,我愿意接受这样的答案,不同之处仅在于门户支持的内容,但请通过链接或其他参考来支持该断言。

我关心的原因是我在 Liferay 中看到有关 Vaadin portlet 的帖子,暗示某些功能不适用于 JSR-168 portlet...也可能是 Liferay 中的某些逻辑根据它看到的 portlet.xml 版本进行切换,但我还没有确认,所以这也是有趣的信息,但不是我问题的答案。

4

2 回答 2

3

根据this doc,但在jsr286中也提到了它:

JSR 286 规范(Portlet 2.0)不会破坏与 JSR168(Portlet 1.0)的二进制兼容性。这意味着所有根据 Portlet 1.0 规范编写的 portlet 都可以不加改变地运行。此规则的唯一例外是:

renderResponse.setContentType在调用 getWriter 或 getOutputstream 之前不再需要。在 JSR168 中,调用 getWriter 或 getOutputstream 而不事先设置内容类型会导致 IllegalStateException。

getProtocol对于包含的 servlet / JSP 返回“HTTP/1.1”,在 JSR168 中,它返回 null。

因此,只要您的 jsr168 portlet 不依赖于getProtocol()您返回的值就是安全的(即每个 jsr168 portlet 都是一个 jsr286 portlet)。

您看到的帖子似乎是合乎逻辑的,因为 jsr286 是一个较新的规范,并且有一些特性使 jsr268 portlet 不是 jsr168 portlet。

于 2012-01-27T16:49:27.277 回答
1

好的,因为我没有找到任何新的东西来区分 2.0 portlet 和 1.0 portlet(除了使用附加服务和 ),我将在此处开始列出我的答案。

必须做:

  1. 符合 portlet.xml 的 2.0 XSD (xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd")

不得:

  1. 如果尚未调用 renderResponse.setContentType,则依赖 getWriter 抛出异常。(无论如何似乎不太可能)
  2. 依赖 getProtocol() 返回 null

结果是,如果您只是简单地转换您的 portlet.xml,那么您现在“286 兼容”,除非您依赖第二个列表中的两个项目来执行您的程序流。我找不到其他任何东西,但如果有人为这些列表找到另一个项目,请编辑。

于 2012-01-30T15:54:15.367 回答