下面是我整理下來的JSP知識點:html
圖上的知識點均可以在我其餘的文章內找到相應內容。java
jsp靜態包含和動態包含的區別web
在講解request對象的時候,咱們曾經使用過request.getRequestDispatcher(String url).include(request,response)來對頁頭和頁尾面進行包含面試
inclue指令也是作這樣的事情,咱們來試驗一下吧!設計模式
這是頁頭瀏覽器
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>頁頭</title> </head> <body> 我是頁頭 <br> <br> <br> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>頁尾</title> </head> <body> 我是頁尾 </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>包含頁頭和頁尾進來</title> </head> <body> <%@include file="head.jsp" %> <%@include file="foot.jsp" %> </body> </html>
<jsp:include page=""/>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>包含頁頭和頁尾進來</title> </head> <body> <jsp:include page="head.jsp"/> <jsp:include page="foot.jsp"/> </body> </html>
jsp行爲包含文件就是先編譯被包含的頁面,再將頁面的結果寫入到包含的頁面中(1.jsp)緩存
固然了,如今有靜態包含和動態包含,使用哪個更好呢?答案是:動態包含。服務器
動態包含能夠向被包含的頁面傳遞參數(用處不大),而且是分別處理包含頁面的(將被包含頁面編譯後得出的結果再寫進包含頁面)【若是有相同名稱的參數,使用靜態包含就會報錯!】!微信
模擬一下場景吧,如今個人頭頁面有個名爲s的字符串變量session
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>頁頭</title> </head> <body> <% String s = "zhongfucheng"; %> 我是頁頭呀 <br> <br> <br> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>頁尾</title> </head> <body> <% String s = "zhongfucheng"; %> 我是頁尾呀 </body> </html>
<%@include file="xxx.jsp"%>
爲jsp中的編譯指令,其文件的包含是發生在jsp向servlet轉換的時期,而<jsp:include page="xxx.jsp">
是jsp中的動做指令,其文件的包含是發生在編譯時期,也就是將java文件編譯爲class文件的時期
使用靜態包含只會**產生一個class文件,而使用動態包含會產生多個class文件 **
使用靜態包含,包含頁面和被包含頁面的request對象爲同一對象,由於靜態包含只是將被包含的頁面的內容複製到包含的頁面中去;而動態包含包含頁面和被包含頁面不是同一個頁面,被包含的頁面的request對象能夠取到的參數範圍要相對大些,不只能夠取到傳遞到包含頁面的參數,一樣也能取得在包含頁面向下傳遞的參數
jsp有哪些內置對象?做用分別是什麼?
九個內置對象:
其中,request、response、session、application、config這五個對象和Servlet的API是同樣的。這5個對象我就不解釋了。
在JSP中,尤爲重要的是pageContext對象。
pageContext是內置對象中最重要的一個對象,它表明着JSP頁面編譯後的內容(也就是JSP頁面的運行環境)!
pageContext對象
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>獲取八大內置對象</title> </head> <body> <% System.out.println(pageContext.getSession()); System.out.println(pageContext.getRequest()); System.out.println(pageContext.getResponse()); System.out.println(pageContext.getException()); System.out.println(pageContext.getPage()); System.out.println(pageContext.getServletConfig()); System.out.println(pageContext.getServletContext()); System.out.println(pageContext.getOut()); %> </body> </html>
pageContext做爲域對象
相似於request,session,ServletContext做爲域對象而言都有如下三個方法:
固然了,pageContext也不例外,pageContext也有這三個方法!
pageContext本質上表明的是當前JSP頁面編譯後的內容,做爲域對象而言,它就表明着當前JSP頁面(也就是page)!也就是說:pageContext域對象只在page範圍內有效,超出了page範圍就無效了!
首先來看看在page範圍內能不能使用
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>使用page域對象</title> </head> <body> <% pageContext.setAttribute("name", "zhongfucheng"); %> <% String value = (String) pageContext.getAttribute("name"); System.out.println(value); %> </body> </html>
咱們如今來試驗一下是否是超出了page範圍就無效了!
在2.jsp中request域對象設置屬性
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>request域對象設置屬性</title> </head> <body> <% //這是request域對象保存的內容 request.setAttribute("name","zhongfucheng"); %> <%--跳轉到1.jsp中--%> <jsp:forward page="1.jsp"/> </body> </html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>在page域對象獲取屬性</title> </head> <body> <% //企圖獲取request域對象存進的屬性 String value = (String) pageContext.getAttribute("name"); System.out.println(value); %> </body> </html>
pageContext本質上表明着編譯後JSP的內容,pageContext還能夠封裝了訪問其餘域的方法!
上面的pageContext默認是page範圍的,但pageContext對象重載了set、get、removeAttribute這三個方法
多了一個設置域範圍的一個參數,若是不指定默認就是page。固然了,pageContext把request、session、application、page這幾個域對象封裝着了靜態變量供咱們使用。
剛纔咱們沒有使用重載方法的時候,使用pageContext是沒法獲取到request域對象設置的屬性的。如今咱們使用重載後的方法看一下能不能獲取獲得!
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>在page域對象獲取request域對象的屬性</title> </head> <body> <% //使用重載的方法獲取request域對象的屬性 String value = (String) pageContext.getAttribute("name",pageContext.REQUEST_SCOPE); System.out.println(value); %> </body> </html>
pageContexst還有這麼一個方法:
該方法會查找各個域的屬性,從小到大開始尋找!也就是page—>request->session->application。
咱們用此方法看能不能查找出request域對象的屬性吧!
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>使用findAttribute</title> </head> <body> <% //使用findAttribute查找2.jsp中request域對象的屬性 String value = (String) pageContext.findAttribute("name"); System.out.println(value); %> </body> </html>
out對象:
咱們能夠簡單理解爲:JspWriter就是帶緩存的PrintWrieter。
out對象的原理以下:
只有向out對象中寫入了內容,且知足以下任何一個條件時,out對象纔去調用ServletResponse.getWriter方法,並經過該方法返回的PrintWriter對象將out對象的緩衝區中的內容真正寫入到Servlet引擎提供的緩衝區中:
通常咱們在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>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %> <html> <head> <title>錯誤頁面</title> </head> <body> <% out.println("程序拋出了異常:" + exception); %> </body> </html>
jsp和servlet的區別、共同點、各自應用的範圍?
屬性做用域範圍
應用場景:
寫出5種JSTL經常使用標籤
<c:if>,<c:item>,<c:foreach>,<c:out>,<c:set>
寫一個自定義標籤要繼承什麼類
咱們能夠有兩種方式來實現自定義標籤:
SimpleTagSupport類的執行順序(原理):
SimpleTagSupport,通常調用doTag方法或者實現SimpleTag接口
JSP是如何被執行的?執行效率比SERVLET低嗎?
如何避免jsp頁面自動生成session對象?爲何要這麼作?
可使用頁面指令顯式關掉,代碼以下:
<%@ page session="false" %>
jsp的缺點?
說出Servlet和CGI的區別?
簡述JSP的設計模式。
在Web開發模式中,有兩個主要的開發結構,稱爲模式一(Mode I)和模式二(Mode II)
首先咱們來理清一些概念吧:
模式一指的就是在開發中將顯示層、控制層、數據層的操做統一交給JSP或者JavaBean來進行處理!
模式一有兩種狀況:
徹底使用JSP作開發:
優勢:
缺點:
使用JSP+JavaBean作開發:
優勢:
缺點:
Mode II 中全部的開發都是以Servlet爲主體展開的,由Servlet接收全部的客戶端請求,而後根據請求調用相對應的JavaBean,並全部的顯示結果交給JSP完成!,也就是俗稱的MVC設計模式!
MVC設計模式:
若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章的同窗,能夠關注微信公衆號:Java3y