© Copyright International Business Machines Corporation 2006. All rights reserved. US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM® Corp.
在使用“新建门户网站项目”向导从样本库导入门户网站样本项目或者创建新的门户网站项目时,“问题”视图显示了链接中断警告消息。
在此版本的 Rational® Developer 中,Portal Designer 仅支持以 HTML、cHTML 和 WML 格式进行显示。如果对所导入项目中的页面或标签指定了其他受支持的标记语言,则 Rational Developer 支持显示这些标记语言,但不能对其进行编辑。这些标记语言将不会显示在“属性”视图中。
除非对页面指定了调色板,否则在 WebSphere® Portal 6 中将使用缺省调色板。但是,在 Portal Designer 中,当未指定调色板时,将使用祖代页面的调色板,而不是使用缺省调色板。
在“新建门户网站项目”向导中,选择门户网站服务器版本时并不会自动更新目标运行时。您必须对门户网站服务器版本设置和目标运行时设置进行手工同步。例如,对于版本为 6.0.0.x 的门户网站服务器,必须选择 WebSphere Portal V6.0 运行时;对于版本为 5.1.0.x 的门户网站服务器,必须选择 WebSphere Portal V5.1 运行时。如果目标运行时版本与门户网站服务器版本不同步,则部署门户网站项目时,门户网站服务器可能会损坏或变为不可用。
在 WebSphere Portal V6.0 中,如果在“样式”对话框中编辑 CSS 内容类型 JSP 文件(例如 styles.jsp 或 styles_theme.jspf),在该对话框中可能会显示 JSP 表达式。无法在该对话框中修改这些 JSP 表达式,您必须在 CSS Designer 源代码面板中对其进行修改。
对于 JSR168 Faces Portlet,如果使用任何下列工具来在 Faces JSP 中生成服务客户机,则生成的页面代码在 WebSphere Portal 6.0 或 5.1 上无法正确工作。受影响的工具包括:
- “页数据”视图
- Java™ Bean(带有方法调用)
- Web Service
- EJB 会话 Bean
- “选用板”视图
- Java Bean(带有方法调用)
- Web Service
- EJB 会话 Bean
- 从 Page Designer 的上下文菜单或窗口菜单中,单击“插入”->“数据”
- Java Bean(带有方法调用)
- Web Service
- EJB 会话 Bean
这是由于 jsf-Portletbridge.jar 中包含的 JSR168 Faces Portlet 运行时的新实现与先前实现不同而引起的。
在新实现中,如果将 Faces JSP 的页面代码 Bean 声明为请求作用域受管 Bean,则它的生命周期不会跨越 Portlet 的操作阶段和呈示阶段。在生成的 Web Service 客户机代码中,将使用页面代码 Bean 在操作阶段对 Web Service 的结果进行高速缓存。但由于它在请求作用域内,因此在呈示阶段将创建新实例。所以,高速缓存的结果将丢失。
有两个可能的解决方案:
- 将 Bean 置于会话作用域中(在 faces-config.xml 中进行配置)。如果采用此方案,您只需在配置文件中更改一行代码。
- 此方案比前一方案复杂,但却是在 JSR168 Portlet 中实现服务客户机的首选方法。此方案遵循 JSR168 Portlet 的最佳编程实践原则,并启用了更好的“后退”按钮和书签支持。
- 如果需要在操作阶段调用 Web Service,例如根据服务结果转到不同的目标页面,则需要更改对结果进行高速缓存的方法。使用呈示参数或 Portlet 会话来代替在页面代码 Bean 中使用局部变量。虽然呈示参数只支持字符串值,但是,这是将信息从操作阶段传递到呈示阶段的首选方法。如果结果具有复杂类型,则必须使用 Portlet 会话。
- 以下是从页面代码 Bean 的 JSF 操作方法中将值设置为呈示参数的样本片段:
PortletResponse response = (PortletResponse)getFacesContext().getExternalContext().getResponse();
((ActionResponse)response).setRenderParameter("resultValue", resultValue);
- 以下是从页面代码 Bean 的 JSF 操作方法中将值设置为 Portlet 会话的样本片段:
PortletRequest request = (PortletRequest)getFacesContext().getExternalContext().getRequest();
request.getPortletSession().put("resultValue", resultValue);
- 或者,如果不需要在操作阶段调用服务,则可以将服务调用工作推迟到 Web Service 结果 Bean 的 getter 方法执行。在 JSF 操作方法中,如果输入值是字符串,则将其放在呈示请求参数中;如果输入值具有复杂类型,则将其放在 Portlet 会话中。然后,从 Web Service 结果 Bean 的 getter 方法中检索输入值,以便使用此值来调用服务。
- 以下是从页面代码 Bean 的 JSF 操作方法中设置呈示参数输入值的样本片段:
PortletResponse response = (PortletResponse)getFacesContext().getExternalContext().getResponse();
((ActionResponse)response).setRenderParameter("inputValue", inputValue);
- 以下是在 getter 方法中检索结果输入值的样本片段:
PortletRequest request = (PortletRequest)getFacesContext().getExternalContext().getRequest();
String inputValue = request.getParameter("inputValue");
- 注意,使用呈示参数将信息传递到呈示阶段的另一个好处是,对浏览器“后退”按钮和书签的支持都更完善。
导入门户网站项目时,系统可能会显示以下问题消息框:“下列工作空间文件与编辑器不一致。要使用工作空间内容来更新编辑器吗”。请单击“是”。
根据 JSR 168 规范,Portlet 应用程序标识是可选的,但 Rational® Developer 无法正确发布不带标识的 Portlet。如果没有这些标识,Rational Developer 就不会生成 Portlet。如果从另一个来源导入 Portlet,则可能会创建 Portlet。要解决此问题,请打开该项目的 Portlet 部署描述符,然后在“源代码”选项卡中添加 Portlet 应用程序标识。例如:
<portlet-app xmlns=... version=... xmlns:xsi=... xsi:schemaLocation=... id="ENTER_YOUR_ID_HERE">
...
</portlet-app>
当服务器正在运行时,如果检测到的服务器状态为“已停止”,则首先请确保 SOAP/RMI 连接器端口正确,然后确保在服务器编辑器中使用的 WebSphere 安全性凭证正确。如果它们不正确,则检测到的服务器状态永远不会是“已启动”。如果它们正确,但服务器状态仍是“已停止”,则表明可能存在 WebSphere Application Server V6.1 与 WebSphere Portal V6.0 共存问题。
最常见的情况是,在本地机器上已安装了 WebSphere Application Server 6.1 服务器,并且您开始使用新工作空间。在这个新工作空间中,将自动创建并初始化 WebSphere Application Server 6.1 服务器实例,这将导致 Portal 6.0 状态检测功能无法正确运行。如果刚刚创建了 WebSphere Application Server V6.1 服务器,接着创建 Portal 6.0 服务器,也会发生此问题。
解决方案是,在同一个工作空间中重新启动 Rational 产品。于是,只要未初始化 WebSphere Application Server 6.1 服务器,即,只要它的状态保持空白而不是“已停止”或“已启动”,Portal 6.0 服务器实例就应该能够正常工作。
在运行门户网站项目或将其部署到 Portal 6.0 后,Portlet 无法显示在页面中。为了最大程度地减轻此问题的影响,在不必进行完全部署的情况下,应该使用仅配置部署。
如果确实遇到问题,请尝试在不部署任何 Portlet 的情况下运行门户网站项目的仅配置部署。通常,这将使该门户网站再次正确地呈示 Portlet。
如果正在创建新的业务流程消息,并且 WSDL 文件采用 Document-Literal 样式,则输入消息名称和输出消息名称可能不会显示在向导的第二页中。您仍能够选择这些消息并在向导右边查看消息详细信息。尽管消息名称未显示在向导中,但生成的代码将是正确的。
如果使用协作向导来创建源 Portlet 或目标 Portlet,并且 JSR 168 Portlet 项目包含多种 Portlet 类型,例如一个基本 Portlet 和一个 Struts Portlet,则向导中的缺省操作参数可能不正确。
在基本 Portlet 和 Faces Portlet 中,缺省操作参数应该是 ACTION_NAME_PARAM,但用户可以选择另一个值。
在 Struts 中,操作参数必须是 spf_strutsAction。
任务页面容器中唯一名称的缺省值如下所示:
WebSphere Portal V6.0:ibm.portal.MyTasks
WebSphere Portal V5.1:wps.MyTasks在 Portal Designer 中,当使用唯一名称与上面列示的名称不同的另一页面时,执行部署后,WebSphere Portal 无法将其识别为任务页面容器页面。
变通方法:执行部署后,通过执行下列步骤在“我的任务”Portlet 中更改 TaskPageContainerUniqueName 参数值:
1. 打开“管理”>“Portlet 管理”>“Portlet”
2. 对于“我的任务”Portlet,单击“配置 Portlet”按钮
3. 对于 TaskPageContainerUniqueName 参数,单击“编辑”。
4. 使用下列值,将此参数值更改为 Portal Designer 中的新唯一名称:WebSphere Portal V6.0:ibm.portal.MyTasks
WebSphere Portal V5.1:wps.MyTasks
5. 单击“确定”。
如果已将门户网站项目从 Rational Developer 6.x 迁移到 Rational Developer 7.0 工作空间,则可能会导致部署失败并发生 NoModuleFileException 异常。发生这种情况时,请执行以下过程以解决问题。
- 本过程假定失败的门户网站项目部署操作生成了 EAR 项目“wps”。
- 打开新生成的 EAR 项目 wps 中的 application.xml。
- 确保 application.xml 的内容如下所示:
<module id="WebModule_1163447032109">
<web>
<web-uri>wps.war</web-uri>
<context-root>wps</context-root>
</web>
</module>
<module id="WebModule_WSRP">
<web>
<web-uri>wps_facade.war</web-uri>
<context-root>/wsrp</context-root>
</web>
</module>
<module id="EjbModule_1">
<ejb>wp.scheduler.ejb.jar</ejb>
</module>
<security-role id="SecurityRole_1">
<description>Everyone in the enterprise.</description>
<role-name>Everyone Role</role-name>
</security-role>
<security-role id="SecurityRole_2">
<description>All Authenticated users in the enterprise.</description>
<role-name>All Role</role-name>
</security-role>
<security-role id="SecurityRole_3">
<description>No users in the enterprise.</description>
<role-name>No Role</role-name>
</security-role>
- 具体而言,此内容:
- 应该包含 wps.war 的 Web 模块定义并将内容根值设置为“wps”。
- 不应该包含多个将内容根值设置为“wps”的 Web 模块定义。
- 应该包含 wps_facade.war 的 Web 模块定义并将内容根值设置为 "/wsrp。
- 包含 wp.scheduler.ejb.jar 的 EJB 模块定义。
- 包含“每个角色”、“全部角色”和“没有角色”的安全角色定义。
- 保存更改,然后再次进行发布。
由于 WebSphere Portal 6.0 中交付的 jsf-ibm.jar 版本已过期,因此,如果将 Portlet Web 模块的类装入器方式设置为 PARENT_FIRST,则某些 JSF 组件无法在 Portlet 中正确呈示。这是因为,当类装入器方式设置为 PARENT_FIRST 时,将使用 WebSphere Portal 6.0 中的 jsf-ibm.jar 来代替 Portlet Web 模块中包含的副本。
在 jsf-ibm.jar 中,只有与 URI http://www.ibm.com/jsf/html_extended 相对应的组件受影响。Faces IBM Portlet 和 Faces JSR168 Portlet 都会受影响。
在下列情况下,Portlet Web 模块的类装入器方式将设置为 PARENT_FIRST,因此需要对其进行更改:
要解决此问题,请打开包含 Portlet 项目的 EAR 项目中的 application.xml 文件,然后打开“部署”选项卡。在“应用程序”部分中,请查找显示了 EAR 和 Portlet 项目的树。选择 Portlet 项目,然后将“类装入器方式”由“PARENT_FIRST”更改为“PARENT_LAST”。要使此更改在目标服务器上生效,可能需要再次发布该应用程序。
- Portlet 是由 Rational Developer V7 部署的。
- 最初使用 EAR 将 Portlet 安装在 WebSphere Application Server 中,然后在 WebSphere Portal 中使用 xmlAccess 命令对其进行了配置。
如果已通过 WebSphere Portal 管理页面或 xmlAccess 命令使用 WAR 将该 Portlet 直接安装在 WebSphere Portal 中,则类装入器方式就会设置为 PARENT_LAST。在这种情况下,该 Portlet 能够正常运行,而不需要采用任何变通方法。
在通过项目交换功能将使用 Rational Developer 6.x 创建的 5.1.0.1 版门户网站项目导入 Rational Developer 7.0 工作空间后,“在 WebSphere Portal V5.1 测试环境中运行”可能会失败。
变通方法:执行下列步骤,修改 .portalsettings 文件内容:
1. 打开“窗口”>“打开透视图”>“其他”...。
2. 选择“资源”,然后在“打开透视图”对话框中单击“确定”。
3. 在“导航器”视图中展开门户网站项目。
4. 选择 .portalsettings 文件,然后使用文本编辑器将其打开。
5. 插入以下内容。
<?xml version="1.0" encoding="UTF-8"?>
<portalSettings>
<portal-version version="5.1.0.1"/>
<portlets-ear-project portlets-ear-project-name=""/>
<process-integration mytaskspage-uniquename="wps.MyTasks"/>
</portalSettings>
要查看“导入门户网站”向导以及样本库中的门户网站和 Portlet 样本,必须打开“Web 开发者(高级)”功能。要启用此功能,请转到“帮助”>“欢迎”。然后,在“欢迎”中,单击屏幕角部的“启用角色”按钮。然后,选择角色“Web 开发者(高级)”以将其打开。重新启动向导或样本库,以使更改生效。