下面是我整理下來的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