專利名稱:基于j2ee的web動(dòng)態(tài)頁(yè)面靜態(tài)化解決方法
技術(shù)領(lǐng)域:
本技術(shù)發(fā)明方案應(yīng)用于基于J2EE的WEB應(yīng)用,用于解決用戶使用系統(tǒng)的性能要 求。
2背景技術(shù):
目前現(xiàn)有的WEB應(yīng)用大部分都是采用動(dòng)態(tài)頁(yè)面,客戶端訪問(wèn)時(shí)動(dòng)態(tài)生成返回響應(yīng) 信息,當(dāng)由于剛性原因,某些動(dòng)態(tài)頁(yè)面響應(yīng)時(shí)間超長(zhǎng)時(shí),WEB應(yīng)用就無(wú)法滿足海量用戶高并 發(fā)和數(shù)據(jù)調(diào)用的性能要求。傳統(tǒng)的動(dòng)態(tài)頁(yè)面訪問(wèn)數(shù)據(jù)庫(kù)的操作太多,導(dǎo)致數(shù)據(jù)庫(kù)連接競(jìng)爭(zhēng) 激勵(lì),所以響應(yīng)緩慢,但數(shù)據(jù)庫(kù)連接又不能開(kāi)太多,否則數(shù)據(jù)庫(kù)壓力會(huì)很高。
3
發(fā)明內(nèi)容
(l)發(fā)明目的 本發(fā)明方案的目的是解決傳統(tǒng)基于J2EE的WEB應(yīng)用存在的,由于全部動(dòng)態(tài)頁(yè)面數(shù) 據(jù)都是實(shí)時(shí)生成導(dǎo)致的性能問(wèn)題,針對(duì)海量用戶,高并發(fā)和數(shù)據(jù)調(diào)用的性能需求,提出一種 基于J2EE的WEB動(dòng)態(tài)頁(yè)面靜態(tài)化的解決方案,減少數(shù)據(jù)庫(kù)資源的競(jìng)爭(zhēng)和對(duì)數(shù)據(jù)庫(kù)讀的壓 力。 (2)技術(shù)方案 本發(fā)明技術(shù)方案是基于由數(shù)據(jù)庫(kù)服務(wù)器組、應(yīng)用服務(wù)器組、客戶端三部分組成系 統(tǒng)。 —種基于J2EE的WEB動(dòng)態(tài)頁(yè)面靜態(tài)化解決方法,步驟包括 1)由靜態(tài)頁(yè)面生成應(yīng)用模擬客戶端請(qǐng)求,發(fā)送請(qǐng)求到原有的動(dòng)態(tài)頁(yè)面例如JSP, 并將響應(yīng)對(duì)象里的輸出流指向到本地文件; 2)WEB應(yīng)用讀取由"靜態(tài)頁(yè)面生成應(yīng)用"生成的靜態(tài)頁(yè)面。 靜態(tài)頁(yè)面生成好以后,用戶對(duì)WEB應(yīng)用(如移動(dòng)的BOSS系統(tǒng)、電信的營(yíng)銷支撐系 統(tǒng))的動(dòng)態(tài)頁(yè)面地址的訪問(wèn)就會(huì)重定向響應(yīng)的靜態(tài)頁(yè)面。 具體來(lái)說(shuō),首先,從配置文件config. xml中讀取生成靜態(tài)頁(yè)面的相關(guān)參數(shù); 例如 config. xml : 〈pages> 〈page>
3
〈/page> 〈page>
〈n咖e〉p3rt-d3te〈/n咖e〉 〈type〉PART〈/type〉
〈url>/jsp/main/home_data. jsp〈/url> 〈parameters>
〈parameter>userID〈/parameter>
〈parameter>dataID〈/parameter> 〈/pages> 上面的配置中,每一個(gè)page元素,表示一個(gè)需要靜態(tài)化的頁(yè)面;name元素,用來(lái)說(shuō) 明這個(gè)頁(yè)面的主要用途;type元素用來(lái)描述這個(gè)是全頁(yè)面靜態(tài)化(ALL),還是部分頁(yè)面靜 態(tài)化(PART),另外這個(gè)參數(shù)將決定,頁(yè)面將來(lái)存儲(chǔ)的位置;url標(biāo)簽就是動(dòng)態(tài)頁(yè)面所在的地 址parameters元素是一個(gè)集合,下面的parameter元素表示需要傳入到url所指定的動(dòng) 態(tài)頁(yè)面需要的參數(shù)。 然后,"靜態(tài)頁(yè)面生成應(yīng)用"在實(shí)現(xiàn)javax. servlet. Filter接口的過(guò)濾器中發(fā)送請(qǐng) 求到動(dòng)態(tài)頁(yè)面,動(dòng)態(tài)頁(yè)面將結(jié)果響應(yīng)給靜態(tài)頁(yè)面生成應(yīng)用的過(guò)濾器;當(dāng)過(guò)濾器接收到動(dòng)態(tài) 頁(yè)面響應(yīng)時(shí),將數(shù)據(jù)流指向到配置好的靜態(tài)文件中,即將動(dòng)態(tài)頁(yè)面的處理結(jié)果輸出到靜態(tài) 頁(yè)面。 動(dòng)態(tài)頁(yè)面靜態(tài)化的粒度可以通參數(shù)來(lái)靈活選擇。 在conf ig. xml中type元素用來(lái)描述這個(gè)是全頁(yè)面靜態(tài)化(ALL),還是部分頁(yè)面靜 態(tài)化(PART),另外這個(gè)參數(shù)將決定,頁(yè)面將來(lái)存儲(chǔ)的位置。所述過(guò)濾器將從配置文件中讀 取type參數(shù),并根據(jù)type參數(shù),將文件流指向到不同的存儲(chǔ)空間。比如,全頁(yè)面靜態(tài)化的 文件放在/data/pages/all下,而部分頁(yè)面靜態(tài)化的文件放在/data/pages/parts下。
所述的靜態(tài)化策略包括 1)對(duì)每個(gè)需要靜態(tài)化的動(dòng)態(tài)頁(yè)面,每天凌晨,在用戶上班前生成好一套靜態(tài)頁(yè) 面; 2)對(duì)個(gè)別需要靜態(tài)化的動(dòng)態(tài)頁(yè)面,在策略1)的基礎(chǔ)上,還支持客戶手動(dòng)更新,更
新完畢后,重定向到新生成的靜態(tài)頁(yè)面。
上述的手動(dòng)更新,舉例來(lái)說(shuō),步驟如下 首先在crontab中配置好啟動(dòng)時(shí)間,在程序啟動(dòng)后,Main. Java先讀取conf ig. xml 中的配置信息。Main. Java發(fā)送請(qǐng)求到config. xml中配置的url地址。在url地址所在 的web應(yīng)用程序中,存在一個(gè)實(shí)現(xiàn)了 javax. servlet. Filter接口的過(guò)濾器類,以下統(tǒng)稱過(guò) 濾器,在過(guò)濾器中,也會(huì)加載config. xml中的信息,并將response的輸出流改成指向到本 地文件的文件流,靜態(tài)頁(yè)面文件存儲(chǔ)的位置由config. xml中的type屬性來(lái)判斷,從而決定 是放在/data/pages/all下還是/data/pages/parts下。這樣,當(dāng)處理完請(qǐng)求以后,就會(huì)將 結(jié)果輸出到指定的文件中。 然后,當(dāng)客戶訪問(wèn)這個(gè)原有應(yīng)用的某個(gè)配置好的地址時(shí),就將訪問(wèn)某個(gè)生成好的
4靜態(tài)頁(yè)面。當(dāng)需要更新頁(yè)面上的數(shù)據(jù)時(shí),點(diǎn)擊頁(yè)面上的"刷新數(shù)據(jù)"按鈕,將訪問(wèn)動(dòng)態(tài)頁(yè)面 的url地址(以下與上一步基本相同)再由過(guò)濾器將response的輸出流指向到web服務(wù) 器的指定文件中,當(dāng)動(dòng)態(tài)頁(yè)面將數(shù)據(jù)從數(shù)據(jù)庫(kù)中撈出來(lái),并生成好相應(yīng)留以后,就會(huì)把輸出 寫(xiě)到指定的文件中。當(dāng)文件生成好以后,過(guò)濾器再將請(qǐng)求重定向到新的靜態(tài)頁(yè)面,再有服務(wù) 器響應(yīng)到客戶端,這時(shí)客戶就可以訪問(wèn)新的頁(yè)面(數(shù)據(jù))了。 本方法的有益效果是,采用基于J2EE的動(dòng)態(tài)頁(yè)面靜態(tài)化解決方案,程序上不做修 改,就能夠很好的減少應(yīng)用服務(wù)器的壓力和數(shù)據(jù)庫(kù)連接資源的競(jìng)爭(zhēng)。相比原來(lái)的直接訪問(wèn) WEB應(yīng)用的動(dòng)態(tài)頁(yè)面,WEB服務(wù)器的高峰期的cpu使用率由原來(lái)的100%降到了 60%。相關(guān) 功能對(duì)數(shù)據(jù)庫(kù)連接資源的競(jìng)爭(zhēng)由原來(lái)的80%降到了 0%,因?yàn)檫@時(shí)沒(méi)有數(shù)據(jù)庫(kù)連接。高并 發(fā)環(huán)境下響應(yīng)速度快。
4
圖1.系統(tǒng)架構(gòu)圖; 圖2.動(dòng)態(tài)頁(yè)面靜態(tài)化實(shí)施流程圖。
5具體實(shí)施例方式
下面結(jié)合附圖和具體實(shí)施方式
對(duì)本發(fā)明進(jìn)一步說(shuō)明。 本方法是基于由數(shù)據(jù)庫(kù)服務(wù)器組、應(yīng)用服務(wù)器組、客戶端三部分組成的系統(tǒng)。 >系統(tǒng)架構(gòu) 系統(tǒng)架構(gòu)示意圖如圖1所示; 1.數(shù)據(jù)庫(kù)服務(wù)器組 應(yīng)用服務(wù)器組上數(shù)據(jù)庫(kù)實(shí)例,如ORACLE等。
2.應(yīng)用服務(wù)器組 應(yīng)用服務(wù)器組上部署WEB中間件,如WEBLOGIC等,WEB應(yīng)用和生成靜態(tài)頁(yè)面應(yīng)用。
3.客戶端 客戶端使用WEB瀏覽器訪問(wèn)系統(tǒng)。
>靜態(tài)頁(yè)面生成策略
策略一 對(duì)每個(gè)需要靜態(tài)化的動(dòng)態(tài)頁(yè)面,每天凌晨,在用戶上班前生成好一套靜態(tài)頁(yè)面。
策略二 對(duì)個(gè)別需要靜態(tài)化的動(dòng)態(tài)頁(yè)面,在策略一的基礎(chǔ)上,還支持客戶手動(dòng)更新,更新完 畢后,重定向到新生成的靜態(tài)頁(yè)面。 動(dòng)態(tài)頁(yè)面生成靜態(tài)頁(yè)面的方法1、模擬客戶端請(qǐng)求,發(fā)送請(qǐng)求到原來(lái)的動(dòng)態(tài)頁(yè)面 例如JSP,并將響應(yīng)對(duì)象里的輸出流指向到本地文件。2、WEB應(yīng)用讀取由靜態(tài)頁(yè)面生成應(yīng)用 生成的靜態(tài)頁(yè)面。 首先,讀取配置文件獲取生成靜態(tài)頁(yè)面的相關(guān)參數(shù);然后,靜態(tài)頁(yè)面生成應(yīng)用,在 過(guò)濾器中發(fā)送請(qǐng)求到動(dòng)態(tài)頁(yè)面,動(dòng)態(tài)頁(yè)面將結(jié)果響應(yīng)給靜態(tài)頁(yè)面生成應(yīng)用的過(guò)濾器;當(dāng)過(guò) 濾器接收到動(dòng)態(tài)頁(yè)面響應(yīng)時(shí),將數(shù)據(jù)流指向到配置好的靜態(tài)文件中,即將動(dòng)態(tài)頁(yè)面的處理 結(jié)果輸出到靜態(tài)頁(yè)面。靜態(tài)頁(yè)面生成好以后,用戶對(duì)WEB應(yīng)用的動(dòng)態(tài)頁(yè)面地址的訪問(wèn)就會(huì)
5重定向響應(yīng)的靜態(tài)頁(yè)面。 本例中,動(dòng)態(tài)頁(yè)面靜態(tài)化具體的實(shí)施步驟 自主實(shí)現(xiàn)部分通過(guò)過(guò)濾器截獲請(qǐng)求,然后重定向數(shù)據(jù)流到指點(diǎn)文件。實(shí)現(xiàn)核心細(xì) 節(jié) RequestDispatcher rd = sc. getRequestDispatcher(url); final ByteArrayOutputStream os = new ByteArrayOutputStream(); final ServletOutputStream stream = new ServletOutputStream(){ public void write(byte[]data, int offset, int length){ os. write(data, offset,length); } public void write (int b) throws IOExc印tion( os. write (b); } }; final PrintWriter pw = new PrintWriter(new OutputStreamWriter(os)); HttpServletResponseWrapper r印=new HttpServletResponseWrapper (respon se) { public ServletOutputStream getOutputStream(){ return stream ; } public PrintWriter getWriter()( return pw ; } }; response. setHeader(〃 Content-Type" , 〃 text/html ;charset = gbk〃 ); response. setContentType(〃 text/html ;charset = gbk〃 ); rd. include (request, r印); pw. flush (); File0utputStream fos = new FileOutputStream(fileName); os. writeTo(fos); fos. close (); 在應(yīng)用服務(wù)器組上部署靜態(tài)頁(yè)面生成應(yīng)用;先部署WEB應(yīng)用,再部署靜態(tài)頁(yè)面生
成應(yīng)用,讓后配置NFS映射。 對(duì)于不同的動(dòng)態(tài)頁(yè)面配置不同的靜態(tài)化策略;由于兩種策略的不動(dòng)點(diǎn)就是是否支 持手工刷新,那么就對(duì)需要手工刷新的頁(yè)面上加上主動(dòng)刷新按鈕即可。采取策略的依據(jù)主 要是根據(jù)用戶的需求。其次,就是將對(duì)應(yīng)的動(dòng)態(tài)頁(yè)面生成靜態(tài)頁(yè)面對(duì)系統(tǒng)資源的占用情況。
針對(duì)動(dòng)態(tài)化對(duì)象選擇靜態(tài)化頁(yè)面的粒度;當(dāng)動(dòng)態(tài)頁(yè)面中只有部分?jǐn)?shù)據(jù)響應(yīng)慢時(shí), 就對(duì)這塊數(shù)據(jù)靜態(tài)化,粒度可以定位單個(gè)或者部分?jǐn)?shù)據(jù)。當(dāng)大部分?jǐn)?shù)據(jù)響應(yīng)比較慢時(shí),可以 對(duì)整個(gè)頁(yè)面靜態(tài)化,粒度可以定位這個(gè)頁(yè)面。
權(quán)利要求
一種基于J2EE的WEB動(dòng)態(tài)頁(yè)面靜態(tài)化解決方法,其特征是步驟包括1)由靜態(tài)頁(yè)面生成應(yīng)用模擬客戶端請(qǐng)求,發(fā)送請(qǐng)求到原有的動(dòng)態(tài)頁(yè)面,并將響應(yīng)對(duì)象里的輸出流指向到本地文件;2)WEB應(yīng)用讀取由“靜態(tài)頁(yè)面生成應(yīng)用”生成的靜態(tài)頁(yè)面;靜態(tài)頁(yè)面生成好以后,用戶對(duì)WEB應(yīng)用的動(dòng)態(tài)頁(yè)面地址的訪問(wèn)就會(huì)重定向響應(yīng)的靜態(tài)頁(yè)面。
2. 根據(jù)權(quán)利要求1所述的基于J2EE的WEB動(dòng)態(tài)頁(yè)面靜態(tài)化解決方法,其特征是 首先,讀取配置文件獲取生成靜態(tài)頁(yè)面的相關(guān)參數(shù);然后,然后靜態(tài)頁(yè)面生成應(yīng)用在過(guò)濾器中發(fā)送請(qǐng)求到動(dòng)態(tài)頁(yè)面,動(dòng)態(tài)頁(yè)面將結(jié)果響應(yīng) 給"靜態(tài)頁(yè)面生成應(yīng)用"的過(guò)濾器;當(dāng)過(guò)濾器接收到動(dòng)態(tài)頁(yè)面響應(yīng)時(shí),將數(shù)據(jù)流指向到配置 好的靜態(tài)文件中,即將動(dòng)態(tài)頁(yè)面的處理結(jié)果輸出到靜態(tài)頁(yè)面。
3. 根據(jù)權(quán)利要求1所述的基于J2EE的WEB動(dòng)態(tài)頁(yè)面靜態(tài)化解決方法,其特征是通參數(shù) 來(lái)靈活選擇動(dòng)態(tài)頁(yè)面靜態(tài)化的粒度。
4. 根據(jù)權(quán)利要求1所述的基于J2EE的WEB動(dòng)態(tài)頁(yè)面靜態(tài)化解決方法,其特征是所述靜 態(tài)頁(yè)面的生成策略即靜態(tài)化的策略包括a) 對(duì)每個(gè)需要靜態(tài)化的動(dòng)態(tài)頁(yè)面,每天凌晨,在用戶上班前生成好一套靜態(tài)頁(yè)面;b) 對(duì)個(gè)別需要靜態(tài)化的動(dòng)態(tài)頁(yè)面,在策略b)的基礎(chǔ)上,還支持客戶手動(dòng)更新,更新完 畢后,重定向到新生成的靜態(tài)頁(yè)面;手動(dòng)更新方法,步驟如下1) 首先配置好啟動(dòng)時(shí)間,程序啟動(dòng)后,先讀取配置文件中的配置信息 先發(fā)送請(qǐng)求到配置文件中配置的url地址;在url地址所在的web應(yīng)用程序中,存在實(shí)現(xiàn)了 javax. servlet. Filter接口的過(guò)濾器類,在該過(guò)濾器中,也會(huì)加載配置文件中的信 息,并將response的輸出流改成指向到本地文件的文件流,靜態(tài)頁(yè)面存儲(chǔ)的位置由配置文 件來(lái)判斷,當(dāng)處理完請(qǐng)求以后,就會(huì)將結(jié)果輸出到指定的文件中;2) 然后,當(dāng)這個(gè)原有應(yīng)用的某個(gè)配置好的地址被訪問(wèn)時(shí),就將訪問(wèn)生成好的靜態(tài)頁(yè)面; 當(dāng)需要更新頁(yè)面上的數(shù)據(jù)時(shí),則刷新數(shù)據(jù)來(lái)訪問(wèn)到動(dòng)態(tài)頁(yè)面的url地址,方法與步驟1)相 同;再由過(guò)濾器將response的輸出流指向到web服務(wù)器的指定文件中,當(dāng)動(dòng)態(tài)頁(yè)面將數(shù)據(jù) 從數(shù)據(jù)庫(kù)中撈出來(lái),并生成好相應(yīng)留以后,就會(huì)把輸出寫(xiě)到指定的文件中;當(dāng)文件生成好以 后,過(guò)濾器再將請(qǐng)求重定向到新的靜態(tài)頁(yè)面,再由服務(wù)器響應(yīng)到客戶端,這時(shí)就可以訪問(wèn)新 的頁(yè)面/數(shù)據(jù)了。
全文摘要
一種基于J2EE的WEB動(dòng)態(tài)頁(yè)面靜態(tài)化解決方法,步驟包括1)由靜態(tài)頁(yè)面生成應(yīng)用模擬客戶端請(qǐng)求,發(fā)送請(qǐng)求到原有的動(dòng)態(tài)頁(yè)面,并將響應(yīng)對(duì)象里的輸出流指向到本地文件;2)WEB應(yīng)用讀取由“靜態(tài)頁(yè)面生成應(yīng)用”生成的靜態(tài)頁(yè)面;靜態(tài)頁(yè)面生成好以后,用戶對(duì)WEB應(yīng)用的動(dòng)態(tài)頁(yè)面地址的訪問(wèn)就會(huì)重定向響應(yīng)的靜態(tài)頁(yè)面。本方法采用基于J2EE的動(dòng)態(tài)頁(yè)面靜態(tài)化解決方案,程序上不做修改,就能夠很好的減少應(yīng)用服務(wù)器的壓力和數(shù)據(jù)庫(kù)連接資源的競(jìng)爭(zhēng)。相比原來(lái)的直接訪問(wèn)WEB應(yīng)用的動(dòng)態(tài)頁(yè)面,WEB服務(wù)器的高峰期的cpu使用率由原來(lái)的100%降到了60%。相關(guān)功能對(duì)數(shù)據(jù)庫(kù)連接資源的競(jìng)爭(zhēng)由原來(lái)的80%降到了0%,因?yàn)檫@時(shí)沒(méi)有數(shù)據(jù)庫(kù)連接。高并發(fā)環(huán)境下響應(yīng)速度快。
文檔編號(hào)G06F17/30GK101789012SQ201010105969
公開(kāi)日2010年7月28日 申請(qǐng)日期2010年2月3日 優(yōu)先權(quán)日2010年2月3日
發(fā)明者余志剛, 蘭清, 劉樹(shù)權(quán), 孫力斌, 龐海東, 沈鵬程, 馬榮海 申請(qǐng)人:南京聯(lián)創(chuàng)科技集團(tuán)股份有限公司