java讀取PI數(shù)據(jù)庫測點(diǎn)值_第1頁
java讀取PI數(shù)據(jù)庫測點(diǎn)值_第2頁
java讀取PI數(shù)據(jù)庫測點(diǎn)值_第3頁
java讀取PI數(shù)據(jù)庫測點(diǎn)值_第4頁
java讀取PI數(shù)據(jù)庫測點(diǎn)值_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

Java讀取PI數(shù)據(jù)庫測點(diǎn)值

最近公司組織培訓(xùn)PI數(shù)據(jù)庫,在聽課之余試驗(yàn)了一下java直接讀取PI數(shù)據(jù)庫。

1.安裝數(shù)據(jù)庫。

安裝osi,啟動(dòng)PIPerfMon_Basic.bat,使用processbook繪制一個(gè)趨勢圖,加入幾個(gè)例

子測點(diǎn),如“CDT158”,如圖:

2.Piapi簡介

利用PIAPI直接操作PI,安裝PI數(shù)據(jù)庫后會(huì)有一個(gè)piapi32.dll,提供了.net讀取的接口。

3.Jnative簡介

川ative是一種能夠使Java語言使調(diào)用DLL的一種技術(shù),對JNI進(jìn)行了封裝。我們將下載

的jnative.jar解壓后,有一個(gè)jNativeCpp.dll,將其拷入C:\windows\system32下,并將

jnative.jar加載到我們項(xiàng)目中來。準(zhǔn)備工作就緒。

4.程序讀取。

要點(diǎn)記錄:

1.閱讀API。打開PISystem->aboutPISDK->ViewHelp,即可看到api文檔。

PI數(shù)據(jù)庫的數(shù)據(jù)分別存儲(chǔ)在Snapshot或者Archive中,一個(gè)是快照一個(gè)是檔案文

件,這樣做是為了方便PI數(shù)據(jù)庫對數(shù)據(jù)進(jìn)行壓縮,那么自然對數(shù)據(jù)庫的讀取也分為對

Snapshot和Archive讀取.snapshot和archive的值都是用PIValue的形式表

示的,PIValue對象包括了數(shù)值和時(shí)間。

其中Pi的api中,用到最多的函數(shù)組是timefunctions、archivefunctions、snapshot

functions?timefunctions包含很多對時(shí)間處理的函數(shù);archivefunctions包含了對檔

案文件的讀寫的函數(shù);snapshotfunctions包含了對快照的讀取函數(shù)。

2.時(shí)間處理。

.net調(diào)用piapi傳入時(shí)間類型時(shí),是將.net的Date類型轉(zhuǎn)為int數(shù)組,并可以直接將

int數(shù)組傳入方法。Java使用時(shí)間類型稍微復(fù)雜一些,需要調(diào)用pitmjntsec方法,該

方法幫助如下:

PIVOIDpitm_intsec(

int32PIPTR*timedate,

int32timearray[6]);

Returns

None

Arguments

timedate(returned)

PItimestamp

timearray(passed)

表示該方法2個(gè)參數(shù),第一個(gè)是一個(gè)int型數(shù)組(指針),第二個(gè)參數(shù)是一個(gè)int型

數(shù)組。第一個(gè)參數(shù)是返回參數(shù),第二個(gè)參數(shù)是傳入?yún)?shù)。

注意,傳入int32timearray⑹參數(shù)時(shí),必須使用Pointer模擬指針,并且,循環(huán)設(shè)置

數(shù)組元素時(shí),注意pointer.setlntAt(intoffset,intvalue),offset的下標(biāo),比如第一個(gè)元素

是0,第二個(gè)元素不是1,要看int占幾個(gè)字節(jié),int在。Net中占4個(gè)字節(jié),所以第二個(gè)

元素是4,第三個(gè)元素是8。這是java調(diào)用.net時(shí),傳入和讀取數(shù)組時(shí)需要注意的事項(xiàng)。

3.Java與。Net類型匹配。

Api里的除字符串外的指針類型,對應(yīng)jnative的pointer。

Api里的int>float等基本類型和String類型,在java中必須指定類型(Type.INT)

Api里的date,是用int口表示的,詳見上條。

4.傳值與返回值。

Jnative對象調(diào)用invoke后會(huì)有返回,對照api,一般返回值是調(diào)用狀態(tài)。如果要查詢一

個(gè)測點(diǎn)值,返回值是通過傳入的pointer對象讀取出來的。

源代碼如下:

importjava?text.ParseException;

importjava,text.SimpleDateFormat;

importjava?util.Calendar;

importjava.util.Date;

importjava?util.regex.Matcher;

importjava.util.regex.Pattern;

importorg.xvolks.jnative.JNative;

importorg?xvolks.jnative.Type;

importorg.xvolks.jnative.exceptions.NativeException;

importorg.xvolks,jnative.pointers.Pointer;

importorg.xvolks,jnative.pointers.memory.HeapMemoryBlock;

importorg.xvolks.jnative.pointers.memory.MemoryBlock;

importorg.xvolks?jnative.pointers.memory.MemoryBlockFactory;

★★

*Java通過jnative調(diào)用pi實(shí)時(shí)數(shù)據(jù)庫dll類庫piapi32.dll獲取tag標(biāo)簽數(shù)據(jù)

*

★/

publicclassPlClientUtil{

privatestaticPlClientUtilpiClientUtil=newPlClientUtil();

publicstaticvoidmain(String[]args){

//PlClientUtil.getPlClientUtil().getTimeFromlnt("");

//PlClientUtil.getPlClientUtil().getTagValue(npicompress_Compressi

onRatio_CALCT,);

//PlClientUtil.getPlClientUtil().getTagValueByTime(nCDT158H,n2012-

05-17;

//PlClientUtil.getPIClientUtil().getTagValuesByTimeToTime(HCDT

11,n

158“,“2012-05-1711:11:ll,,2012-05-1718:00:00z2);

PlClientUtil.getPIClientUtil().getTagMaxValue("CDT158”,“2012-0

nH

5-17ll:ll:llz2012-05-1718:00:00”);

//PlClientUtil.getPIClientUtil().getTimeSecint(1);

//PlClientUtil.getPIClientUtil().getPiTime("“);

//PlClientUtil.getPIClientUtil().getTimelntSec(n2012-03-03

12:00:00°);

)

publicstaticPlClientUtilgetPIClientUtil(){

returnpiClientUtil;

)

privatePlClientUtil(){

try(

//*********************連接p[數(shù)據(jù)庫

*★★★*************★*★******//

//

***★*****★*****★*★★★*★***★*****★*★*★*****★*****★*★★★*★****//

JNativemessageBox=newJNative(npiapi32.dlln,

“piujsetservernode“);

messageBox.setRetVal(Type.INT);

messageBox.setParameter(0,Type.STRING,”");//月艮

務(wù)器ip

messageBox.invoke();

System.out.printIn(npiut_setservernode:H+messageBox.getRetValAsInt

0);

}catch(NativeExceptione){

//TODOAuto-generatedcatchblock

e,printStackTrace();

}catch(IllegalAccessExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

)

*獲取tag最新值

*@paramtagName

*?return

*/

publicfloatgetTagValue(StringtagName){

try(

JNativemessageBox=newJNative(npiapi32.dlln,

,Tpipt_findpoinf*);

messageBox.setRetVal(Type.INT);

messageBox.setParameter(0rType.STRING,tagName);

Pointerp=newPointer(newHeapMemoryBlock(1024));

messageBox.setParameter(1,p);

messageBox.invoke();

intptld=p.getAsInt(0);

if(0==messageBox.getRetValAsInt()){

System.out.printIn(”測點(diǎn)id:n+ptld);

n1

messageBox=newJNative(piapi32.dll'z

npisn_getsnapshotn);

messageBox.setRetVal(Type.工NT);

messageBox.setParameter(0,Type.INTZ""+ptld);

Pointerpp=newPointer(newHeapMemoryBlock(1024));

messageBox.setParameter(1zpp);

messageBox.setParameter(2ZnewPointer(new

HeapMemoryBlock(1024)));

//messageBox.setParameter(3,newPointer(new

HeapMemoryBlock(1024)));

//messageBox.setParameter(4,newPointer(new

HeapMemoryBlock(1024)));

messageBox.invoke();

if(0==messageBox.getRetValAsInt()){

System,out.printin(tagName+”測點(diǎn)

值:n+pp.getAsFloat(0));

returnpp.getAsFloat(0);

)

}else{

System.out.printIn("查詢測點(diǎn)失敗”);

}

}catch(NativeExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IllegalAccessExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

returnOF;

*獲取測點(diǎn)制定時(shí)間點(diǎn)的值

*@paramtagName

*@return

*/

publicfloatgetTagValueByTime(StringtagName,Stringtime){

try(

n

JNativemessageBox=newJNative(piapi32.dll"z

npipt_findpoint11);

messageBox.setRetVal(Type.INT);

messageBox.setParameter(0,Type.STRING,tagName);

Pointerp=newPointer(newHeapMemoryBlock(8));

messageBox.setParameter(lzp);

messageBox.invoke();

intptld=p.getAsInt(0);

if(0==messageBox.getRetValAsInt()){

System,out.printIn(“測點(diǎn)id:n4-ptlci);

messageBox=newJNative(npiapi32.dll",npiar_valueH);

messageBox.setRetVal(Type.INT);

messageBox.setParameter(0zType.工NT,""+ptld);

Pointerpp=newPointer(newHeapMemoryBlock(1024));

Pointerpp_status=newPointer(new

HeapMemoryBlock(1024));

messageBox.setParameter(lzgetTimelntSec(time));

messageBox.setParameter(2,Type.工NT,3+"”);

messageBox.setParameter(3,pp);

messageBox.setParameter(4zpp_status);

messageBox.invoke();

if(0==messageBox.getRetValAsInt()){

System,out.printIn(tagName+”測點(diǎn)

值:"+pp.getAsFloat(0));

System,out.printin(tagName+f,status

值:n+pp_status.getAsInt(0));

returnpp.getAsFloat(0);

}else{

System,out.printin(tagName+”查詢返回

值:n+messageBox.getRetValAsInt());

)

}else{

System.out.printin("查詢測點(diǎn)失敗”);

)

}catch(NativeExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IllegalAccessExceptione){

//TODOAuto-generatedcatchblock

e,printStackTrace();

)

returnOF;

)

*查詢測點(diǎn)某時(shí)間段內(nèi)最小值

*?paramtagName

*@paramtimel

*?paramtime2

*/

publicvoidgetTagMinValue(StringtagName,StringtimelfString

time2){

intcode=1;

this.getTagValuesByTimeToTime(tagName,timelztime2zcode);

)

**

*查詢測點(diǎn)某時(shí)間段內(nèi)最大值

*@paramtagName

*@paramtimel

*?paramtime2

*/

publicvoidgetTagMaxValue(StringtagName,StringtimelyString

time2){

intcode=2;

this.getTagValuesByTimeToTime(tagName,timelztime2zcode);

)

/**

*查詢測點(diǎn)某時(shí)間段內(nèi)平均值

*@paramtagName

*@paramtimel

*?paramtime2

*/

publicvoidgetTagAvgValue(StringtagName,StringtimelzString

time2){

intcode=5;

this.getTagValuesByTimeToTime(tagName,timel,time2,code);

)

/**

*

火@paramtagName

*@return

*/

publicvoidgetTagValuesByTimeToTime(StringtagName,String

timel,Stringtime2zintcode){

try(

nn

JNativemessageBox=newJNative(piapi32.dllr

"pipt_findpoinf1);

messageBox.setRetVal(Type.INT);

messageBox.setParameter(0,Type.STRING,tagName);

Pointerp=newPointer(newHeapMemoryBlock(1024));

messageBox.setParameter(1,p);

messageBox.invoke();

intptld=p.getAsInt(0);

if(0==messageBox.getRetValAsInt()){

System.out.printIn(“測點(diǎn)id:H+ptId);

messageBox=newJNative(npiapi32.dll'*,

npiar_summaryf,);

messageBox.setRetVal(Type.INT);

//下面開始設(shè)置參數(shù)

messageBox.setParameter(0zType.INTZ""+ptld);

Pointerp_startTime=this.getTimeIntSec(timel);

Pointerp_endTime=this.getTimelntSec(time2);

Pointerp_retVal=newPointer(newHeapMemoryBlock(8));

Pointerp_pctGood=newPointer(new

HeapMemoryBlock(8));

messageBox.setParameter(1,p_startTime);

messageBox.setParameter(2,p_endTime);

messageBox.setParameter(3,p_retVal);

messageBox.setParameter(4zp_pctGood);

nn

messageBox.setParameter(5,Type.INTzcode+);

messageBox.invoke();

if(0==messageBox.getRetValAsInt()){

System.out.printin(tagName+”測點(diǎn)返回

值:n+p_retVal.getAsFloat(0));

}else{

System.out.printIn(tagName+”查詢狀態(tài)

值:n+messageBox.getRetValAsInt());

)

}else{

System.out.printIn("查詢測點(diǎn)失敗");

)

}catch(NativeExceptione){

e.printStackTrace();

}catch(IllegalAccessExceptione){

e.printStackTrace();

)

)

/**

*將時(shí)間串轉(zhuǎn)換為int

*格式:11-Aug-1718:00:00

*@paramtime

*@return

*/

publicintgetPiTime(Stringtime){

//獲取時(shí)間點(diǎn)

try(

Stringtt=time;

Pointerpointer=new

Pointer(MemoryBlockFactory.createMemoryBlock(8));

H

JNativemessageBox=newJNative(piapi32.dll"z

npitm_parsetimen);

messageBox.setRetVal(Type.工NT);

messageBox.setParameter(0zType.STRING,tt);

messageBox.setParameter(1rType?工NT,"0");

messageBox.setParameter(2,pointer);

messageBox.invoke();

if(0==messageBox.getRetValAsInt()){

System.out.printIn("執(zhí)行成功,getPiTime結(jié)果是:“+

pointer.getAsInt(0));

returnpointer.getAsInt(0);

}else{

System.out.printIn("執(zhí)行失敗");

return0;

)

}catch(NativeExceptione){

e.printStackTrace();

return0;

}catch(IllegalAccessExceptione){

e,printStackTrace();

return0;

}

)

*將整數(shù)轉(zhuǎn)換為時(shí)間,同上方法互逆

*?paramtime

*@return

*/

publicStringgetTimeFromlnt(inttime){

try{

Pointerpointer=new

Pointer(MemoryBlockFactory.createMemoryBlock(8));

H

JNativemessageBox=newJNative(piapi32.dll"z

npitm_formtimen);

messageBox.setRetVal(Type.INT);

messageBox.setParameter(0,

Type.工NT,this.getPiTime(”“)+"");

messageBox.setParameter(1,pointer);

messageBox.setParameter(2z19);

messageBox.invoke();

System,out.printIn("結(jié)果是:"+pointer.getAsString());

returnpointer.getAsString();

}catch(NativeExceptione){

e.printStackTrace();

}catch(IllegalAccessExceptione){

e.printStackTrace();

}

return

)

/**

*將P工日期轉(zhuǎn)為數(shù)組型

*?paramtime

*?return

*/

publicint[]getTimeSecint(inttime){

int[]time_arrays=newint[6];

try(

Pointerpointer=new

Pointer(MemoryBlockFactory.createMemoryBlock(4*

time_arrays.length));

JNativemessageBox=newJNative(Hpiapi32.dllH,

Hpitm_secintn);

messageBox.setParameter(0,

Type?工NT,this.getTimelntSec(n2012-05-17

ll:ll:lln).getAsInt(0)+nn);

messageBox.setParameter(1,pointer);

messageBox.invoke();

for(inti=0;i<time_arrays.length;i++){

time_arrays[i]=pointer.getAsInt(i*4);

}

returntime_arrays;

}catch(NativeExceptione){

e.printStackTrace();

}catch(IllegalAccessExceptione){

e.printStackTrace();

}

returnnull;

)

/**

*將日期轉(zhuǎn)為數(shù)組型,與pitm_secint互相逆

*@paramtime

*?return

*/

publicPointergetTimelntSec(Stringtime){

PIDatedate=PIDate.getPIDate(time);

try(

inttime_array[]=newint[]{date.getMonth(),date.getDay(),

date,getYear(),date.getHour(),date.getMinutes(),

date.getSeconds()};

Pointerpointer=new

Pointer(MemoryBlockFactory.createMemoryBlock(8));

Pointerpointer_array=new

Pointer(MemoryBlockFactory.createMemoryBlock(time_array.length*4))

r

Hn

JNativemessageBox=newJNative(piapi32.dllz

upitm_intsecn);

/**這種方法也可以

pointer_array.setlntAt(0,2012);

pointer_array.setIntAt(4,5);

pointer_array.setlntAt(8,16);

pointer_array.setlntAt(12,21);

pointer_array.setlntAt(16,33);

pointer_array.setlntAt(20,33);

**/

//初始化數(shù)組

for(inti=0;i<time_array.length;i++){

pointer_array.setlntAt(4*i,time_array[i]);

}

messageBox.setParameter(0,pointer);

messageBox.setParameter(1,pointer_array);

messageBox.invoke();

System.out.printin(ngetTimeIntSec=n+pointer.getAsInt(0));

returnpointer;

}catch(NativeExceptione){

e.printStackTrace();

}catch(IllegalAccessExceptione){

e,printStackTrace();

)

returnnull;

)

/**

*不能直接返回

*@paramtime

*?return

*/

publicintgetTimelntSecForlnt(Stringtime){

PIDatedate=PIDate.getPIDate(time);

try(

inttime_array[]=newint[]{date.getMonth(),date.getDay(),

date.getYear(),date.getHour(),date.getMinutes(),

date,getSeconds()};

Pointerpointer=new

Pointer(MemoryBlockFactory.createMemoryBlock(8));

Pointerpointer_array=new

Pointer(MemoryBlockFactory.createMemoryBlock(time_array.length*4))

r

JNativemessageBox=newJNative(Hpiapi32.dll*',

Hpitm_intsecn);

//初始化數(shù)組

for(inti=0;i<time_array.length;i++){

pointer_array.setlntAt(4*iztime_array[i]);

)

messageBox.setParameter(0zpointer);

messageBox.setParameter(1,pointer_array);

messageBox.invoke();

System.out.printIn(ngetTimeIntSec="+pointer.getAsInt(0));

returnpointer.getAsInt(0);

}catch(NativeExceptione){

e.printStackTrace();

}catch(IllegalAccessExceptione){

e.printStackTrace();

}

return0;

時(shí)間工具類:

importjava.util.regex.Matcher;

importjava.utiI.regex.Pattern;

publicclassPIDate{

privateintyear;

privateintmonth;

privateintday;

privateinthour;

privateintminutes;

privateintseconds;

publicintgetYear(){

returnyear;

)

publicvoidsetYear(intyear){

this.year=year;

)

publicintgetMonth(){

returnmonth;

}

publicvoidsetMonth(intmonth){

this.month=month;

)

publicintgetDayO{

returnday;

)

publicvoidsetDay(intday){

this.day=day;

)

publicintgetHour(){

returnhour;

publicvoidsetHour(inthour){

this.hour=hour;

)

publicintgetMinutes(){

returnminutes;

)

publicvoidsetMinutes(intminutes){

this.minutes=minutes;

)

publicintgetSeconds(){

returnseconds;

)

publicvoidsetSeconds(intseconds){

this.seconds=seconds;

)

publicstaticPIDategetPIDate(Stringtime){

Patternp=Ppile("(\\d{4})-(\\d{l.2})-(\\d{l/2})

(\\d{l,2}):(\\d{lz2)):(\\d{l,2})");

Matcherm=p.matcher(time);

PIDatedate=newPIDate();

if(m.find()){

/*System.out.println("H期:"+m.group());

System.out.println("^:n+m.group(l));

System.out.printin("月:"+m.group(2));

System.out.println("日:"+m.group(3));

System.out.println("時(shí):”+m.group⑷);

System.out.printin(“分:“+m.group(5));

System.out.printin(”秒:“+m.group⑹);*/

date.setYear(lnteger.parselnt(m.group(l)));

date.setMonth(lnteger.parselnt(m.group(2)));

date.setDay(lnteger.parselnt(m.group(3)));

date.setHour(lnteger.parselnt(m.group(4)));

date.setMinutes(lnteger.parselnt(m.group(5)));

date.setSeconds(lnteger.parselnt(m.group(6)));

)

returndate;

)

}

附錄資料:

java處理高并發(fā)高負(fù)載類網(wǎng)站的優(yōu)化方法

java處理高并發(fā)高負(fù)載類網(wǎng)站中數(shù)據(jù)庫的設(shè)計(jì)方法(java教程,java處理大量數(shù)

據(jù)Java高負(fù)載數(shù)據(jù))

-:高并發(fā)高負(fù)載類網(wǎng)站關(guān)注點(diǎn)之?dāng)?shù)據(jù)庫

沒錯(cuò),首先是數(shù)據(jù)庫,這是大多數(shù)應(yīng)用所面臨的首個(gè)尤其是的應(yīng)

SPOFoWeb2.0

用,數(shù)據(jù)庫的響應(yīng)是首先要解決的。一般來說MySQL是最常用的,可能最初是

一個(gè)mysql主機(jī),當(dāng)數(shù)據(jù)增加到100萬以上,那么,MySQL的效能急劇下降。

常用的優(yōu)化措施是M-S(主-從)方式進(jìn)行同步復(fù)制,將查詢和操作和分別在不

同的服務(wù)器上進(jìn)行操作。我推薦的是M-M-Slaves方式,2個(gè)主Mysql,多個(gè)

Slaves,需要注意的是,雖然有2個(gè)Master,但是同時(shí)只有1個(gè)是Active,我

們可以在一定時(shí)候切換。之所以用個(gè),是保證不會(huì)又成為系統(tǒng)的

2MMSPOFo

Slaves可以進(jìn)一步負(fù)載均衡,可以結(jié)合LVS,從而將select操作適當(dāng)?shù)钠胶獾讲?/p>

同的slaves上。以上架構(gòu)可以抗衡到一定量的負(fù)載,但是隨著用戶進(jìn)一步增加,

你的用戶表數(shù)據(jù)超過1千萬這時(shí)那個(gè)M變成了SPOF。你不能任意擴(kuò)充Slaves,

否則復(fù)制同步的開銷將直線上升,怎么辦?我的方法是表分區(qū),從業(yè)務(wù)層面上進(jìn)

行分區(qū)。最簡單的,以用戶數(shù)據(jù)為例。根據(jù)一定的切分方式,比如id,切分到

不同的數(shù)據(jù)庫集群去。

全局?jǐn)?shù)據(jù)庫用于meta數(shù)據(jù)的查詢。缺點(diǎn)是每次查詢,會(huì)增加一次,比如你要查

一個(gè)用戶nightsailer,你首先要到全局?jǐn)?shù)據(jù)庫群找到nightsailer對應(yīng)的cluster

id,然后再到指定的cluster找到nightsailer的實(shí)際數(shù)據(jù)。每個(gè)cluster可以用

m-m方式,或者m-m-slaves方式。這是一個(gè)可以擴(kuò)展的結(jié)構(gòu),隨著負(fù)載的增

加,你可以簡單的增加新的mysqlcluster進(jìn)去。

需要注意的是:1、禁用全部autojncrement的字段2、id需要采用通用的算

法集中分配3、要具有比較好的方法來監(jiān)控mysql主機(jī)的負(fù)載和服務(wù)的運(yùn)行狀

態(tài)。如果你有30臺(tái)以上的mysql數(shù)據(jù)庫在跑就明白我的意思了。4、不要使用

持久性鏈接(不要用pconnect),相反,使用sqlrelay這種第三方的數(shù)據(jù)庫鏈接

池,或者干脆自己做,因?yàn)閜hp4中mysql的鏈接池經(jīng)常出問題。二:高并發(fā)

高負(fù)載網(wǎng)站的系統(tǒng)架構(gòu)之HTML靜態(tài)化

其實(shí)大家都知道,效率最高、消耗最小的就是純靜態(tài)化,所以我們盡可能使我們

的網(wǎng)站上的頁面采用靜態(tài)頁面來實(shí)現(xiàn),這個(gè)最簡單的方法其實(shí)也是最有效的方

法。但是對于大量內(nèi)容并且頻繁更新的網(wǎng)站,我們無法全部手動(dòng)去挨個(gè)實(shí)現(xiàn),于

是出現(xiàn)了我們常見的信息發(fā)布系統(tǒng)CMS,像我們常訪問的各個(gè)門戶站點(diǎn)的新聞

頻道,甚至他們的其他頻道,都是通過信息發(fā)布系統(tǒng)來管理和實(shí)現(xiàn)的,信息發(fā)布

系統(tǒng)可以實(shí)現(xiàn)最簡單的信息錄入自動(dòng)生成靜態(tài)頁面,還能具備頻道管理、權(quán)限管

理、自動(dòng)抓取等功能,對于一個(gè)大型網(wǎng)站來說,擁有一套高效、可管理的CMS

是必不可少的。除了門戶和信息發(fā)布類型的網(wǎng)站,對于交互性要求很高的社

區(qū)類型網(wǎng)站來說,盡可能的靜態(tài)化也是提高性能的必要手段,將社區(qū)內(nèi)的帖子、

文章進(jìn)行實(shí)時(shí)的靜態(tài)化,有更新的時(shí)候再重新靜態(tài)化也是大量使用的策略,像

Mop的大雜炮就是使用了這樣的策略,網(wǎng)易社區(qū)等也是如此。同時(shí),html

靜態(tài)化也是某些緩存策略使用的手段,對于系統(tǒng)中頻繁使用數(shù)據(jù)庫查詢但是內(nèi)容

更新很小的應(yīng)用,可以考慮使用html靜態(tài)化來實(shí)現(xiàn),比如論壇中論壇的公用

設(shè)置信息,這些信息目前的主流論壇都可以進(jìn)行后臺(tái)管理并且存儲(chǔ)再數(shù)據(jù)庫中,

這些信息其實(shí)大量被前臺(tái)程序調(diào)用,但是更新頻率很小,可以考慮將這部分內(nèi)

容進(jìn)行后臺(tái)更新的時(shí)候進(jìn)行靜態(tài)化,這樣避免了大量的數(shù)據(jù)庫訪問請求高并發(fā)。

網(wǎng)站HTML靜態(tài)化解決方案當(dāng)一個(gè)Servlet資源請求到達(dá)WEB服務(wù)器之后我們

會(huì)填充指定的JSP頁面來響應(yīng)請求:

HTTP請求一Web服務(wù)器一Servlet-業(yè)務(wù)邏輯處理一訪問數(shù)據(jù)一填充JSP一響

應(yīng)請求

HTML靜態(tài)化之后:

HTTP請求--Web服務(wù)器Servlet--HTML—響應(yīng)請求

靜態(tài)訪求如下

Servlet:

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponse

response)throwsServletException,lOException

{if(request.getParameterCchapterId")!=null){String

chapterFileName=

"bookChapterRead_"+request.getParameterCchapterId")+".html";

Stringch叩terFilePath=getServletContext().getRealPath(7")+

chapterFileName;FilechapterFile=new

File(chapterFilePath);if(chapterFile.exists()){response.sendRedirect

(ch叩terFileName);return;}〃如果有這個(gè)文件就告訴瀏覽器轉(zhuǎn)

向INovelChapterBiznovelChapterBiz=new

NovelChapterBizImpl();Novelchapternovelchapter=

novelChapterBiz.searchNovelChapterById(Integer.parseInt(request.getP

arameterCchapterld")));//章節(jié)信息intlastPageld=

novelChapterBiz.searchLastCHapterId(novelChapter.getNovelId().getId(),

novelChapter.getId());intnextPageld=

novelChapterBiz.searchNextChapterId(novelChapter.getNovelId().getId(),

novelChapter.getId());request.setAttribute("novelChapter",

novelchapter);request.setAttribute("lastPageld",

lastPageld);request.setAttribute("nextPageld",

nextPageld);new

CreateStaticHTMLPage().createStaticHTMLPage(request,response,

getServletContext(),chapterFileName,chapterFilePath,

VbookRead.jsp");}}生成HTML靜態(tài)頁面的類:

packagecom.jb.y2t034.thefifth.web.servlet;import

java.io.ByteArrayOutputStream;import

java.io.FileOutputStream;importjava.io.IOException;import

java.io.OutputStreamWriter;importjava.io.Printwriter;import

javax.servlet.RequestDispatcher;import

javax.servlet.ServletContext;import

javax.servlet.ServletException;import

javax.servlet.ServletOutputStream;import

javax.servlet.http.HttpServletRequest;import

javax.servlet.http.HttpServletResponse;import

javax.servlet.http.HttpServletResponseWrapper;/***創(chuàng)建HTML靜態(tài)頁

面*功能:創(chuàng)建HTML靜態(tài)頁面*時(shí)間:2009年1011日*地點(diǎn):home*

@authormavk**/publicclassCreateStaticHTMLPage{/***牛

成靜態(tài)HTML頁面的方法*@paramrequest請求對象*@param

response響應(yīng)對象*@paramservletContextServlet上下文*

@paramfileName文件名稱*@paramfileFullPath文件完整路徑*

@paramjspPath需要生成靜態(tài)文件的JSP路徑(相對即可)*@throws

lOException*@throwsServletException*/publicvoid

createStaticHTMLPage(HttpServletRequestrequest,

HttpServletResponseresponse,ServletContextservletContext,String

fileName,StringfileFullPath,StringjspPath)throwsServletException,

IOException{response.setContentType("text/html;charset=gb231

2");〃設(shè)置HTML結(jié)果流編碼(即HTML文件編碼)RequestDispatcher

rd=servletContext.getRequestDispatcher(jspPath);//得至UJSP資

源finalByteArrayOutputStreambyteArrayOutputStream=new

ByteArrayOutputStream();//用于從ServletOutputStream中接收資

源finalServletOutputStreamservletOuputStream=new

ServletOutputStream(){//用于從HttpServletResponse中接收資

源publicvoidwrite(byte[]b,intoff,int

len){byteArrayOutputStream.write(b,off,

len);}publicvoidwrite(int

b){byteArrayOutputStream.write(b);}};f

inalPrintWriterprintwriter=newPrintWriter(new

OutputStreamWriter(byteArrayOutputStream));〃

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論