??xml version="1.0" encoding="utf-8" standalone="yes"?>久久亚洲国产精品尤物,校园春色欧美,a√中文在线观看http://www.aygfsteel.com/kingwell/category/8834.htmlAspire to Professionalismzh-cnTue, 27 Feb 2007 12:56:54 GMTTue, 27 Feb 2007 12:56:54 GMT60使用 Apache Pluto 构徏和测?JSR 168 兼容?portlets http://www.aygfsteel.com/kingwell/articles/48560.htmlKingWellKingWellSun, 28 May 2006 01:03:00 GMThttp://www.aygfsteel.com/kingwell/articles/48560.htmlhttp://www.aygfsteel.com/kingwell/comments/48560.htmlhttp://www.aygfsteel.com/kingwell/articles/48560.html#Feedback0http://www.aygfsteel.com/kingwell/comments/commentRss/48560.htmlhttp://www.aygfsteel.com/kingwell/services/trackbacks/48560.htmlApache Pluto ?Java?开发h员可以自׃用的工具Q用来测试他们的 portlets 是否遵@ JSR 168 Portlet 规范。开发h?Mark Talbot ?Kulvir Singh Bhogal 带领您学?portlet 试。您安?PlutoQ构建、编译和打包一个简单的 portletQƈ它部v?Pluto 以测试它?JSR 168 兼容性。您q将了解?Portlet 规范的下一个版本将保留哪些内容?/blockquote>

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>
JSR 168 Portlet API 是相当广泛的。本文不打算成ؓ JSR 168 的教E,因此我们不L入钻研这?API。如果您不熟?JSR 168 APIQ?您花一些时间去熟悉 参考资?/font> 中的一些材料?

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 容器试它?

安装 Pluto

Apache Pluto 需?Java SE 5。如果您q没有安装此版本?JDKQ下载ƈ安装它以l箋q行本文的练习(参见 参考资?/font>Q?/p>

如果 JAVA_HOME 已经讄为在您的pȝ上安装的先前版本?JVMQ?更改它会使已有的依赖 JVM 的应用程序崩溃。如果已l安装了老版本的 JVMQ您应该直接?Pluto 启动脚本中更?JAVA_HOME 变量Q?Windows pȝ上的 startup.bat 或?Linux 上的 startup.sh?/p>

接下来,需要设|和更改 JAVA_HOME 环境变量QPluto 引用它来查找 JVMQ默认情况下QSun 的安装程序不讄 JAVA_HOME 的|。如果在pȝ上没有安装以前版本的 JVMQ则执行以下步骤Q这些说明假定您q行的是 windowsQ:

  1. 叛_我的电脑Qƈ从上下文菜单选择属?/b>?
  2. 单击选项卡?
  3. 在窗口的底部Q单?b>环境变量按钮?
  4. ?b>pȝ变量H格中,单击新徏?
  5. 为变量名输入 JAVA_HOME。ؓ变量D?Sun JVM 的安装目录?

?1 展示了选择?Java 5.0 SDK 安装?C:\Program Files\IBM\Java50 目录下时 JAVA_HOME 的|


?1. 更改 JAVA_HOME 环境变量

现在已经正确地设|了 Java 环境Q就来从 Apache ?Web 站点Q参?参考资?/font>Q下载包?Pluto 的二q制内容?ZIPet 文gQpluto-current.zipQ?/p>

验证下蝲文g

假定您和我们的安全意识一样强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
												
														C:\>gpg --import KEYS
gpg: key E41EDC7E: public key "Carsten Ziegeler <cziegeler@apache.org>" importe

gpg: key 320B4FB4: public key "Nick Lothian (Apache) <nlothian@apache.org>" imp
rted
gpg: key DD4200EA: public key "David H. DeWolf <david@daviddewolf.com>" importe

gpg: Total number processed: 3
gpg:               imported: 3
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2011-03-08

												
										

接下来,输入清单 2 剙一行所C的命o来验证您?Apache 接收的已{֐?ZIP 文gQ?/p>
清单 2. 验证 pluto-1.0.1.zip.asc
												
														C:\>gpg --verify pluto-1.0.1.zip.asc
gpg: Signature made 10/19/05 09:11:31 using DSA key ID DD4200EA
gpg: Good signature from "David H. DeWolf <david@daviddewolf.com>"
gpg:               aka "David H. DeWolf <ddewolf@apache.org>"
gpg:               aka "David H. DeWolf <ddewolf@rocketmail.com>"
gpg:               aka "David H. DeWolf <ddewolf@gmail.com>"
gpg:               aka "David H. DeWolf <david.dewolf@digitalfocus.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 6AA5 5850 9A7B 275C E0BC  2851 B217 63FA DD42 00EA

												
										

如果 gpg --verify 命o生成的输Z清单 2 昄的相|可以确?Pluto 归档文g实来自 Apache。可以忽略表明签名不可信的警告。保证公共密钥签名来自所有者的惟一Ҏ是,密钥的所有者亲自把盘上的密钥交给您。但是,采取q些步骤以后Q可以在某种E度上确定从 Apache 下蝲?ZIP 文g是不用怀疑的。(有关验证 Apache 下蝲文g的更多信息,请参?参考资?/font> 。)

解压 Pluto 下蝲文g

现在准备?ZIP 文g解压到您的机器上。我们假定您?Pluto 解压?C:\ 盘的根目录上Q?/p>
												
														C:\>unzip pluto-current.zip

												
										

q就创徏了一个包?bin 子目录的 C:\pluto-1.0.1 目录。导航到 bin 子目录ƈ在命令提C符下输?startup.bat 以启?Pluto 服务器?

如图 2 所C,您可以从 Pluto 主页理和查?portlets。启?Web 览器ƈD?http://localhost:8080/pluto/portal?


?2. Pluto 主页
Pluto 主页

注意Q?/b>如果 Pluto 主页没有出现Q请保防火墙没有阻?Pluto 接受q接?/i>

现在已经启动和运?PlutoQ您创Z个简单的 portletQ然后?Pluto 试它的 JSR 168 兼容性?/p>



回页?/font>


开?JSR 168 portlet

Z查看如何使用 Pluto 作ؓ portlet ?JSR 168 兼容性测试^収ͼ需要一?portlet 来进行测试。在此练习中Q您创Z个简单的 portletQ它Ҏ用户的输入,把文本框中的内容转换为全是大写字W或全是写字符Q见?3Q:


?3. Change Case portlet

我们从查看清?3 所C的 portlet.xml 文g开始。portlet.xml 文g是包含关?WAR 文g中捆l的 portlet 的配|细节的描述W文件?/p>
清单 3. portlet.xml 文g
												
														<?xml version="1.0" encoding="UTF-8"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" 
   version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd 
   http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" 
   id="com.ibm.changecase.ChangeCasePortlet">
   <portlet>
      <portlet-name>ChangeCase</portlet-name>
      <display-name>Change Case Portlet</display-name>
      <portlet-class>com.ibm.changecase.ChangeCasePortlet</portlet-class>
      <supports>
         <mime-type>text/html</mime-type>
         <portlet-mode>view</portlet-mode>
      </supports>
      <portlet-info>
         <title>ChangeCasePortlet</title>
      </portlet-info>
   </portlet>
</portlet-app>

												
										

清单 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>
												
														package com.ibm.changecase;

import java.io.*;
import javax.portlet.*;

/**
 *
 * A sample portlet based on GenericPortlet
 * 
 */
public class ChangeCasePortlet extends GenericPortlet {
   
   private static String VIEW_JSP = "/view.jsp";

   protected void doView(RenderRequest request, RenderResponse response) 
      throws PortletException, IOException {
      response.setContentType(request.getResponseContentType());
       PortletContext context = getPortletConfig().getPortletContext();
       context.getRequestDispatcher(VIEW_JSP).include(request, response);
   }

public void processAction(ActionRequest request, ActionResponse response) 
   throws PortletException, java.io.IOException {
//Do Action Handling here.

}

}

												
										

注意重写 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>
												
														response.getWriter().println("<p>Hello World</p>()");

												
										

q种Ҏ的问题是Q图形用L面的设计者需要具?portlet 技术的知识来编?doView() Ҏ。JSP 开发h员从复杂?Java 开发中解放出来Q能够集中精力开发前端界面。清?5 昄的是 view.jspQ?/p>
清单 5. view.jsp
												
														<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
	pageEncoding="ISO-8859-1" session="false"%>
<portlet:defineObjects />

<%String textBox = renderRequest.getParameter("textBox");
		if (textBox == null)
			textBox = "";
		String caseString = renderRequest.getParameter("case");
		boolean isUpperCase = true;
		if ((caseString != null) && (caseString.equals("false"))) {
			isUpperCase = false;
		}
		String errorMessage = renderRequest.getParameter("errorMessage");%>

<%if (errorMessage != null) {%>
<p><%=errorMessage%></p>
<%}%>

<FORM name="<portlet:namespace/>caseform" action="<portlet:actionURL/>">
<INPUT type="text" name="textBox" size="20" value="<%=textBox%>">
<p><INPUT type="radio" name="case" value="lowercase"
	<%if (!isUpperCase) {%> checked="checked" <%}%>>To Lowercase</p>
<p><INPUT type="radio" name="case" value="uppercase"
	<%if (isUpperCase) {%> checked="checked" <%}%>>To Uppercase</p>
<INPUT type="submit" name="<portlet:namespace/>submitCase"
	value="Change Case"></FORM>

												
										

首先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送表单数据的表单。ؓ了发送表单数据,必须创徏一?actionURLQ它?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 Ҏ
												
														 public void processAction(ActionRequest request, ActionResponse response) 
    throws PortletException, java.io.IOException {
    String newCase = request.getParameter("case");
    String textBox = request.getParameter("textBox");
    String errorMessage = null;
      
    boolean isUpperCase = true;
    if ((newCase!=null) && (newCase.equals(ChangeCaseConstants.LOWER_CASE)))
       isUpperCase = false;
    else if ((newCase == null) || (newCase==ChangeCaseConstants.UPPER_CASE))
       errorMessage = "Error no case selected!  Select a case.";
    if (textBox !=null) {
       if (isUpperCase)
          textBox = textBox.toUpperCase();
       else 
          textBox = textBox.toLowerCase();
       response.setRenderParameter("textBox", textBox);
    } else 
       errorMessage = "Error, text in the text box is invalid";
    response.setRenderParameter("case", Boolean.toString(isUpperCase));
    if (errorMessage != null) {
       response.setRenderParameter("errorMessage",errorMessage);
    }
   
 }

												
										

ActionRequest 对象包含输入到表单中的数据。ؓ了检索表单数据,可?getParameter() Ҏ。在 processAction() Ҏ中,也要执行业务逻辑Q确定用h惌大写形式q是写形式的输出。根据该逻辑Q把输入的文本{换成惌的大写形式q发送给用户。?setRenderParameter() Ҏ把数据发送给视图?/p>



回页?/font>


~译q打?JSR 168 portlet

现在已经开发了 portletQ需要把它{换成已编译的形式QƈZ部v?Pluto 它打包。首先,保 portlet-api-1.0.jar ?CLASSPATH 中。然后?javac ~译器编?ChangeCaseConstants.java ?ChangeCasePortlet.javaQ?/p>
												
														javac ChangeCaseConstants.java
javac ChangeCasePortlet.java

												
										

接着需要ؓ WAR 文g创徏所需要的文g夹结构,WAR 文g是归档文Ӟ通过它把 portlet 部v?portlet 容器。把刚才~译的两个类攑֜ classes\com\ibm\changecase 目录中?/p>

Z构徏 WAR 文gQ需要以下的目录l构Q如清单 7 所C:


清单 7. 用于部v的目录结?/b>
												
														changeCaseWAR\
   META-INF
      MANIFEST.MF
   WEB-INF
      classes
         com
            ibm
               changecase
                  ChangeCaseConstants.class
                  ChangeCasePortlet.class
      lib
      tld
         portlet.tld
      portlet.xml
      web.xml
   index.html
   view.jsp

												
										

注意Q清?7 引入?4 个我们还没有讨论q的文gQ?

  • portlet.tldQ这?portlet 标记库。如果回想一下,您曾l用 <portlet:defineObjects /> 之类的引用在整个 JSP 中都用到q?portlet 标记库。portlet 标记库在 Apache-SVN 代码库中可以得到Q参?参考资?/font>Q?

  • MANIFEST.MFQ因里不存在外部依赖Q所以这个清单文仉?Manifest-Version: 1.0 之外什么也不包含?br />
  • index.htmlQ如果由于某些原因上下文根被直接讉KQ则会显C?index.html。在 index.html 中可以有M正确格式?HTML?

  • web.xmlQ如清单 8 所C)Q它定义包含单个 portlet ?Web 应用E序?

清单 8. web.xml
												
														<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
   "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
   <display-name>CasePortlet</display-name>
   <welcome-file-list>
      <welcome-file>index.html</welcome-file>
   </welcome-file-list>
   <taglib>
      <taglib-uri>http://java.sun.com/portlet</taglib-uri>
      <taglib-location>tld/portlet.tld</taglib-location>
   </taglib>
   <taglib id="PortletTLD">
      <taglib-uri>http://java.sun.com/portlet</taglib-uri>
      <taglib-location>/WEB-INF/tld/std-portlet.tld</taglib-location>
   </taglib>
</web-app>

												
										

一旦生成了 MANIFEST.MF、portlet.tld、web.xml ?index.htmlQ就可以使用 JAR 实用工具清?7 所C的l构归档C?WAR 文g中:

												
														C:\temp>jar -cvf changeCase.war

												
										

l果是一个叫?changeCase.war 文gQ用于部|到 JSR 168 兼容的门戗?





回页?/font>


保 portlet ?JSR 168 兼容?/font>

现在使用 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:


?6. 映射 portlet 的位|?/b>

Z部v portletQ您可以选择重新启动 Pluto 或?i>热部|?/i> 包含 portlet ?portlet 应用E序Q如?7 所C:


?7. 热部|?portlet

一个具?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 容器中?





回页?/font>


l束?/font>

我可以在生环境中?Pluto 吗?

Apache Pluto 只适合作ؓ JSR 168 兼容性的试q_Q不推荐在生产环境中使用。对于生产来_您应该考虑使用更加可׾~的容器。您可以考虑使用 Apache Software Foundation 的名?Jetspeed 的开放源?portlet 容器Q参?参考资?/font>Q。IBM ?WebSphere Portal Server Version 5.1 也是一个支?JSR 168 标准的商业解x案(参见 参考资?/font>Q?

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>

展望未来QJSR 286

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>



回页?/font>


参考资?

学习
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文 ?

  • ?a >JSR 168 - An Introduction to the Portlet Specification”:更多C?JSR 168?

  • Apache Pluto Q访?Pluto Web 站点?

  • JSR 168: Portlet Specification ?SR 286: Portlet Specification 2.0Q由 Java Community Process 开发和l护?portlet 规范?

  • ?a >使用 WebSphere Portal V5.1 ?IBM Portlet ?JSR 168 Portlet 间共享信?/font>”(Stefan Hepper ?Jerry ZhengQdeveloperWorksQ?006 q?2 月)Q编写一个自定义?portlet 服务以允?IBM portlet ?JSR 168 portlet ׃n作ؓ属性的信息?

  • ?a >使用 WebSphere Portal V5.1 ?JSR 168 Portlet 中缓存数?/font>”(Stefan Hepper ?Jerry ZhengQdeveloperWorksQ?005 q?8 月)Q学习如何在 JSR 168 portlet 中缓存数据以避免不必要的后端h?

  • ?a >?WorldClock portlet ?IBM Portlet API 转换?JSR 168 portlet API”(Franziska Paeffgen ?Birga RickQdeveloperWorksQ?004 q?12 月)Q了解如何将最?IBM WebSphere Portal 专有 Portlet API 开发的 portlet 转换Z?JSR 168 标准 portlet API ?portlet?

  • Verifying Apache HTTP Server Releases Q有关验证来?Apache Web 站点的下载文件的更多信息?

  • Java 技术专?/font> Q关?Java ~程的各个方面的数百文章?


获得产品和技?/b>


KingWell 2006-05-28 09:03 发表评论
]]>
վ֩ģ壺 | ƽ| | | Ͷ| żҿ| | | üɽ| | ګ| | ԭ| | ؼ| | ڽ| | | | | ɽ| | | | ľ| | ÷| | г| °Ͷ| | | | Ȩ| żҿ| | ء| | ̩| ƺ|