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>无标题文档</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',
//设置每页显示数据条数
increase : 5,
//分页导航的替换文本
counter:' _x_到_y_条 共_z_条 ',
nextLabel:'下一页',
previousLabel:'上一页',
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">标题</th><th scope="col">介绍</th></tr>
</thead>
<tbody>
<tr><th>1</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>2</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>3</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>4</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>5</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>6</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>7</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>8</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>9</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>10</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>11</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>12</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>13</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>14</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>15</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>16</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>17</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>18</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>19</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>20</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
<tr><th>21</th><td>萧涤非 等著</td><td>唐诗鉴赏辞典</td><td>《唐诗鉴赏辞典》为代表的文学鉴赏辞典系列</td></tr>
<tr><th>22</th><td>左民安</td><td>细说汉字(精装版)</td><td>这是一本介绍汉字基本知识的通俗读物</td></tr>
</tbody>
</table>
</body>
</html>
为了提高速度,LinkedHashMap散列化所有的元素,但是在遍历键值对时,却又以元素的插入顺序返回键值对(System.out.println()会迭代遍历该映射,因此可以看到遍历的结果)。此外,可以在构造器中设定LinkedHashMap,使之采用基于访问的最近最少使用(LRU)算法,于是没有被访问过的(可被看作需要删除的)元素就会出现在队列的前面。对于需要定期清理元素以节省空间的程序来说,此功能使得程序很容易得以实现。下面就是一个简单的例子,它演示了LinkedHashMap的这两种特点:
在输出中可以看到,键值对是以插入的顺序进行遍历的,甚至LRU算法的版本也是如此。但是,在LRU版本中,在(只)访问过前面六个元素后,最后三个元素移到了队列前面。然后再一次访问元素“o”时,它就被移到队列后端了。
LinkedHashMap平常用的比较少,但是却是用在相当重要的地方,利用其LRU算法可以创建对象池、连接池等等。
1、是否为空:
${empty sessionScope.username}
2、是否不为空
${not empty sessionScope.username}
3、得到请求参数
${param.username}
4、判断数字
${requestScope.age==20}
5、判断字符串
${requestScope.username=='vickzhu'}
或者${requestScope.username=="vickzhu"}
6、选中单选、复选、下拉框
下拉框:<option value="${cityInfo.cityCode }" ${param.cityCode==cityInfo.cityCode? "selected='selected'":"" } >${cityInfo.cityName }</option>
单选、复选:<input name="gender" type="radio" ${param.gender==1?"checked='checked'":"" } value="1" />男
<input name="gender" type="radio" ${param.gender==2?"checked='checked'":"" } value="2" />女
不论是在开发还是在已经发布的项目中,我们经常会碰到的一个问题:
java.lang.OutOfMemoryError: PermGen space
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,OutOfMemoryError: PermGen space从表面上看就是内存溢出,解决方法是加大内存。说说为什么会内存溢出:PermGen space用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APPLICATION会LOAD很多CLASS的话,就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
建议:将相同的第三方jar文件移置到tomcat/lib目录下,这样可以达到减少jar 文档重复占用内存的目的。
改正方法:-Xms256m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m
其中-Xms<size> 为JVM初始化堆的大小
-Xmx<size> 为JVM堆的最大值
-XX:MaxNewSize 为调大新对象区,以减少垃圾回收器回收次数
但是有的时候可能这样的设置还会不行(比如,当Server应用程序加载较多类时,即jvm加载类时,永久域中的对象急剧增加,从而使jvm不断调整永久域大小,为了避免调整),你可以使用更多的参数配置,如: java -Xms512m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m
其中,使用 -XX:MaxPermSize标志来增加永久域的大小,-XX:PermSize标志设置初始值
如果虚拟机启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,虚拟机就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时虚拟机就会提示内存溢出,并且导致应用服务崩溃。因此一般建议堆的最大值设置为可用内存的最大值的80%。
在tomcat中redeploy时出现outofmemory的错误.
可以有以下几个方面的原因:
1,使用了proxool,因为proxool内部包含了一个老版本的cglib.
2, log4j,最好不用,只用common-logging
3, 老版本的cglib,快点更新到最新版。
4,更新到最新的hibernate3.2
< jsp-config> 包括< taglib> 和< jsp-property-group> 两个子元素。
其中< taglib>元素在JSP 1.2时就已经存在,用于在jsp页面引用标签库描述符(.tld);而< jsp-property-group>是JSP 2.0 新增的元素,用于设置jsp页面的某些属性。
< jsp-property-group>元素主要有八个子元素,它们分别为:
1.< description>:设定的说明;
2.< display-name>:设定名称;
3.< url-pattern>:设定值所影响的范围,如:/CH2 或 /*.jsp;
4.< el-ignored>:若为true,表示不支持EL 语法;
5.< scripting-invalid>:若为true,表示不支持< % scripting %>语法;
6.< page-encoding>:设定JSP 网页的编码;
7.< include-prelude>:设置JSP 网页的抬头,扩展名为.jspf;
8.< include-coda>:设置JSP 网页的结尾,扩展名为.jspf。
一个简单的< 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对象的生命周期分析
Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除。因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3。其中T1表示对象的创建时间,T2表示对象的使用时间,而T3则表示其清除时间。由此,我们可以看出,只有T2是真正有效的时间,而T1、T3则是对象本身的开销。下面再看看T1、T3在对象的整个生命周期中所占的比例。
我们知道,Java对象是通过构造函数来创建的,在这一过程中,该构造函数链中的所有构造函数也都会被自动调用。另外,默认情况下,调用类的构造函数时,Java会把变量初始化成确定的值:所有的对象被设置成null,整数变量(byte、short、int、long)设置成0,float和double变量设置成0.0,逻辑值设置成false。所以用new关键字来新建一个对象的时间开销是很大的,如表1所示。
表1 一些操作所耗费时间的对照表
运算操作 |
示例 |
标准化时间 |
本地赋值 |
i = n |
1.0 |
实例赋值 |
this.i = n |
1.2 |
方法调用 |
Funct() |
5.9 |
新建对象 |
New Object() |
980 |
新建数组 |
New int[10] |
3100 |
从表1可以看出,新建一个对象需要980个单位的时间,是本地赋值时间的980倍,是方法调用时间的166倍,而若新建一个数组所花费的时间就更多了。
再看清除对象的过程。我们知道,Java语言的一个优势,就是Java程序员勿需再像C/C++程序员那样,显式地释放对象,而由称为垃圾收集器(Garbage Collector)的自动内存管理系统,定时或在内存凸现出不足时,自动回收垃圾对象所占的内存。凡事有利总也有弊,这虽然为Java程序设计者提供了极大的方便,但同时它也带来了较大的性能开销。这种开销包括两方面,首先是对象管理开销,GC为了能够正确释放对象,它必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等。其次,在GC开始回收“垃圾”对象时,系统会暂停应用程序的执行,而独自占用CPU。
因此,如果要改善应用程序的性能,一方面应尽量减少创建新对象的次数;同时,还应尽量减少T1、T3的时间,而这些均可以通过对象池技术来实现。
对象池技术的基本原理
对象池技术基本原理的核心有两点:缓存和共享,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。事实上,由于对象池技术将对象限制在一定的数量,也有效地减少了应用程序内存上的开销。
实现一个对象池,一般会涉及到如下的类:
1)对象池工厂(ObjectPoolFactory)类
该类主要用于管理相同类型和设置的对象池(ObjectPool),它一般包含如下两个方法:
·createPool:用于创建特定类型和设置的对象池;
·destroyPool:用于释放指定的对象池;
同时为保证ObjectPoolFactory的单一实例,可以采用Singleton设计模式,见下述getInstance方法的实现:
public static ObjectPoolFactory getInstance() {
if (poolFactory == null) {
poolFactory = new ObjectPoolFactory();
}
return poolFactory;
} |
2)参数对象(ParameterObject)类
该类主要用于封装所创建对象池的一些属性参数,如池中可存放对象的数目的最大值(maxCount)、最小值(minCount)等。
3)对象池(ObjectPool)类
用于管理要被池化对象的借出和归还,并通知PoolableObjectFactory完成相应的工作。它一般包含如下两个方法:
·getObject:用于从池中借出对象;
·returnObject:将池化对象返回到池中,并通知所有处于等待状态的线程;
4)池化对象工厂(PoolableObjectFactory)类
该类主要负责管理池化对象的生命周期,就简单来说,一般包括对象的创建及销毁。该类同ObjectPoolFactory一样,也可将其实现为单实例。
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"); //在这里设置开始时间
long delay=d.getTime()-System.currentTimeMillis(); //延迟多少毫秒后开始调用
long cycle=24*60*60*1000; //循环调用的时间间隔
timer.schedule(timerTask, delay, cycle);
}
}
class Test extends TimerTask{
privateinti=1;
publicvoid run() {
System.out.println("这是第 "+i+" 次调用,时间为:"+new Date());
i++;
}
}
其实servletContext和application 是一样的,就相当于一个类创建了两个不同名称的变量
大家只要打开jsp编译过后生成的Servlet中的_jspService()方法就可以看到如下的声明:
ServletContext application = null;
两者的区别就是application用在jsp中,servletContext用在servlet中
很简单的问题,但是有很多人在问。
一,修改tomcat配置
将tomcat的server.xml配置文件中的connector节点加上属性:useBodyEncodingForURI="true"
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
useBodyEncodingForURI="true"
/>
或者在配置中加上 URIEncoding="utf-8"
这是最切实及有效的方式!最大的缺点是需要修改配置文件
二,jsp编码
未完待续......