第 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
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




                                         2
10. Java EE 中各技術標準最後將由什麼文件明訂規範?
  (A) JCP
  (B) JSR
  (C) JDK
答:B
提示:JCP 是組織名稱。JDK 是 Java 開發工具箱名稱。




                                   3
第 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>


                                                                  4
<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



                                                   5
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 中撰寫判斷分支來呈現不同條件下的結果畫面
       ,                                            。




                                                                   6
第 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()


                                                           7
(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),瀏覽器會提示
       另存新檔


                                                                     8
答案: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




                                                                       9
圖 3.18 根據使用者輸入動態產生圖片內容


畫圖的部份不難,主要讓學生練習如何取得請求參數、如何使用
ServletOutputStream 以及利用搜尋引擎尋找解答的能力。


2.   請實作一個 Web 應用程式,可動態產生使用者登入密碼(參考下圖,僅需
     先實作動態產生密碼圖片功能即可 送出表單後密碼驗證功能還不用實現)
                      ,                。




               圖 3.19 動態產生登入密碼


提示:主要是上一題練習的延伸,隨機產生四個數字,再畫到圖片上。這個練習
可結合 Session 屬性的運用,就可實作出登入的部份。




                                      10
第 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()方法,以下描述何
   者錯誤?


                                                     11
(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


                                                         12
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
3.   實作一個購物車應用程式,可以在採購網頁進行購物、顯示目前採購項目數
     量,並可觀看購物車內容。




                圖 4.12 採購網頁




                圖 4.13 購物車網頁



                                     14
第 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;


                                                          15
(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




                                                         16
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


                                                            17
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 節中的範例,不僅統計線上人數,還可以在頁面上顯示目前登
     入使用者的名稱、瀏覽器資訊、最後活動時間。




                                                           18
圖 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
第 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 是否一致。




                                                   20
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"]}才是正確。




                                                                21
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 模式等。




                                                                22
第 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>


                                                 23
(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


                                                                     24
10. 以下哪幾個選項可以進行 XML 字元替換?
  (A)    <c:out>
  (B)    ${fn:escapeXML}
  (C)    <fmt:message>
  (D)    ${param}
答案:A、B


 實作題
1.   請建立一個首頁,預設用英文顯示訊息,但可以讓使用者選擇使用英文、繁
     體中文或簡體中文。




                     圖 7.14 預設是英文首頁




                    圖 7.15 切換至繁體中文首頁




                    圖 7.16 切換至簡體中文首頁




                                       25
第 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().              ;
           }


                                                               26
} 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;


                                                             27
}
         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


                                                28
(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
第 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)


                                                   30
答案: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


                                                          31
(B)   boolean
  (C)      ResultSet
  (D)      Table
答案:C


 實作題
1.   微網誌應用程式中,AccountDAOJdbcImpl 與 BlahDAOJdbcImpl 中,
     為了處理 SQLException 與正確的關閉 Statement、Connection,充
     斥著大量重複的 try...catch 程式碼,請嘗試透過設計的方式,讓
     try...catch 程式碼可以重複使用,以簡化 AccountDAOJdbcImpl 與
     BlahDAOJdbcImpl 的原始碼內容。
     提示:搜尋關鍵字「JdbcTemplate」了解相關設計方式。




                                                   32
第 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>


                                                                   33
</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


                                                                   34
(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";


                                                                       35
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
第 11 章課後練習
 實作題
1.   請實作一個簡單的圖片上傳程式,使用者上傳的圖片,可以直接內嵌在
     HTML 郵件中顯示,而不是以附件方式顯示。例如若使用者使用以下表單:




               圖 11.6 上傳圖片表單
     則收到的郵件內容要是如下:




              圖 11.7 內嵌圖片的 HTML 郵件
     提示:搜尋關鍵字 cid。



                                      37
第 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 等),則應採用哪個模式?


                                                38
(A)   Business Delegate 模式
  (B)   Interceptor Filter 模式
  (C)   Service Locator 模式
  (D)   Front Controller 模式
答案:C




                                39

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

  • 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% 答案: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 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 的類別 答案: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> 4
  • 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 5
  • 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 中撰寫判斷分支來呈現不同條件下的結果畫面 , 。 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() 答案: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() 7
  • 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),瀏覽器會提示 另存新檔 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、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 9
  • 10.
    圖 3.18 根據使用者輸入動態產生圖片內容 畫圖的部份不難,主要讓學生練習如何取得請求參數、如何使用 ServletOutputStream以及利用搜尋引擎尋找解答的能力。 2. 請實作一個 Web 應用程式,可動態產生使用者登入密碼(參考下圖,僅需 先實作動態產生密碼圖片功能即可 送出表單後密碼驗證功能還不用實現) , 。 圖 3.19 動態產生登入密碼 提示:主要是上一題練習的延伸,隨機產生四個數字,再畫到圖片上。這個練習 可結合 Session 屬性的運用,就可實作出登入的部份。 10
  • 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()方法,以下描述何 者錯誤? 11
  • 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 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 答案: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; 15
  • 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 16
  • 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 17
  • 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 節中的範例,不僅統計線上人數,還可以在頁面上顯示目前登 入使用者的名稱、瀏覽器資訊、最後活動時間。 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 是丟到瀏覽器端,由瀏覽器進行直譯 答案: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 是否一致。 20
  • 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"]}才是正確。 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"]} 答案: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 模式等。 22
  • 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> 23
  • 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 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/> 答案: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(). ; } 26
  • 27.
    } catch (java.io.IOExceptionex) { 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; 27
  • 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 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、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) 30
  • 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 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、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> 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、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 34
  • 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"; 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 模式 答案: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 等),則應採用哪個模式? 38
  • 39.
    (A) Business Delegate 模式 (B) Interceptor Filter 模式 (C) Service Locator 模式 (D) Front Controller 模式 答案:C 39