|
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" " <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程序了。。。。。希望這篇文章對大家有所幫助:)
|