下面是我整理下來的JSP知識點:html
圖上的知識點均可以在我其餘的文章內找到相應內容。java
jsp靜態包含和動態包含的區別web
在講解request對象的時候,咱們曾經使用過request.getRequestDispatcher(String url).include(request,response)來對頁頭和頁尾面進行包含面試
inclue指令也是作這樣的事情,咱們來試驗一下吧!設計模式
這是頁頭瀏覽器
頁頭 我是頁頭
這是頁尾緩存
頁尾 我是頁尾
在1.jsp中把頁頭和頁尾包含進來服務器
包含頁頭和頁尾進來
訪問1.jspsession
include指令是靜態包含。靜態包含的意思就是:把文件的代碼內容都包含進來,再編譯!,看一下jsp的源代碼就知道了!app
上面已經說起到了,include指令是靜態包含,include行爲是動態包含。其實include行爲就是封裝了request.getRequestDispatcher(String url).include(request,response)
include行爲語法是這個樣子的
<jsp:include page=""/>
咱們先來使用一下把,在1.jsp頁面中也將頁頭和頁尾包含進來。
包含頁頭和頁尾進來
訪問1.jsp頁面看一下效果:
使用jsp行爲來包含文件,jsp源文件是這樣子的:
jsp行爲包含文件就是先編譯被包含的頁面,再將頁面的結果寫入到包含的頁面中(1.jsp)
固然了,如今有靜態包含和動態包含,使用哪個更好呢?答案是:動態包含。
動態包含能夠向被包含的頁面傳遞參數(用處不大),而且是分別處理包含頁面的(將被包含頁面編譯後得出的結果再寫進包含頁面)【若是有相同名稱的參數,使用靜態包含就會報錯!】!
模擬一下場景吧,如今個人頭頁面有個名爲s的字符串變量
頁頭 我是頁頭呀
個人頁尾也有個名爲s的字符串變量
頁尾 我是頁尾呀
如今我使用靜態包含看看會發生什麼,出現異常了。
出現異常的緣由很簡單,就是同一個文件中有兩個相同的變量s
使用動態包含就能夠避免這種狀況
<%@include file="xxx.jsp"%>
爲jsp中的編譯指令,其文件的包含是發生在jsp向servlet轉換的時期,而<jsp:include page="xxx.jsp">
是jsp中的動做指令,其文件的包含是發生在編譯時期,也就是將java文件編譯爲class文件的時期
使用靜態包含只會產生一個class文件,而使用動態包含會產生多個class文件
使用靜態包含,包含頁面和被包含頁面的request對象爲同一對象,由於靜態包含只是將被包含的頁面的內容複製到包含的頁面中去;而動態包含包含頁面和被包含頁面不是同一個頁面,被包含的頁面的request對象能夠取到的參數範圍要相對大些,不只能夠取到傳遞到包含頁面的參數,一樣也能取得在包含頁面向下傳遞的參數
jsp有哪些內置對象?做用分別是什麼?
九個內置對象:
pageContext
page
config
request
response
session
application
exception
out
其中,request、response、session、application、config這五個對象和Servlet的API是同樣的。這5個對象我就不解釋了。
在JSP中,尤爲重要的是pageContext對象。
pageContext是內置對象中最重要的一個對象,它表明着JSP頁面編譯後的內容(也就是JSP頁面的運行環境)!
pageContext對象
既然它表明了JSP頁面編譯後的內容,理所固然的:它封裝了對其餘8大內置對象的引用!,也就是說,經過pageContext能夠獲取到其餘的8個內置對象!
獲取八大內置對象
看下效果:
pageContext做爲域對象
相似於request,session,ServletContext做爲域對象而言都有如下三個方法:
setAttribute(String name,Objcet o)
getAttribute(String name)
removeAttribute(String name)
固然了,pageContext也不例外,pageContext也有這三個方法!
pageContext本質上表明的是當前JSP頁面編譯後的內容,做爲域對象而言,它就表明着當前JSP頁面(也就是page)!也就是說:pageContext域對象只在page範圍內有效,超出了page範圍就無效了!
首先來看看在page範圍內能不能使用
使用page域對象
效果以下:
咱們如今來試驗一下是否是超出了page範圍就無效了!
在2.jsp中request域對象設置屬性
request域對象設置屬性
企圖在1.jsp中pageContext取出request存進去的屬性
在page域對象獲取屬性
效果以下:
pageContext本質上表明着編譯後JSP的內容,pageContext還能夠封裝了訪問其餘域的方法!
上面的pageContext默認是page範圍的,但pageContext對象重載了set、get、removeAttribute這三個方法
getAttribute(String name,int scope)
setAttribute(String name,Object value,int scope)
removeAttribute(String name,int scope)
多了一個設置域範圍的一個參數,若是不指定默認就是page。固然了,pageContext把request、session、application、page這幾個域對象封裝着了靜態變量供咱們使用。
PageContext.APPLICATION_SCOPE
PageContext.SESSION_SCOPE
PageContext.REQUEST_SCOPE
PageContext.PAGE_SCOPE
剛纔咱們沒有使用重載方法的時候,使用pageContext是沒法獲取到request域對象設置的屬性的。如今咱們使用重載後的方法看一下能不能獲取獲得!
在page域對象獲取request域對象的屬性
效果:
pageContexst還有這麼一個方法:
findAttribute(String name)
該方法會查找各個域的屬性,從小到大開始尋找!也就是page—>request->session->application。
咱們用此方法看能不能查找出request域對象的屬性吧!
使用findAttribute
效果以下:
out對象:
out對象用於向瀏覽器輸出數據,與之對應的是Servlet的PrintWriter對象。然而這個out對象的類型並非PrintWriter,是JspWriter
咱們能夠簡單理解爲:JspWriter就是帶緩存的PrintWrieter。
out對象的原理以下:
只有向out對象中寫入了內容,且知足以下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並經過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:
設置page指令的buffer屬性關閉了out對象的緩存功能
out對象的緩衝區已滿
整個JSP頁面結束
通常咱們在JSP頁面輸出都是用表達式(<%=%>),因此out對象用得並非不少!
page對象
內置對象page是HttpJasPage對象,其實page對象表明的就是當前JSP頁面,是當前JSP編譯後的Servlet類的對象。也就是說:page對象至關於普通java類的this
exception對象
內置對象exception是java.lang.Exception類的對象,exception封裝了JSP頁面拋出的異常信息。exception常常被用來處理錯誤頁面
前面咱們已經講過了怎麼設置錯誤頁面了,下面咱們就來簡單使用一下exception對象吧
1.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title></title>
</head>
<body>
<%--模擬空指針異常的錯誤--%>
<%
String sss = null;
sss.length();
%>
</body>
</html>
error.jsp頁面
錯誤頁面
效果:
request 用戶端請求,此請求會包含來自GET/POST請求的參數
response 網頁傳回用戶端的迴應
pageContext 網頁的屬性是在這裏管理,表明的編譯後JSP內容
session 與請求有關的會話期
application servlet 正在執行的內容
out 用來傳送回應的輸出
config servlet的構架部件
page JSP網頁自己
exception 針對錯誤網頁,未捕捉的例外
jsp和servlet的區別、共同點、各自應用的範圍?
JSP是Servlet技術的擴展,本質上就是Servlet的簡易方式。JSP編譯後是「類servlet」。
Servlet和JSP最主要的不一樣點在於:Servlet的應用邏輯是在Java文件中,而且徹底從表示層中的HTML裏分離開來。而JSP的狀況是Java和HTML能夠組合成一個擴展名爲.jsp的文件。
JSP側重於視圖,Servlet主要用於控制邏輯。
屬性做用域範圍
page【只在一個頁面中保存屬性,跳轉頁面無效】
requet【只在一次請求中保存屬性,服務器跳轉有效,瀏覽器跳轉無效】
session【在一個會話範圍中保存屬性,不管何種跳轉均有效,關閉瀏覽器後無效】
application【在整個服務器中保存,全部用戶均可以使用】
應用場景:
request:若是客戶向服務器發請求,產生的數據,用戶看完就沒用了,像這樣的數據就存在request域,像新聞數據,屬於用戶看完就沒用的
session:若是客戶向服務器發請求,產生的數據,用戶用完了等一下子還有用,像這樣的數據就存在session域中,像購物數據,用戶須要看到本身購物信息,而且等一下子,還要用這個購物數據結賬
servletContext:若是客戶向服務器發請求,產生的數據,用戶用完了,還要給其它用戶用,像這樣的數據就存在servletContext域中,像聊天數據
寫出5種JSTL經常使用標籤
,,,,
寫一個自定義標籤要繼承什麼類
咱們能夠有兩種方式來實現自定義標籤:
傳統方式,實現Tag接口(老方法)
簡單方式,繼承SimpleTagSupport類
SimpleTagSupport類的執行順序(原理):
①WEB容器調用標籤處理器對象的setJspContext方法,將表明JSP頁面的pageContext對象傳遞給標籤處理器對象
②WEB容器調用標籤處理器對象的setParent方法,將父標籤處理器對象傳遞給這個標籤處理器對象。【注意,只有在標籤存在父標籤的狀況下,WEB容器纔會調用這個方法】
③若是調用標籤時設置了屬性,容器將調用每一個屬性對應的setter方法把屬性值傳遞給標籤處理器對象。若是標籤的屬性值是EL表達式或腳本表達式,則WEB容器首先計算表達式的值,而後把值傳遞給標籤處理器對象。
④若是簡單標籤有標籤體,容器將調用setJspBody方法把表明標籤體的JspFragment對象傳遞進來
⑤執行標籤時:容器調用標籤處理器的doTag()方法,開發人員在方法體內經過操做JspFragment對象,就能夠實現是否執行、迭代、修改標籤體的目的。
SimpleTagSupport,通常調用doTag方法或者實現SimpleTag接口
JSP是如何被執行的?執行效率比SERVLET低嗎?
當客戶端向一個jsp頁面發送請求時,Web Container將jsp轉化成servlet的源代碼(只在第一次請求時),而後編譯轉化後的servlet並加載到內存中執行,執行的結果response到客戶端
jsp只在第一次執行的時候會轉化成servlet,之後每次執行,web容器都是直接執行編譯後的servlet,因此jsp和servlet只是在第一次執行的時候不同,jsp慢一點,之後的執行都是相同的
如何避免jsp頁面自動生成session對象?爲何要這麼作?
可使用頁面指令顯式關掉,代碼以下:
<%@ page session="false" %>
jsp的缺點?
1)很差調試
2)與其餘腳本語言的交互(可讀性差)
說出Servlet和CGI的區別?
Servlet處於服務器進程中,只會有一個servlet實例,每一個請求都會產生一個新的線程,並且servlet實例通常不會銷燬
CGI:來一個請求就建立一個進程,用完就銷燬,效率低於servlet
簡述JSP的設計模式。
在Web開發模式中,有兩個主要的開發結構,稱爲模式一(Mode I)和模式二(Mode II)
首先咱們來理清一些概念吧:
DAO(Data Access Object):主要對數據的操做,增長、修改、刪除等原子性操做。
Web層:界面+控制器,也就是說JSP【界面】+Servlet【控制器】
Service業務層:將多個原子性的DAO操做進行組合,組合成一個完整的業務邏輯
控制層:主要使用Servlet進行控制
數據訪問層:使用DAO、Hibernate、JDBC技術實現對數據的增刪改查
JavaBean用於封裝數據,處理部分核心邏輯,每一層中都用到!
模式一指的就是在開發中將顯示層、控制層、數據層的操做統一交給JSP或者JavaBean來進行處理!
模式一有兩種狀況:
徹底使用JSP作開發:
優勢:
開發速度賊快,只要寫JSP就好了,JavaBean和Servlet都不用設計!
小幅度修改代碼方便,直接修改JSP頁面交給WEB容器就好了,不像Servlet還要編譯成.class文件再交給服務器!【固然了,在ide下開發這個也不算是事】
缺點:
程序的可讀性差、複用性低、代碼複雜!什麼jsp代碼、html代碼都往上面寫,這確定很難閱讀,很難重用!
使用JSP+JavaBean作開發:
優勢:
程序的可讀性較高,大部分的代碼都寫在JavaBean上,不會和HTML代碼混合在一塊兒,可讀性還行的。
可重複利用高,核心的代碼都由JavaBean開發了,JavaBean的設計就是用來重用、封裝,大大減小編寫重複代碼的工做!
缺點:
沒有流程控制,程序中的JSP頁面都須要檢查請求的參數是否正確,異常發生時的處理。顯示操做和業務邏輯代碼工做會緊密耦合在一塊兒的!往後維護會困難
Mode II 中全部的開發都是以Servlet爲主體展開的,由Servlet接收全部的客戶端請求,而後根據請求調用相對應的JavaBean,並全部的顯示結果交給JSP完成!,也就是俗稱的MVC設計模式!
MVC設計模式:
顯示層(View):主要負責接受Servlet傳遞的內容,調用JavaBean,將內容顯示給用戶
控制層(Controller):主要負責全部用戶的請求參數,判斷請求參數是否合法,根據請求的類型調用JavaBean,將最終的處理結果交給顯示層顯示!
模型層(Mode):模型層包括了業務層,DAO層。
(1)ModelI,JSP+JavaBean設計模式。
(2)ModelII,MVC設計模式。
若是文章有錯的地方歡迎指正,你們互相交流。