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='登出'>
<a href='./logout.jsp'>登出</a> //用簡單的超連結做一個登出的功能 留言板
</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='登出'>
<a href='./logout.jsp'>登出</a>
留言板
</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:
Post a Comment