Answers:
Portlet是JSR-168标准的一部分,该标准规范门户容器和组件。这与Web容器(和Servlet)的标准不同。尽管这两个标准之间肯定有很强的相似之处,但是它们在容器,API,生命周期,配置,部署等方面有所不同。
portlet与servlet之间的主要区别可能是,尽管servlet总是响应单一类型的动作请求,但portlet(由于其生命周期的本质和更强的容器绑定)必须响应两种类型的动作:render和request。当然还有更多内容,但是当我研究门户开发时,我发现这是两者之间的核心区别。
从源代码增强: Servlet与Portlet
相似点
Servlet和Portlet是基于Web的组件,使用Java来实现。
Portlet由Portlet容器管理,就像Servlet由Servlet容器管理一样。
静态和动态内容都可以由Portlet和Servlet生成。
Portlet和Servlet的生命周期由容器控制
客户机/服务器模型用于servlet和portlet
打包和部署实质上是相同的,WAR / EAR。
Servlet和Portlet容器中都存在Application Session。这是在portlet容器中从呈现阶段到操作阶段(或任何较低阶段)共享数据(粗间Portlet通信)的一种方法。
Servlet和Portlet都使用支持它的类似服务器/ VM环境。虽然,在portlet的情况下可能需要一些其他配置才能使其打勾
两者的构建/ DI工具都相似-都支持Ant,Maven,Gradle等。大多数情况下:)-Liferay 7对此有所改变。
差异性
Servlet可以呈现完整的网页,而Portlet可以呈现html片段。这些片段由门户网站聚合到完整的网页中。
JSR 168 Portlet的内容类型只能是cHTML,XHTML,WML。它不支持其他内容类型。
Portlet不允许生成包含诸如正文,框架,框架集,标题,html或标题之类的标签的HTML代码。
Portlet与Servlet不同,它没有附加URL,因此无法直接访问。仅通过包含portlet的门户页面进行访问。
可以为Portlet提供控件以操纵其窗口状态或Portlet模式。
单个portlet的多个实例可以放置在同一页面上。
Portlet支持持久性配置和定制,概要文件信息。
Portlet可以具有两种请求类型。渲染请求和动作请求。
Portlet在会话中有两个作用域;跨portlet进行通信的应用程序范围和内部portlet进行通信的portlet范围。
Portlet无法设置响应的字符集编码,也不能设置HTTP响应头。
Portlet无权访问请求URL。因此,它无法访问附加到URL的查询参数。Portlet无法设置cookie。
Portlet API的典型的方法是
doView()
,doEdit()
,doHelp()
和processAction()
而那些的servlet的是service()
,doPost()
,doGet()
。Servlet规范 -JSR 369(Servlet 4.0),JSR 340(Servlet 3.1),JSR 315(Servlet 3.0),JSR 154(Servlet 2.5和2.4)。 Portlet规范 -JSR 168(Portlet Spec v1.0),JSR 286(Portlet Spec v2.0),JSR 362(Portlet Spec v3.0)
Portlet的部署涉及与 Servlet应用程序不同的方法。一些提供程序(Liferay / Alfresco / WebSphere)支持Portlet的热部署,而无需重新启动服务器,而对于servlet,如果不使用OSGi之类的特殊库对应用程序进行模块化,则无法实现。
编辑 (来自评论)
Portlet容器建立在Servlet容器上。因此最终可以说Portlet在Servlet容器上运行。但是在开发应用程序时,我们将Portlet容器与Servlet / Java EE容器分开查看。