Java EE學習筆記之一——JSP/Servlet相關技術

1. JSP的本質是Servlet,當用戶向指定Servlet發送請求時,Servlet利用輸出流動態生成HTML頁面。
   JSP頁面由系統編譯成Servlet,Servlet再負責相應用戶請求。JSP其實是Servlet的一種簡化。
   JSP頁面生成的Servlet放在work路徑對應的Web應用下。
2. JSP頁面工作原理:
   (1)客戶端(瀏覽器)向服務器發出請求;
   (2)如果該JSP頁面第一次收到請求,先編譯JSP文件,生成對應的Servlet。
      如果該JSP頁面已有對應的Servlet,則服務器會根據請求動態生成標準的HTML頁面。
   (3)服務器返回標準HTML頁面給客戶端。
3. 當JSP被編譯成Servlet時,JSP註釋、JSP聲明、JSP輸出表達式、JSP腳本、JSP編譯指令是否都在Servlet中。如果在,分別在哪個位置?
4. JSP的編譯指令和動作指令的區別
   (1)JSP的編譯指令是通知JSP引擎的消息,在JSP編譯成Servlet時起作用,它不直接生成輸出。編譯指令都有默認值。
   (2)JSP的動作指令只是運行時的動作,是JSP腳本的標準化寫法,可以用JSP腳本替換。
5. JSP有3個編譯指令,分別是page、include和taglib,作用分別是什麼?
6. JSP有7個動作指令,分別是forward、include、plugin、param、useBean、setProperty、getProperty。
   使用語法:<jsp:動作指令名 屬性名="屬性值"/>或<jsp:動作指令名 屬性名="屬性值"></jsp:動作指令名>
7. JSP編譯指令include(靜態導入/包含)和動作指令include(動態導入/包含)的區別:
   (1)靜態導入是將被導入頁面的代碼完全融入,兩個頁面融合成一個整體Servlet;而動態導入則在Servlet中使用include方法來引入被導入頁面的內容。
   (2)靜態導入時被導入頁面的編譯指令會起作用;而動態導入時被導入頁面的編譯指令則失去作用。
   (3)動態包含還可以增加額外的參數。
8. JSP有9個內置對象,分別是application, config, session, request, response, page, pageContext, out, exception.
   9個內置對象的作用分別是:
   (1)application: javax.servlet.ServletContext的實例,該實例代表jsp頁面所屬的Web應用本身,可用於JSP頁面,或者在Servlet之間交換信息。
   (2)config: javax.servlet.ServletConfig的實例,該實例代表JSP頁面的配置信息。該對象更多地在Servlet中有效。
   (3)session: javax.servlet.http.HttpSession的實例,該實例代表一次會話。從瀏覽器和站點/應用建立連接(會話開始),到瀏覽器關閉(會話關閉),這是一次會話。
   (4)request: javax.servlet.http.HttpServletRequest的實例,該對象封裝了一次請求。客戶端的請求參數都被封裝在該對象裏。
   (5)response: javax.servlet.http.HttpServletResponse的實例,代表服務器對客戶端的相應。通常很少使用該對象相應,而是使用jsp頁面的輸出流對象out來輸出字符串給客戶端。如果要生成非字符串,則可以使用response。它通常用於獲取輸出、轉發、重定向請求等。
   (6)page: java.lang.Object的實例,該實例代表頁面本身,即Servlet實例本身,即this。其類型就是生成的Servlet類,能用page的地方就可以用this。
   (7)pageContext: javax.servlet.jsp.PageContext的實例,該實例代表JSP頁面上下文,使用該對象可以訪問頁面中的共享數據,常用於獲取當前JSP頁面所屬的application和config、session、out、exception。
   (8)out: javax.servlet.jsp.JspWriter的實例,該實例代表JSP頁面的輸出流,用於輸出字符串,形成HTML頁面。
   (9)exception: java.lang.Throwable的實例,該實例代表其他頁面中的異常和錯誤。只有當JSP頁面爲錯誤處理頁面,即編譯指令page 的isErrorPage屬性爲true時,該JSP頁面才能使用該對象。
9. Web服務器的實現原理:Web應用,常稱爲B/S架構(也可叫“請求/響應”架構)的應用,但也可看做C/S架構的應用。
   瀏覽器負責完成的事情:
   (1)向遠程服務器發送請求;
   (2)讀取遠程服務器返回的字符串數據;
   (3)負責根據字符串數據渲染出一個豐富多彩的頁面
   Web服務器負責的工作:
   (1)等待客戶端連接;
   (2)接收到用戶請求,啓動單獨的線程;
   (3)使用I/O流讀取用戶的請求數據;
   (4)從請求數據中解析請求參數;
   (5)處理用戶請求;
   (6)生成響應數據;
   (7)使用I/O流向客戶端發送請求數據。
10. Web應用裏的JSP頁面、Servlet等程序都將由Web服務器來調用,JSP、Servlet之間通常不會相互調用,那麼,JSP、Servlet之間如何交換數據?
   JSP和Servlet之間交換數據是通過4個類似Map結構——application、session、request和page。
   它們類似銀行的角色——把數據放入這四個結構,再從這四個結構拿數據。
   JSP中通過application、session、request和pageContext這四個內置對象來分別操作這application、session、request和page四個範圍的數據。
11. 可以使用PageContext獲取各屬性所在的範圍(pageContext.getAttributesScope(屬性名)),其中這些範圍獲取的都是整型變量,這些整型變量分別對應如下4個生存範圍。
    PageContext.PAGE_SCOPE        = 1: 對應page生存範圍。
 PageContext.REQUEST_SCOPE     = 2: 對應request生存範圍。
 PageContext.SESSION_SCOPE     = 3: 對應session生存範圍。
 PageContext.APPLICATION_SCOPE = 4: 對應application生存範圍。
 PageContext類提供瞭如下兩個方法來訪問page、request、session、application範圍的變量。
 getAttribute(String name);
 getAttribute(String name, int scope); scope可以是以上的4個值。
12. 如果post請求的請求參數裏包含非西歐字符,則必須在獲取請求參數之前先調用setCharacterEncoding()方法設置編碼的字符集。
    如果發送請求的表單頁採用gb2312字符集,該表單頁發送的請求也應採用gb2312字符集,即request.setCharacterEncoding("gb2312");
13. 如果GET請求值裏包含了非西歐字符,則獲取這些參數比較複雜。通常有兩種方法。
    (1)先獲取請求裏包含的字符串,再使用URLDecoder以GBK的方式解碼字符串,最後分割字符串得到相應參數的參數名和參數值。代碼如下:
    String rawQuery = request.getQueryString();
    String queryStr = java.net.URLDecoder.decode(rawQuery, "gbk");
    //以&分解查詢字符串
    String paramPairs = queryStr.split("&");
    for(String paramPair : paramPairs)
    {
        //以=來分解請求參數名和值,nameValue[0]爲參數名,nameValue[1]爲參數值。
        String[] nameValue = paramPair.split("=");
    }
 (2)獲取對應參數名的值,先將其重新以ISO-8859-1格式分解成字節數組,最後以Ggb2312的格式將字節數組解碼成字符串。
    //獲取原始的請求參數
    String rawname = request.getParameter("name");
    //將請求參數值使用ISO-8859-1字符串分解成字節數組
    byte[] rawBytes = rawname.getBytes("ISO-8859-1");
    //將字節重新解碼成字符串
    String name = new String(rawBytes, "gb2312");

中文亂碼原因見《Java web開發中的編碼問題》一文。

14. HttpServletRequest類提供了forward和include方法代替JSP所提供的forward和include功能。
    如下代碼行可以將a.jsp頁面include到本頁面中。
 request.getRequestDispatcher("/a.jsp").include(request, response);
 如下代碼行則可以將請求forward到a.jsp頁面:
 request.getRequestDispatcher("/a.jsp").forward(request, response);
 注:使用request的getRequestDispatcher(String path)方法時,該path字符串必須以斜線開頭。
15. forward(轉發)和redirect(重定向)的區別
16. response對象的主要功能:
    (1)響應生成非字符響應
 (2)重定向(response.sendRedirect(path));
 (3)增加Cookie(Cookie放在客戶端機器上)
 添加Cookie的步驟:
 (1)創建Cookie實例,Cookie的構造器爲Cookie(String name, String value);
 (2)設置Cookie的生命期限
 (3)向客戶端寫Cookie。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章