© 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 6.0 版執行時期,必須為 5.1.0.x 的入口網站伺服器版本選取 WebSphere Portal 5.1 版執行時期。如果目標執行時期版本與入口網站版本不同步,則部署入口網站專案之後,入口網站伺服器會毀損或無法使用。
在 WebSphere Portal 6.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 服務
- EJB Session Bean
- 「選用區」視圖
- Java Bean(含方法呼叫)
- Web 服務
- EJB Session Bean
- Page Designer 快速功能表或視窗功能表中的「插入 -> 資料」
- Java Bean(含方法呼叫)
- Web 服務
- EJB Session Bean
這起因於 jsf-portletbridge.jar 中的 JSR168 Faces Portlet 執行時期有不同於以往的新實作方式。
在新的實作中,Faces JSP 的 pagecode Bean(宣告為 request-scope managed bean 時)無法在 Portlet 的「動作」階段和「呈現」階段之間持續保留。在產生的 Web 服務用戶端程式碼中,「動作」階段會使用 pagecode Bean 來快取 Web 服務的結果。但因為是在要求範圍內,「呈現」階段會建立新的實例。因此會遺失快取的結果。
有兩個可能的解決方案:
- 將 Bean 放入階段作業範圍內(在 faces-config.xml 中配置)。只是在配置檔中變更一行而已。
- 不像 #1 那麼簡單,但卻是在 JSR168 Portlet 中實作服務用戶端的好方法。不但符合 JSR168 Portlet 程式設計的最佳實務,也提供更好的「上一步按鈕」和書籤支援。
- 如果在「動作」階段需要呼叫 Web 服務,例如,視服務結果來導覽不同的目標頁面,則必須變更結果的快取方式。請使用呈現參數或 Portlet 階段作業,代替在 pagecode Bean 中使用區域變數。雖然使用呈現參數僅支援字串值,但卻有利於資訊從「動作」階段傳遞至「呈現」階段。如果結果是複式類型,則必須改用 Portlet 階段作業。
- 下列是範例片段,示範在 pagecode Bean 中從 JSF 動作方法內設定呈現參數的值:
PortletResponse response = (PortletResponse)getFacesContext().getExternalContext().getResponse();
((ActionResponse)response).setRenderParameter("resultValue", resultValue);
- 下列是範例片段,示範在 pagecode Bean 中從 JSF 動作方法內設定 Portlet 階段作業的值:
PortletRequest request = (PortletRequest)getFacesContext().getExternalContext().getRequest();
request.getPortletSession().put("resultValue", resultValue);
- 或者,如果不需要在「動作」階段呼叫服務,您可以將服務呼叫委派給 Web 服務結果 Bean 的 getter 方法。在 JSF 動作方法中,如果輸入值是「字串」,請放在呈現要求參數內,如果輸入值是複式類型,請放在 Portlet 階段作業內。然後利用 Web 服務結果 Bean 的 getter 方法來擷取,以用於呼叫服務。
- 下列是範例片段,示範在 pagecode 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 app id 是選用的,但如果沒有 id,Rational® Developer 無法正確發佈 Portlet。如果缺少這些 id,Rational Developer 也不會產生 Portlet。如果從另一個來源匯入 Portlet,可能會建立 Portlet。若要解決這個問題,請開啟專案的 Portlet 部署描述子,在程式碼標籤中新增 Portlet 應用程式 ID。例如:
<portlet-app xmlns=... version=... xmlns:xsi=... xsi:schemaLocation=... id="ENTER_YOUR_ID_HERE">
...
</portlet-app>
當伺服器在執行中時,如果偵測到的伺服器狀態是「已停止」,首先,請在伺服器編輯器中確定 SOAP/RMI 連接器埠已連接,且您使用的 WebSphere 安全認證是正確的。如果不正確,則偵測到的伺服器狀態一定不會是「已啟動」。如果都正確,但伺服器狀態仍為「已停止」,則可能是 WebSphere Application Server 6.1 版和 WebSphere Portal 6.0 版共存性的問題。
最常見的情況是 WebSphere Application Server 6.1 伺服器安裝在本端機器,然後您啟動新的工作區。在這個新的工作區,將自動建立並起始設定 WebSphere Application Server 6.1 伺服器實例,這會導致 Portal 6.0 狀態偵側不正常。如果您先建立 WebSphere Application Server 6.1 版伺服器,然後建立 Portal 6.0 伺服器,也會發生這個問題。
解決方案是以相同的工作區來重新啟動 Rational 產品。只要未起始設定 WebSphere Application Server 6.1伺服器,亦即狀態維持空白而非「已停止」或「已啟動」,Portal 6.0 伺服器實例就應該會正常運作。
執行我的入口網站專案或部署至 Portal 6.0 之後,頁面中未顯示 Portlet。為了降低這個問題的影響程度,只要不需要完整部署,就儘量使用「僅配置」部署。
如果發生此問題,請試著在入口網站專案上執行「僅配置」部署,不要部署任何 Portlet。這通常就可讓入口網站再次正常呈現 Portlet。
如果建立新的「商業程序訊息」且 WSDL 檔案是 Document-Literal 樣式,則精靈的第二頁可能不會顯示輸入及輸出訊息名稱。您仍然可以選取訊息,並在精靈的右邊檢視訊息的詳細資料。不論精靈中是否顯示訊息名稱,產生的程式碼一定正確。
如果使用協同式精靈來建立來源或目標 Portlet,且 JSR 168 Portlet 專案包含多種 Portlet 類型,例如一個基本 Portlet 和一個 Struts Portlet,則精靈中的預設動作參數可能不正確。
在基本和 Faces Portlet 中,預設動作參數應該為 ACTION_NAME_PARAM,但使用者可以選取不同的值。
在 Struts 中,動作參數必須為 spf_strutsAction。
下列是作業頁面儲存器中唯一名稱的預設值:
WebSphere Portal 6.0 版: ibm.portal.MyTasks
WebSphere Portal 5.1 版: wps.MyTasks在 Portal Designer 中,如果使用另一個頁面,但唯一名稱不是以上列出的名稱,則 WebSphere Portal 在部署之後無法將頁面視為作業頁面儲存器的頁面。
暫行解決方法:在部署之後,在「我的作業」Portlet 中,執行下列步驟來變更 TaskPageContainerUniqueName 參數的值:
1. 開啟「管理 > Portlet 管理 > Portlet」
2. 對於「我的作業」Portlet,按一下「配置 Portlet」按鈕
3. 對於 TaskPageContainerUniqueName 參數,按一下「編輯」。
4. 在 Portal Designer 中,使用下列這些值,將值改為新的唯一名稱:WebSphere Portal 6.0 版: ibm.portal.MyTasks
WebSphere Portal 5.1 版: wps.MyTasks
5. 按一下「確定」。
如果入口網站專案已從 Rational Developer 6.x 移轉至 Rational Developer 7.0 工作區,則可能造成部署失敗,擲出 NoModuleFileException。發生此狀況時,請遵循下列程序來更正問題。
- 這個程序假設失敗的入口網站專案部署作業已產生 "wps" EAR 專案。
- 在新產生的 wps EAR 專案中開啟 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 模組定義,且 content-root 值設為 "wps"。
- 不含多個將 content-root 值設為 "wps" 的 Web 模組定義。
- 包含 wps_facade.war 的一個 Web 模組定義,且 content-root 值設為 "/wsrp。
- 包含 wp.scheduler.ejb.jar 的一個 ejb 模組定義。
- 包含 "Everyone Role"、"All Role" 及 "No Role" 的安全角色定義。
- 儲存並重新發佈。
由於 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"。可能需要重新發佈應用程式,才能讓變更在目標伺服器上生效。
- 使用 Rational Developer 第 7 版來部署 Portlet 時。
- 先使用 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 透過 Project Interchange 來匯入 Rational Developer 7.0 工作區,則「在 WebSphere Portal 5.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>
必須啟用「Web 開發人員(進階)」能力,才能檢視「匯入入口網站」精靈及入口網站和 Portlet 範例(從「範例展示區」)。若要啟用此能力,請跳至「說明 > 歡迎使用」,在「歡迎使用」中按一下畫面角落的「啟用角色」按鈕。然後選擇啟用「Web 開發人員(進階)」角色。重新啟動精靈或「範例展示區」,讓變更生效。