portlet JSR-286的兼容性



是否有人链接到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

您可以将"use the portlet-app_2_0.xsd"从列表中删除,因为我认为这一部分是显而易见的。

我愿意回答,除了portlet.xml的DTD/xsd之外,这两个列表都是空的,区别仅在于门户支持什么,但请使用链接或其他引用来支持该断言。

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

根据本文档,但jsr286:中也提到了这一点

JSR286规范(Portlet2.0)没有破坏与JSR168(Portlet1.0)的二进制兼容性。这意味着所有根据Portlet1.0规范编写的Portlet都可以不受更改地运行。该规则的唯一例外是:

调用getWriter或getOutputstream之前不再需要renderResponse.setContentType。在JSR168中,在没有预先设置内容类型的情况下调用getWriter或getOutputstream会导致IllegalStateException。

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

因此,只要您的jsr168portlet不依赖于getProtocol()返回的值,您就安全了(即每个jsr168Portlet都是jsr286portlet)。

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

好的,由于我没有发现任何新的东西来区分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兼容的",除非您的程序流依赖于第二个列表中的两个项目。我找不到其他内容,但如果有人为这些列表找到其他项目,请编辑。

最新更新