JSP相關知識

        JSP的本質是Servlet,當用戶向指定的Servlet發送請求時,Servlet利用輸出流動態生成HTML頁面。JSP頁面由靜態部分和動態部分組成。靜態部分是標準的HTML標籤、靜態的頁面內容,這些內容通過該JSP頁面生成的Servlet的out輸出流對象以字符的形式輸出到客戶端。動態部分是受java程序控制的內容,這些內容由Java程序動態生成。

        每個JSP頁面就是一個Servlet實例,JSP頁面通過系統編譯成Servlet,Servlet再來負責相應用戶的請求。JSP是Servlet的一種簡化,使用JSP時,其實還是使用Servlet,Web應用中的每個JSP頁面都會由Servlet容器生成對應的Servlet。


        JSP文件必須在JSP服務器內運行。

        JSP文件必須生成Servlet才能執行。

        每個JSP頁面的第一個訪問者速度很慢,因爲必須等待JSP編譯成Servlet。

        JSP頁面的訪問者無需安裝任何客戶端,甚至不需要可以運行Java的運行環境,因爲JSP頁面輸送到客戶端的是標準的HTML頁面

        

        JSP頁面會編譯成一個Servlet類,每個Servlet在容器中只有一個實例(單例)


JSP的3個編譯指令:page, include, taglib。編譯指令是通知Servlet引擎的處理消息,在將JSP編譯成Servlet時起作用

JSP的7個動作指令:jsp:forward, jsp:param, jsp:include, jsp:plugin, jsp:useBean, jsp:setProperty, jsp:getProperty。動作指令只是運行時的動作,通常可替換成JSP腳本。


靜態導入(<%@ include %>)和動態導入(jsp:include)的區別

1、靜態導入是將被導入頁面的代碼完全融入,兩個頁面融合成一個整體Servlet;而動態導入則在Servlet中實用include方法來引入被導入頁面的內容。

2、靜態導入時被導入頁面的編譯指令會起作用;而動態導入時被導入頁面的編譯指令則失去作用,只是插入被導入頁面的body內容

3、動態導入還可以增加額外的參數。


jsp:setProperty和jsp:getProperty要求的屬性名與java類中定義的屬性有一定的差別,例如setProperty和getProperty需要使用那麼屬性,但JavaBean中是否定義了name屬性並不重要,重要的是在JavaBean中提供了setName和getName方法即可。實際上用到就是反射機制,根據用到的屬性名,大寫首字母后加set或get得到相應的方法。


JSP腳本中的9個內置對象,pageContext, request, response, session, application, out, page, config, exception

pageContext:代表該JSP頁面的上下文。使用該對象可以訪問頁面中的共享數據

page:代表該頁面本身,就是該JSP頁面生成的對應的java Servlet類中的this關鍵代表的對象

out:代表JSP頁面的輸出流,用於輸出內容,生成HTML頁面

application:javax.servlet.ServletContext的實例。該變量代表JSP頁面所屬的Web應用本身。

config:javax.servlet.ServletConfig的實例,代表JSP頁面的配置信息。該對象通常用在Servlet中。


JSP內置對象的實質:其實就是該JSP生成的對應Servlet類中的_jspService()方法的形參或該方法中的局部變量


Web服務器負責接收客戶端請求,每當接收到客戶端連接請求後,Web服務器應該使用單獨的線程爲該客戶端提供服務:接收請求參數、送回響應數據。

對於每次客戶端請求而言,Web服務器大致需要完成如下幾個步驟:

1、啓動單獨的線程。

  2、使用I\O流讀取用戶的請求數據(流來自Socket對象,深入剖析tomcat中介紹)

3、從請求數據中解析參數。

4、處理用戶請求。

5、生成響應數據。

6、使用I\O流向客戶端發送請求數據

第1、2、6步是通用的,可以由Web服務器完成。3、4、5存在差異。Web服務器會調用Servlet的_jspService()方法來完成第3、4和5步,當編寫JSP頁面時,頁面裏的靜態內容、JSP腳本都會轉換成_jspService()方法的執行代碼,這些代碼完成解析參數、處理請求、生成響應等業務功能,Web服務器則負責完成多線程、網絡通信等底層功能。Web服務器在解析到用戶的請求參數後,將需要通過這些請求參數來創建HttpServletRequest、HttpServletResponse等對象,作爲調用_jspService()的參數。


每個Web應用只有一個ServletContext實例。web.xml文件中使用<context-param/>元素配置的參數對整個Web應用有效。可以通過application對象來操作(getInitParameter())

config對象主要用在Servlet中,用於獲取對應的Servlet類在web.xml文件中配置的初始化參數信息(config.getInitParameter())

pageContext可用使用getAttribute(String name)、getAttribute(String name, int scope)方法來獲取page、request、response、application範圍的變量。PageContext.PAGE_SCOPE、PageContext.REQUEST_SCOPE等


GET方式請求:GET方式的請求會將請求參數的名和值轉換成字符串,並附加在原URL之後,因此可以在地址欄中看到請求參數名和值。且GET請求傳送的數據量較小,一般不能大於2KB。

POST方式的請求:POST方式傳送的數據量較大,通常認爲POST請求參數的大小不受限制,但往往取決於服務器的限制,POSt請求傳輸的數據量總比GET傳輸的數據量大。而且POST方式發送的請求參數以及對應的值放在HTML HEADER中傳輸,用戶不能在地址欄裏看到請求參數值,安全性相對較高。


forward用戶請求時,請求參數和request範圍的屬性都不會丟失,即forward動作還是原來的請求。重定向是response的另一個用處,與forward不同的是,重定向會丟失所有的請求參數和request範圍的屬性,因爲重定向將生產第二次請求


通常只應該把與用戶會話狀態相關的信息放入session範圍內,不要僅僅爲了兩個頁面之間交換信息就講該信息放入session範圍內。如果僅僅是爲了兩個頁面之間交換信息,可以將該信息放入request範圍內,然後forward請求即可


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