獲息BEA舉辦dev2dev原創(chuàng)技術(shù)文章大獎(jiǎng)賽活動(dòng),恰巧我的項(xiàng)目也處于收尾驗(yàn)收階段。作為Weblogic Portal8.1.2在國(guó)內(nèi)的第一次大型應(yīng)用,我覺(jué)得有必要把這次項(xiàng)目實(shí)施過(guò)程中的一些感想和經(jīng)驗(yàn)整理成文并介紹給所有喜歡和使用Weblogic Portal的開(kāi)發(fā)者。 這篇文章以解決方案集的形勢(shì)收錄了這次項(xiàng)目實(shí)施過(guò)程中對(duì)一些典型問(wèn)題的解決辦法。這些問(wèn)題有的是Portal項(xiàng)目中最常遇到的,如單點(diǎn)登錄,內(nèi)容整合,有的則純粹是解決Weblogic Portal自身問(wèn)題的小技巧,如Desktop的傳遞中文參數(shù)的問(wèn)題。 由于有太多經(jīng)驗(yàn)和感想需要和廣大Portal開(kāi)發(fā)著交流,所以這個(gè)解決方案集還有必要收錄更豐富的內(nèi)容,這部分工作還在進(jìn)行當(dāng)中。希望這些來(lái)自一線的實(shí)戰(zhàn)經(jīng)驗(yàn)?zāi)軌驇椭?/span>Weblogic Portal在國(guó)內(nèi)的其他項(xiàng)目中取得勝利。 陳龍 (dev2dev ID:SCEA) 北京有生博大軟件軟件技術(shù)有限公司 目錄: BEA Weblogic Portal項(xiàng)目實(shí)施解決方案集?來(lái)自WLP8.1 SP2在國(guó)內(nèi)的第一個(gè)成功應(yīng)用... 利用UUP實(shí)現(xiàn)Portal和LDAP同步用戶信息.. WLP應(yīng)用中部署的 p13n_ejb.jar的配置... 查看WLP admin console中的結(jié)果... 利用UUP實(shí)現(xiàn)Portal和已有J2EE應(yīng)用的單點(diǎn)登錄... 第二步:制作login.jsp和LoginBacking.java. 利用RSS技術(shù)實(shí)現(xiàn)Portal和其他Web應(yīng)用的內(nèi)容整合... 利用UUP實(shí)現(xiàn)Portal和LDAP同步用戶信息同步用戶信息(profile)的必要性如果項(xiàng)目中有以下因素存在則有必要同步Portal和LDAP服務(wù)器的用戶信息。 1. LDAP服務(wù)器為整個(gè)項(xiàng)目中的所有應(yīng)用作集中用戶身份驗(yàn)證服務(wù)。在這種情況下Portal不一定要和LDAP同步。因?yàn)?/span>WLS作為WLP的基礎(chǔ)組件可以為Portal提供身份驗(yàn)證服務(wù),所以只需要WLS和LDAP同步即可。具體如何在WLS中配置LDAP身份驗(yàn)證服務(wù)請(qǐng)看LDAP服務(wù)器端的配置和WLS Admin console中的配置部分。 2. Portal的用戶數(shù)量眾多,而且由于用戶的所屬的組織機(jī)構(gòu)(ou)變化頻繁,導(dǎo)致用戶的角色經(jīng)常變化。在這種情況下,完全有必要讓Portal從LDAP服務(wù)器獲取用戶信息,否則開(kāi)發(fā)和維護(hù)的任務(wù)將相當(dāng)繁重。在Portal中為了達(dá)到基于角色的個(gè)性化,必須在Portal admin中給Portal組件指定具體的角色。讓Portal 訪問(wèn)LDAP,從LDAP同步用戶的組織機(jī)構(gòu),解決了在Portal中維護(hù)用戶信息的問(wèn)題,體現(xiàn)了LDAP作為用戶身份認(rèn)證服務(wù)的價(jià)值。
下面將以業(yè)界領(lǐng)先的Novell NDS為例詳細(xì)描述具體的配置方法。NDS的基本配置情況可以通過(guò)圖1了解。 圖1顯示了目錄樹(shù)的組織結(jié)構(gòu),其中Groups是用于管理的環(huán)境(Context),我們用來(lái)存放groups。 Users是存放組織單元和用戶的組織(Organization)。 LDAP服務(wù)器端的配置不同的LDAP服務(wù)器配置方法各不相同,下面方法簡(jiǎn)單介紹Novell NDS的LDAP配置,所有操作都在ConsoleOne中進(jìn)行: 1. 在Users下創(chuàng)建一個(gè)用戶PortalAdmin。該用戶應(yīng)該是配置WLS域的管理員,用戶名和密碼要和其完全一致。所以建議在配置PortalDomain時(shí)選擇使用PortalAdmin作為域管理員。如果需要修改PortalDomain的管理員名和密碼則需要修改PortalDomain根目錄下的boot.property文件,只要將username=和password=后面的密文改為明文即可,當(dāng)?shù)谝淮沃仄?/span>WLS后,系統(tǒng)會(huì)自動(dòng)把明文以3DES算法加密。 2. 在Groups下創(chuàng)建兩個(gè)組Administrators,PortalSystemAdministrators。 3. 將Portaladmin加入Administrators和PortalSystemAdministrators組。 4. 為PortalAdmin分配權(quán)限。也就是指定PortalAdmin為Users這個(gè)組織的受托者(Trustees)。在Users上點(diǎn)擊右鍵,選擇此對(duì)象的受托者(Trustees of This Object)。選擇PortalAdmin,然后選擇合適的權(quán)限。 5. 為了讓PortalAdmin和管理環(huán)境Groups中的LDAP Group聯(lián)系,還要啟用明文口令。在LDAP Group上點(diǎn)擊右鍵,選擇屬性,在一般(General)項(xiàng)中選擇啟用明文口令復(fù)選框。 WLS Admin console中的配置用LDAP的身份驗(yàn)證替換WLS默認(rèn)的身份驗(yàn)證服務(wù)需要如下配置: 1. 進(jìn)入WLS admin console(需要先啟動(dòng)WLS),以下兩種方法都可以:
2. 在admin console左側(cè)的樹(shù)型菜單依次展開(kāi)Security -> Realms-> myrealm-> Providers-> Authentication。 3. 在admin console右側(cè)頁(yè)面中選擇合適的目錄服務(wù)的類型。我們選擇Configure a new Novell Authenticator...。 4. 在新的頁(yè)面中,General 面板保持默認(rèn)值即可,如果有多個(gè)身份驗(yàn)證服務(wù)器同時(shí)存在則需要考慮Control Flag的選項(xiàng)。點(diǎn)擊Create開(kāi)始配置。 5. Novell LDAP 面板。這里的參數(shù)是Weblogic用來(lái)和LDAP連接的。輸入的參數(shù)有:Host ,NDS服務(wù)器的IP地址;Port ,NDS的端口號(hào),默認(rèn)是389;Principal ,Weblogic用來(lái)連接NDS的用戶名的DN,依照?qǐng)D1應(yīng)該是cn=admin,o=Groups; Credential,該DN的密碼。其他參數(shù)保持默認(rèn)。點(diǎn)擊Apply。 6. Users 面板。輸入的參數(shù)有:User Base DN,用戶的基礎(chǔ)DN,一般為用戶所屬的ou的DN,如果用戶分散在多個(gè)以同一o為根的ou中就需要把該值設(shè)為包含這些ou的o的DN,依照?qǐng)D1應(yīng)該是o=Users。其他參數(shù)保持默認(rèn)。點(diǎn)擊Apply。 7. Groups 面板。輸入的參數(shù)有:Group Base DN,組的基礎(chǔ)DN,一般為管理環(huán)境的組織(o)的DN,依照?qǐng)D2應(yīng)該是o=Groups。其他參數(shù)保持默認(rèn)。點(diǎn)擊Apply。 8. 其他的面板暫時(shí)無(wú)需配置。配置完上述參數(shù)后重新啟動(dòng)這個(gè)PortalDomain 的WLS,然后再次登錄WLS admin console。 9. 在admin console左側(cè)的樹(shù)型菜單依次展開(kāi)Security -> Realms-> myrealm-> Users 和 Security -> Realms-> myrealm-> Groups。檢查上述步驟配置的結(jié)果。 10. 如果配置沒(méi)有問(wèn)題,WLS從LDAP獲得了用戶,還需要將原來(lái)的默認(rèn)身份驗(yàn)證刪除。分別是:DefaultAuthenticator,DefaultIdentityAsserter。 WLP應(yīng)用中部署的 p13n_ejb.jar的配置為了讓Portal從LDAP獲得用戶信息,實(shí)現(xiàn)基于角色的個(gè)性化配置,就必須要部署一個(gè)無(wú)狀態(tài)Session Bean從LDAP獲得用戶的信息。這個(gè)無(wú)狀態(tài)Session Bean負(fù)責(zé)UUP和LDAP之間的映射。實(shí)現(xiàn)這個(gè)無(wú)狀態(tài)Session Bean有兩種方案,可以自己開(kāi)發(fā),也可以使用WLP在p13n_ejb.jar中提供的一個(gè)參考實(shí)現(xiàn),com.bea.p13n.usermgmt.profile.ldap。實(shí)際上,對(duì)這個(gè)參考實(shí)現(xiàn)作一些配置之后就基本能夠滿足項(xiàng)目的要求。下面是具體的配置方法。ejb-jar.xml和weblogic-ejb.xml位于你的Portal應(yīng)用的根目錄下的p13n_ejb.jar中的META_INF目錄中,application_config位于你的應(yīng)用的根目錄下的META_INF目錄中。 1. 將p13n_ejb.jar復(fù)制到另外一個(gè)目錄中。在這一新的目錄中執(zhí)行jar xvf p13n_ejb.jar META-INFejb-jar.xml META-INFweblogic-ejb-jar.xml命令,把p13n_ejb.jar中的META_INF目錄下的ejb-jar.xml和weblogic-ejb-jar.xml解壓出來(lái)。 2. 修改ejb-jar.xml。找到<!-- Ldap Property Manager 這一行,取消這一注釋,使LdapPropertyManager這個(gè)無(wú)狀態(tài)session bean可以部署。 3. 在LdapPropertyManager的部署描述中的多數(shù)配置和在WLS Admin console中的配置一致,見(jiàn)圖2。
圖2 XMLSpy中看到的ejb-jar.xml 如果配置了config/principal和config/principalCredential兩項(xiàng),就可以將config/credentialMBeanName這一項(xiàng)注釋或刪除掉。 4. 找到<!-- User Profile Manager-->這一行,開(kāi)始修改UserProfileManager的部署描述。 5. 注意下面一項(xiàng): <!-- map all properties in property set ldap to ldap server --> <env-entry> <env-entry-name>PropertyMapping/ldap</env-entry-name> <env-entry-type>java.lang.String</env-entry-type> <env-entry-value>LdapPropertyManager</env-entry-value> </env-entry> 其中PropertyMapping/ldap指明LdapPropertyManager作為ldap這個(gè)UUP中的PropertySet到LDAP服務(wù)器之間的映射,以后創(chuàng)建UUP文件時(shí)的名稱必須和這里指定的”ldap”完全一致。 6. 修改下面一項(xiàng): <!-- an ldap property manager --> <ejb-ref> <ejb-ref-name>ejb/LdapPropertyManager</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>com.bea.p13n.property.EntityPropertyManagerHome</home> <remote>com.bea.p13n.property.EntityPropertyManager</remote> <!-- <ejb-link>LdapPropertyManager</ejb-link> --> <ejb-link>EntityPropertyManager</ejb-link> </ejb-ref> 修改為: <!-- an ldap property manager --> <ejb-ref> <ejb-ref-name>ejb/LdapPropertyManager</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>com.bea.p13n.property.LdapPropertyManagerHome</home> <remote>com.bea.p13n.property.LdapPropertyManager</remote> <ejb-link>LdapPropertyManager</ejb-link> <!-- <ejb-link>EntityPropertyManager</ejb-link> --> </ejb-ref> 請(qǐng)注意home,remote接口和ejb-link的變化。 7. 按需要,可在<!-- Group profile manager -->中作同樣修改。 8. 取消對(duì) <method> <ejb-name>LdapPropertyManager</ejb-name> <method-name>*</method-name> </method> 的注釋。ejb-jar.xml的修改完成。 9. 修改weblogic-ejb-jar.xml文件,找到 <!-- LdapPropertyManager <weblogic-enterprise-bean> <ejb-name>LdapPropertyManager</ejb-name> <enable-call-by-reference>True</enable-call-by-reference> <jndi-name>${APPNAME}.BEA_personalization.LdapPropertyManager</jndi-name> </weblogic-enterprise-bean> --> 取消對(duì)這一項(xiàng)的注釋。 10. 取消對(duì) <method> <ejb-name>LdapPropertyManager</ejb-name> <method-name>*</method-name> </method> 的注釋。weblogic-ejb-jar.xml的修改完成 11. META-INF中的ejb-jar.xml和weblogic-ejb-jar.xml都修改完成后,執(zhí)行jar uvf p13n_ejb.jar META-INF命令,將這兩個(gè)文件更新回p13n_ejb.jar中。然后將p13n_ejb.jar重新復(fù)制到Portal應(yīng)用的根目錄下,覆蓋原始文件。 12. 修改application_config文件,在<CacheManager Name="CacheManager"></CacheManager>中加入一項(xiàng):<Cache Name="ldapPropertyCache" TimeToLive="60000" Notes="Cache for UUP LDAP." MaxEntries="100"/>。該項(xiàng)配置同樣可以在WLP admin console的Service Administration->CacheManager中添加和修改。 13. 所有的配置都完成以后,需要重新啟動(dòng)weblogic,并在WLS admin console中檢查p13n_ejb是否部署成功。 創(chuàng)建UUP只有創(chuàng)建的UUP的文件名必須和上述ejb-jar.xml中的指定的文件名完全一致,LdapPropertyManager才可以把LDAP服務(wù)器中的User的屬性映射到UUP文件中定義的屬性集中。 1. 在Workshop中打開(kāi)你的Portal應(yīng)用,在datauserprofiles下創(chuàng)建名為ldap.usr的屬性集文件。 2. 屬性集中的屬性必須和LDAP服務(wù)器中的屬性對(duì)應(yīng)才會(huì)有意義。所以應(yīng)該對(duì)照LDAP服務(wù)器中的用戶屬性向ldap.usr屬性集中添加屬性。 3. 可以去http://www./~gawojar/ldap/ 下載一個(gè)LDAP browser,在其中觀察LDAP中User對(duì)象的屬性。User對(duì)象的屬性類似圖3。
圖3 4. 對(duì)應(yīng)的我們?cè)?/span>ldap.usr中加入如下屬性:
圖4 UUP屬性集中的屬性必須是LDAP服務(wù)其中User對(duì)象屬性的子或全集,并且屬性的類型一致。 查看WLP admin console中的結(jié)果1. 登錄WLP admin console。在Workshop中打開(kāi)Portal應(yīng)用后在通過(guò)Portal->Portal Administration打開(kāi)。 2. 用WLS域管理員身份(PortalAdmin)登陸,該WLS域管理員也是在LDAP服務(wù)器端創(chuàng)建的超級(jí)用戶。 3. 點(diǎn)擊Users & Groups,然后選擇一個(gè)組。在右側(cè)頁(yè)面的1號(hào)區(qū)域點(diǎn)擊Show All Users in Group,然后再2號(hào)區(qū)域點(diǎn)擊一個(gè)用戶名。 4. 在新頁(yè)面中選擇Edit User Profile Values標(biāo)簽,然后在Properties from Property Set:選擇ldap。 5.
可以看到LdapPropertyManager的映射結(jié)果,如圖5,可對(duì)比圖3觀看。 圖5 利用UUP實(shí)現(xiàn)Portal和已有J2EE應(yīng)用的單點(diǎn)登錄優(yōu)點(diǎn)和限制條件在企業(yè)應(yīng)用整合中,Portal負(fù)責(zé)的是表現(xiàn)層和部分Web Component(Portlets)層的整合。而在這些整合應(yīng)用中又以單點(diǎn)登錄(Single Sign-On)最為常見(jiàn),其實(shí)SSO也最能代表Portal在應(yīng)用整合中的作用。 下面介紹一個(gè)在項(xiàng)目中使用的簡(jiǎn)單方案,他利用一個(gè)Servlet Filter和WLP的UUP實(shí)現(xiàn)了Portal和項(xiàng)目中的其他J2EE應(yīng)用通過(guò)同一個(gè)LDAP服務(wù)器進(jìn)行身份驗(yàn)證的目的,用戶只需要在Portal中登錄一次,再訪問(wèn)其他和Portal整合的應(yīng)用時(shí)無(wú)需再次登錄。這個(gè)Filter只需編寫(xiě)一次就可以部署到多個(gè)Web項(xiàng)目中去,可復(fù)用程度高。
這個(gè)方案也有一個(gè)限制,就是所有要整合的Web項(xiàng)目都必須是Portal應(yīng)用中的項(xiàng)目。如圖6所示: 圖6 FTApp是一個(gè)Portal應(yīng)用。FTPortal是FTAPP這個(gè)應(yīng)用下的一個(gè)Portal Web項(xiàng)目。RiseNet則是FTAPP這個(gè)應(yīng)用下的一個(gè)普通 Web項(xiàng)目。之所以這樣做是為了讓同一個(gè)Portal應(yīng)用下的項(xiàng)目共享一個(gè)Datasync Project,因?yàn)槲覀円?/span>Datasync Project的UUP機(jī)制存取同一個(gè)用戶在多個(gè)Web項(xiàng)目中的狀態(tài)。 因?yàn)橛羞@個(gè)限制,所以在實(shí)現(xiàn)單點(diǎn)登錄之前應(yīng)該把所有要整合到單點(diǎn)登錄環(huán)境的項(xiàng)目導(dǎo)入(Import)到Portal應(yīng)用中來(lái)。導(dǎo)入的方法是在Portal應(yīng)用上點(diǎn)擊右鍵然后選擇Import Project。 下面開(kāi)始正式的開(kāi)發(fā)工作。這個(gè)過(guò)程需要?jiǎng)?chuàng)建的工件有:一個(gè)登錄用的JSP頁(yè)面,login.jsp,以及這個(gè)JSP頁(yè)面用到的LoginBacking.java類;一個(gè)Filter,SSOFilter.java;一個(gè)UUP文件,online.usr; 第一步:制作online.usr文件在Workshop中打開(kāi)你的Portal應(yīng)用,在datauserprofiles下創(chuàng)建名為online.usr的屬性集文件。在文件中加入token和password兩個(gè)屬性,他們的類型都是Single Unrestricted。Online.usr的作用是存取已經(jīng)登錄的在線用戶的信息,用于以后在其他Web Project中登錄。 第二步:制作login.jsp和LoginBacking.java這兩個(gè)文件可以從BEA提供的例子sampleportal中導(dǎo)入,然后在這個(gè)基礎(chǔ)上修改而來(lái)。他們的具體位置分別在: %BEA_HOME%weblogic81samplesportalportalAppsampleportalportletslogin.jsp %BEA_HOME%weblogic81samplesportalportalAppsampleportalWEB-INFsrcexamplesloginLoginBacking.java 把這兩個(gè)文件導(dǎo)入到你的Portal項(xiàng)目的相應(yīng)位置。根據(jù)實(shí)際需要對(duì)login.jsp做一些界面修改即可,LoginBacking.java則要加入一些額外的邏輯,這些邏輯包括用戶在登錄進(jìn)Portal之后和退出Portal之前的操作兩部分。 打開(kāi)LoginBacking.java,進(jìn)行如下修改: 1. 添加import com.bea.p13n.usermgmt.profile.*; 2. 找到 String username = request.getParameter("username"); String password = request.getParameter("password"); 兩行代碼,在他們后面加入一行: ProfileWrapper profile = ProfileFactory.getProfile(username,"everyone"); 3. 找到Authentication.login(username, password, request);這一行代碼。這行代碼正確執(zhí)行的就是用戶登錄Portal。在這一行之后加入我們自己的代碼。我們的代碼要為用戶的這次登錄創(chuàng)建一個(gè)唯一的token,然后把這個(gè)token和用戶的密碼一起存入online.usr中。代碼示例:
代碼示例1 4. 找到Authentication.logout(request);這一行代碼。這行代碼正確執(zhí)行的結(jié)果就是用戶退出Portal。在這一行之前加入我們自己的代碼。代碼將刪除在online.usr中存儲(chǔ)的用戶登錄token和password。代碼示例: 代碼示例2 5. 注意讀者自己處理以上步驟profile操作的異常。 第三步:制作SSOFilter.javaSSOFilter.java應(yīng)該部署到每一個(gè)和Portal整合的Web項(xiàng)目中,他的作用是檢查通過(guò)自己的Request對(duì)象,如果這個(gè)Request對(duì)應(yīng)的Session沒(méi)有登錄就從Request對(duì)象得到token和username參數(shù)。通過(guò)username參數(shù)從online.usr中查找Portal存儲(chǔ)的token。比較這兩個(gè)token,驗(yàn)證用戶是不是已經(jīng)在Portal中登錄過(guò)的合法用戶。如果通過(guò)了驗(yàn)證,程序還要把online.usr中存儲(chǔ)的password取出,和username一起作為這個(gè)Web應(yīng)用登錄的參數(shù)。在這個(gè)過(guò)程中發(fā)生任何錯(cuò)誤都可以跳轉(zhuǎn)回Portal的登錄頁(yè)面,如果沒(méi)有錯(cuò)誤和異常,這個(gè)Request就可以通過(guò)SSOFilter了。
代碼示例3 利用RSS技術(shù)實(shí)現(xiàn)Portal和其他Web應(yīng)用的內(nèi)容整合Portal和其他Web應(yīng)用內(nèi)容整合的最簡(jiǎn)單方式就是使用<IFrame>,但是這種方式引發(fā)的Session同步問(wèn)題在大型整合應(yīng)用中往往是讓人無(wú)法接受的。必須采用一種全新的整合方式,使被整合的各個(gè)應(yīng)用之間達(dá)到最大程度的松耦合。因?yàn)槲覀冋系氖莾?nèi)容,不涉及表現(xiàn),更不涉及業(yè)務(wù)邏輯,所以XML是我們的首選。其他 Web應(yīng)用把XML(內(nèi)容)格式的內(nèi)容信息傳遞給Portal,Portal使用XSLT(表現(xiàn))解析XML,把XML表現(xiàn)為HTML(內(nèi)容+表現(xiàn))各式展現(xiàn)給用戶。 為了使整合方案形成規(guī)范并符合標(biāo)準(zhǔn),我們采用和RSS技術(shù),它是WEB站點(diǎn)之間交換內(nèi)容的標(biāo)準(zhǔn)??梢詮?/span>BEA Portal的sampleportal例子中找到符合RSS2.0規(guī)范的XML文件(rssBEA.xml)和解析XML的XSL文件(位于rss.jsp中)。我們可以從sampleportal中導(dǎo)入這兩個(gè)文件,然后在這個(gè)基礎(chǔ)上修改而來(lái)。他們的具體位置分別在: %BEA_HOME%weblogic81samplesportalportalAppsampleportalportlets ss ssBEA.xml %BEA_HOME%weblogic81samplesportalportalAppsampleportalportlets ss ss.jsp sampleportal演示的是如何整合外網(wǎng)信息,也就是整合的內(nèi)容對(duì)于每個(gè)用戶都是一樣的,比如Yahoo的新聞等。而具體項(xiàng)目中的要求往往是整合的信息需要根據(jù)用戶的權(quán)限和角色的不同而不同,也就是個(gè)性化的內(nèi)容,如通知,待辦文件,郵件列表等。這就對(duì)整合方案增加了如下要求: 1. 個(gè)性化內(nèi)容整合的前提還是單點(diǎn)登錄。必須首先實(shí)現(xiàn)單點(diǎn)登錄才可以使其他Web應(yīng)用為用戶提供安全的,個(gè)性化的內(nèi)容。 2. 從Portal發(fā)往其他Web應(yīng)用的請(qǐng)求無(wú)需攜帶用戶名和密碼等識(shí)別用戶身份的參數(shù),因?yàn)樵诘谝淮蔚卿涍@個(gè)Web應(yīng)用時(shí)SSOFilter已經(jīng)解決了Session的問(wèn)題并且在Session中添加了識(shí)別用戶身份的參數(shù)。 3. 被整合的其他Web應(yīng)用需要根據(jù)用戶的身份動(dòng)態(tài)生成XML內(nèi)容,然后把XML內(nèi)容響應(yīng)給發(fā)送請(qǐng)求的Portal。 這個(gè)過(guò)程用圖說(shuō)7明:
圖8 一個(gè)模仿MSN風(fēng)格的Portal界面。其中每個(gè)Portlet的內(nèi)容都可能來(lái)自不同的外部應(yīng)用甚至Internet。
Desktop中的中文問(wèn)題WL Portal的中文問(wèn)題很多就是WL Server的中文問(wèn)題,只有少數(shù)和Portal自身相關(guān),但是這些問(wèn)題更加隱蔽。這其中最迷惑人的就是Desktop的中文問(wèn)題。
第一種方式
圖10 在Workshop Test Browser中展現(xiàn)這個(gè)Portal的過(guò)程如下圖所示:
圖11 第一步:Portal Server 首先解析.portal XML文件,從中得到這個(gè)Portal的全局配置屬性,從中得知portal使用了哪些組件(shell,books,pages,layouts,menus等)。 第二步:獲得這些portal組件的資源信息。 第三步:按照資源信息,定位并找到這些資源(images,javascript,CSS,JSP,HTML等)。 第四部:把所有的資源合并成HTML。 可以看出Portal Server會(huì)把.portal文件中的<portal:directive.page contentType="text/html;charset=GBK"/>這一行轉(zhuǎn)換成<%@ page contentType="text/html; charset=GBK" %>用于整個(gè)Portal中的所有JSP頁(yè)面,這一行的默認(rèn)值是charset=UTF8。所以在測(cè)試和預(yù)覽時(shí)的中文問(wèn)題可以在這里解決。這個(gè)中文問(wèn)題相對(duì)很好解決。 第二種方式這種方式我們稱為”Database mode”。這種方式用于實(shí)際的使用當(dāng)中,即Portal的管理員在WLP Admin Console中根據(jù)角色把Desktop授權(quán)給相應(yīng)具有權(quán)限的用戶后,用戶在訪問(wèn)自己的 Desktop時(shí)Portal Server的處理方式。顯然Desktop中的中文參數(shù)傳遞問(wèn)題不通過(guò)上述第一種方式的方法修改。 注意到這樣一點(diǎn),就是這種方式訪問(wèn)desktop的URL中包含appmanager。然后試圖去Web.xml中找到和這樣的URL匹配的Servlet。果然發(fā)現(xiàn)如下Servlet配置項(xiàng): <servlet> <servlet-name>AppManagerServlet</servlet-name> <servlet-class>com.bea.netuix.servlets.manager.PortalServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> 和 <servlet-mapping> <servlet-name>AppManagerServlet</servlet-name> <url-pattern> /appmanager/* </url-pattern> </servlet-mapping> 從AppManagerServlet所在的包路徑得到線索,com.bea.netuix包負(fù)責(zé)用戶界面的合成和展現(xiàn)。所以進(jìn)一步發(fā)現(xiàn)com.bea.netuix.application.localization.definition.LocalizationLocale這個(gè)類(可以下載BEA Portal的API文檔)。這個(gè)類中的public void setEncoding(String encoding),這個(gè)方法就是設(shè)置編碼字符集的。這個(gè)類還有一個(gè)靜態(tài)字符串常量public static final String DEFAULT_ENCODING,而這個(gè)變量的值是”UTF-8”。見(jiàn)圖12。
在WLP Admin Console或Portal項(xiàng)目的其他配置文件中均沒(méi)有發(fā)現(xiàn)指定其他編碼字符集的方法。 我們稱這種方式為”Database mode”是因?yàn)樗腔跀?shù)據(jù)庫(kù)的,它需要從數(shù)據(jù)庫(kù)中查尋書(shū)然后合成用戶界面。那么關(guān)于字符集的信息也一定存儲(chǔ)在數(shù)據(jù)庫(kù)中。根據(jù)這個(gè)思路,進(jìn)行如下操作(以sampleportal為例): 1. 在Workshop中打開(kāi)Tools->Weblogic Server->DataSource Viewer。見(jiàn)圖13
圖13 2. 在%BEA_HOME%weblogic81commonevalpointbase ools目錄中運(yùn)行startPointBaseConsole.cmd 3. 在Connect to DataBase窗口按照?qǐng)D12的信息添加相應(yīng)選項(xiàng),然后連接數(shù)據(jù)庫(kù)。見(jiàn)圖14
圖14 4. 在左側(cè)的目錄中找到SCHEMAS->WEBLOGIC->TABLES->L10N_LOCALE表。在L10N_LOCALE上點(diǎn)右鍵,選擇Select * FROM “WEBLOGIC”.” L10N_LOCALE”。問(wèn)題的根源一目了然。 5. 按你的要求修改Encoding,Language等字段。 總結(jié)其他解決方案還在整理之中,希望很快能夠和大家見(jiàn)面。也希望您能通過(guò)Email和我聯(lián)系,交流經(jīng)驗(yàn)。 |
|
來(lái)自: smoking_boy > 《Portal》