Servlet & JSP 教學手冊第二版 - 課後練習解答
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Servlet & JSP 教學手冊第二版 - 課後練習解答

  • 2,467 views
Uploaded on

Servlet & JSP 教學手冊第二版

Servlet & JSP 教學手冊第二版

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,467
On Slideshare
2,467
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
53
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 第 1 章課後練習 選擇題1.以下何者適合使用 GET 請求來發送? (A) 使用者名稱、密碼 (B) 檢視論譠頁面 (C) 信用卡資料 (D) 查詢資料的分頁答案:B、D提示:敏感性資料不應使用 GET 來發送。論譠頁面、資料分頁可以使用 GET,便於使用者設定為書籤。2.以下何者應該使用 POST 請求來發送? (A) 使用者名稱、密碼 (B) 檔案上傳 (C) 搜尋引擎的結果頁面 (D) 留言版訊息答案:A、B、D提示:敏感性資料、大量資料不應使用 GET 來發送。搜尋引擎結果畫面可以使用 GET,便於使用者設定為書籤。3.以下何者適合使用 GET 請求來發送? (A) 檢視靜態頁面 (B) 查詢商品資料 (C) 新增商品資料 (D) 刪除商品資料答案:A、B提示:這題在考等冪操作,不改變伺服器狀態的查詢應使用 GET。4.以下何者應該使用 POST 請求來發送? (A) 查詢商品資料 (B) 新增商品資料 (C) 更新商品資料 (D) 刪除商品資料答案:B、C、D提示:這題在考非等冪操作,會改變伺服器狀態的查詢應使用 POST。 1
  • 2. 5. 中文字「良」在 UTF-8 編碼下,三個位元組的十六進位數值表示分別為 「E8」「89」「AF」 、 、 ,那麼在 URI 編碼規範下,應如何表示? (A) E889AF (B) %E889AF (C) %E8%89%AF (D) %E889AF%答案:C6. 以下何者是屬於客戶端執行的程式? (A) JSP (B) JavaScript (C) Servlet (D) Applet答案:B、D7. Servlet/JSP 主要是屬於哪個 Java 平台的規範之中? (A) Java SE (B) Java ME (C) Java EE答:C8.Servlet/JSP 必須基於哪一類型的容器才能提供服務? (A) Applet 容器 (B) 應用程式客戶端容器 (C) Web 容器 (D) EJB 容器答:C9. Web 容器在收到瀏覽器請求時,會如何處理請求? (A) 使用單一執行緒處理所有請求 (B) 一個請求就建立一個執行緒來處理請求 (C) 一個請求就建立一個行程來處理請求 (D) 一個請求就執行一個容器來處理請求答:B 2
  • 3. 10. Java EE 中各技術標準最後將由什麼文件明訂規範? (A) JCP (B) JSR (C) JDK答:B提示:JCP 是組織名稱。JDK 是 Java 開發工具箱名稱。 3
  • 4. 第 2 章課後練習 選擇題1.若要針對 HTTP 請求撰寫 Servlet 類別,以下何者是正確的作法? (A) 實作 Servlet 介面 (B) 繼承 GenericServlet (C) 繼承 HttpServlet (D) 直接定義一個結尾名稱為 Servlet 的類別答案:C2. 續上題,如何針對 HTTP 的 GET 請求進行處理與回應? (A) 重新定義 service()方法 (B) 重新定義 doGet()方法 (C) 定義一個方法名稱為 doService() (D) 定義一個方法名稱為 get()答案:B提示:不建議也不應重新定義 HttpServlet 所繼承下來的 service()方法。3. HttpServlet 是定義在哪個套件之中? (A) javax.servlet (B) javax.servlet.http (C) java.http (D) javax.http答案:B提示:與 Servlet 定義相關的類別或介面都位於 javax.servlet 套件之中,像是 Servlet、GenericServlet、ServletRequest、ServletResponse等 與 HTTP 定義相關的類別或介面都位於 javax.servlet.http 套件之中, 。像是 HttpServlet、HttpServletRequest、HttpServletResponse 等。4. 你在 web.xml 中定義了以下的內容: <servlet> <servlet-name>Goodbye</servlet-name> <servlet-class>cc.openhome.LogutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GoodBye</servlet-name> 4
  • 5. <url-pattern>/goodbye</url-pattern> </servlet-mapping> 哪個 URL 可以正確的要求 Servlet 進行請求處理? (A) /GoodBye (B) /goodbye.do (C) /LoguotServlet (D) /goodbye答案:D5. 在 Web 容器中,以下哪兩個介面的實例分別代表 HTTP 請求與回應物件? (A) HttpRequest (B) HttpServletRequest (C) HttpServletResponse (D) HttpPrintWriter答案:B、C6. 在 Web 應用程式中 何者負責將 HTTP 請求轉換為 HttpServletRequest , 物件? (A) Servlet 物件 (B) HTTP 伺服器 (C) Web 容器 (D) JSP 網頁答案:C7.在 Web 應用程式的檔案與目錄結構中,web.xml 是放置在哪個目錄之中? (A) WEB-INF 目錄 (B) conf 目錄 (C) lib 目錄 (D) classes 目錄答案:A8.Web 應用程式中要尋找某個類別檔案,會到哪些位置尋找? (A) WEB-INF/classes 目錄 (B) WEB-INF/lib 中的 JAR 檔案 (C) 根目錄中的 bin 目錄 (D) JAR 檔案中的 META-INF 目錄答案:A、B 5
  • 6. 9. web-fragement.xml 必須放置在 JAR 檔案的哪個目錄中? (A) META-INF/resources 目錄 (B) META-INF 目錄 (C) classes 目錄 (D) config 目錄答案:B10. 你在 web.xml 中定義了以下的內容: <servlet> <servlet-name>Goodbye</servlet-name> <servlet-class>cc.openhome.LogutServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Goodbye</servlet-name> <url-pattern>/goodbye</url-pattern> </servlet-mapping> 如果改用@WebServlet 的話,該如何設定? (A) @WebServlet("/goodbye") (B) @WebServlet("Goodbye") (C) @WebServlet(name="/goodbye", urlPatterns="Goodbye") (D) @WebServlet(name="Goodbye", urlPatterns="/goodbye")答案:D 實作題1. 講師提示:這個練習在讓學生動手實作 HttpServlet 的繼承、web.xml 的定義,並能夠自行查詢線上 API 文件,了解 HttpServletRequest 有 哪些方法可以利用。2. 提示:這個練習在讓學生動作撰寫表單 (學生必須自行學習基本的 HTML) , 了解 GET 與 POST 如何在 Servlet 中進行處理 學生必須重新定義 doPost() , 方法 並了解如何在 Servlet 中撰寫判斷分支來呈現不同條件下的結果畫面 , 。 6
  • 7. 第 3 章課後練習課後練習 選擇題1. 以下的空格應該填入哪個方法? response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.____________; out.println("<html>"); ... (A) getPrintWriter() (B) getWriter() (C) getBufferedWriter() (D) getOutputWriter()答案:B2. 請問以下的 Servlet 程式片段輸出結果為何? out.println("第一個 Servlet 程式"); out.flush(); request.getRequestDispatcher("message.jsp") .forward(request,response); out.println("Hello!World!"); (A) 顯示"第一個 Servlet 程式"後轉發 message.jsp (B) 顯示"第一個 Servlet 程式"與"Hello!World!" (C) 直接轉發給 message.jsp 進行回應 (D) 丟出 IllegalStateException答案:D提 示 : 在 flush() 之 後 回 應 已 確 認 , 此 時 再 forward() 就 會 發 生IllegalStateException。3. 你將 secret.jsp 檔案放在 WEB-INF 目錄中,哪個方式或程式片段可以正確 讓 secret.jsp 進行回應? (A) 使用瀏覽器請求/WEB-INF/secret.jsp (B) request.getRequestDispatcher("/WEB-INF/secret.j sp")並進行 forward() 7
  • 8. (C) 使用 response.sendRedirect("/WEB-INF/secret.jsp") (D) 使用 response.sendError("/WEB-INF/secret.jsp")答案:B4. 如果想知道使用者所使用的瀏覽器版本等相關訊息,可以執行哪一段程式 碼: (A) request.getHeaderParameter("User-Agent") (B) request.getParameter("User-Agent") (C) request.getHeader("User-Agent") (D) request.getRequestHeader("User-Agent")答案:C5. 如果想取得輸出串流物件對瀏覽器輸出位元資料,應該撰寫哪一段程式碼? (A) ResponseStream out = response.getResponseStream(); (B) ResponseStream out = response.getStream(); (C) ResponseStream out = response.getOutputStream(); (D) ServletOutputStream out = response.getOutputStream();答案:D6. 哪幾個程式碼可以取得 password 請求參數的值? (A) request.getParameter("password"); (B) request.getParameters("password")[0]; (C) request.getParameterValues("password")[0]; (D) request.getRequestParameter("password");答案:A、C提示:getParameterValues()會用字串陣列傳回指定的請求參數值,如果請求參數只有一個值,則透過指定索引值 0 也可取得該值。7. 下面這個程式碼片段會輸出什麼結果? PrintWriter writer = response.getWriter(); writer.println("第一個 Servlet 程式"); OutputStream stream = response.getOutputStream(); stream.println("第一個 Servlet 程式".getBytes()); (A) 瀏覽器會看到兩段"第一個 Servlet 程式"的文字 (B) 瀏覽器會看到一段"第一個 Servlet 程式"的文字 (C) 丟出 IllegalStateException (D) 由於沒有正確地設定內容類型(content-type),瀏覽器會提示 另存新檔 8
  • 9. 答案:C提 示 : 同 一個 請 求週期 中 , HttpServletResponse 的 getWriter() 與getOutputStream() 只 能 擇 一 使 用 , 否 則 會 丟 出IllegalStateException。8. 如果要設置回應的內容類型標頭,哪幾個選項是正確的作法? (A) response.setHeader("Content-Type", "text/html"); (B) response.setContentType("text/html"); (C) response.addHeader("Content-Type", "text/html"); (D) response.setContentHeader("text/html");答案:A、B、C9. 下面哪個選項,可以正確地追加自訂標頭"MyHead"的值? (A) response.setHeader("MyHeader", "Value2"); (B) response.appendHeader("MyHeader", "Value2"); (C) response.addHeader("MyHeader", "Value2"); (D) response.insertHeader("MyHeader", "Value2");答案:C10. 哪幾個方法是定義在 HttpServletRequest 中 而非由 ServletRequet , 中繼承而來? (A) getMethod() (B) getHeader() (C) getParameter() (D) getCookies()答案:A、B、D提示:與 HTTP 請求有關的方法,是定義在 HttpServletRequest 中,與通用請求有關的,是定義在 ServletRequest 中,例如 getParameter()。 實作題:1.請實作一個 Web 應用程式,可以將使用者所發送的 name 請求參數值畫在 一張圖片上(參考下圖,底圖可任選) 。提示:http://caterpillar.onlyfun.net/Gossip/ServletJSP/GetOutputStream.html 9
  • 10. 圖 3.18 根據使用者輸入動態產生圖片內容畫圖的部份不難,主要讓學生練習如何取得請求參數、如何使用ServletOutputStream 以及利用搜尋引擎尋找解答的能力。2. 請實作一個 Web 應用程式,可動態產生使用者登入密碼(參考下圖,僅需 先實作動態產生密碼圖片功能即可 送出表單後密碼驗證功能還不用實現) , 。 圖 3.19 動態產生登入密碼提示:主要是上一題練習的延伸,隨機產生四個數字,再畫到圖片上。這個練習可結合 Session 屬性的運用,就可實作出登入的部份。 10
  • 11. 第 4 章課後練習 選擇題1. 在瀏覽器禁用 Cookie 的情況下,哪些機制仍可以用於會話管理? (A) HttpSession (B) URL 重寫 (C) 隱藏欄位 (D) Cookie API答案:B、C2. 如何設定 Cookie 的有效期限? (A) 使用 setMaxAge() (B) 使用 setMaxInactive() (C) 使用 setMaxInactiveInterval() (D) 在 web.xml 中設定<cookie-timeout>答案:A3. web.xml 中<session-timeout>的設定單位是? (A) 時 (B) 分 (C) 秒 (D) 毫秒答案:B4. 要讓使用者選擇是否自動登入,可以使用哪個機制? (A) HttpSession (B) Cookie (C) HttpServletRequest (D) URL 重寫答案:B提示 SessionCookieConfig 可以設定儲存 Session ID 的 Cookie 存活期限 : ,但這必須在應用程式啟始時設定 ,無法讓使用者於應用程式服務期間選擇是否自動登入,因此使用 Cookie,仍是實作使用者決定是否自動登入的機制。5. 關於 HttpSession 的 setMaxInactiveInterval()方法,以下描述何 者錯誤? 11
  • 12. (A) 設定的單位是「分」 (B) 用來設定 HttpSession 在瀏覽器多久沒活動後失效 (C) 用來設定 Cookie 的失效時間 (D) 會覆蓋 web.xml 中<session-timeout>的設定答案:A、C6. 關於 HttpSession 的描述,以下何者錯誤? (A) 關閉瀏覽器後 HttpSession 就會被回收 (B) 可以執行 invalidate()使之失效 (C) 不 同 的 瀏 覽 器 使 用 相 同 的 Session ID , 也 會 取 得 不 同 的 HttpSession 物件 (D) HttpSession 的 setMaxInactiveInterval()方法設定為-1 將永不失效答案:A、C提 示 : 關 閉 瀏 覽 器 後 立 即 失 效 的 是 儲 存 Session ID 的 Cookie , 不 是HttpSession 物件。7. 哪幾個物件提供有 setAttribute()方法? (A) ServletRequest (B) HttpSession (C) ServletConfig (D) ServletResponse答案:A、B8. 關於 Servlet/JSP 的 Session ID,何者正確? (A) 預設使用 Cookie 來儲存 Session ID (B) Cookie 的名稱是 JSESSIONID (C) 在禁用 Cookie 時,可以使用 URL 重寫來發送 Session ID (D) 必須自行呼叫 HttpSession 的 getId()方可產生答案:A、C提示:Session ID 可以透過 SessionCookieConfig 修改名稱。9. 哪幾個物件的屬性設定可以跨越請求範圍? (A) ServletRequest (B) HttpSession (C) ServletConfig (D) ServletResponse答案:B 12
  • 13. 10. HttpSession 失效的時機為何? (A) 執行 invaliate()方法 (B) 下次請求超過 web.xml 中<session-timeout>的設定時間 (C) 存活時間超過 setMaxInactiveInterval()方法設定的時間 (D) 關閉瀏覽器答案:A、B提示:無論是<session-timeout>或 setMaxInactiveInterval()所設定的時間,都是指瀏覽器沒有再次請求活動的時間,而不是指 HttpSession 本身的存活時間。 實作題1. 請實作一個 Web 應用程式,可動態產生使用者登入密碼,送出表單後必須 通過密碼驗證才可觀看到使用者頁面。提示:此題仍第 3 章課後練習第 2 個實作題之延伸。 圖 4.10 圖片驗證2. 實作一個登入表單,如果使用者核取「記住名稱、密碼」,則下次造訪表單 時,將會自動在名稱、密碼欄位填入上次登入時所使用的值。 圖 4.11 記住名稱、密碼 13
  • 14. 3. 實作一個購物車應用程式,可以在採購網頁進行購物、顯示目前採購項目數 量,並可觀看購物車內容。 圖 4.12 採購網頁 圖 4.13 購物車網頁 14
  • 15. 第 5 章課後練習 選擇題1. 如果是整個應用程式會共用的資料,則適合存放在哪個物件之中成為屬性? (A) ServletConfig (B) ServletContext (C) ServletRequest (D) Session答案:B2. 如果要取得 ServletContext 初始參數,則可以執行哪個方法? (A) getContextParameter() (B) getParameter() (C) getInitParameter() (D) getAttribute()答案:C3. 假設有段程式碼如下,其中 PARAM 為設定於 web.xml 中的初始參數: public class SomeServlet extends HttpServlet { private String param; public SomeServlet() { param = getInitParameter("PARAM"); } … } 以下何者正確? (A) param 被設定為 web.xml 中的初始參數值 (B) 無法通過編譯 (C) 應該改用 getServletParameter()方法 (D) 發生 NullPointerException答案:D4. 繼承 HttpServlet 之後,若要進行 Servlet 初始化,重新定義哪個方法才 是正確的作法? (A) public void init(ServletConfig config) throws ServletException; 15
  • 16. (B) public void init() throws ServletException (C) public String getInitParameter(String name) (D) public Enumeration getInitParameterNames()答案:B5. 哪幾個物件提供有 getAttribute()方法? (A) ServletRequest (B) HttpSession (C) ServletConfig (D) ServletContext答案:A、B、D6. 關於過濾器的描述,以下何者正確? (A) Filter 介面定義了 init()、service()與 destroy()方法 (B) 會傳入 ServletRequest 與 ServletResponse 至 Filter (C) 要執行下一個過濾器,必須執行 FilterChaing 的 next()方法 (D) 如果要取得初始參數,要使用 FilterConfig 物件答案:B、D7. 關於 FilterChain 的描述,何者正確? (A) 如果不呼叫 FilterChain 的 doFilter()方法,則請求略過接 下來的過濾器而直接交給 Servlet (B) 如果有下一個過濾器,呼叫 FilterChain 的 doFilter()方法, 會將請求交給下一個過濾器 (C) 如果沒有下一個過濾器,呼叫 FilterChain 的 doFilter()方 法,會將請求交給 Servlet (D) 如果沒有下一個過濾器,呼叫 FilterChain 的 doFilter()方 法沒有作用答案:B、C8.關於 FilterConfig 的描述,何者錯誤? (A) 會在 Filter 介面的 init()方法呼叫時傳入 (B) 為@WebServlet、web.xml 中<filter>設定的代表物件 (C) 可讀取<servlet>標籤中<init-param>所設定的初始參數 (D) 可使用 getInitParameter()方法讀取初始參數答案:A、B、D 16
  • 17. 9. 以下的程式碼將實作請求包裹器:public class MyRequestWrapper ________________ { public MyRequstWrapper(HttpServletRequest request) { super(requset); } ….} 請問空白處應該填上哪個程式碼片段? (A) implements ServletRequest (B) extends ServletRequestWrapper (C) implements HttpServletRequest (D) extends HttpServletRequestWrapper答案:D10. 關於請求包裹器,以下描述何者正確? (A) 可以實作 ServletRequest 介面 (B) 可以繼承 ServletRequestWrapper 類別 (C) 一定要繼承 ServletRequestWrapper 類別 (D) HttpServletRequestWrapper 是 ServletRequestWrapper 的子類別答案:A、B、D11. 關 於 HttpServletRequestWrapper 與 HttpServletResponseWrapper 的描述,何者有誤? (A) 分 別 實 作 了 HttpServletRequest 介 面 與 HttpServletResponse 介面 (B) 分 別 繼 承 了 ServletRequestWrapper 與 ServletResponseWrapper 類別 (C) 實作時,至少要重新定義一個父類別中的方法 (D) 實作時必須在建構式中呼叫父類別建構式答案:A、B、D12. 在開發過濾器時,以下何者是正確的觀念? (A) 必須考慮前後過濾器之間的關係 (B) 掛上過濾器後不改變應用程式原有的功能 (C) 設計 Servlet 時必須考慮到未來加裝過濾器的需求 (D) 每個過濾器要設計為獨立互不影響的元件答案:B、D 17
  • 18. 13. 關於 Filter 介面上的 doFilter()方法之說明,何者有誤? (A) 會傳入兩個參數 ServletRequest、ServletResponse (B) 會 傳 入 三 個 參 數 ServletRequest 、 ServletResponse 、 FilterChain (C) 前一個過濾器呼叫 FilterChain 的 doFilter()後,會執行目 前過濾器的 doFilter()方法 (D) 前一個過濾器的 doFilter()執行過後,會執行目前過濾器的 doFilter()方法答案:B、C14. 你有一段程式碼片段: HttpSession session = request.getSession(); User user = new User(); session.setAttrubute("user", user); 以下何種作法,可以讓你在不修改程式碼的情況下,實作統計線上人數? (A) 實作 HttpSessionBindingListener (B) 實作 HttpSessionListener (C) 實作 HttpSessionActivationListener (D) 以上皆非答案:B提示:題目要求不修改原有的程式碼,所以 B 是唯一的可能性。15. 以下傾聽器中,不需要使用@WebListener 或在 web.xml 中設定的是? (A) HttpSessionListener (B) HttpSessionBindingListener (C) ServletContextListener (D) ServletAttributeListener答案:B 實作題1. 請擴充 5.2.2 節中的範例,不僅統計線上人數,還可以在頁面上顯示目前登 入使用者的名稱、瀏覽器資訊、最後活動時間。 18
  • 19. 圖 5.11 線上使用者資訊2. 在 5.2.2 節中,使用 HttpSessionBindingListener 在使用者登入後進 行資料庫查詢功能,請改用 HttpSessionAttributeListener 來實作 這個功能。3. 你的應用程式不允許使用者輸入 HTML 標籤,但可以允許使用者輸入一些 代碼作些簡單的樣式。例如:  [b]粗體[/b]  [i]斜體[/i]  [big]放大字體[/big]  [small]縮小字體[/small] HTML 的過濾功能,可以直接使用本章所開發的字元過濾器,並基於該字元 過濾器進行擴充。4. 在 5.3.3 開 發 的 字 元 編 碼 過 濾 器 與 編 碼 設 定 過 濾 器 , 繼 承 HttpServletRequestWrapper 後都僅重新定義了 getParameter() 方 法 , 事 實 上 為 了 完 整 性 , getParameterValues() 、 getParameterMap()等方法也要重新定義,請加強 5.3.3 的字元編碼過濾 器 與 編 碼 設 定 過 濾 器 , 針 對 getParameterValues() 、 getParameterMap()重新定義。 19
  • 20. 第 6 章課後練習 選擇題1.關於 JSP 的描述,哪個正確? (A) JSP 是直譯式的網頁,與 Servlet 無關 (B) JSP 會先轉譯為.java,然後編譯為.class 載入容器 (C) JSP 會直接由容器動態生成 Servlet 實例,無需轉譯 (D) JSP 是丟到瀏覽器端,由瀏覽器進行直譯答案:B2. 關於 JSP 的描述,哪個正確? (A) 要在 JSP 中撰寫 Java 程式碼,必須重新定義_jspService() (B) 重新定義 jspInit()來作 JSP 初次載入容器的初始化動作 (C) 重新定義 jspDestroy()來作 JSP 從容器銷毀時的結尾動作 (D) 要在 JSP 中撰寫 Java 程式碼,必須重新定義 service()答案:B、C3. 如果想要在 JSP 中定義方法,應該使用哪個 JSP 元素? (A) <% %> (B) <%= %> (C) <%! %> (D) <%-- --%>答案:C4. 當 JSP 中有撰寫中文時,而執行結果出現亂碼,必須檢查 page 指示元素 的哪些屬性設定是否正確? (A) contentType (B) language (C) extends (D) pageEncoding答案:A、D提示:基本上還得檢查一下編輯器的預設編碼與 pageEncoding 是否一致。 20
  • 21. 5. 哪個 JSP 隱含物件,轉譯後對應 ServletContext 物件? (A) pageContext (B) config (C) page (D) application答案:D6. 在會話範圍中以名稱"bean"放置了一個 JavaBean 屬性,JavaBean 上有個 getMessage()方法,請問以下哪個方式呼叫 getMessage()以取得訊息 並顯示出來? (A) <jsp:getProperty name="bean" property="message"> (B) ${requestScope.bean.message} (C) <%= request.getBean().getMessage() %> (D) ${bean.message}答案:B、D提示:<jsp:getProperty>前必須先使用<jsp:useBean>並指定 scope 為request,否則<jsp:getProperty>只會在 page 範圍中尋找屬性。7. 在 Web 應用程式中有以下的程式碼,執行後轉發至某個 JSP 網頁: Map<String, String> map = new HashMap<String, String>(); map.put("user", "caterpillar"); map.put("role", "admin"); request.setAttribute("login", map); 以下哪個選項可以正確地使用 EL 取得 map 中的值? (A) ${map.user} (B) ${map["role"]} (C) ${login.user} (D) ${login[role]}答案:C提示:選項 D 必須改為${login["role"]}才是正確。 21
  • 22. 8. 在 Web 應用程式中有以下的程式碼,執行後轉發至某個 JSP 網頁: Map<String, String> map = new HashMap<String, String>(); map.put("local.role", "admin"); request.setAttribute("login", map); 以下哪個選項可以正確地使用 EL 取得 map 中的值? (A) ${map.local.role} (B) ${login.local.role} (C) ${map["local.role"]} (D) ${login["local.role"]}答案:D9. 在 Web 應用程式中有以下的程式碼,執行後轉發至某個 JSP 網頁: List<String> names = new ArrayList<String>(); names.add("caterpillar"); request.setAttribute("names", names); 以下哪個選項可以正確地使用 EL 取得 List 中的值? (A) ${names.0} (B) ${names[0]} (C) ${names.[0]} (D) ${names["0"]}答案:B、D提示:在[]指定索引值時可以用雙引號,所以 D 也是正確的。10. 以下何者不是 EL 隱含物件? (A) param (B) request (C) pageContext (D) cookie答案:B 實作題JSP 終究會轉譯為 Servlet,Servlet 作得到的事,JSP 都作得到,試著將本章節微網誌綜合練習中 cc.openhome.controller 套件所有 Servlet 全使用 JSP , ,來改寫,你會需要在 web.xml 中設定初始參數、URL 模式等。 22
  • 23. 第 7 章課後練習 選擇題1. 哪些 JSTL 標籤可用來進行 Java 程式中 if、if..else 的功能? (A) <c:if> (B) <c:else> (C) <c:when> (D) <c:otherwise>答案:C、D2. 如果打算使用 request 物件的 setCharacterEncoding()方法設定字 元編碼處理方式,則以下哪個 JSTL 標籤可以不必使用 Scriptlet? (A) <c:if> (B) <c:set> (C) <c:out> (D) <c:url>答案:B3. JSTL 的<c:forEach>標籤 items 屬性,接受哪些型態? (A) 字串 (B) 陣列 (C) Collection (D) Map答案:A、B、C、D4. 關於<c:catch>的使用,哪幾個不正確? (A) 使用<c:catch>將可能產生例外的網頁段落包起來 (B) JSP 頁面必須設定 isErrorPage 為 true (C) 例外發生時,使用 exception 取得例外物件 (D) 例外物件會設定給 var 屬性所指定的名稱答案:A、D5. 以下哪幾個選項,可以讓你在 JSP 的四個屬性範圍中設置物件? (A) <jsp:setProperty> (B) <jsp:useBean> (C) <c:set> 23
  • 24. (D) <c:setBean>答案:B、C6. 以下哪幾個選項,可以讓你設定 Locale 資訊? (A) <fmt:bundle>的 locale 屬性 (B) <fmt:setBundle>的 value 屬性 (C) <fmt:message>的 bundle 屬性 (D) <fmt:setBundle>的 locale 屬性答案: B、D提 示 : bundle 屬 性 接 受 LocalizationContext , 建 構 時 需 要 的ResourceBundle 可以指定 Locale 物件7. JSTL 函式庫提供的 length()函式,接受哪些型態? (A) 字串 (B) 陣列 (C) Collection (D) Map答案:A、B、C、D8. 如果 JSP 中出現 HttpServletResponse 的 sendRedirect()方法的使 用,可以考慮使用哪個標籤取代? (A) <jsp:forward> (B) <c:redirect> (C) <c:url> (D) <%@include>答案:B9. JSP 中出現了以下程式碼: <% session.setAttribute("login", "caterpillar"); %> 以下哪個標籤可以避免這段程式碼的使用? (A) <c:set var="login" value="caterpillar" scope="session"/> (B) <jsp:setProperty var="login" value="caterpillar" scope="session"/> (C) <jsp:useBean id="login" value="caterpillar" scope="session"/> (D) <c:set target="login" value="caterpillar" scope="session"/>答案:A 24
  • 25. 10. 以下哪幾個選項可以進行 XML 字元替換? (A) <c:out> (B) ${fn:escapeXML} (C) <fmt:message> (D) ${param}答案:A、B 實作題1. 請建立一個首頁,預設用英文顯示訊息,但可以讓使用者選擇使用英文、繁 體中文或簡體中文。 圖 7.14 預設是英文首頁 圖 7.15 切換至繁體中文首頁 圖 7.16 切換至簡體中文首頁 25
  • 26. 第 8 章課後練習 選擇題1. 如果 taglib 設定如下: <%@taglib prefix="x" uri="http://openhome.cc/magic/x"%> 則以下何者會是使用自訂標籤的正確方式? (A) <x:if> (B) <magic:forEach> (C) <if/> (D) <x:if/>答案:A2. 在使用 Tag File 自訂標籤時,若 JSP 中有以下的內容: <%@taglib prefix="html" tagdir="/WEB-INF/tagFile" %> 以下何者描述正確? (A) 可以<html:Errors/>的方式使用自訂標籤 (B) 可以<htmlErrors/>的方式使用自訂標籤 (C) 可以<Errors/>的方式使用自訂標籤 (D) taglib 的定義有誤,無法使用自訂標籤答案:D提示:Tag File 只能放在/WEB-INF/tags 或其子資料夾中。3. 關於 tag 指示元素的 body-content 屬性,以下說明何者正確? (A) 可設定的值有 JSP、scriptless、empty 與 tagdependent (B) 預設值是 scriptless (C) 設定為 tagdependent 時,本體內容將不作任何處理直接傳入 Tag File 中 (D) 如果本體中要執行 Scriptlet,則要設定為 JSP答案:B、C4. 在繼承 SimpleTagSupport 後,doTag()的實作如下: public void doTag() throws JspException { try { if(test) { getJspBody(). ; } 26
  • 27. } catch (java.io.IOException ex) { throw new JspException("執行錯誤", ex); } } 如果 test 為 true 時,將執行本體內容並輸出結果至瀏覽器,則空白部份 應填入? (A) invoke() (B) invoke(new JspWriter()) (C) invoke(null) (D) invoke(new PrintWriter())答案:C5. 在繼承 SimpleTagSupport 後,doTag()的實作如下: public void doTag() throws JspException { try { if(test) { // ... } else { throw new ; } } catch (java.io.IOException ex) { throw new JspException("執行錯誤", ex); } } 如果 test 為 false 時,希望能中斷 JSP 後續頁面的處理?則空白部份應 填入? (A) SkipPageException() (B) IOException() (C) ServletException() (D) Exception()答案:A6. 在繼承 TagSupport 後,有個程式片段實作如下: public int ______ ______ throws JspException { if(test) { // ... return EVAL_PAGE; 27
  • 28. } return SKIP_PAGE; } 如果 test 為 false 時,希望能中斷 JSP 後續頁面的處理?則空白部份應 是實作哪個方法? (A) doTag() (B) doStartTag() (C) doEndTag() (D) doAfterBody()答案:C7. 在繼承 BodyTagSupport 類別實作自訂標籤時,基本上 doStartTag() 方法可以傳回的有效值有哪幾個? (A) SKIP_BODY (B) EVAL_BODY_BUFFERED (C) EVAL_BODY_INCLUDE (D) EVAL_PAGE答案:A、B、C8.在 TagSupport 類別的實作中,doStartTag()、doEndTag()的預設傳 回值是? (A) SKIP_BODY、EVAL_PAGE (B) EVAL_BODY_INCLUDE、EVAL_PAGE (C) EVAL_BODY_INCLUDE、SKIP_PAGE (D) SKIP_BODY、SKIP_PAGE答案:A9. Tag File 檔案轉譯後,是繼承自哪個類別? (A) TagSupport (B) BodyTagSupport (C) SimpleTagSupport (D) HttpServlet答案:B10. 關於 Tag File,何者有誤? (A) .tag 檔案中可以使用 Scriptlet (B) 自訂標籤的本體可以使用 Scriptlet 28
  • 29. (C) .tag 的 Scriptlet 中定義的變數,可以在 JSP 中使用 (D) .tag 的 Scriptlet 中可以使用 request、response 等隱含物件答案:B、C 實作題1. 請開發一個自訂標籤,可以如下使用: <g:eachImage var="image" dir="/avatars"> <img src="${image}"/><br> </g:eachImage> 你可以指定某個目錄,這個自訂標籤將取得該目錄下所有圖片的路徑,並設 定給 var 所指定的變數名稱,之後在標籤本體中可以使用該名稱(像上例 使用${image}搭配<img>標籤將圖片顯示在瀏覽器上) 。2. 請使用 Tag 開發自訂標籤,模擬 JSTL 的<c:set>與<c:remove>標籤功 能 , 其 中 <c:set> 的 模 擬 至 少 具 備 var 、 value 與 scope 屬 性 , <c:remove>的模擬至少具備 var、scope 屬性。 29
  • 30. 第 9 章課後練習 選擇題1. 哪些 JDBC 驅動程式可以有跨平台的特性? (A) TYPE 1 (B) TYPE 2 (C) TYPE 3 (D) TYPE 4答案:C、D2. 哪種 JDBC 驅動程式是基於資料庫所提供的 API 來進行實作? (A) TYPE 1 (B) TYPE 2 (C) TYPE 3 (D) TYPE 4答案:B3. JDBC 相關介面或類別,是放在哪個套件之下加以管理? (A) java.lang (B) javax.sql (C) java.sql (D) java.util答案:C4. 使用 JDBC 時,通常會需要處理哪個受檢例外(Checked Exception)? (A) RuntimeException (B) SQLException (C) DBException (D) DataException答案:B5. 關於 Connection 的描述,何者正確? (A) 可以從 DriverManager 上取得 Connection (B) 可以從 DataSource 上取得 Connection (C) 在方法結束之後 Connection 會自動關閉 (D) Connection 是執行緒安全(Thread-safe) 30
  • 31. 答案:A、B提 示 : Connection 不 是 執 行 緒 安 全 的 , 不 可 以 在 多 執 行 緒 環 境 下 共 用Connection,以免發生資料錯亂的問題。6. 使用 Statement 來執行 SELECT 等查詢用的 SQL 指令時,應使用下列哪 個方法? (A) executeSQL() (B) executeQuery() (C) executeUpdate() (D) executeFind()答案:B7. 哪個物件正確使用下,可以適當地避免 SQL Injection 的問題? (A) Statement (B) ResultSet (C) PreparedStatement (D) Command答案:C8. 取得 Connection 之後,如何取得 Statement 物件? (A) conn.createStatement() (B) conn.buildStatement() (C) conn.getStatement() (D) conn.createSQLStatement()答案:A9. 以下描述何者有誤? (A) 使用 Statement 一定會發生 SQL Injection (B) 使用 PreparedStatement 就不會發生 SQL Injection (C) 不使用 Connection 時必須加以關閉 (D) ResultSet 代表查詢的結果集合答案:A、B提示:只要有正確的使用觀念,即使用 Statement 也不一定會發生 SQLInjection。如果使用不正確,使用 PreparedStatement 也有可能發生 SQLInjection。10. 使用 Statement 的 executeQuery()方法,會傳回哪個型態? (A) int 31
  • 32. (B) boolean (C) ResultSet (D) Table答案:C 實作題1. 微網誌應用程式中,AccountDAOJdbcImpl 與 BlahDAOJdbcImpl 中, 為了處理 SQLException 與正確的關閉 Statement、Connection,充 斥著大量重複的 try...catch 程式碼,請嘗試透過設計的方式,讓 try...catch 程式碼可以重複使用,以簡化 AccountDAOJdbcImpl 與 BlahDAOJdbcImpl 的原始碼內容。 提示:搜尋關鍵字「JdbcTemplate」了解相關設計方式。 32
  • 33. 第 10 章課後練習 選擇題1. 哪幾個 Web 容器提供的驗證方式,會出現對話方塊讓使用者輸入名稱、密 碼? (A) BASIC (B) FORM (C) DIGEST (D) CLIENT_CERT答案:A、C、D2. 以下何者驗證方式,有機會自行設計登入畫面與登出機制? (A) BASIC (B) FORM (C) DIGEST (D) CLIENT_CERT答案:B3. 在使用容器表單驗證時,<form>的 action 屬性應設置為? (A) j_security (B) j_check (C) j_security_check (D) 沒有規範答案:C4. 假設有以下的 web.xml 設定檔: <security-constraint> <web-resource-collection> <web-resource-name>Login Required</web-resource-name> <url-pattern>/delete.jsp</url-pattern> <url-pattern>/delete.do</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> 33
  • 34. </auth-constraint> </security-constraint> 以下描述何者正確? (A) 只有 admin 角色才可以存取/delete.jsp 與/delete.do (B) admin 角色只允許使用 GET 與 POST 方法 (C) GET 與 POST 方法只允許 admin 使用 (D) 其他角色可使用 GET、POST 以外的 HTTP 方法存取答案:A、C、D提示:admin 可以使用所有的 HTTP 方法來存取/delete.jsp 與/delete.do。5. 如 果 要 保 證 資 料 傳 輸 時 的 完 整 性 與 機 密 性 , 必 須 在 <security_contraint>中使用哪兩個標籤? (A) <user-data-constraint> (B) <transport-guarantee> (C) <auth-constraint> (D) <form-login-config>答案:A、B6. 假設有以下的 web.xml 設定檔: <security-constraint> <web-resource-collection> <web-resource-name>Login Required</web-resource-name> <url-pattern>/delete.jsp</url-pattern> <url-pattern>/delete.do</url-pattern> </web-resource-collection> <auth-constraint/> </security-constraint> 以下描述何者正確? (A) 所有角色都可以存取/delete.jsp 與/delete.do (B) 存取/delete.jsp 與/delete.do 任何 HTTP 方法都是允許的 (C) 沒有任何角色可以存取/delete.jsp 與/delete.do (D) 這個設定片段是錯誤的,無法部署答案:C7. 驗證成功但授權失敗,則會出現哪種狀態碼及訊息? (A) 404 Not Found (B) 401 Unauthorized (C) 403 Forbidden 34
  • 35. (D) 500 Error答案:C8. 哪幾個 Web 容器提供的驗證方式,會需要使用到憑證? (A) BASIC (B) FORM (C) DIGEST (D) CLIENT_CERT答案:D9. HttpServletRequest 中的 isUserInRole()可以協助達到安全的哪項 要求? (A) 驗證 (B) 授權 (C) 機密性 (D) 完整性答案:B提示:會使用到 isUserInRole()方法的 URL,基本上會先透過宣告式安全的驗證及授權,再透過 isUserInRole()作更細部的授權控制。10. 以下何者是<transport-guarantee>的合法設定值? (A) NONE (B) CONFIDENTIAL (C) INTEGRAL (D) SSL答案:A、B、C 實作題1. 在 9.2.4 曾經實作一個檔案管理程式,請利用本章學到的 Web 容器安全管 理,必須通過表單驗證才能使用檔案管理程式。 提示:如果使用 Tomcat,必須在 catalina.policy 中的 grant 區段,加入以下 內容: // DataSource 與 Realm permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.dbcp.dbcp"; permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.dbcp.pool.impl"; 35
  • 36. permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.dbcp.pool"; permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.realm"; permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.session"; permission java.lang.RuntimePermission"accessClassInPackage.org.apache.tomcat.util.http.fileupload.disk"; permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.util.http.fileupload"; permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.util.http.fileupload.servlet"; permission java.lang.RuntimePermission "accessClassInPackage.org.apache.tomcat.util.http.fileupload.util"; permission java.lang.RuntimePermission "accessClassInPackage.org.apache.catalina.core"; permission java.net.SocketPermission "localhost:3306","connect,resolve"; permission java.util.PropertyPermission "*","read"; 36
  • 37. 第 11 章課後練習 實作題1. 請實作一個簡單的圖片上傳程式,使用者上傳的圖片,可以直接內嵌在 HTML 郵件中顯示,而不是以附件方式顯示。例如若使用者使用以下表單: 圖 11.6 上傳圖片表單 則收到的郵件內容要是如下: 圖 11.7 內嵌圖片的 HTML 郵件 提示:搜尋關鍵字 cid。 37
  • 38. 第 12 章課後練習 選擇題1. 當繼承 HttpServlet 後,重新定義 doGet()方法,以在 GET 請求來到時 執行,這實際上是哪個模式的實現結果? (A) Factory Method 模式 (B) Template Method 模式 (C) Command 模式 (D) Proxy 模式答案:B2. 在 web.xml 中定義使用者登入驗證過濾器、效能過濾器,就可以有攔截請 求,這是哪個模式的實現? (A) Business Delegate 模式 (B) Interceptor Filter 模式 (C) Service Locator 模式 (D) Front Controller 模式答案:B3.以下哪幾個屬於 Java EE 模式? (A) Business Delegate 模式 (B) Interceptor Filter 模式 (C) Service Locator 模式 (D) Front Controller 模式答案:A、B、C、D4. 想要降低前端所採用技術及後端服務物件的耦合度,例如為免日後前端從 Servlet/JSP 改用 JSF 時必須對後端物件作出修改,則適合採用哪個模式? (A) Business Delegate 模式 (B) Interceptor Filter 模式 (C) Service Locator 模式 (D) Front Controller 模式答案:A5. 在分散式的應用當中,你希望對某個物件隱藏取得遠端服務物件的細節(也 許是透過 RMI、JNDI 等),則應採用哪個模式? 38
  • 39. (A) Business Delegate 模式 (B) Interceptor Filter 模式 (C) Service Locator 模式 (D) Front Controller 模式答案:C 39