J2EE Part 11

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: