950 likes | 1.16k Views
WEB 架構. 靜態網頁範例. < html> <head> <meta http-equiv="Content-Type" content="text/html;charset=Big5" /> <title>JSP</title> </head> <body> Hello 大家好 </body> </html>. 其他細節,請參考 http://web.nchu.edu.tw/~jlu/tutorials.shtml 的 HTML 入門. 客戶端執行的網頁語言. JSP 的執行.
E N D
JSP 2.0 動態網頁技術 第三版 WEB架構
JSP 2.0 動態網頁技術 第三版 靜態網頁範例 <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=Big5" /> <title>JSP</title> </head> <body> Hello 大家好 </body> </html> 其他細節,請參考 http://web.nchu.edu.tw/~jlu/tutorials.shtml 的 HTML 入門
JSP 2.0 動態網頁技術 第三版 客戶端執行的網頁語言
JSP 2.0 動態網頁技術 第三版 JSP的執行 產生的程式碼以及其類別檔在 tomcat\work\Catalina\localhost\[test\]org\apache\jsp\xxx_jsp.java
研討主題 • Hello World:動態 – 由 JSP 產生 • <%@page contentType="text/html" pageEncoding="Big5"%> • <h3 align="center"> • <% • out.println("Hello 大家好"); • System.out.println("debug output"); • %> • </h3>
研討主題 • Hello World :動態 – 由 JSP 產生 • 動態 – 由 JSP 產生 • <%@page contentType=“text/html” pageEncoding=“Big5”%> 或者 • <%@page contentType=“text/html; charset=Big5”%> • 請檢視網頁的原始碼 • JSP 檔裡面,可以全部是 HTML 而沒有 JSP 的程式碼嗎? • 試試看
研討主題 • HTMLform 元件 • <html> • <head> • <meta http-equiv="Content-Type" content="text/html;charset=Big5"> • <title>Hello Form</title> • </head> • <body> • <form method="get" action="http://localhost:8080/jsp/hello1.jsp"> • <input type="text" value="老呂" name="name"> • <input type="submit"> • </form> • </body> • </html> 其他細節,請參考 http://web.nchu.edu.tw/~jlu/classes/examples/cgi/forms.html
研討主題 • hello1.jsp • <%@page contentType="text/html" pageEncoding="Big5"%> • <h3 align="center"> • <% • request.setCharacterEncoding(“Big5”); // ??? 只有 post 有用 • String name = request.getParameter("name"); • out.println("Hello " + name); • %> • </h3>
研討主題 • 互動式 Hello World • 若輸入為英文 (JSP 內建物件 request) • form 是 HTML 網頁,由 HTML 內呼叫遠端的 JSP • 注意 GET/POST 時,網址的變化 • JSP 利用 request.getParameter() 取得使用者輸入的資料 • 再次說明 System.out.println() 除錯時的用法 • 若輸入為中文 • request.setCharacterEncoding("Big5"); • 這個方法只適用 POST,卻無法正確處理 GET。 • String name = new String(request.getParameter(“name").getBytes("ISO-8859-1"), "Big5"); • 這個方法 GET/POST 都可以
研討主題 • hello3.jsp • <%@page contentType="text/html" pageEncoding="Big5"%> • <h3 align="center"> • <% • String name = request.getParameter("name"); • name = new String(request.getParameter("name").getBytes("ISO-8859-1"), • "Big5"); • out.println("Hello " + name); • %> • </h3>
研討主題 • 互動式 Hello World(強化版) • 人機介面:希望能輕易的再次執行 • 可以結合 if-else 敘述:例如,如果沒有任何輸入資料,則顯示 “Hello World”。 • 如果使用者並未輸入任何資料? • 如果沒輸入資料(或者資料錯誤),讓使用者有再次輸入的機會。 • 我們之後會逐步說明!
研討主題 • 求解:a*x2 + b*x + c = 0 • 接收到的資料是字串,需要轉換才能運算 • Double.parseDouble();Integer.parseInt() • 如果 a = 0 或者 b2-4ac < 0 • 明確說明原因,並要求重新輸入:response.sendRedirect(URL) • 呼叫另一個獨立網頁 • 轉回原網頁 • 請注意,這個用法相當於一個 GET;意思就是說,需要考量編碼問題
研討主題 • cal.html • <html> • <head> • <meta http-equiv="Content-Type" content="text/html;charset=Big5"> • <title>解一元二次方程式</title> • </head> • <body> • <form method="POST" action="cal1.jsp"> • 輸入 a 值:<input type="text" name="a"/><br/> • 輸入 b 值:<input type="text" name="b"/><br/> • 輸入 c 值:<input type="text" name="c"/><br/> • <input type="submit" value="求解"/> • </form> • </body> • </html>
研討主題 • cal1.jsp • <%@page contentType="text/html" pageEncoding="Big5"%> • <h3 align="center"> • <% • request.setCharacterEncoding("Big5"); • double a = Double.parseDouble(request.getParameter("a")); • double b = Double.parseDouble(request.getParameter("b")); • double c = Double.parseDouble(request.getParameter("c")); • double x1 = (-b + Math.sqrt(b*b - 4*a*c)) / (2 * a); • double x2 = (-b - Math.sqrt(b*b - 4*a*c)) / (2 * a); • out.println("x1 = " + x1 + "<br/>"); • out.println("x2 = " + x2 + "<br/>"); • %> • </h3>
研討主題 • cal3.jsp • // 資料檢查 • if(a == 0) { • String msg = URLEncoder.encode("a 的值為 0,請重新輸入"); • response.sendRedirect("cal.jsp?message=" + msg); • }
研討主題 • 還有 jsp:forward 的用法(要說嗎???) • <jsp:forward> 是一個 JSP 內建的特殊標籤 • 與 response.sendRedirect(URL) 功能類似,但有下列不同處: • 直接呼叫,而非經由瀏覽器 • 被呼叫的 JSP(B.jsp) 和呼叫的 JSP(A.jsp),共享一個 request 物件 • http://someurl/jsp/A.jsp?data1=ddd • A.jsp 呼叫 B.jsp 時,傳遞了 data2=eee;因為 A 和 B 共用一個 request 物件,B.jsp 可以同時取得 data1 和 data2 的值 • 網址列只會顯示呼叫的 JSP(A.jsp)
研討主題 • jsp:forward 的用法 <jsp:forward page="cal-f.jsp"> <jsp:param name="message" value="a 的值為 0,請重新輸入" /> </jsp:forward>
研討主題 • 練習題:寫一個程式,將使用者輸入的攝氏溫度轉換成華氏溫度 • 加強版:由選項按鈕(或者下拉式選單)決定究竟是攝氏轉華氏、還是華氏轉攝氏 • 嗯,如果在範例中,使用者不小心輸入不是數字的資料(如英文、中文)呢? • 之後,例外處理中說明
研討主題 • 往簡單的數位教學以及資料庫的資料處理進行 • 需要知道迴圈 • 需要知道陣列的資料型態 • 需要知道例外處理的方式
研討主題 • 請試求以下數列的總和。 • 求 1 到 1/35 的和 • 求前二十項的和 • 需要迴圈:for (和 while) 語法與 pattern • 是否能以亂數的方式產生分母? • Math.random()
研討主題 • 請試求以下矩陣之和與積。 • 如果陣列大小改變了呢? • 這是所謂的一維陣列,還有二維、三維、…陣列
研討主題 • <%@page contentType="text/html" pageEncoding="Big5"%> • <% • int[] a1 = new int[3]; • int[] a2 = new int[3]; • for(int i=0; i<a1.length; i++) { • a1[i] = (int) (Math.random() * 10); • a2[i] = (int) (Math.random() * 10); • } • int[] c = new int[3]; • for(int i=0; i<c.length; i++) { • c[i] = a1[i] + a2[i]; • } • // 以下結合 table 和 Expression Lanaguage (EL) 的用法 • // 可以把這段利用迴圈改寫嗎? • %>
研討主題 • <table> • <tr> • <td>|</td><td><%=a1[0]%></td><td>|</td><td></td><td>|</td><td><%=a2[0]%></td><td>|</td> • <td></td><td>|</td><td><%=c[0]%></td><td>|</td> • </tr> • <tr> • <td>|</td><td><%=a1[1]%></td><td>|</td><td>+</td><td>|</td><td><%=a2[1]%></td><td>|</td> • <td>=</td><td>|</td><td><%=c[1]%></td><td>|</td> • </tr> • <tr> • <td>|</td><td><%=a1[2]%></td><td>|</td><td></td><td>|</td><td><%=a2[2]%></td><td>|</td> • <td></td><td>|</td><td><%=c[2]%></td><td>|</td> • </tr> • </table>
研討主題 • 在之前的範例中,我們都假設使用者會依照我們的期望,輸入正確的資料,只可惜事實上,這是非常遙不可及的想法 • 你希望使用者輸入數字,例如 10,但是他卻輸入”a”。 • 你希望使用者輸入的數字不能小於 1,但是他卻輸入”-1”。
例外處理:try-catch 子句 研討主題 try{ 執行敘述1; 執行敘述2; 執行敘述3; …; //偵錯程式區塊 } catch(例外類型1 例外物件){ 執行敘述 …; //處理例外錯誤的程式片段 } catch(例外類型2 例外物件){ 執行敘述 …; //處理例外錯誤的程式片段 } catch(例外類型n 例外物件){ 執行敘述 …; //處理例外錯誤的程式片段 } finally{ 執行敘述 …; //一定會執行的程式區段 } try至少要配上一個catch,而finally則是可有可無。
例外處理的範例 • <%@page contentType="text/html" pageEncoding="Big5"%> • <h3 align="center"> • <% • request.setCharacterEncoding("Big5"); • try { • String input = request.getParameter("a"); • int n = Integer.parseInt(input); • //int n = Integer.parseInt(request.getParameter("a")); • int result = 0; • for(int i=1; i<=n; i++) { • result = result + i; • } • out.println("總和 = " + result + "<br/>"); • } catch(NumberFormatException e) { • out.println("輸入值必須都是數字 !! <br/>"); • } finally { • out.println("<a href='loop-try1.html'>回首頁</a>"); • } • %> • </h3>
例外處理的範例 • <%@page contentType="text/html" pageEncoding="Big5"%> • <h3 align="center"> • <% • request.setCharacterEncoding("Big5"); • try { • String input = request.getParameter("a"); • int n = Integer.parseInt(input); • if(n < 1) { • throw new Exception("輸入值不得小於 1"); • } • int result = 0; • for(int i=1; i<=n; i++) { • result = result + i; • } • out.println("總和 = " + result + "<br/>"); • } catch(NumberFormatException e) { • out.println("輸入值必須都是數字 !! <br/>"); • } catch(Exception e) { • out.println(e.getMessage() + "<br/>"); • } finally { • out.println("<a href='loop-try2.html'>回首頁</a>"); • } • %> • </h3>
usingMultiCatch.jsp <%@page contentType="text/html“ pageEncoding="Big5"%> <html> <head><title>多重catch子句</title></head><body> <% try{ String input = request.getParameter("input"); int intNumber = Integer.parseInt(input); out.print("您指定的陣列數目:"+ intNumber + "<br><br>" ); int a[]=new int[intNumber]; for(int i=0;i<=intNumber;i++){ a[i]=i*10 ; out.println(a[i]+ "<br>") ; } } catch(NumberFormatException e){ out.println("網址列的參數不正確 !! <br>") ; out.println("請在參數列輸入整數值 !! <br>") ; } catch(ArrayIndexOutOfBoundsException e){ out.println("超出陣列大小"); } finally { out.println("<b><br><br>程式執行結束 !! <b>"); } %> </body></html>
研討主題 • catch內程式的設計原則: • 儘可能反應”例外“發生的原因 • 進可能讓使用者有機會彌補錯誤
例外類別 說明 NumberFormatException 字串無法轉換的例外。 ArithmeticException 數學運算所產生的例外。 ArrayIndexOutOfBounds-Exception 陣列索引值超出陣列大小的例外。 NullPointerException 參考物件為 null 的例外。 研討主題 Exception 類別: • 例外處理機制,建構在一組預先設計好的例外類別之上,JSP 藉由各種例外類別,處理程式中各種可能所發生的錯誤。 • java.lang.Execption 類別為所有例外類別的基礎類別;放置於最後一個 catch。
研討主題 • 練習題:a*x2 + b*x + c = 0 • 如果 a = 0 或者 b2-4ac < 0 • 如果輸入的不是數字 • 明確說明原因,並要求重新輸入 • a、b、c 的值都由亂數產生器產生(可以是整數)
研討主題 • 簡易的系統分析與 ERD(實體關聯圖) • 流程以畫面呈現
研討主題 • 加入會員
研討主題 • 登入
研討主題 • 實體關聯圖 學號 + 課程編號 • PK(主鍵)以及 FK(外來鍵) • 記得要加上”index”(索引)
研討主題 • 資料庫練習題(分組作業) • 以 Course, Student, Grade 為例 • 請顯示每一位學生修課的總學分數(含未修任何學分的學生) • 請顯示每一位學生的平均分數 • 請顯示每個學生所修的課程(常見於明細表) • XXX • DB • Programming • YYY • Architecture • ZZZ • English • Accounting
研討主題 • 資料庫的安裝 • http://web.nchu.edu.tw/~jlu/cyut/mysql.shtml • 在 \mysql的目錄下建立 startup.bat start e:\mysql\bin\mysqld --defaults-file=my.ini --console • 在 \mysql的目錄下建立 shutdown.bat e:\mysql\bin\mysqladmin –u root –p shutdown • JDBC 的安裝 • Connector/J: http://dev.mysql.com/downloads/connector/j/ • http://web.nchu.edu.tw/~jlu/cyut/mysql-jdbc.shtml
研討主題 • 資料庫練習題(分組作業) • 請利用 MySQL 建立 Course, Student, Grade 表格,並建立範例資料;以 SQL 語法呈現下列結果 • 請顯示每一位學生修課的總學分數(含未修任何學分的學生) • 請顯示每一位學生的平均分數
AppServ • 如果你在其他課程已經安裝了 AppServ 又不能解除安裝:
研討主題 • JSP 查詢 MySQL 資料 • <form method="post" action="http://localhost:8080/jsp/query1.jsp"> • Price > <input type="text" value="100" name="price" size="20"><br> • <input type="submit"> • </form>
研討主題 • <%@ page contentType=“text/html;charset=Big5”language=“java”import="java.sql.*" %> • <html> • <!-- 加上 ! 宣告成為類別的屬性,否則便成為方法內的變數。 --> • <%! • private Connection conn = null; • public void jspInit() { • try { • Class.forName(“com.mysql.jdbc.Driver”);// 載入 JDBC 驅動程式 • // 請記得設定適當的 UID 和 PWD。 • conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1/eric", "jlu", "abcd"); • } catch (Exception e) { • System.out.println("Fail to connect to database."); • } • } • public void jspDestroy() { • try { • conn.close(); • } catch (Exception e) { • System.out.println("Fail to close connection."); • } • } • %>
研討主題 • <% • String salary = request.getParameter("price"); • String aQuery = null; • try { • aQuery = "select * from Product where Price > " + salary; • %> • <head><title>Database Query</title></head> • <body> • <% • // Construct a SQL statement and submit it • Statement aStatement = conn.createStatement(); • ResultSet rs = aStatement.executeQuery(aQuery);
研討主題 • <% • ResultSetMetaData rsmeta = rs.getMetaData(); • int cols = rsmeta.getColumnCount(); • // contruct table • out.println("<table border=\"1\">"); • out.println("<tr>"); • // Display column headers • for(int i=1; i<=cols; i++) { • out.print("<th>"); • out.print(rsmeta.getColumnLabel(i)); • out.print("</th>"); • } • out.println("\n</tr>");
研討主題 • // Display query results. • while(rs.next()) { • out.print("<tr>"); • for(inti=1; i<=cols; i++) { • out.print("<td>"); • out.print(rs.getString(i)); • out.print("</td>"); • } • out.println("</tr>"); • } • // Clean up • rs.close(); • aStatement.close(); • }catch (Exception e) { • System.out.println("Exception Occurs: " + e); • } • %> • </body></html>
研討主題 • 多網頁的系統 • 以資料的修改為例 • 原始碼http://web.nchu.edu.tw/~jlu/classes/jsp/update.zip • JSP 的生命週期 • 經由生命週期的了解,可以提升 JSP 的效能 • http://web.nchu.edu.tw/~jlu/cyut/jsp.shtml#life
研討主題 • 多網頁的系統
研討主題 • 多網頁的系統