20120712 J2EE 程式設計十

1.龜兔賽跑(執行緒的應用)
利用執行緒的幾個特性,將跑者先放入等待區,等三秒一到 notifyall 指令一下開始跑,每次用Math.random()*10  亂數來取的跑步的距離。
程式碼:
runner.java

public class Runner implements Runnable {
  String name;
  Race r;

  public Runner( String name, Race r){
    this.name = name;
    this.r = r;
  }

  public void run() {
    int m = 0;
    int t = 0;
    try {
      synchronized (r) { r.wait(); }
      do{
        t = (byte)(Math.random()*10);
        Thread.currentThread().sleep(1000);
        m += t;
        System.out.println(name +", 累計跑:"+ m +"公尺");
      } while( m<100 );
    } catch ( Exception e ){}
  }
}


Test.java

public class Test {
  public static void main ( String[] args ){
    Race r = new Race();
    Runner rabbit = new Runner("兔", r);
    Runner turtle = new Runner("龜", r);
    Runner mouse = new Runner("鼠", r);
    Thread t1 = new Thread(rabbit);
    Thread t2 = new Thread(turtle);
    Thread t3 = new Thread(mouse);
    t1.start();
    t2.start();
    t3.start();
    try{
      System.out.println("龜兔鼠100公尺賽跑, 三秒鐘後 起跑!");
      Thread.currentThread().sleep(3000);
    } catch( Exception e){}
    synchronized(r) { r.notifyAll(); }
  }
}
class Race{};


PS:執行續流程示意圖

2.留言板
依據昨天的登入系統,加入留言版功能。
a.將 wellcome.jsp 加入留言版功能
首先在 wellcome.jsp 匯入 java.io.* --- 語法 <%@ page  import="java.io.*" %>,其他跟之前的依樣,顯示歡迎詞。
接下來加入留言板。因為需要將留言版的內容 post 到其他地方,所以需要將留言版 <textarea> 寫在 <form> 裡面。
最後加上一個提交的按鈕。
第一階段程式碼:

<%@ page contentType="text/html; charset=UTF-8" import="java.io.*" %>
<html><head><title>留言板</title></head>
<%
   if (session.getAttribute("uid") == null){
      response.sendRedirect("error.html");
   } //if
%>

<body>
<form name='logout' method='post' action='logout.jsp'>    //用 form做一個登出的按鈕
<input type='submit' value='登出'>
&nbsp;&nbsp;&nbsp;<a href='./logout.jsp'>登出</a>    //用簡單的超連結做一個登出的功能
&nbsp;&nbsp;&nbsp;留言板
</form>
<hr>

<%= session.getAttribute("uid")%> 你好!歡迎光臨</br></br>
<%   //預留做第二階段的讀檔案用
%>

<form name='f1' method='post' action='input.jsp'>
<textarea name='content'>請留言</textarea>    //做一個留言版
<input type='submit' value='提交'>    //做一個提交按鈕 type=submit</form>
</body>
</html>


b.增加一個 input.jsp 來承接留言版所 "提交"的文字 
程式碼:

<%@ page contentType="text/html; charset=UTF-8" import="java.io.*" %>
<%
   if (session.getAttribute("uid") ==null){
      response.sendRedirect("error.html");
   } //if
   String content = request.getParameter("content");
   File f =null;
   FileWriter fw = null;
   BufferedWriter bw = null;
 
   if ( content != null){
 //先將字型轉為 UTF-8,以免產生亂碼
      content = new String (content.getBytes("ISO-8859-1"), "UTF-8");
      f = new File ("C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0\\webapps\\jamespcschool\\message\\g_book.txt");
      fw = new FileWriter(f, true); //true 是append 到檔案的意思
      bw = new BufferedWriter (fw);
             //先寫入UID + 說 + 內容 + 換行
      bw.write(session.getAttribute("uid") + "說:" + content + "\r\n");
            // 這裡的  "\r\n" 請參考本業下方的 PS1
      bw.close();   //要記得 close 掉 bw & fw
      fw.close();
   } //if
   response.sendRedirect("wellcome.jsp");   //寫入到檔案後,重新導回 wellcome.jsp,就會清空留言的地方
%>



c.回 wellcome.jsp  加上一個功能,將之前的留言顯示在留言版上方
完整程式碼:


<%@ page contentType="text/html; charset=UTF-8" import="java.io.*" %>
<html><head><title>留言板</title></head>
<%
   if (session.getAttribute("uid") == null){
      response.sendRedirect("error.html");
   } //if
%>
<body>
<form name='logout' method='post' action='logout.jsp'>
<input type='submit' value='登出'>
&nbsp;&nbsp;&nbsp;<a href='./logout.jsp'>登出</a>
&nbsp;&nbsp;&nbsp;留言板
</form>
<hr>

<%= session.getAttribute("uid")%> 你好!歡迎光臨</br></br>
<%   //第二階段讀檔案
   File f = new File("C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0\\webapps\\jamespcschool\\message\\g_book.txt");
   FileReader fr = new FileReader(f);
   BufferedReader br = new BufferedReader(fr);
   String s = null;
   while ( (s=br.readLine()) != null){   // while 括弧裡的 (s=br.readLine()) 就會讀一次,所以在下面就不需要再讀一次了,意思是說在迴圈內不需要再寫一次(s=br.readLine())
      out.print(s + "<br>");   // 這裡的  "<br>" 請參考本業下方的PS2
   } //while
   br.close();
   fr.close();
%>
<form name='f1' method='post' action='input.jsp'>
<textarea name='content'>請留言</textarea>
<input type='submit' value='提交'>
</form>
</body>
</html>


PS1:Java 語法的  \r   &  \n
原先以為 \n 即可換行,但是寫個JAva程式輸出文字到windows 記事本後,發現 \n 無效,必須也要加入\r而且一定要先 \r 再 \n,不能 \n \r
測試範例:

public class ttt {
public static void main(String[] args) {
String ss="a\nbc";
String ss2="a\rbc";
String ss3="a\n\rbc";
String ss4="a\r\nbc";
System.out.println(ss);
System.out.println("-----");
System.out.println(ss2);
System.out.println("-----");
System.out.println(ss3);
System.out.println("-----");
System.out.println(ss4);
System.out.println("-----");
}
}

結果
a
bc
-----
a
bc
-----
a

bc
-----
a
bc
-----

注意:第三個範例SS3 多空一行!

PS2:用JSP 寫網頁時,何時要使用  \r  \n  以及  <br>
a. \r \n :當需要將資料寫入某檔案時,且需要換行所使用。
b. <br>:當需要在網頁顯示換行時使用。
範例:以上面的留言版為例
input.jsp
    bw.write(session.getAttribute("uid") + "說:" + content + "\r\n");   //先寫入UID + 說 + 內容 + 換行
**這裡是要將留言版的文字內容寫到文字檔,所以要依照 Java 語法使用"\r\n"在寫完該行之後換行。

wellcome.jsp

   String s = null;
   while ( (s=br.readLine()) != null){
      out.print(s + "<br>");
   } //while

**這裡是將從檔案讀出來的文字,一行一行顯示在網頁上,所以要依照 HTML 語法,使用 <br> 來換行。

3.安全性
基於安全上的考量,避免懂得程式語言的有心人士,惡意在留言版寫下有意義的特殊字元,進而破壞網站的功能。故而我們須將攔截特殊字元,將之改為全型,以避免上述的危險。所以 input.jsp 改成下面的版本。
完整版程式碼:

<%@ page contentType="text/html; charset=UTF-8" import="java.io.*,java.util.*, java.text.*" %>
<%
   if (session.getAttribute("uid") ==null){
      response.sendRedirect("error.html");
   } //if
   String content = request.getParameter("content");
   File f =null;
   FileWriter fw = null;
   BufferedWriter bw = null;
      //建立時間變數
   Date now = new Date();
   SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd EEEE HH:mm");
 
   if ( content != null){
            //先將字型轉為 UTF-8,以免產生亂碼
      content = new String (content.getBytes("ISO-8859-1"), "UTF-8");
            //將特殊符號改成全形
      content = content.replace('<','<');
      content = content.replace('>','>');
      content = content.replace('\'','’');
      content = content.replace('\"','”');
      f = new File ("C:\\Program Files\\Apache Software Foundation\\Tomcat 7.0\\webapps\\jamespcschool\\message\\g_book.txt");
      fw = new FileWriter(f, true); //true 是append 到檔案的意思
      bw = new BufferedWriter (fw);
          //先寫入UID + 說 + 內容 + 換行
      bw.write(session.getAttribute("uid")+ " 於 " + (sdf.format(now)) + " 說:" + "\r\n" + content + "\r\n");
      bw.close();
      fw.close();
   } //if
   response.sendRedirect("wellcome.jsp");
%>


No comments: