2003 q?10 月,Java Community Process 发布?Java Specification Request (JSR) 168的最l版本:Portlet SpecificationQ参?参考资?/font>Q。JSR 168 阐述的是W一?Java portlet 开发的~程标准。以前,?WebSphere Portal Server 开发的 portlet 不能在另外的 portlet 容器Q例?BEA WebLogic PortalQ中q行。Portlet 容器不是 J2EE 应用服务器所必需的组件。然而,q种可移植性的~少是与标准 J2EE 企业U应用程序相背离的,标准 J2EE 企业U应用程序(当根据规范构建时Q可以部|到M?J2EE 兼容的应用服务器中。缺?portlet 可移植性和相关厂商的锁定阻止企业购买门h务器。通过l束 portlet 开发的混ؕ状态,JSR 168 qx了那些企业的担忧?/p>
![]() |
|
Java 开发h员具有一个可以自p得的工具Q用来测试他们编写的 portlets 是否?Portlet 规范怸致。Apache Pluto ?JSR 168 的参考实玎ͼ是实C Portlet API ?portlet 容器。像 Pluto ?IBM WebSphere Portal Server q样?portlet 容器充当 portlets 的运行时环境Q与 web 应用服务器的 servlet 容器的运行时环境支持 servlet 的情形非常相伹{但是,portlet 容器不是独立的,它存在于 servlet 容器的顶部ƈ依赖于它的服务。在本文中,我们ؓ您演C如何编写简单的 portlet q?Pluto portlet 容器试它?
Apache Pluto 需?Java SE 5。如果您q没有安装此版本?JDKQ下载ƈ安装它以l箋q行本文的练习(参见 参考资?/font>Q?/p>
![]() |
|
接下来,需要设|和更改 JAVA_HOME
环境变量QPluto 引用它来查找 JVMQ默认情况下QSun 的安装程序不讄 JAVA_HOME
的|。如果在pȝ上没有安装以前版本的 JVMQ则执行以下步骤Q这些说明假定您q行的是 windowsQ:
JAVA_HOME
。ؓ变量D?Sun JVM 的安装目录??1 展示了选择?Java 5.0 SDK 安装?C:\Program Files\IBM\Java50 目录下时 JAVA_HOME
的|
现在已经正确地设|了 Java 环境Q就来从 Apache ?Web 站点Q参?参考资?/font>Q下载包?Pluto 的二q制内容?ZIPet 文gQpluto-current.zipQ?/p>
假定您和我们的安全意识一样强Q就会希望保证下载的 ZIP 文g实来自 Apache Software Foundation。文件?PGP ?MD5 q行了数字签名。?GnuPGQ参?参考资?/font>Q和 ASCII armor 文gQpluto-current.zip.ascQ,可以验证此下载文件的真实性?/p>
首先Q通过输入清单 1 剙一行所C的命oQ把 Apache Pluto 的公共密钥添加到您的公共密钥环。在 Pluto 下蝲面可以获得 KEYS 文g?/p>
清单 1. 导入 KEYS 文g
|
接下来,输入清单 2 剙一行所C的命o来验证您?Apache 接收的已{?ZIP 文gQ?/p>
清单 2. 验证 pluto-1.0.1.zip.asc
|
如果 gpg --verify
命o生成的输Z清单 2 昄的相|可以确?Pluto 归档文g实来自 Apache。可以忽略表明签名不可信的警告。保证公共密钥签名来自所有者的惟一Ҏ是,密钥的所有者亲自把盘上的密钥交给您。但是,采取q些步骤以后Q可以在某种E度上确定从 Apache 下蝲?ZIP 文g是不用怀疑的。(有关验证 Apache 下蝲文g的更多信息,请参?参考资?/font> 。)
现在准备?ZIP 文g解压到您的机器上。我们假定您?Pluto 解压?C:\ 盘的根目录上Q?/p>
|
q就创徏了一个包?bin 子目录的 C:\pluto-1.0.1 目录。导航到 bin 子目录ƈ在命令提C符下输?startup.bat
以启?Pluto 服务器?
如图 2 所C,您可以从 Pluto 主页理和查?portlets。启?Web 览器ƈD?http://localhost:8080/pluto/portal?
注意Q?/b>如果 Pluto 主页没有出现Q请保防火墙没有阻?Pluto 接受q接?/i>
现在已经启动和运?PlutoQ您创Z个简单的 portletQ然后?Pluto 试它的 JSR 168 兼容性?/p>
![]() ![]() |
![]()
|
Z查看如何使用 Pluto 作ؓ portlet ?JSR 168 兼容性测试^収ͼ需要一?portlet 来进行测试。在此练习中Q您创Z个简单的 portletQ它Ҏ用户的输入,把文本框中的内容转换为全是大写字W或全是写字符Q见?3Q:
我们从查看清?3 所C的 portlet.xml 文g开始。portlet.xml 文g是包含关?WAR 文g中捆l的 portlet 的配|细节的描述W文件?/p>
清单 3. portlet.xml 文g
|
清单 3 中的 <portlet-app>
标记定义?XML 模式定义?portlet 应用E序 ?ID。一?portlet 应用E序可以包含零个或多?portlet。?<portlet>
标记来定?portlet 应用E序中的单个 portletQ?/p>
<portlet-name>
—?提供一个名Uͼ在内部或q序用该名称来引?portlet?
<display-name>
—?portlet 的羃写名Q用来在 GUI 工具中显C?portlet 名称Q它?portlet 容器的不同而不同?
<portlet-class>
—?充当 portlet 控制器的cR?
<supports>
—?q些标记定义 portlet 支持?portlet 模式?mime cd?
<title>
—?可以?portlet.xml 中定?portlet 的首选标题。但是,如何使用该标题取决于 portlet 容器?清单 4 昄的是 portlet.xml 中引用的 com.ibm.changecase.ChangeCasePortlet
portlet cR此cdd?javax.portlet.Portlet
接口Q但q运的是Q您不必直接实现 Portlet
接口。JSR 168 ?javax.portlet.Portlet
接口定义了一个称?javax.portlet.GenericPortlet
cȝ默认实现?code>com.ibm.changecase.ChangeCasePortlet cȝ?GenericPortlet
cR?/p>
清单 4. ChangeCasePortlet c?/b>
|
注意重写 doView()
?processAction()
Ҏ的选择。每当出?portlet 操作旉会调?processAction()
Ҏ。当用户处于 portlet 的视图模式时调用 doView()
Ҏ。JSR 168 支持其他的模式,例如帮助模式和编辑模式。但是,如果回过头看一?清单 3Q在 <supports>
部分可以看到 portlet 只支持视图模式?
现在仔细地看一下清?4 中的 doView()
Ҏ。与 Java servlet ~码中一Pportlet ~码中也l常使用模型-视图-控制?(MVC) 设计模式。因此,?portlet 中,把表C的职责转交l了 view.jsp。或者,也可以?prinltn
逻辑?doView()
Ҏ中实现视图?/p>
|
q种Ҏ的问题是Q图形用L面的设计者需要具?portlet 技术的知识来编?doView()
Ҏ。JSP 开发h员从复杂?Java 开发中解放出来Q能够集中精力开发前端界面。清?5 昄的是 view.jspQ?/p>
清单 5. view.jsp
|
首先Q注意在 view.jsp 中定?portlet 标记库。这?JSP 解析器识?portlet 标记所必需的。您使用的第一?portlet 标记?<portlet:defineObjects/>
。此标记允许讉K renderRequest
?code>renderResponse ?portletConfig
对象。?renderRequest
对象使您h讉K requestParameters
的权利。portlet c通过 request 参数?view JSP 传递倹{?
接下来,?view.jsp 中创Z个向 portlet cd送表单数据的表单。ؓ了发送表单数据,必须创徏一?actionURL
Q它?ChangeCasePortlet
portlet cȝ processAction()
Ҏ被调用。?<portlet:actionURL/>
标记创徏 actionURL
?注意Q在 view.jsp 中将文本框和单选按钮的D|ؓ服务器传?JSP 的倹{因此,view.jsp 负责处理h输入和显C?portlet 的响应?/p>
单击表单?Submit 按钮会调?portlet ?processAction()
ҎQ如清单 6 所C?code>processAction() ?view.jsp 接收一?ActionRequest
对象作ؓ输入?/p>
清单 6. processAction Ҏ
|
ActionRequest
对象包含输入到表单中的数据。ؓ了检索表单数据,可?getParameter()
Ҏ。在 processAction()
Ҏ中,也要执行业务逻辑Q确定用h惌大写形式q是写形式的输出。根据该逻辑Q把输入的文本{换成惌的大写形式q发送给用户。?setRenderParameter()
Ҏ把数据发送给视图?/p>
![]() ![]() |
![]()
|
现在已经开发了 portletQ需要把它{换成已编译的形式QƈZ部v?Pluto 它打包。首先,保 portlet-api-1.0.jar ?CLASSPATH
中。然后?javac ~译器编?ChangeCaseConstants.java ?ChangeCasePortlet.javaQ?/p>
|
接着需要ؓ WAR 文g创徏所需要的文g夹结构,WAR 文g是归档文Ӟ通过它把 portlet 部v?portlet 容器。把刚才~译的两个类攑֜ classes\com\ibm\changecase 目录中?/p>
Z构徏 WAR 文gQ需要以下的目录l构Q如清单 7 所C:
|
注意Q清?7 引入?4 个我们还没有讨论q的文gQ?
<portlet:defineObjects />
之类的引用在整个 JSP 中都用到q?portlet 标记库。portlet 标记库在 Apache-SVN 代码库中可以得到Q参?参考资?/font>Q?
|
一旦生成了 MANIFEST.MF、portlet.tld、web.xml ?index.htmlQ就可以使用 JAR 实用工具清?7 所C的l构归档C?WAR 文g中:
|
l果是一个叫?changeCase.war 文gQ用于部|到 JSR 168 兼容的门戗?
![]() ![]() |
![]()
|
现在使用 Apache Pluto 来查?portlet 是否能通过 JSR168 兼容性的最l测试?/p>
保 Apache Pluto 启动q运行,然后D?Pluto 主页Qhttp://localhost:8080/pluto/portalQ。单M栏上?Admin。应该看?Deploy War portlet 昄在管理页面上Q如?4 所C。单?Browse q导航到在前一节中攄在一L changeCase.war 文g的位|,然后单击 Submit?/p>
?4. Pluto ?Deploy War portlet
现在必须?portlet 应用E序输入布局信息 —?一个非怸重要的Q务,因ؓ?portlet 应用E序中只有一?portlet。正如在?5 中可以看到的Q您告知 Pluto portlet 有一行和一列,然后单击 Submit 向服务器提交此选择Q?/p>
?5.?portlet 应用E序输入面布局信息
接下来,必须定义 portlet 出现?portlet 应用E序面布局的何处。通过?portlet 应用E序中的所?portlet 映射到刚才定义的行和列来完成此Q务。因为只有一?portlet 需要部|ƈ且您先前选择了一行和一列的面布局Q所以在该位|输?ChangeCase portlet q单?SubmitQ如?6 所C:
Z部v portletQ您可以选择重新启动 Pluto 或?i>热部|?/i> 包含 portlet ?portlet 应用E序Q如?7 所C:
一个具?portlet 应用E序名称Q?b>Change CaseQ的链接出现在侧栏。单击该链接,现在看?portlet 应用E序Q其中包?portletQ如?8 所C。这时应该与 Change Case portlet 交互q确保它的功能与预期的一栗如果与预期的一P您就可以定?portlet ?JSR 168 兼容?/p>
?8. 部v?Pluto ?Change Case portlet
Change Case Portlet 能够运行在M支持 JSR 168 portlet 标准?Portlet 容器中?
![]() ![]() |
![]()
|
![]() |
|
Apache Pluto ?portlet 开发h员能够确定他们的 portlet 能够q行在Q?JSR 168 兼容?portlet 容器中。大多数 portlet 容器Q包?WebSphere Portal ServerQ都包括 Portlet 规范未提及的扩展。例如,IBM WebSphere Portal Server 提供非标准的一点即动(click-to-actionQ扩展(卛_?portletQ。是否用扩展由使用 portal 技术的企业来决定。作为开发h员,您应该牢记的是支持这U技术会损害 portlet 的可UL?—?但是有时q么做能满业务需要。Apache Pluto 佉K些?portlet 的组l能够知道他们偏M Portlet 规范有多q,q决定是否采取一些措施来调整那些 portlet W合标准?/p>
JSR 168 在走向 portal 领域有序的过E经q了很长的\。但是,portlet 的标准化工作q没有停止。当写作本文的时候,Java Portlet API version 2.0 规范 (JSR 286) 仍旧在开发中Q打把?J2EE 1.4 的支持引入到 portlet 规范中(参见 参考资?/font>Q。许多曾׃应商利用其自有实现通过非标准方式处理的 Portlet 技术(提一下其中的两个Qportlet qo器和形式化的 portlet 间通信Q现采U?2.0 规范。Apache Pluto 的将来版本将充当 JSR 286 规范的参考实现。当 JSR 286 成ؓ事实上的 portlet 标准Ӟ您将仍旧能够使用 Pluto 试兼容性?/p>
在我们写作本文时Q还不能得到 Pluto 1.1 ?alpha 版本。Pluto 1.1 具有一个新的容器架构,q包含一些 portlet 开发更Ҏ的更攏V但是,Pluto 1.0.1 仍然是一个很好的用于验证 portlet 是否 JSR 168 兼容的工兗?/p>
![]() ![]() |
![]()
|