Upload
justin-lin
View
2.684
Download
18
Embed Size (px)
DESCRIPTION
Servlet & JSP 教學手冊第二版
Citation preview
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。
2
5. 中文字「良」在 UTF-8 編碼下,三個位元組的十六進位數值表示分別為
「E8」、「89」、「AF」,那麼在 URI 編碼規範下,應如何表示?
(A) E889AF
(B) %E889AF
(C) %E8%89%AF
(D) %E889AF%
答案:C
6. 以下何者是屬於客戶端執行的程式?
(A) JSP
(B) JavaScript
(C) Servlet
(D) Applet
答案:B、D
7. Servlet/JSP 主要是屬於哪個 Java 平台的規範之中?
(A) Java SE
(B) Java ME
(C) Java EE
答:C
8. Servlet/JSP 必須基於哪一類型的容器才能提供服務?
(A) Applet 容器
(B) 應用程式客戶端容器
(C) Web 容器
(D) EJB 容器
答:C
9. Web 容器在收到瀏覽器請求時,會如何處理請求?
(A) 使用單一執行緒處理所有請求
(B) 一個請求就建立一個執行緒來處理請求
(C) 一個請求就建立一個行程來處理請求
(D) 一個請求就執行一個容器來處理請求
答:B
3
10. Java EE 中各技術標準最後將由什麼文件明訂規範?
(A) JCP
(B) JSR
(C) JDK
答:B
提示:JCP 是組織名稱。JDK 是 Java 開發工具箱名稱。
4
第 2 章課後練習
選擇題
1. 若要針對 HTTP 請求撰寫 Servlet 類別,以下何者是正確的作法?
(A) 實作 Servlet介面
(B) 繼承 GenericServlet
(C) 繼承 HttpServlet
(D) 直接定義一個結尾名稱為 Servlet 的類別
答案:C
2. 續上題,如何針對 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>
5
<url-pattern>/goodbye</url-pattern>
</servlet-mapping>
哪個 URL 可以正確的要求 Servlet 進行請求處理?
(A) /GoodBye
(B) /goodbye.do
(C) /LoguotServlet
(D) /goodbye
答案:D
5. 在 Web 容器中,以下哪兩個介面的實例分別代表 HTTP 請求與回應物件?
(A) HttpRequest
(B) HttpServletRequest
(C) HttpServletResponse
(D) HttpPrintWriter
答案:B、C
6. 在Web應用程式中,何者負責將HTTP請求轉換為HttpServletRequest
物件?
(A) Servlet 物件
(B) HTTP 伺服器
(C) Web 容器
(D) JSP 網頁
答案:C
7. 在 Web 應用程式的檔案與目錄結構中,web.xml 是放置在哪個目錄之中?
(A) WEB-INF 目錄
(B) conf 目錄
(C) lib 目錄
(D) classes 目錄
答案:A
8. Web 應用程式中要尋找某個類別檔案,會到哪些位置尋找?
(A) WEB-INF/classes 目錄
(B) WEB-INF/lib 中的 JAR 檔案
(C) 根目錄中的 bin 目錄
(D) JAR 檔案中的 META-INF 目錄
答案:A、B
6
9. web-fragement.xml 必須放置在 JAR 檔案的哪個目錄中?
(A) META-INF/resources 目錄
(B) META-INF 目錄
(C) classes 目錄
(D) config 目錄
答案:B
10. 你在 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 中撰寫判斷分支來呈現不同條件下的結果畫面。
7
第 3 章課後練習
課後練習
選擇題
1. 以下的空格應該填入哪個方法?
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.____________;
out.println("<html>");
...
(A) getPrintWriter()
(B) getWriter()
(C) getBufferedWriter()
(D) getOutputWriter()
答案:B
2. 請問以下的 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()
8
(C) 使用 response.sendRedirect("/WEB-INF/secret.jsp")
(D) 使用 response.sendError("/WEB-INF/secret.jsp")
答案:B
4. 如果想知道使用者所使用的瀏覽器版本等相關訊息,可以執行哪一段程式
碼:
(A) request.getHeaderParameter("User-Agent")
(B) request.getParameter("User-Agent")
(C) request.getHeader("User-Agent")
(D) request.getRequestHeader("User-Agent")
答案:C
5. 如果想取得輸出串流物件對瀏覽器輸出位元資料,應該撰寫哪一段程式碼?
(A) ResponseStream out = response.getResponseStream();
(B) ResponseStream out = response.getStream();
(C) ResponseStream out = response.getOutputStream();
(D) ServletOutputStream out = response.getOutputStream();
答案:D
6. 哪幾個程式碼可以取得 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),瀏覽器會提示
另存新檔
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、C
9. 下面哪個選項,可以正確地追加自訂標頭"MyHead"的值?
(A) response.setHeader("MyHeader", "Value2");
(B) response.appendHeader("MyHeader", "Value2");
(C) response.addHeader("MyHeader", "Value2");
(D) response.insertHeader("MyHeader", "Value2");
答案:C
10. 哪幾個方法是定義在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
10
圖 3.18 根據使用者輸入動態產生圖片內容
畫圖的部份不難,主要讓學生練習如何取得請求參數、如何使用
ServletOutputStream 以及利用搜尋引擎尋找解答的能力。
2. 請實作一個 Web 應用程式,可動態產生使用者登入密碼(參考下圖,僅需
先實作動態產生密碼圖片功能即可,送出表單後密碼驗證功能還不用實現)。
圖 3.19 動態產生登入密碼
提示:主要是上一題練習的延伸,隨機產生四個數字,再畫到圖片上。這個練習
可結合 Session屬性的運用,就可實作出登入的部份。
11
第 4 章課後練習
選擇題
1. 在瀏覽器禁用 Cookie 的情況下,哪些機制仍可以用於會話管理?
(A) HttpSession
(B) URL 重寫
(C) 隱藏欄位
(D) Cookie API
答案:B、C
2. 如何設定 Cookie 的有效期限?
(A) 使用 setMaxAge()
(B) 使用 setMaxInactive()
(C) 使用 setMaxInactiveInterval()
(D) 在 web.xml 中設定<cookie-timeout>
答案:A
3. web.xml 中<session-timeout>的設定單位是?
(A) 時
(B) 分
(C) 秒
(D) 毫秒
答案:B
4. 要讓使用者選擇是否自動登入,可以使用哪個機制?
(A) HttpSession
(B) Cookie
(C) HttpServletRequest
(D) URL 重寫
答案:B
提示:SessionCookieConfig可以設定儲存 Session ID 的 Cookie 存活期限,
但這必須在應用程式啟始時設定,無法讓使用者於應用程式服務期間選擇是否自
動登入,因此使用 Cookie,仍是實作使用者決定是否自動登入的機制。
5. 關於 HttpSession的 setMaxInactiveInterval()方法,以下描述何
者錯誤?
12
(A) 設定的單位是「分」
(B) 用來設定 HttpSession在瀏覽器多久沒活動後失效
(C) 用來設定 Cookie的失效時間
(D) 會覆蓋 web.xml 中<session-timeout>的設定
答案:A、C
6. 關於 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、B
8. 關於 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
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 記住名稱、密碼
14
3. 實作一個購物車應用程式,可以在採購網頁進行購物、顯示目前採購項目數
量,並可觀看購物車內容。
圖 4.12 採購網頁
圖 4.13 購物車網頁
15
第 5 章課後練習
選擇題
1. 如果是整個應用程式會共用的資料,則適合存放在哪個物件之中成為屬性?
(A) ServletConfig
(B) ServletContext
(C) ServletRequest
(D) Session
答案:B
2. 如果要取得 ServletContext初始參數,則可以執行哪個方法?
(A) getContextParameter()
(B) getParameter()
(C) getInitParameter()
(D) getAttribute()
答案:C
3. 假設有段程式碼如下,其中 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
答案:D
4. 繼承 HttpServlet之後,若要進行 Servlet 初始化,重新定義哪個方法才
是正確的作法?
(A) public void init(ServletConfig config) throws
ServletException;
16
(B) public void init() throws ServletException
(C) public String getInitParameter(String name)
(D) public Enumeration getInitParameterNames()
答案:B
5. 哪幾個物件提供有 getAttribute()方法?
(A) ServletRequest
(B) HttpSession
(C) ServletConfig
(D) ServletContext
答案:A、B、D
6. 關於過濾器的描述,以下何者正確?
(A) Filter介面定義了 init()、service()與 destroy()方法
(B) 會傳入 ServletRequest與 ServletResponse至 Filter
(C) 要執行下一個過濾器,必須執行 FilterChaing的 next()方法
(D) 如果要取得初始參數,要使用 FilterConfig物件
答案:B、D
7. 關於 FilterChain的描述,何者正確?
(A) 如果不呼叫 FilterChain 的 doFilter()方法,則請求略過接
下來的過濾器而直接交給 Servlet
(B) 如果有下一個過濾器,呼叫 FilterChain的 doFilter()方法,
會將請求交給下一個過濾器
(C) 如果沒有下一個過濾器,呼叫 FilterChain 的 doFilter()方
法,會將請求交給 Servlet
(D) 如果沒有下一個過濾器,呼叫 FilterChain 的 doFilter()方
法沒有作用
答案:B、C
8. 關於 FilterConfig的描述,何者錯誤?
(A) 會在 Filter介面的 init()方法呼叫時傳入
(B) 為@WebServlet、web.xml 中<filter>設定的代表物件
(C) 可讀取<servlet>標籤中<init-param>所設定的初始參數
(D) 可使用 getInitParameter()方法讀取初始參數
答案:A、B、D
17
9. 以下的程式碼將實作請求包裹器:
public class MyRequestWrapper ________________ {
public MyRequstWrapper(HttpServletRequest request) {
super(requset);
}
….
}
請問空白處應該填上哪個程式碼片段?
(A) implements ServletRequest
(B) extends ServletRequestWrapper
(C) implements HttpServletRequest
(D) extends HttpServletRequestWrapper
答案:D
10. 關於請求包裹器,以下描述何者正確?
(A) 可以實作 ServletRequest介面
(B) 可以繼承 ServletRequestWrapper類別
(C) 一定要繼承 ServletRequestWrapper類別
(D) HttpServletRequestWrapper 是
ServletRequestWrapper的子類別
答案:A、B、D
11. 關 於 HttpServletRequestWrapper 與
HttpServletResponseWrapper的描述,何者有誤?
(A) 分 別 實 作 了 HttpServletRequest 介 面 與
HttpServletResponse介面
(B) 分 別 繼 承 了 ServletRequestWrapper 與
ServletResponseWrapper類別
(C) 實作時,至少要重新定義一個父類別中的方法
(D) 實作時必須在建構式中呼叫父類別建構式
答案:A、B、D
12. 在開發過濾器時,以下何者是正確的觀念?
(A) 必須考慮前後過濾器之間的關係
(B) 掛上過濾器後不改變應用程式原有的功能
(C) 設計 Servlet 時必須考慮到未來加裝過濾器的需求
(D) 每個過濾器要設計為獨立互不影響的元件
答案:B、D
18
13. 關於 Filter介面上的 doFilter()方法之說明,何者有誤?
(A) 會傳入兩個參數 ServletRequest、ServletResponse
(B) 會傳入三個參數 ServletRequest、ServletResponse、
FilterChain
(C) 前一個過濾器呼叫 FilterChain 的 doFilter()後,會執行目
前過濾器的 doFilter()方法
(D) 前一個過濾器的 doFilter()執行過後,會執行目前過濾器的
doFilter()方法
答案:B、C
14. 你有一段程式碼片段:
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 節中的範例,不僅統計線上人數,還可以在頁面上顯示目前登
入使用者的名稱、瀏覽器資訊、最後活動時間。
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()重新定義。
20
第 6 章課後練習
選擇題
1. 關於 JSP 的描述,哪個正確?
(A) JSP 是直譯式的網頁,與 Servlet 無關
(B) JSP 會先轉譯為.java,然後編譯為.class 載入容器
(C) JSP 會直接由容器動態生成 Servlet 實例,無需轉譯
(D) JSP 是丟到瀏覽器端,由瀏覽器進行直譯
答案:B
2. 關於 JSP 的描述,哪個正確?
(A) 要在 JSP 中撰寫 Java 程式碼,必須重新定義_jspService()
(B) 重新定義 jspInit()來作 JSP 初次載入容器的初始化動作
(C) 重新定義 jspDestroy()來作 JSP 從容器銷毀時的結尾動作
(D) 要在 JSP 中撰寫 Java 程式碼,必須重新定義 service()
答案:B、C
3. 如果想要在 JSP 中定義方法,應該使用哪個 JSP 元素?
(A) <% %>
(B) <%= %>
(C) <%! %>
(D) <%-- --%>
答案:C
4. 當 JSP 中有撰寫中文時,而執行結果出現亂碼,必須檢查 page 指示元素
的哪些屬性設定是否正確?
(A) contentType
(B) language
(C) extends
(D) pageEncoding
答案:A、D
提示:基本上還得檢查一下編輯器的預設編碼與 pageEncoding是否一致。
21
5. 哪個 JSP 隱含物件,轉譯後對應 ServletContext物件?
(A) pageContext
(B) config
(C) page
(D) application
答案:D
6. 在會話範圍中以名稱"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"]}才是正確。
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"]}
答案:D
9. 在 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 模式等。
23
第 7 章課後練習
選擇題
1. 哪些 JSTL 標籤可用來進行 Java 程式中 if、if..else的功能?
(A) <c:if>
(B) <c:else>
(C) <c:when>
(D) <c:otherwise>
答案:C、D
2. 如果打算使用 request 物件的 setCharacterEncoding()方法設定字
元編碼處理方式,則以下哪個 JSTL 標籤可以不必使用 Scriptlet?
(A) <c:if>
(B) <c:set>
(C) <c:out>
(D) <c:url>
答案:B
3. JSTL 的<c:forEach>標籤 items屬性,接受哪些型態?
(A) 字串
(B) 陣列
(C) Collection
(D) Map
答案:A、B、C、D
4. 關於<c:catch>的使用,哪幾個不正確?
(A) 使用<c:catch>將可能產生例外的網頁段落包起來
(B) JSP 頁面必須設定 isErrorPage為 true
(C) 例外發生時,使用 exception取得例外物件
(D) 例外物件會設定給 var屬性所指定的名稱
答案:A、D
5. 以下哪幾個選項,可以讓你在 JSP 的四個屬性範圍中設置物件?
(A) <jsp:setProperty>
(B) <jsp:useBean>
(C) <c:set>
24
(D) <c:setBean>
答案:B、C
6. 以下哪幾個選項,可以讓你設定 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、D
8. 如果 JSP中出現 HttpServletResponse的 sendRedirect()方法的使
用,可以考慮使用哪個標籤取代?
(A) <jsp:forward>
(B) <c:redirect>
(C) <c:url>
(D) <%@include>
答案:B
9. 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
25
10. 以下哪幾個選項可以進行 XML 字元替換?
(A) <c:out>
(B) ${fn:escapeXML}
(C) <fmt:message>
(D) ${param}
答案:A、B
實作題
1. 請建立一個首頁,預設用英文顯示訊息,但可以讓使用者選擇使用英文、繁
體中文或簡體中文。
圖 7.14 預設是英文首頁
圖 7.15 切換至繁體中文首頁
圖 7.16 切換至簡體中文首頁
26
第 8 章課後練習
選擇題
1. 如果 taglib設定如下:
<%@taglib prefix="x" uri="http://openhome.cc/magic/x"%>
則以下何者會是使用自訂標籤的正確方式?
(A) <x:if>
(B) <magic:forEach>
(C) <if/>
(D) <x:if/>
答案:A
2. 在使用 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、C
4. 在繼承 SimpleTagSupport後,doTag()的實作如下:
public void doTag() throws JspException {
try {
if(test) {
getJspBody(). ;
}
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())
答案:C
5. 在繼承 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()
答案:A
6. 在繼承 TagSupport後,有個程式片段實作如下:
public int ______ ______ throws JspException {
if(test) {
// ...
return EVAL_PAGE;
28
}
return SKIP_PAGE;
}
如果 test為 false時,希望能中斷 JSP 後續頁面的處理?則空白部份應
是實作哪個方法?
(A) doTag()
(B) doStartTag()
(C) doEndTag()
(D) doAfterBody()
答案:C
7. 在繼承 BodyTagSupport 類別實作自訂標籤時,基本上 doStartTag()
方法可以傳回的有效值有哪幾個?
(A) SKIP_BODY
(B) EVAL_BODY_BUFFERED
(C) EVAL_BODY_INCLUDE
(D) EVAL_PAGE
答案:A、B、C
8. 在 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
答案:A
9. Tag File 檔案轉譯後,是繼承自哪個類別?
(A) TagSupport
(B) BodyTagSupport
(C) SimpleTagSupport
(D) HttpServlet
答案:B
10. 關於 Tag File,何者有誤?
(A) .tag檔案中可以使用 Scriptlet
(B) 自訂標籤的本體可以使用 Scriptlet
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屬性。
30
第 9 章課後練習
選擇題
1. 哪些 JDBC 驅動程式可以有跨平台的特性?
(A) TYPE 1
(B) TYPE 2
(C) TYPE 3
(D) TYPE 4
答案:C、D
2. 哪種 JDBC 驅動程式是基於資料庫所提供的 API 來進行實作?
(A) TYPE 1
(B) TYPE 2
(C) TYPE 3
(D) TYPE 4
答案:B
3. JDBC 相關介面或類別,是放在哪個套件之下加以管理?
(A) java.lang
(B) javax.sql
(C) java.sql
(D) java.util
答案:C
4. 使用 JDBC 時,通常會需要處理哪個受檢例外(Checked Exception)?
(A) RuntimeException
(B) SQLException
(C) DBException
(D) DataException
答案:B
5. 關於 Connection的描述,何者正確?
(A) 可以從 DriverManager上取得 Connection
(B) 可以從 DataSource上取得 Connection
(C) 在方法結束之後 Connection會自動關閉
(D) Connection是執行緒安全(Thread-safe)
31
答案:A、B
提示:Connection 不是執行緒安全的,不可以在多執行緒環境下共用
Connection,以免發生資料錯亂的問題。
6. 使用 Statement來執行 SELECT等查詢用的 SQL 指令時,應使用下列哪
個方法?
(A) executeSQL()
(B) executeQuery()
(C) executeUpdate()
(D) executeFind()
答案:B
7. 哪個物件正確使用下,可以適當地避免 SQL Injection 的問題?
(A) Statement
(B) ResultSet
(C) PreparedStatement
(D) Command
答案:C
8. 取得 Connection之後,如何取得 Statement物件?
(A) conn.createStatement()
(B) conn.buildStatement()
(C) conn.getStatement()
(D) conn.createSQLStatement()
答案:A
9. 以下描述何者有誤?
(A) 使用 Statement一定會發生 SQL Injection
(B) 使用 PreparedStatement就不會發生 SQL Injection
(C) 不使用 Connection時必須加以關閉
(D) ResultSet代表查詢的結果集合
答案:A、B
提示:只要有正確的使用觀念,即使用 Statement 也不一定會發生 SQL
Injection。如果使用不正確,使用 PreparedStatement 也有可能發生 SQL
Injection。
10. 使用 Statement的 executeQuery()方法,會傳回哪個型態?
(A) int
32
(B) boolean
(C) ResultSet
(D) Table
答案:C
實作題
1. 微網誌應用程式中,AccountDAOJdbcImpl與 BlahDAOJdbcImpl中,
為了處理 SQLException 與正確的關閉 Statement、Connection,充
斥著大量重複的 try...catch 程式碼,請嘗試透過設計的方式,讓
try...catch 程式碼可以重複使用,以簡化 AccountDAOJdbcImpl 與
BlahDAOJdbcImpl的原始碼內容。
提示:搜尋關鍵字「JdbcTemplate」了解相關設計方式。
33
第 10 章課後練習
選擇題
1. 哪幾個 Web 容器提供的驗證方式,會出現對話方塊讓使用者輸入名稱、密
碼?
(A) BASIC
(B) FORM
(C) DIGEST
(D) CLIENT_CERT
答案:A、C、D
2. 以下何者驗證方式,有機會自行設計登入畫面與登出機制?
(A) BASIC
(B) FORM
(C) DIGEST
(D) CLIENT_CERT
答案:B
3. 在使用容器表單驗證時,<form>的 action屬性應設置為?
(A) j_security
(B) j_check
(C) j_security_check
(D) 沒有規範
答案:C
4. 假設有以下的 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>
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、B
6. 假設有以下的 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) 這個設定片段是錯誤的,無法部署
答案:C
7. 驗證成功但授權失敗,則會出現哪種狀態碼及訊息?
(A) 404 Not Found
(B) 401 Unauthorized
(C) 403 Forbidden
35
(D) 500 Error
答案:C
8. 哪幾個 Web 容器提供的驗證方式,會需要使用到憑證?
(A) BASIC
(B) FORM
(C) DIGEST
(D) CLIENT_CERT
答案:D
9. 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";
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";
37
第 11 章課後練習
實作題
1. 請實作一個簡單的圖片上傳程式,使用者上傳的圖片,可以直接內嵌在
HTML 郵件中顯示,而不是以附件方式顯示。例如若使用者使用以下表單:
圖 11.6 上傳圖片表單
則收到的郵件內容要是如下:
圖 11.7 內嵌圖片的 HTML 郵件
提示:搜尋關鍵字 cid。
38
第 12 章課後練習
選擇題
1. 當繼承 HttpServlet後,重新定義 doGet()方法,以在 GET 請求來到時
執行,這實際上是哪個模式的實現結果?
(A) Factory Method 模式
(B) Template Method 模式
(C) Command 模式
(D) Proxy 模式
答案:B
2. 在 web.xml 中定義使用者登入驗證過濾器、效能過濾器,就可以有攔截請
求,這是哪個模式的實現?
(A) Business Delegate 模式
(B) Interceptor Filter 模式
(C) Service Locator 模式
(D) Front Controller 模式
答案:B
3. 以下哪幾個屬於 Java EE 模式?
(A) Business Delegate 模式
(B) Interceptor Filter 模式
(C) Service Locator 模式
(D) Front Controller 模式
答案:A、B、C、D
4. 想要降低前端所採用技術及後端服務物件的耦合度,例如為免日後前端從
Servlet/JSP 改用 JSF 時必須對後端物件作出修改,則適合採用哪個模式?
(A) Business Delegate 模式
(B) Interceptor Filter 模式
(C) Service Locator 模式
(D) Front Controller 模式
答案:A
5. 在分散式的應用當中,你希望對某個物件隱藏取得遠端服務物件的細節(也
許是透過 RMI、JNDI 等),則應採用哪個模式?
39
(A) Business Delegate 模式
(B) Interceptor Filter 模式
(C) Service Locator 模式
(D) Front Controller 模式
答案:C