1.統計來客數
a.使用 application 的功能 "getAttribute" 和 "setAttribute"
index.jsp
<%
Integer g=null;
if ( application.getAttribute("guestCount") ==null ){ // guestcount是自己設的變數,屬性為String
g =new Integer(1); // 宣告一個整數變數,名字為 g
application.setAttribute("guestCount", g); // 設定 guestcount 變數的值為 g
} else {
// g = new Integer(((Integer)(application.getAttribute("guestCount"))).intValue() +1);
g = (Integer)(application.getAttribute("guestCount"));
g++;
application.setAttribute("guestCount", g);
}
out.print("今日累計來客數: ");
out.print( (Integer)(application.getAttribute("guestCount")) );
%>
結果:
b.加入數字圖形的功能
index.jsp
<% //今日來客數
Integer g=null;
if ( application.getAttribute("guestCount") ==null ){
application.setAttribute("guestCount", 1);
} else {
g = (Integer)(application.getAttribute("guestCount"));
g++;
application.setAttribute("guestCount", g);
}
out.print("今日來客數: ");
String s = ((Integer)(application.getAttribute("guestCount"))).toString();
//宣告一個 char 陣列,再用 .toString 方法,由左而右放入來客數的每個位數
char[] gn = s.toCharArray();
for ( int i=0; i<gn.length; i++){
out.print("<img src='./images/" +gn[i] +".png'>");
}
%>
結果:
c.加入總來客數及數字圖形的功能
index.jsp 老師版
<% //今日來客數
Integer g=null;
if ( application.getAttribute("guestCount") ==null ){
application.setAttribute("guestCount", 1);
} else {
g = (Integer)(application.getAttribute("guestCount"));
g++;
application.setAttribute("guestCount", g);
}
out.print("今日來客數: ");
//將人數轉成整數後放入字串,因為數字不能一個一個拆出來
String s = ((Integer)(application.getAttribute("guestCount"))).toString();
char[] gn = s.toCharArray(); //將上面的字串轉成一個一個字在放入陣列
for ( int i=0; i<gn.length; i++){
out.print("<img src='./images/" +gn[i] +".png'>");
}
%>
</br>
<% //總來客數
File f = new File("C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0\\webapps\\winjow\\total_guest.txt");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = null;
String oneLine = br.readLine();
out.print("總來客數: ");
//將來客數寫入檔案,不會因重開機而歸零,所以可得到總來客數
if ( oneLine ==null ){
out.print(1);
fw = new FileWriter(f);
fw.write("1");
} else {
int total_guest = Integer.parseInt(oneLine);
//顯示數字圖的方法同上
gn = oneLine.toCharArray();
for ( int i=0; i<gn.length; i++){
out.print("<img src='./images/" +gn[i] +".png'>");
}
fw = new FileWriter(f);
fw.write(Integer.toString(++total_guest));
}
fw.close();
br.close();
fr.close();
%>
結果:
d.更正總來客數為一的時候出現的錯誤
index.jsp 完整版
<% //總來客數
File f = new File("C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0\\webapps\\jamespcschool\\total_guest.txt");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
FileWriter fw = null;
String oneLine = br.readLine();
char[] gn =null;
out.print("總來客數: ");
//將來客數寫入檔案,不會因重開機而歸零,所以可得到總來客數
int total_guest=0;
if ( oneLine ==null ){
out.print("<img src='./images/number/1.jpg' width='36' height='64'>" ); //將數字改成顯示圖形
fw = new FileWriter(f);
fw.write("1");
} else {
//讀出上一次的來客數 oneLine (在 total_guest.txt 檔案內)後,要加一才是目前正確的總來客數,再放入 total_guest。
total_guest = Integer.parseInt(oneLine) +1;
oneLine = Integer.toString( total_guest ); //數字轉成字串
//宣告一個 char 陣列,再用 .toString 方法,由左而右放入來客數的每個位數。
//PS:盡量不要在 if...else 內宣告變數、陣列。所以該陣列已經在前面宣告。
gn = oneLine.toCharArray();
for ( int i=0; i<gn.length; i++){
out.print("<img src='./images/number/" +gn[i] +".jpg' width='36' height='64' >"); //將數字改成圖形
}
fw = new FileWriter(f);
fw.write(oneLine); // oneLine已經是正確的總來客數,將之寫入檔案
}
fw.close();
br.close();
fr.close();
%>
結果:
PS:陣列的回收再利用
我原本對陣列的觀念:
本範例中在今日來客數與總來客數,共用了同一個陣列 char[ ] gn。因為在程式流程順序中,今日來客數在先,總來客數在後,而且今日來客數一定小於總來客數,所以回收陣列後,陣列的大小不受影響。(詳見下面的範例)
如果將程式流程順序顛倒,總來客數在先,今日來客數在後,所以陣列的大小會受影響。
範例:總來客數 = 123,今日來客數 = 45
總來客數陣列
gn[0] = 1
gn[1] = 2
gn[2] = 3
陣列回收再利用之後
今日來客數陣列
gn[0] = 4
gn[1] = 5
gn[2] = 3 (因為沒有第三個位數可以覆蓋)
但是正確的觀念應該是:
總來客數陣列
gn[0] = 1
gn[1] = 2
gn[2] = 3
陣列回收再利用之後
今日來客數陣列
gn[0] = 4
gn[1] = 5
沒有 gn [2],因為陣列回收是整個陣列全部回收,而不是陣列內一個一個單獨回收。所以沒有第三個陣列,也就是沒有 gn[2]。
PS2:
而且上面的例子中,陣列再利用之後,陣列所指向的記憶體位置也不相同了。因為
總來客數的 gn 是由檔案中的 int total_guest --> String oneLine 再轉成 char 而來。
int total_guest=0;
oneLine = Integer.toString( total_guest );
char[] gn = oneLine.toCharArray();
而今日來客數的 gn 是由 application.getAttribute("guestCount") 轉成 String s 之後而來。
String s = ((Integer)(application.getAttribute("guestCount"))).toString();
char[] gn = s.toCharArray();
No comments:
Post a Comment