|
2005年9月28日
JTable如果在编辑状态下,当要保存的时候,比如直接点保存按钮,得到的数据不是编辑状态下的数据,琢磨出一个方法,记录一下:
i和j表示正在被编辑的行号列号
CellEditor ce = md.getCellEditor(i,j);
//CellEditor ce = md.getCellEditor(md.getEditingRow(), md.getEditingColumn());
ce.stopCellEditing();
Object value = ce.getCellEditorValue();
// model.setValueAt(value,md.getEditingRow(), md.getEditingColumn());
model.setValueAt(value,i,j);
获取网卡物理地址:
String cmd="ipconfig /all";
Process p=Runtime.getRuntime().exec(cmd);
BufferedReader bis=new BufferedReader(new InputStreamReader(p.getInputStream()));
String line="";
while((line=bis.readLine())!=null){
if(line.indexOf("Physical Address")!=-1){
Pattern ptn=Pattern.compile("((\\w{2})|(\\d{2})|(\\w+\\d+)|(\\d+\\w+))-.*");
Matcher m=ptn.matcher(line.trim());
while(m.find()){
System.out.println("get mac "+m.group());
}
}
}
闲暇之余写的坦克小游戏,源码贴出来,有意见和疑问请留言,共同进步
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<META NAME="Generator" CONTENT="EditPlus">
<META NAME="Author" CONTENT="">
<META NAME="Keywords" CONTENT="">
<META NAME="Description" CONTENT="">
</HEAD>
<SCRIPT LANGUAGE="JavaScript">
<!--
var missleno=0;
var energy=100;
var enemytimer;
function document.onkeydown()
{
if (window.event.keyCode==37) // 方向键 <-
{
var temp=document.getElementById("sg");
temp.style.pixelLeft-=10;
}
else if (window.event.keyCode==39) // 方向键 ->
{
var temp=document.getElementById("sg");
temp.style.pixelLeft+=10;
}
else if (window.event.keyCode==40){
var temp=document.getElementById("sg");
temp.style.pixelTop+=10;
// temp.style.height=66px;
}
else if(window.event.keyCode==38){ // up ^
//alert(window.event.keyCode);
var temp=document.getElementById("sg");
temp.style.pixelTop-=10;
}
else if(window.event.keyCode==32){
fire(missleno);
missleno++;
}
// else{
// var temp=document.getElementById("missle1000");
// if(temp==null){
// alert('null');
// }
//}
}
function fire(mno){
var no=mno;
var temp=document.getElementById("sg");
tt=document.createElement("div");
cont=document.createTextNode("=");
tt.appendChild(cont);
tt.id="missle"+no;
// missleno++;
tt.style.position="absolute";
// var obj=eval("sg"+num);
tt.style.pixelTop=temp.style.pixelTop+15;
tt.style.pixelLeft=temp.style.pixelLeft+60;
document.body.appendChild(tt);
move(no);
}
function move(mno){
var no=mno;
var temp=document.getElementById("missle"+no);
// var temphn=document.getElementById("hn");
temp.style.pixelLeft+=5;
var result=monitor_missle(no); //监控子弹是否打中
//alert(result);
if(result!='stop'){
if(temp.style.pixelLeft!=1000){
setTimeout("move("+no+")",20);
}
else if(temp.style.pixelLeft==1000){ //消除子弹
temp.parentNode.removeChild(temp);
}
}
}
function showpos(){
var temp=document.getElementById("hn");
alert(temp.style.pixelLeft);
}
function flush(){
var temp=document.getElementById("hn");
//temp.parentNode.removeChild(temp);
temp.style.display="none";
temp=document.getElementById("missle"+missleno);
temp.parentNode.removeChild(temp);
}
function initEnemy(){
tt=document.createElement("div");
cont=document.createTextNode("enemy");
tt.appendChild(cont);
tt.id="enemy";
tt.style.position="absolute";
// var obj=eval("sg"+num);
tt.style.pixelTop=390;
tt.style.pixelLeft=900;
tt.style.border="dashed thick #008022";
tt.style.width="36px";
tt.style.padding="2px 4px 0px 4px";
tt.style.background="#ff3303";
tt.style.color="#FFFFEE";
document.body.appendChild(tt);
enemy_move();
}
function monitor(){
var enemy=document.getElementById("enemy");
for(var t=0;t<missleno;t++){
var temp=document.getElementById("missle"+t);
if(temp==null)
continue;
else{
if(((enemy.style.pixelTop-10)<temp.style.pixelTop) &&((enemy.style.pixelTop+10)>temp.style.pixelTop) && (temp.style.pixelLeft>=enemy.style.pixelLeft)){
energy--;
temp.parentNode.removeChild(temp);
alert(energy);
}
}
}
}
function monitor_missle(mno){
var t=mno;
var enemy=document.getElementById("enemy");
var temp=document.getElementById("missle"+t);
if((temp!=null)&&(enemy!=null)){
if(((enemy.style.pixelTop-10)<temp.style.pixelTop) &&((enemy.style.pixelTop+10)>temp.style.pixelTop) && (temp.style.pixelLeft>=enemy.style.pixelLeft)){
energy--;
var blood=document.getElementById("bld");
blood.innerHTML=energy;
temp.parentNode.removeChild(temp);
if(energy==0){
enemy.parentNode.removeChild(enemy);
clearTimeout(enemytimer);
// enemy.style.display="none";
alert("YOU WIN,CONGRATULATIONS!");
}
return 'stop';
}
}
return 'continue';
}
function enemy_move(){
var enemy=document.getElementById("enemy");
enemy.style.pixelLeft-=10;
enemytimer=setTimeout("enemy_move()",1000);
}
//-->
</SCRIPT>
<BODY>
<div style="border: dashed thick #008000; width:36px; text-align:center; padding:2px 4px 0px 4px; background:#ff3300; color:#FFFFFF;position:absolute" id="sg" >sugo</div>
<!-- <div style="border: dashed thick #008000; width:36px; text-align:center; padding:2px 4px 0px 4px; background:#ff3300; color:#FFFFFF;position:absolute;left=1000;top=500" id="hn">hanna</div> -->
<SCRIPT LANGUAGE="JavaScript">
<!--
initEnemy();
// setInterval("monitor()",500);
//-->
</SCRIPT>
<div id="bld"></div>
</BODY>
</HTML>
实现了控制随机生成的一个六位字符串下落,可以向左、向右、向下加速。实现的功能仿照俄罗斯方块来做,本来想实现上下两行相同字母消除功能,但想起一个方法(代码中的erase()方法),感觉没问题,但一直没有实现,后来也懒得想了。现将代码贴在这里,希望读到这篇文章的朋友如果感兴趣的话提出宝贵意见,并可以随意拷贝代码完善功能:) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT="Sugo"> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT=""> </HEAD> <SCRIPT LANGUAGE="JavaScript"> <!-- var incx=10;//每次下落的高度 var sty=20; //开始时候的纵坐标 var stx=500; //开始时候的横坐标 var num=0; //每个div标号,同时也起到确定下一个div元素停止的位置 var len=10; var timer;//定时器 //var arr0,arr1,arr2,arr3,arr4,arr5,arr6,arr7,arr8,arr9,arr10,arr11,arr12,arr13,arr14,arr15; //用于字母消除作用的数组,此功能没实现,这些变量可以不用 //初始字符串初始位置 function firstshow(){ //temp=document.getElementById("sg"); sg0.style.pixelTop=sty; sg0.style.pixelLeft=stx; } //增加字符串 function addDiv(){ tt=document.createElement("div"); divcontent=randomString(6); cont=document.createTextNode(divcontent); tt.appendChild(cont); tt.id="sg"+num; tt.style.position="absolute"; // var obj=eval("sg"+num); tt.style.pixelTop=10; tt.style.pixelLeft=500; document.body.appendChild(tt); }
//字符串下落方法 function fall(id){ var obj=eval("sg"+id); obj.style.pixelTop+=incx; obj.style.pixelLeft=stx; if(obj.style.pixelTop==(610-len*num)){ //到达目的地址时(下落到610处,此处可随意改动) obj.style.pixelTop=610-len*num; //erase(); 功能没有实现 num++; addDiv(); fall(num); } else if(obj.style.pixelTop<(610-len*num)) //没有到达目的地址时 timer = setTimeout('fall(num)',1000); //1000可以换成任意数字,越小下落速度越快 else if(obj.style.pixelTop>(610-len*num)) //处理出现地址大于目的地址时 { } } //当使用方向键操作时使用的下落方法 function fall1(id,sx,sy){ var obj=eval("sg"+id); obj.style.pixelTop=sy+incx; obj.style.pixelLeft=sx; y=obj.style.pixelTop; x=obj.style.pixelLeft; if(obj.style.pixelTop==(610-len*num)){ //到达目的地址时 obj.style.pixelTop=610-len*num; //erase(); 功能没有实现 num++; addDiv(); fall(num); } else if(obj.style.pixelTop<(610-len*num)) //没有到达目的地址时 timer = setTimeout('fall1(num,x,y)',1000); //1000可以换成任意数字,越小下落速度越快 else if(obj.style.pixelTop>(610-len*num)) //处理出现地址大于目的地址时 { } } //产生随机六位字符串 function randomString(leng){ var source="abcdefghijklmnopqrstuvwxyz"; var result=""; for(var i=0;i<leng;i++){ result+=source.charAt(Math.random()*source.length) } return result; } //键盘控制 function document.onkeydown() { if (window.event.keyCode==37) // 方向键 <- { var temp=document.getElementById("sg"+num); temp.style.pixelLeft-=8; x=temp.style.pixelLeft; y=temp.style.pixelTop; clearTimeout(timer); fall1(num,x,y-10); } else if (window.event.keyCode==39) // 方向键 -> { var temp=document.getElementById("sg"+num); temp.style.pixelLeft+=8; x=temp.style.pixelLeft; y=temp.style.pixelTop; clearTimeout(timer); fall1(num,x,y-10); } else if (window.event.keyCode==40){ //方向键 | var temp=document.getElementById("sg"+num); temp.style.pixelTop+=10; x=temp.style.pixelLeft; y=temp.style.pixelTop; clearTimeout(timer); fall1(num,x,y-10); } } //字母消除程序,暂时不能实现功能 function erase(){ var pos=new Array(); for(var i=0;i<=num;i++){ //得到所有存在的div每个字符的位置值 dpos=document.getElementById("sg"+i); x=dpos.style.pixelLeft; //content=dpos.value; obj=eval("arr"+i); obj=new Array(); for(var j=0;j<6;j++){ obj[j]=x+j; } pos[i]=obj; } //alert(num); if(num>=1){ for(t=num-1;t<num;t++){ for(tt=0;tt<6;tt++){ for(ttt=0;ttt<6;ttt++){ // alert(pos[t][ttt]); if(pos[t][tt]==pos[t+1][ttt]){ // alert("here"+tt+" "+ttt); mod1=document.getElementById("sg"+t); mod2=document.getElementById("sg"+(t+1)); var rep1="",rep2=""; for(var l=0;l<mod1.innerHTML.length;l++){ if(l!=tt){ rep1+=mod1.innerHTML.charAt(l); } else{ rep1+="-"; } } mod1.innerHTML=rep1; //rep1=''; //alert(mod1.innerHTML); for(var ll=0;ll<mod2.innerHTML.length;ll++){ if(ll!=ttt){ rep2+=mod2.innerHTML.charAt(ll); } else{ rep2+="-"; } } mod2.innerHTML=rep2; //rep2=''; } } } } } } //--> </SCRIPT> <BODY onload="firstshow();" >
<div id="sg0" style="position:absolute"><SCRIPT LANGUAGE="JavaScript"> <!-- document.write(randomString(6)); //6可以改为任意数字,数字即是字符串的长度 //--> </SCRIPT></div> <SCRIPT LANGUAGE="JavaScript"> <!-- fall(0); //--> </SCRIPT> </BODY> </HTML>
访问某论坛时,发现论坛全是html页面。今天搞明白了,原来是重写了页面的url。通俗的说就是虽然地址栏里的是html结尾的url,但实际上访问的是后台动态jsp(php、asp)页面。好像是一种视觉欺骗。 实现这个技术也很容易,一般都会使用国外的一个urlrewriter过滤器。 1、下载: 下载地址为 http://tuckey.org/urlrewrite/#download。 2、解压和基本配置 使用的为2.6版本,解压后,包中含有一个urlrewrite.xml,此为关键的配置文件。还有lib文件夹下的urlrewrite-2.6.0.jar这个包。将此包放到web应用程序的web-inf/lib下面,urlrewrite.xml放到web-inf下。 3、修改应用程序web-inf文件夹下的web.xml文件,添加如下内容: <filter> <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 4、修改应用程序web-inf文件夹下的urlrewrite.xml文件,添加rule,内容如下: <rule> <name>html rule</name> <from>/test/thread([0-9]+)_([0-9]+).html</from> <to>/show.jsp?id=$1&order=$2</to> </rule> 其中要求对正则表达式有所了解,以上的语句可以实现当你访问http://localhost/test/ thread12_56.html时,会转向http://localhost/ show.jsp?id=12& order=56这个动态页面。 个人觉得需要开发人员对页面参数非常熟悉。这个技术还是值得大家来尝试一下的。个人论坛可以使用此技术:),让别人看不出你是使用什么编写的。
实现了基本的网络图片、mp3、影片下载,原理为首先根据要下载的图片(mp3、影片)的url,将它的信息写入一个临时文件。然后再从这个临时文件将信息导入到真正你想要存储的图片(mp3、影片)。第一步为网络到本地,第二步为本地到本地。 //网络到本地代码: java.net.URL l_url = new java.net.URL("http://localhost/rlzy/photo/"+addition); //图片url地址 java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url.openConnection(); int randomnum=(int)(Math.random()*100); System.out.println(randomnum); File f1=new File(photopath+randomnum); FileOutputStream o=new FileOutputStream(f1); l_connection.connect(); java.io.InputStream l_urlStream; l_urlStream = l_connection.getInputStream();
byte b[]=new byte[1000]; int n; while( (n=l_urlStream.read(b))!=-1) { o.write(b,0,n); } o.close(); l_urlStream.close(); //本地到本地 RandomAccessFile random=new RandomAccessFile(f1,"r"); long forthEndPosition=0; File tfolder1=new File("E:/111/);//存储图片路径 tfolder1.mkdirs();//如果不存在就创建此文件夹,如果没有这个步骤将会出现FileNotFoundException File f2=new File("e:/111/"+name); RandomAccessFile random2=new RandomAccessFile(f2,"rw"); random.seek(random.length()); long endPosition=random.getFilePointer(); random.seek(forthEndPosition); long startPoint=random.getFilePointer(); while(startPoint<endPosition) //开始拷贝文件信息 { n=random.readByte(); random2.write(n); startPoint=random.getFilePointer(); } random2.close();random.close(); f1.delete(); //删除临时文件 程序写了一个简单的GUI界面 ,使其看起来更像一个下载器了。如果提高下载速度还需进一步的学习和研究。有兴趣的朋友可以点击下载研究 http://sugo.gnway.net/test/FreeDown.jar(申请的一个免费二级域名,速度可能不快 :-) ,另外需要sun公司的jre环境,Windows、Linux下均能运行)
报表中有这个需求,当报表很大需要下拉时,但表头在正上方,看不到对应的是哪一项的数据。此功能可以使用虚拟一个表头来实现。具体的灵感来自网站随着鼠标移动的图片。当鼠标下移时,图片跟着走。对于这个需求来说只需把图片换成一个表格即可。 网页中加入如下代码: <DIV id="thead" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FILTER: progid:DXImageTransform.Microsoftpadding:8px; ; LEFT: expression(eval(document.body.scrollLeft)+eval(document.body.clientWidth)-980); BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; POSITION: absolute; ; TOP: expression(eval(document.body.scrollTop)+eval(document.body.clientHeight)-500); TEXT-ALIGN: center"> <TABLE cellSpacing=0 cellPadding=0 align=center border=0> <TBODY> <TR> <TD> <EMBED style="LEFT: -73px; POSITION: absolute; TOP: 125px" align=right> <table bgcolor="red" border=1> <tr> <td>sdfsd</td><td>sdfsd</td><td>sdfsd</td> </tr> </table> </EMBED> </TD> </TR> </TBODY> </TABLE> </DIV> 红色代码部分可以更替为任意html标记,比如img、input等等。 注:内嵌的表格颜色最好深一些,不然会出现重叠现象。调整虚拟表头相对屏幕上方的位置在蓝色粗体的地方,可根据需要修改。 当需要打印报表时,可以添加一个button来控制这个表头的显示 js方法为 function control(){ var temp=document.getElementById("thead"); if(temp.style.display=='none') temp.style.display='' ; else temp.style.display='none'; }
使用hibernate的hql查询,当指定某些字段时,一行数据此时得到的是相应的一个数组。而字段全部查询得到的是一个pojo对象。 使用struts的逻辑标签显示时,如果得到的是一个pojo对象,可以使用<logic:iterate>,也可以使用<logic present>使用的时候不用再定义id,name属性即为request或者session里存储的对象的别名。然后使用<bean:write>定义两个属性name和logic标签的name一样,property为对应的类中定义的成员变量名字。 如果得到的是数组的集合,则需要<logic:iterate>嵌套。例如: <logic:iterate name="du" id="indiv" scope="session"> <logic:iterate name="indiv" id="tiny"> <bean:write name="tiny" /> </logic:iterate> </logic:iterate> 注(个人认为):可以看到规律,下一层的name为上层的id。 得到的是集合,如List 或者Vector等。例如: <logic:iterate scope="session" id="du" name="dlist"> <bean:write name="du" property="wdate" /> <bean:define id="text" name="du" property="content" type="String"/> <html:link href="modify.do" paramId="id" paramName="du" paramProperty="id" linkName="mod" /> <html:button property="modify" onclick="mod.click()" value="modify" /> <html:textarea property="content" value="<%= text %>"></html:textarea><br> <bean:write name="du" property="username" /> <bean:write name="du" property="weather" /> <br> <html:link href="modify.do?manipulate=delete" paramId="id" paramName="du" paramProperty="id" linkName="del" /> <html:button property="delete" onclick="del.click()" value="delete" /> </logic:iterate> 例子中还包括在一个组件中填值,使用<bean:define>标签,可以得到一个对象,id就是对象的引用。 <html:link>的linkName相当于超链接<a href="">中的id属性,<html:link>的page和href的不同,page需要相对路径,url前面需要加上/,href则不用。<html:link>参数传递,如果确定需要传递的参数,直接跟在url后面即可。如果是动态的,则需要paramId, paramName, paramProperty 。第一个为参数名称,第二个为存储的对象的名字,如在request、session中存储的名字,第三个就是这个对象里面的成员变量。多个参数一般使用HashMap。 Struts中的action,即便是不想用ActionForm,也需要在action的配置属性里写入,否则会出现空值的问题,今天遇到了,所以定义DynaActionForm还是必要的。 hibernate一般的数据库操作都通过session来进行,我把所有涉及的操作都写成了一个ObjectDAO,比较方便操作。
当提交表单时,此时操作人员只需等待结果返回,这里,我实现了一个覆盖网页的方法,使得整个网页被一个很大的div覆盖,这样操作人员就不能点击页面的内容了。实现很简单,一个div <div id="doing" style="Z-INDEX: 12000; LEFT: 0px; WIDTH: 100%; CURSOR: wait; POSITION: absolute; TOP: 0px; HEIGHT: 100%; display:none "> <table width="100%" height="100%"> <tr align="center" valign="middle"> <td> <table width="169" height="62" bgcolor="#99cccc" style="FILTER: Alpha(Opacity=75); WIDTH: 169px; HEIGHT: 62px"> <tr align="center" valign="middle"> <td>页面提交中.<br> Loading.</td> </tr> </table> </td> </tr> </table> </div> 页面最初载入时把它隐藏起来,当按下提交按钮时让它显示。结果返回后再次让它隐藏。jsp代码: <% String content=request.getParameter("tc"); if(content==null){ %> <form action="#" method="post" onsubmit="return show()"> <textarea name="tc">dfdfsdf dfdaf</textarea> <input type=submit value=" go " > </form> <% } else{ if(content.indexOf("\n")==-1) out.println("haha"); // content=content.replaceAll("\n","<br>"); %> <textarea> <% out.println(content); %> </textarea> <% } %> show方法: function show(){ document.getElementById('doing').style.display='' return true; } 当表单提交并返回结果时,页面重新加载,div的display属性自动又变为none。达到了想要的效果。
幻灯片大家都非常熟悉了,我以雅虎幻灯片为灵感,开发了自己的幻灯片。 首先,这个幻灯片程序是在我的jsp图片查看器上加上去的,算是满足自己的需求吧,哈。因为有时候看幻灯片对我来说是一种享受。。。嗯 首先是做一个基本的图片自动播放的程序,这个纯javascript就可以实现,实现需要的javascript方法也很简单,代码如下: function rotateBanner(frameNumber,interval){ document.banner.src=fn[frameNumber].src;//为页面中的id为banner的图片标记动态定义图片的链接地址 var imageChoice=frameNumber+1; if(imageChoice==fn.length){ imageChoice=0; } player=window.setTimeout("rotateBanner("+imageChoice+","+inv+")",inv); } 其中frameNumber为图片路径数组的下标,interval为显示下一幅图片的间隔时间。 首先,我们要定义一个全局数组,数组各个元素的值为图片的url。(一般我们都把一类的图片放在一个目录中,这种情况可以通过动态生成的方法来动态的为这个全局数组的各个元素赋值) js方法的使用也很简单,在这个页面的body标签加入onload=“rotateBanner(0,5000)”即可,在这里0为数组的第一个元素下标,5000为播放的间隔时间5秒。 一个不能被我们控制的幻灯片页面就产生了。下面我们就要开始对其进行控制了,首先,我们实现让幻灯片停止滚动播放图片。这个很简单,上面的js方法我们定义了一个定时器player变量,这个player是个全局的,当不停的递归调用的时候,都是它自己在不停的被赋值。停止它我们只需把这个定时器去处即可。在页面中加上一个超链接,在它的onclick事件中触发一个js方法,不妨我们再写一个方法,代码为: function stop(){ window.clearTimeout(player); } 这样就把图片循环显示的player定时器去除了。 有停止就要有开始,开始就容易了,在开始超链接的onclick事件调用rotateBanner()方法就行了,但这里有个问题,这个一会再说。 我们再添加上一幅,下一幅超链接,我们可以通过手工点击来显示下一页,这里就要又要定义一个全局变量了,它用来记录显示图片的数组下标。代码如下:其中的firstno变量我们后面再说它的作用 function previous(){ if(imgno==0) imgno=fn.length; imgno=imgno-1; firstno=imgno; document.banner.src=fn[imgno].src; } function next(){ if(imgno==fn.length-1) imgno=-1; imgno=imgno+1; firstno=imgno; document.banner.src=fn[imgno].src; } imgno就是我们定义的全局变量,来记录当前图片的数组下标。但这样有个问题,那就是imgno的初值为多少?现在的代码中并没初始化。好,我们分析一下,从页面打开开始,onload事件调用rotateBanner方法,这是最初的入口,下一幅上一幅按钮也是当执行了这个事件后才会有作用,所以我们需要在rotateBanner方法中记录图片的下标。其实也可以在声明的时候初始化为0。 所以我们在点击开始的时候,rotateBanner(firstno,firstclock)函数里面的参数要传入当前图片的下标,不然我们点开始后幻灯片是开始幻灯显示了,但它又从0开始了,不会从我们停止定时器时候的显示的图片的位置开始。在此firstno全局变量也是起到记录的作用,但注意它和imgno变量的不同,它记录的是目前显示的图片的下标,而imgno在previous和next方法中已经不是当前图片的下标。firstclock是下面我要说明的内容。 要控制每张图片显示间隔的时间,通过一个下拉选择框来操作,取得每个选项相应的值很简单。当选项改动时触发一个事件,我们取名为setclock()方法,firstclock就是来获得间隔时间的,代码为: function setclock(clock){ firstclock=clock; rotateBanner1(imgno,clock); } rotateBanner1()的代码为: function rotateBanner1(frameNumber,interval){ window.clearTimeout(player); document.banner.src=fn[frameNumber].src; var inv=interval; var imageChoice=frameNumber+1; if(imageChoice==fn.length){ imageChoice=0; } imgno=frameNumber; firstno=imgno; player1=window.setTimeout("rotateBanner("+imageChoice+","+inv+")",inv); } 通过代码可以看出,rotateBanner1方法其实在下拉框选项改变触发的时候只执行了一次,因为最后一行调用的还是原来的rotateBanner()方法,这个代码的当时写的时候很有戏剧性,嘻嘻。 其实这个幻灯片还是很简单的,大家只要动动脑,不难写出来。。。那天看一个人物传记,sun公司的前任首席科学家Bill Joy,一天编程能编14个小时。。。。:)。。。脑子越用越灵活,啥也不说了,向他学习,学习,再学习。 哈哈,明年再接着blog了。。。。。
今天无意中发现了一个叫做Apusic的应用服务器,仔细一看,是中国自己开发的应用服务器,想到是中国自己开发的东西,一定要支持一下。不过在搜索Apusic的时候,发现了不少负面的消息。先不管那么多了,通过一个链接下载了最新的5.0的版本,不过是个免安装的试用版。配置很简单,只需在bin目录的setenv.cmd中编辑APUSIC_HOME(解压后所在目录)和 JAVA_HOME(jdk所在目录),不过还需要把jdk目录下lib文件夹的tools.jar复制到APUSIC_HOME的lib目录下面,网上没有这么介绍,但如果不这样做的话,运行不成功。至少我是这样。 地址栏输入 http://localhost:6888/就可以访问了。 想要发布自己的web应用,我是先把web应用打包为war文件,然后放入到applications目录下面。然后在config目录的server.xml中添加了部署这个web应用的一段话--<application name="test.war" base="解压目录\applications\test.war" start="auto"/>。地址栏输入http://localhost:6888/test 就能成功访问了。 运行了一下,速度还可以。性能方面还需要长期的测试和观察。
忙了一天装的Redhat Linux8.0,装好了之后发现鼠标一直到处乱窜,重启不行,关机重开电脑也不行。一气之下卸载了它重装。但卸载的问题随之而来了。。。。 删除分区比较容易,在windows用pqmagic就可以删除。删除之后呢〉?。。。。。 重启电脑后,原来安装时候安装的grub开始搞鬼了,系统启动就要加载这个引导程序,直接不会出现让你选择进入windows的界面。只有一个grub提示符,光标在一直闪,好像是在嘲笑我。。。。。。:( 不要着急,在提示符下输入 rootnoverify (hd0,0) 命令成功之行后,然后输入 chainloader +1 最后是boot,(注意前两个命令之后要有空格)。系统将执行我们刚才输入命令的参数(hd0,0)对应的所在磁盘分区的启动程序,这时候就能看到熟悉的windows启动界面了。之后要进入dos界面下(可以使用光盘引导,或者装一个虚拟软驱),在命令提示符下输入 fdisk /mbr。 好了,到此,卸载问题解决了。。。。 第二遍总算没有鼠标的问题了,但又来了adsl拨号的问题了。网上的文章讲的内容都差不多,但都不行。adsl-setup配置好之后,输入adsl-start的时候老是返回错误。不知道哪里错了。不行,还是得接着研究。。。。 搞了一晚上也最终没能拨号成功。放放吧。其实我用linux主要目的在两个,学习linux系统的操作和配置,最重要的就是架设web服务器。 第二天,我想既然我上不了网,我用能上网的电脑把jdk、tomcat、mysql下载到u盘,然后再拷到linux系统这个办法总可以吧,结果也证实我这个想法是明智的。首先查资料看看linux系统下如何挂载u盘。首先,打开终端后,输入命令fdisk -l /dev/sda ,这个命令最主要目的是看看u盘是不是真正被识别了还有就是u盘对应的设备名,一般就是sda1了。 敲入命令 mount -t vfat /dev/sda1 /mnt/usbhd。如果命令正确执行,那么不会有什么错误提示。你去/mnt的usbhd里查看,里面的内容就是u盘里面的东西了。 jdk安装比较简单,下载linux下的jdk安装包,是个.bin文件。执行这个文件,将生成一个rpm安装包。然后使用 rpm命令就可以安装了,并且jdk自动安装到了/usr/java文件夹下了。 tomcat是个tar.gz文件,使用tar命令就解压了。就解压在了此文件所在的路径。 关于mysql的安装是最让我头疼的,一直到了晚上才安装好。参考的这篇文章 http://blog.azsq.net/archives/2006/03/31/36.html,成功安装,在此也谢谢这篇文章的作者了。安装包我下载的4.0.27版的。 配置开发环境我使用了大多数人的做法,修改了/etc/profile文件,加入了和在windows下一样的环境变量。 这个周末完全献身了linux,我觉得挺值得。linux下运行jsp程序感觉很快,心情也变得异常的好。。。。。
1、启动eclipse弹出错误对话框,让你查看日志文件。 此错误一般发生在安装了oracle9i之后,安装后,oracle自带的jdk将其jdk所在目录的bin路径写入了path环境变量。此jdk版本为1.3,如果你安装的jdk版本为1.4以上的话,就会发生这个错误。解决方法很简单,把这个环境变量去掉就可以了。 2、在web.xml文件中配置<error-page> 当输入不存在的url时,tomcat通常会出现404错误的页面,对于开发者来说,这件事情无所谓。而对于用户来说,可能看到这样不太友好的界面,可能会不很舒服。所以配置<error-page>还是必要的,一般加入这段文字就可以了: <error-page> <error-code>404</error-code> <location>/error.html</location> </error-page> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/error.html</location> </error-page> 必须要注意的一点是,指定的出错后转向的文件,其大小至少为512bytes,否则不会跳转到你指定的文件。(可以让用户设置客户端ie的internet选项,但我想哪个用户也不想自己手工设置吧)。 还想说的是,此配置最好是webMIS或者网站开发完毕后之后再配置。因为我在开发过程中,调试出现错误也转向了错误页面。不利于发现程序中出现的错误。 有的人想通过欺骗手段,response.setStatus(200)来达到此目的。我个人觉得没什么意思了。。。。
1、当在一个文本框输入内容时,下一个文本框自动填写上一个文本框输入的内容。简单代码如下: <form name="fm" > <input name="first" onpropertychange="fm.second.value=fm.first.value"> <input name="second"> </form> 2、enter键代替tab键。在控件的onkeydown事件中使用简单的一行代码即可: if (window.event.keyCode==13) window.event.keyCode=9 3、强迫用户读取注册协议的计时按钮。主要是使用window.setTimeout()这个方法: var secs = 180; document.agree.agreeb.disabled=true; for(i=1;i<=secs;i++) { window.setTimeout("update(" + i + ")",i*1000);//这里的计时严格来说不是很准确 } function update(num) { if(num == secs) { document.agree.agreeb.value ="同意"; document.agree.agreeb.disabled=false; } else { printnr = secs-num; document.agree.agreeb.value = "请认真阅读协议(" + printnr +" 后才能继续注册)"; } 4、文本框和file控件一起提交 如果还是像原来的表单提交一样,此操作是不可行的。什么原因不太清楚,错误提示好像是语法方面的错误。解决方法就得靠javascript了。另外就是提交按钮换成一般的button,通过button调用一个函数,最后通过表单名.submit()方法来提交。代码简单如下: <form method="post" name="fm"> <input name="picname"> <input type="file" name="pic"> <input type="button" onclick="go()"> </form> function go(){ var picturename=fm.picname.value; var filename=fm.pic.value; fm.action="test.jsp?pname="+picturename+"&fname="+filename; fm.submit(); } 5、两个html页面传递参数 使用js来接受 通过一个location.search就可以获得后面的参数值 (to be continued)
关于word文档操作, 网上不少这样的例子,好像都是一篇文章。word文档嵌入到网页中好像比较简单一些。加个报文头基本上就可以实现此功能。而导出数据到word文档中,我可费了不少的脑细胞。闲话少说,步入正题。。。:) 网页中嵌入word文档,在jsp程序开头部分加入<%@ page contentType="application/msword;charset=GBK"%>这些代码,即可实现。比较简单,相信很多人都知道这一点了。 费脑筋的是将一张报表或者一张登记表导入到word文档中。报表(登记表)都是动态生成的。那么首先的问题是如何获得一个动态网页中的内容。我以前使用的BufferedReader,PrintWriter,BufferedInputStream,BufferedOutputSteam都不起作用了,原因就是他们不能读取动态生成的网页内容。因此,我想到了URL这个类,获得内容的代码如下: java.net.URL l_url = new java.net.URL("http://localhost:9000/rlzy/employee/employee_resume.jsp?id="+emp_id);
java.net.HttpURLConnection l_connection = (java.net.HttpURLConnection) l_url.openConnection();
l_connection.connect();
l_urlStream = l_connection.getInputStream();
java.io.BufferedReader l_reader = new java.io.BufferedReader(new java.io.InputStreamReader(l_urlStream));
while ((sCurrentLine = l_reader.readLine()) != null)
{
content+=sCurrentLine;
} content即为我们想要得到的动态内容。 导出数据的话,使用BufferedInputStream 和 BufferedOutputStream 。但前提是把得到的动态内容先输出到一个临时的html网页中,即把它先变成一个静态文件。这样BufferedInputStream 和BufferedOutputStream 就可以获得要读取和输出的内容。读取完毕,再把这个临时的html网页删除。这是网上流传的代码: BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream(内容资源的路径)); bos = new BufferedOutputStream(response.getOutputStream());
byte[] buff = new byte[2048]; int bytesRead;
while(-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff,0,bytesRead); }
} catch(final IOException e) { System.out.println ( "出现IOException." + e ); } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } 此外,导出内容到word文档后,还可能会出现格式不正确的问题。我就遇到了html表格导出到word就发生变化的情况。这种情况具体原因应该是两种不同文件编码的问题。我是通过修改源html文件解决的问题。至于以后如果还碰到类似问题的话,首先看一下word文档和html文档是从哪个地方格式开始变化了,找到之后再对症下药。如果你觉得这种解决方法没什么技术含量的话,你可以根据内容手动输出。。。哈 。。。。。。。。。。。学到了一些东西。。。。。。。。。。。。
终于把自己的朝思梦想的Linux装上了,兴奋,亢奋。。。 从决定,下载,分区,找资料,安装前前后后总共4天的时间呢。不过我觉得挺值得的,因为我学到了很多以前很模糊的东西。可谓收获颇丰啊 我是下载的安装光盘镜像iso文件。在清华大学ftp服务器上下载得到。同时还学到了关于md5方面的知识。一共三个iso文件,一天下载一个,下载的同时找一些安装资料和相关资料。同时分区也是一块难啃的骨头,好在啃下来了。它要求至少需要2个分区。一个ext2或者ext3分区,还有一个内存大小的swap分区。现在的电脑内存都很大了,swap分区可以不要,但我认为最好还是分出这个区为好。只是这个文件格式怎么得到这个问题我可是找遍了所有关于分区的帖子。qq群,所谓的Linux高手,什么都问了,但结果什么也没学到。最后还是自己琢磨。其实很简单pqmagic8.0就能实现。格式化的时候就有格式成什么样的文件格式这个选项。这些我都是在windows下实现的。这些准备工作完成了,然后安装就可以了。安装步骤网上很多。我也不用写了。第一次安装建议大家完全安装,有4.6G左右大吧。 安装重点:分区,文件格式的转换 安装好了,进入Linux界面,感觉那么纯净。可爱的小鼠标箭头,友好的界面。更坚定了我要学好它的决心。在Linux下架设服务器的任务,快要实现了。Linux, I'm on my way!:)
Tomcat运行Servlet,首先是classpath,我们需要把tomcat安装目录下面的common/lib/servlet-api.jar文件加入到其中。我假设发布路径就是默认的路径,即webapps目录,我在其下建立了一个应用程序总目录,取名为first。不过我们还要在conf文件夹下面的server.xml文件里配置一下,目的就是浏览器能定位此应用程序所在位置。我们需要在此文件中加入一行语句 。在我假设的例子中,就要这样配置 。在<host ></host>之间加入<Context url="/first" docBase="first" deBug="0" reloadable="true" />。 在first文件夹下面建立了一个WEB-INF文件夹(注意,这个文件夹一定要大写)。然后再在WEB-INF下面建立classes文件夹(用来放置servlet编译后的class文件)。下面就要编写servlet程序了。编译通过后,把class文件放到classes文件夹下面。如果是打包的servlet文件。例如 package sg;那么你还需要建立一个sg文件夹,然后在放置你的class文件。如果是多层的包也是如此。接下来需要配置web.xml文件了。即映射你的servlet文件。我们自己建立了一个xml文件。内容如下: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>servlet name</servlet-name> <servlet-class>sg.class name</servlet-class> </servlet> <servlet-mapping> <servlet-name>servlet name</servlet-name> <url-pattern>/url</url-pattern> </servlet-mapping> </web-app> 注:servlet name 为自己随意起的名字 sg.class name 为servlet的名字 /url为你想定义的url 可以任意 好了,全部准备好了。开启服务器,浏览器里输入地址http://localhost:8080/first/url 至此,大功告成。可以去喝杯咖啡了哈。
1)JDK 2)Java syntax 3)Java speciality (interface , extends , constructor...............) 4)Java Library [ java.long.* java.io.* java.util.* java.sql.*] (java.text.* java.net.* javax.naming.*) 5)Java Web http protacal Servlet & JSP the point(design patten) 6)J2EE JNDI JTA Before EJB Serialization RMI ----> JMS EJB UML DESIGN PATTEN
resin运行servlet,我感觉比运行jsp稍微复杂一些,但事在人为,通过resin官方网站还有resin服务器目录下面自带的一些例子,我终于运行成功了,很有成功感。希望这篇文章对于使用resin运行servlet的朋友们有一些帮助吧。 首先我们要编写一个简单的servlet,我编写了一个最简单的例子,代码如下: package sugo; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class HiSugo extends HttpServlet{ public void doPost(HttpServletRequest rq, HttpServletResponse rp) throws ServletException,IOException{ PrintWriter out=rp.getWriter(); out.println("Hello!I'm Sugo! Welcome to Servlet world !:)"); out.close(); } public void doGet(HttpServletRequest rq, HttpServletResponse rp) throws ServletException,IOException{ doPost(rq,rp); } } 编译HiSugo.java文件,然后放入你要发布的目录。为了简便起见,我就在wep-app 下面新建的一个自定义的文件夹sunbreak。这个文件夹就是我们的发布目录。在此文件夹下建立web-inf文件夹,然后再建一个classes文件夹。把编译好的class文件和java源文件同时放入。注意我们把程序打包了,所以class和java文件要放在sugo(还需自己建立)下面。不过还需要一步,那就是还需建立一个web.xml或者resin-web.xml文件。就是为了映射我们的servlet程序,对于此例子我们在web-inf目录下面建立web.xml文件,内容如下: <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet servlet-name="sugo" servlet-class="sugo.HiSugo"> </servlet> <servlet-mapping url-pattern="/sugo" servlet-name="sugo"/> </web-app> 至此,在浏览器里输入http://localhost:8080/sunbreak/sugo 就能运行你的servlet程序了。。。。。希望这篇文章对大家有所帮助:)
|