a.html:
<a href="b.html?src=logo.gif">圖片</a>
b.html
<script>
function window.onload() {
var str = self.location.href;
var image=str.substring(str.indexOf("=")+1);
document.getElementById('vick').src=image;
}
</script>
<img id="vick" src=""></img>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>無(wú)標(biāo)題文檔</title>
<style type="text/css">
table.dynamic tbody tr{ display:none;}
table.dynamic tbody tr.show{display:block;}
html>body table.dynamic tbody tr.show{ display:table-row;}
th,td{ padding:5px;}
th{ background:#eef;}
table.pagelist{ border:1px solid #ccc; border-bottom:none; border-right:none; width:500px;}
table.pagelist td,table.pagelist th{ font-size:12px; border:1px solid #ccc; border-top:none; border-left:none;}
p.paginatedNav{ font-size:12px; width:480px; margin-top:8px; text-align:right;}
p.paginatedNav a{ color:#ccc;}
p.paginatedNav a:link,p.paginatedNav a:visited{ color:#369;}
</style>
<script type="text/javascript" src="http://www.heluyao.com.cn/DOMhelp.js"></script>
<script type="text/javascript">
<!--
pn = {
//css class
paginationClass:'pagelist',
dynamicClass:'dynamic',
showClass:'show',
paginationNavClass:'paginatedNav',
//設(shè)置每頁(yè)顯示數(shù)據(jù)條數(shù)
increase : 5,
//分頁(yè)導(dǎo)航的替換文本
counter:' _x_到_y_條 共_z_條 ',
nextLabel:'下一頁(yè)',
previousLabel:'上一頁(yè)',
init:function(){
var tablebody;
if(!document.getElementById || !document.createTextNode){return;}
var ts=document.getElementsByTagName('table');
for(var i=0;i<ts.length;i++){
if(!DOMhelp.cssjs('check',ts[i],pn.paginationClass)){continue;}
if(ts[i].getElementsByTagName('tr').length<pn.increase+1){continue;}
tablebody=ts[i].getElementsByTagName('tbody')[0];
ts[i].datarows=tablebody.getElementsByTagName('tr');
ts[i].datarowsize=ts[i].datarows.length;
ts[i].current=null;
DOMhelp.cssjs('add',ts[i],pn.dynamicClass);
pn.createPaginationNav(ts[i]);
pn.showSection(ts[i],0);
}
},
createPaginationNav:function(table){
var navBefore,navAfter;
navBefore=document.createElement('p');
DOMhelp.cssjs('add',navBefore,pn.paginationNavClass);
navBefore.appendChild(DOMhelp.createLink('#',pn.previousLabel));
navBefore.appendChild(document.createElement('span'));
counter=pn.counter.replace('_x_',1);
counter=counter.replace('_y_',pn.increase);
counter=counter.replace('_z_',table.datarowsize-1);
navBefore.getElementsByTagName('span')[0].innerHTML=counter;
navBefore.appendChild(DOMhelp.createLink('#',pn.nextLabel));
table.parentNode.insertBefore(navBefore,table);
navAfter=navBefore.cloneNode(true);
table.parentNode.insertBefore(navAfter,table.nextSibling);
table.topPrev=navBefore.getElementsByTagName('a')[0];
table.topNext=navBefore.getElementsByTagName('a')[1];
table.bottomPrev=navAfter.getElementsByTagName('a')[0];
table.bottomNext=navAfter.getElementsByTagName('a')[1];
DOMhelp.addEvent(table.topPrev,'click',pn.navigate,false);
DOMhelp.addEvent(table.bottomPrev,'click',pn.navigate,false);
DOMhelp.addEvent(table.topNext,'click',pn.navigate,false);
DOMhelp.addEvent(table.bottomNext,'click',pn.navigate,false);
table.bottomNext.onclick=DOMhelp.safariClickFix;
table.topPrev.onclick=DOMhelp.safariClickFix;
table.bottomPrev.onclick=DOMhelp.safariClickFix;
table.topNext.onclick=DOMhelp.safariClickFix;
table.topCounter=navBefore.getElementsByTagName('span')[0];
table.bottomCounter=navAfter.getElementsByTagName('span')[0];
},
navigate:function(e){
var start, table;
var t=DOMhelp.getTarget(e);
while(t.nodeName.toLowerCase()!='a'){t=t.parentNode;}
if(t.getAttribute('href') == null || t.getAttribute('href') == ''){return;}
if(t.parentNode.previousSibling.nodeName.toLowerCase() == 'table'){
table=t.parentNode.previousSibling;
}else{
table=t.parentNode.nextSibling;
}
if(t==table.topNext || t==table.bottomNext){
start=table.current+pn.increase;
}else if(t==table.topPrev || t==table.bottomPrev){
start=table.current-pn.increase;
}
pn.showSection(table,start)
},
showSection:function(table,start){
var i;
pn.changePaginationNav(table,start);
if(table.current!=null){
for(i=table.current;i<table.current+pn.increase;i++){
if(table.datarows[i]){
DOMhelp.cssjs('remove',table.datarows[i],pn.showClass);
}
}
}
for(i=start;i<start+pn.increase;i++){
if(table.datarows[i]){
DOMhelp.cssjs('add',table.datarows[i],pn.showClass);
}
}
table.current=start;
},
changePaginationNav:function(table,start){
if(start-pn.increase<0){
table.bottomPrev.removeAttribute('href');
table.topPrev.removeAttribute('href');
}else{
table.bottomPrev.setAttribute('href','#');
table.topPrev.setAttribute('href','#');
}
if(start+pn.increase>table.datarowsize-2){
table.bottomNext.removeAttribute('href');
table.topNext.removeAttribute('href');
}else{
table.bottomNext.setAttribute('href','#');
table.topNext.setAttribute('href','#');
}
var counter=pn.counter.replace('_x_',start+1);
var last=start+pn.increase;
if(last>table.datarowsize){last=table.datarowsize;}
counter=counter.replace('_y_',last);
counter=counter.replace('_z_',table.datarowsize);
table.topCounter.innerHTML=counter;
table.bottomCounter.innerHTML=counter;
}
}
DOMhelp.addEvent(window,'load',pn.init,false);
-->
</script>
</head>
<body>
<table class="pagelist" cellspacing="0" cellpadding="0">
<thead>
<tr><th scope="col">ID</th><th scope="col">作者</th><th scope="col">標(biāo)題</th><th scope="col">介紹</th></tr>
</thead>
<tbody>
<tr><th>1</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>2</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>3</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>4</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>5</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>6</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>7</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>8</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>9</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>10</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>11</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>12</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>13</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>14</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>15</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>16</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>17</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>18</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>19</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>20</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
<tr><th>21</th><td>蕭滌非 等著</td><td>唐詩(shī)鑒賞辭典</td><td>《唐詩(shī)鑒賞辭典》為代表的文學(xué)鑒賞辭典系列</td></tr>
<tr><th>22</th><td>左民安</td><td>細(xì)說(shuō)漢字(精裝版)</td><td>這是一本介紹漢字基本知識(shí)的通俗讀物</td></tr>
</tbody>
</table>
</body>
</html>
為了提高速度,LinkedHashMap散列化所有的元素,但是在遍歷鍵值對(duì)時(shí),卻又以元素的插入順序返回鍵值對(duì)(System.out.println()會(huì)迭代遍歷該映射,因此可以看到遍歷的結(jié)果)。此外,可以在構(gòu)造器中設(shè)定LinkedHashMap,使之采用基于訪問(wèn)的最近最少使用(LRU)算法,于是沒(méi)有被訪問(wèn)過(guò)的(可被看作需要?jiǎng)h除的)元素就會(huì)出現(xiàn)在隊(duì)列的前面。對(duì)于需要定期清理元素以節(jié)省空間的程序來(lái)說(shuō),此功能使得程序很容易得以實(shí)現(xiàn)。下面就是一個(gè)簡(jiǎn)單的例子,它演示了LinkedHashMap的這兩種特點(diǎn):
在輸出中可以看到,鍵值對(duì)是以插入的順序進(jìn)行遍歷的,甚至LRU算法的版本也是如此。但是,在LRU版本中,在(只)訪問(wèn)過(guò)前面六個(gè)元素后,最后三個(gè)元素移到了隊(duì)列前面。然后再一次訪問(wèn)元素“o”時(shí),它就被移到隊(duì)列后端了。
LinkedHashMap平常用的比較少,但是卻是用在相當(dāng)重要的地方,利用其LRU算法可以創(chuàng)建對(duì)象池、連接池等等。
1、是否為空:
${empty sessionScope.username}
2、是否不為空
${not empty sessionScope.username}
3、得到請(qǐng)求參數(shù)
${param.username}
4、判斷數(shù)字
${requestScope.age==20}
5、判斷字符串
${requestScope.username=='vickzhu'}
或者${requestScope.username=="vickzhu"}
6、選中單選、復(fù)選、下拉框
下拉框:<option value="${cityInfo.cityCode }" ${param.cityCode==cityInfo.cityCode? "selected='selected'":"" } >${cityInfo.cityName }</option>
單選、復(fù)選:<input name="gender" type="radio" ${param.gender==1?"checked='checked'":"" } value="1" />男
<input name="gender" type="radio" ${param.gender==2?"checked='checked'":"" } value="2" />女
不論是在開(kāi)發(fā)還是在已經(jīng)發(fā)布的項(xiàng)目中,我們經(jīng)常會(huì)碰到的一個(gè)問(wèn)題:
java.lang.OutOfMemoryError: PermGen space
PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,OutOfMemoryError: PermGen space從表面上看就是內(nèi)存溢出,解決方法是加大內(nèi)存。說(shuō)說(shuō)為什么會(huì)內(nèi)存溢出:PermGen space用于存放Class和Meta的信息,Class在被 Load的時(shí)候被放入PermGen space區(qū)域,它和存放Instance的Heap區(qū)域不同,GC(Garbage Collection)不會(huì)在主程序運(yùn)行期對(duì)PermGen space進(jìn)行清理,所以如果你的APPLICATION會(huì)LOAD很多CLASS的話,就很可能出現(xiàn)PermGen space錯(cuò)誤。這種錯(cuò)誤常見(jiàn)在web服務(wù)器對(duì)JSP進(jìn)行pre compile的時(shí)候。如果你的WEB APP下都用了大量的第三方j(luò)ar, 其大小超過(guò)了jvm默認(rèn)的大小(4M)那么就會(huì)產(chǎn)生此錯(cuò)誤信息了。
建議:將相同的第三方j(luò)ar文件移置到tomcat/lib目錄下,這樣可以達(dá)到減少jar 文檔重復(fù)占用內(nèi)存的目的。
改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
其中-Xms<size> 為JVM初始化堆的大小
-Xmx<size> 為JVM堆的最大值
-XX:MaxNewSize 為調(diào)大新對(duì)象區(qū),以減少垃圾回收器回收次數(shù)
但是有的時(shí)候可能這樣的設(shè)置還會(huì)不行(比如,當(dāng)Server應(yīng)用程序加載較多類時(shí),即jvm加載類時(shí),永久域中的對(duì)象急劇增加,從而使jvm不斷調(diào)整永久域大小,為了避免調(diào)整),你可以使用更多的參數(shù)配置,如: java -Xms512m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m
其中,使用 -XX:MaxPermSize標(biāo)志來(lái)增加永久域的大小,-XX:PermSize標(biāo)志設(shè)置初始值
如果虛擬機(jī)啟動(dòng)時(shí)設(shè)置使用的內(nèi)存比較小而在這種情況下有許多對(duì)象進(jìn)行初始化,虛擬機(jī)就必須重復(fù)地增加內(nèi)存來(lái)滿足使用。由于這種原因,我們一般把-Xms和-Xmx設(shè)為一樣大,而堆的最大值受限于系統(tǒng)使用的物理內(nèi)存。一般使用數(shù)據(jù)量較大的應(yīng)用程序會(huì)使用持久對(duì)象,內(nèi)存使用有可能迅速地增長(zhǎng)。當(dāng)應(yīng)用程序需要的內(nèi)存超出堆的最大值時(shí)虛擬機(jī)就會(huì)提示內(nèi)存溢出,并且導(dǎo)致應(yīng)用服務(wù)崩潰。因此一般建議堆的最大值設(shè)置為可用內(nèi)存的最大值的80%。
在tomcat中redeploy時(shí)出現(xiàn)outofmemory的錯(cuò)誤.
可以有以下幾個(gè)方面的原因:
1,使用了proxool,因?yàn)閜roxool內(nèi)部包含了一個(gè)老版本的cglib.
2, log4j,最好不用,只用common-logging
3, 老版本的cglib,快點(diǎn)更新到最新版。
4,更新到最新的hibernate3.2
< jsp-config> 包括< taglib> 和< jsp-property-group> 兩個(gè)子元素。
其中< taglib>元素在JSP 1.2時(shí)就已經(jīng)存在,用于在jsp頁(yè)面引用標(biāo)簽庫(kù)描述符(.tld);而< jsp-property-group>是JSP 2.0 新增的元素,用于設(shè)置jsp頁(yè)面的某些屬性。
< jsp-property-group>元素主要有八個(gè)子元素,它們分別為:
1.< description>:設(shè)定的說(shuō)明;
2.< display-name>:設(shè)定名稱;
3.< url-pattern>:設(shè)定值所影響的范圍,如:/CH2 或 /*.jsp;
4.< el-ignored>:若為true,表示不支持EL 語(yǔ)法;
5.< scripting-invalid>:若為true,表示不支持< % scripting %>語(yǔ)法;
6.< page-encoding>:設(shè)定JSP 網(wǎng)頁(yè)的編碼;
7.< include-prelude>:設(shè)置JSP 網(wǎng)頁(yè)的抬頭,擴(kuò)展名為.jspf;
8.< include-coda>:設(shè)置JSP 網(wǎng)頁(yè)的結(jié)尾,擴(kuò)展名為.jspf。
一個(gè)簡(jiǎn)單的< jsp-config>元素完整配置:
< jsp-config>
< taglib>
< taglib-uri>Taglib< /taglib-uri>
< taglib-location>/WEB-INF/tlds/MyTaglib.tld< /taglib-location>
< /taglib>
< jsp-property-group>
< description>Special property group for JSP Configuration JSP example.< /description>
< display-name>JSPConfiguration< /display-name>
< url-pattern>/jsp/* < /url-pattern>
< el-ignored>true< /el-ignored>
< page-encoding>GB2312< /page-encoding>
< scripting-invalid>true< /scripting-invalid>
< include-prelude>/include/prelude.jspf< /include-prelude>
< include-coda>/include/coda.jspf< /include-coda>
< /jsp-property-group>
< /jsp-config>
Java對(duì)象的生命周期分析
Java對(duì)象的生命周期大致包括三個(gè)階段:對(duì)象的創(chuàng)建,對(duì)象的使用,對(duì)象的清除。因此,對(duì)象的生命周期長(zhǎng)度可用如下的表達(dá)式表示:T = T1 + T2 +T3。其中T1表示對(duì)象的創(chuàng)建時(shí)間,T2表示對(duì)象的使用時(shí)間,而T3則表示其清除時(shí)間。由此,我們可以看出,只有T2是真正有效的時(shí)間,而T1、T3則是對(duì)象本身的開(kāi)銷(xiāo)。下面再看看T1、T3在對(duì)象的整個(gè)生命周期中所占的比例。
我們知道,Java對(duì)象是通過(guò)構(gòu)造函數(shù)來(lái)創(chuàng)建的,在這一過(guò)程中,該構(gòu)造函數(shù)鏈中的所有構(gòu)造函數(shù)也都會(huì)被自動(dòng)調(diào)用。另外,默認(rèn)情況下,調(diào)用類的構(gòu)造函數(shù)時(shí),Java會(huì)把變量初始化成確定的值:所有的對(duì)象被設(shè)置成null,整數(shù)變量(byte、short、int、long)設(shè)置成0,float和double變量設(shè)置成0.0,邏輯值設(shè)置成false。所以用new關(guān)鍵字來(lái)新建一個(gè)對(duì)象的時(shí)間開(kāi)銷(xiāo)是很大的,如表1所示。
表1 一些操作所耗費(fèi)時(shí)間的對(duì)照表
運(yùn)算操作 |
示例 |
標(biāo)準(zhǔn)化時(shí)間 |
本地賦值 |
i = n |
1.0 |
實(shí)例賦值 |
this.i = n |
1.2 |
方法調(diào)用 |
Funct() |
5.9 |
新建對(duì)象 |
New Object() |
980 |
新建數(shù)組 |
New int[10] |
3100 |
從表1可以看出,新建一個(gè)對(duì)象需要980個(gè)單位的時(shí)間,是本地賦值時(shí)間的980倍,是方法調(diào)用時(shí)間的166倍,而若新建一個(gè)數(shù)組所花費(fèi)的時(shí)間就更多了。
再看清除對(duì)象的過(guò)程。我們知道,Java語(yǔ)言的一個(gè)優(yōu)勢(shì),就是Java程序員勿需再像C/C++程序員那樣,顯式地釋放對(duì)象,而由稱為垃圾收集器(Garbage Collector)的自動(dòng)內(nèi)存管理系統(tǒng),定時(shí)或在內(nèi)存凸現(xiàn)出不足時(shí),自動(dòng)回收垃圾對(duì)象所占的內(nèi)存。凡事有利總也有弊,這雖然為Java程序設(shè)計(jì)者提供了極大的方便,但同時(shí)它也帶來(lái)了較大的性能開(kāi)銷(xiāo)。這種開(kāi)銷(xiāo)包括兩方面,首先是對(duì)象管理開(kāi)銷(xiāo),GC為了能夠正確釋放對(duì)象,它必須監(jiān)控每一個(gè)對(duì)象的運(yùn)行狀態(tài),包括對(duì)象的申請(qǐng)、引用、被引用、賦值等。其次,在GC開(kāi)始回收“垃圾”對(duì)象時(shí),系統(tǒng)會(huì)暫停應(yīng)用程序的執(zhí)行,而獨(dú)自占用CPU。
因此,如果要改善應(yīng)用程序的性能,一方面應(yīng)盡量減少創(chuàng)建新對(duì)象的次數(shù);同時(shí),還應(yīng)盡量減少T1、T3的時(shí)間,而這些均可以通過(guò)對(duì)象池技術(shù)來(lái)實(shí)現(xiàn)。
對(duì)象池技術(shù)的基本原理
對(duì)象池技術(shù)基本原理的核心有兩點(diǎn):緩存和共享,即對(duì)于那些被頻繁使用的對(duì)象,在使用完后,不立即將它們釋放,而是將它們緩存起來(lái),以供后續(xù)的應(yīng)用程序重復(fù)使用,從而減少創(chuàng)建對(duì)象和釋放對(duì)象的次數(shù),進(jìn)而改善應(yīng)用程序的性能。事實(shí)上,由于對(duì)象池技術(shù)將對(duì)象限制在一定的數(shù)量,也有效地減少了應(yīng)用程序內(nèi)存上的開(kāi)銷(xiāo)。
實(shí)現(xiàn)一個(gè)對(duì)象池,一般會(huì)涉及到如下的類:
1)對(duì)象池工廠(ObjectPoolFactory)類
該類主要用于管理相同類型和設(shè)置的對(duì)象池(ObjectPool),它一般包含如下兩個(gè)方法:
·createPool:用于創(chuàng)建特定類型和設(shè)置的對(duì)象池;
·destroyPool:用于釋放指定的對(duì)象池;
同時(shí)為保證ObjectPoolFactory的單一實(shí)例,可以采用Singleton設(shè)計(jì)模式,見(jiàn)下述getInstance方法的實(shí)現(xiàn):
public static ObjectPoolFactory getInstance() {
if (poolFactory == null) {
poolFactory = new ObjectPoolFactory();
}
return poolFactory;
} |
2)參數(shù)對(duì)象(ParameterObject)類
該類主要用于封裝所創(chuàng)建對(duì)象池的一些屬性參數(shù),如池中可存放對(duì)象的數(shù)目的最大值(maxCount)、最小值(minCount)等。
3)對(duì)象池(ObjectPool)類
用于管理要被池化對(duì)象的借出和歸還,并通知PoolableObjectFactory完成相應(yīng)的工作。它一般包含如下兩個(gè)方法:
·getObject:用于從池中借出對(duì)象;
·returnObject:將池化對(duì)象返回到池中,并通知所有處于等待狀態(tài)的線程;
4)池化對(duì)象工廠(PoolableObjectFactory)類
該類主要負(fù)責(zé)管理池化對(duì)象的生命周期,就簡(jiǎn)單來(lái)說(shuō),一般包括對(duì)象的創(chuàng)建及銷(xiāo)毀。該類同ObjectPoolFactory一樣,也可將其實(shí)現(xiàn)為單實(shí)例。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
publicclass TestTimer {
publicstaticvoid main(String[] args) throws ParseException {
TestTimer tt=new TestTimer();
tt.vick();
}
publicvoid vick() throws ParseException{
Timer timer=new Timer();
Test timerTask=new Test();
SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date d=df.parse("2008-08-21 09:00:00"); //在這里設(shè)置開(kāi)始時(shí)間
long delay=d.getTime()-System.currentTimeMillis(); //延遲多少毫秒后開(kāi)始調(diào)用
long cycle=24*60*60*1000; //循環(huán)調(diào)用的時(shí)間間隔
timer.schedule(timerTask, delay, cycle);
}
}
class Test extends TimerTask{
privateinti=1;
publicvoid run() {
System.out.println("這是第 "+i+" 次調(diào)用,時(shí)間為:"+new Date());
i++;
}
}
其實(shí)servletContext和application 是一樣的,就相當(dāng)于一個(gè)類創(chuàng)建了兩個(gè)不同名稱的變量
大家只要打開(kāi)jsp編譯過(guò)后生成的Servlet中的_jspService()方法就可以看到如下的聲明:
ServletContext application = null;
兩者的區(qū)別就是application用在jsp中,servletContext用在servlet中
很簡(jiǎn)單的問(wèn)題,但是有很多人在問(wèn)。
一,修改tomcat配置
將tomcat的server.xml配置文件中的connector節(jié)點(diǎn)加上屬性:useBodyEncodingForURI="true"
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
useBodyEncodingForURI="true"
/>
或者在配置中加上 URIEncoding="utf-8"
這是最切實(shí)及有效的方式!最大的缺點(diǎn)是需要修改配置文件
二,jsp編碼
未完待續(xù)......