要牢記jsp四大做用域(pageContext域:當前jsp頁面範圍 request域:一次請求 session域:一次會話 application域:整個web應用)以及九大內置對象。而後JSP其實就是個Servlet,能夠理解成能很好的結合HTML代碼的Servlet文件!知道其最好的安全的註釋是用JSP註釋。在JSP裏面輸出信息,除非用response輸出,其餘的都默認是out輸出的,可是順序是在response後面。(固然能夠關閉out緩衝區)在jsp中能夠實現頁面包含,靜態包含和動態包含的結果是顯示同樣的,可是動態包含會去要包含的文件中去讀取,也就是會生成.java文件!html
EL技術就是爲了簡化在jsp中的java代碼的。${key}java
JSTL技術就是在JSP頁面內用標籤來簡寫if和for循環語句的!須要注意的是裏面必須是寫el表達式,不然是字符串了。每一個頁面使用的時候必須使用taglib指令導入核心標籤庫!web
1、JSP技術:apache
一、運行原理:安全
Jsp本質就是Servlet!session
jsp在第一次被訪問時會被Web容器翻譯成servlet,在執行過程:app
第一次訪問--->helloServlet.jsp---->helloServlet_jsp.java---->編譯運行.classjsp
PS:被翻譯後的servlet在Tomcat的work目錄中能夠找到(先翻譯成java文件,後轉成class)網站
二、腳本:ui
1)<%java代碼%> ----- 內部的java代碼翻譯到service方法的內部(能夠定義變量、不能定義方法)
2)<%=java變量或表達式%> ----- 會被翻譯成service方法內部out.print()往客戶端輸出
3)<%!java代碼%> ---- 會被翻譯成servlet的成員的內容(能夠是成員變量或者成員方法)
三、註釋:
不一樣的註釋可見範圍是不一樣
1)Html註釋:<!--註釋內容--> ---可見範圍 jsp源碼、翻譯後的servlet、頁面 顯示html源碼
2)java註釋://單行註釋 /*多行註釋*/ --可見範圍 jsp源碼 翻譯後的servlet
3)jsp註釋:<%--註釋內容--%> ----- 可見範圍 jsp源碼可見(只能在源文件中看見,安全!!)
四、jsp指令:
jsp的指令是指導jsp翻譯和運行的命令,jsp包括三大指令:
1)page指令 --- 屬性最多的指令(實際開發中page指令默認)
屬性最多的一個指令,根據不一樣的屬性,指導整個頁面特性
格式:<%@ page 屬性名1= "屬性值1" 屬性名2= "屬性值2" ...%>
經常使用屬性以下:
language:jsp腳本中能夠嵌入的語言種類
pageEncoding:設置當前jsp文件的自己編碼---
內部能夠包含contentType(能夠省略)
contentType:response.setContentType(text/html;charset=UTF-8)
session:是否jsp在翻譯時自動建立session(默認屬性值爲true)在第一行設置false
false的話:須要加第一句。默認不須要加(不須要獲取session)
<% HttpSession session=request.getSession();- session.setAttribute("goods","naiping"); %>
import:導入java的包
errorPage:噹噹前頁面出錯後跳轉到哪一個頁面(跳轉至)
isErrorPage:當前頁面是一個處理錯誤的頁面(聲明是個錯誤頁面)
2)include指令
頁面包含(靜態包含)指令,能夠將一個jsp頁面包含到另外一個jsp頁面中
格式:<%@ include file="被包含的文件地址"%>
<%@ include file="header.jsp" %>
這是內容
<%@ include file="footer.jsp" %>
3)taglib指令
在jsp頁面中引入標籤庫(jstl標籤庫、struts2標籤庫)
格式:<%@ taglib uri="標籤庫地址" prefix="前綴"%>
五、jsp內置/隱式對象(9個):
jsp被翻譯成servlet以後,service方法中有9個對象定義並初始化完畢,咱們在jsp 腳本中能夠直接使用這9個對象:
1)out對象:
out的類型:JspWriter
out做用就是向客戶端輸出內容----out.write()
out緩衝區默認8kb 能夠設置成0 表明關閉out緩衝區 內容直接寫到respons緩衝器.
(Tomcat引擎只能從response緩衝區內取數據,因此response緩衝區會先從out緩衝區內把數據取出來,放到它裏面,而後纔開始往外調數據。這樣就造成了先輸出response輸出的數據。)
2)pageContext對象:
jsp頁面的上下文對象(域對象),做用以下:
page對象與pageContext對象不是一回事
pageContext是一個域對象
setAttribute(String name,Object obj)
getAttribute(String name)
removeAttrbute(String name)
pageContext能夠向指定的其餘域中存取數據
setAttribute(String name,Object obj,int scope)---加了個範圍
getAttribute(String name,int scope)
removeAttrbute(String name,int scope)
findAttribute(String name)
---依次從pageContext域,request域,session域,application域中獲 取屬性,在某個域中獲取後將不在向後尋找
能夠得到其餘8大隱式對象
例如: pageContext.getRequest()
pageContext.getSession()
六、jsp標籤(動做)
1)頁面包含(動態包含):<jsp:include page="被包含的頁面"/>
2)請求轉發:<jsp:forward page="要轉發的資源" />-通常都用Servlet轉發
靜態包含與動態包含的區別?
結果顯示是同樣的!
靜態包含是把你被包含的頁面直接全盤複製粘貼在本身的頁面中;(不生成)
動態包含就是去你的頁面中尋找內容(會讀取你的文件,生成.java文件)
2、El技術:
一、EL 表達式概述
EL(Express Lanuage)表達式能夠嵌入在jsp頁面內部,減小jsp腳本(java代碼)的編寫,EL 出現的目的是要替代jsp頁面中腳本的編寫。(替代java代碼的編寫)
二、EL從域中取出數據(EL最重要的做用):
jsp腳本:<%=request.getAttribute(name)%>
EL表達式替代上面的腳本:${requestScope.name}
EL最主要的做用是得到四大域中的數據,格式${EL表達式}
EL得到pageContext域中的值:${pageScope.key};
EL得到request域中的值:${requestScope.key};
EL得到session域中的值:${sessionScope.key};
EL得到application域中的值:${applicationScope.key};
三、EL從四個域中得到某個值${key};
---一樣是依次從pageContext域,request域,session域,application域中 獲取屬性,在某個域中獲取後將不在向後尋找
四、<!-- 獲取web應用名稱 -->
${pageContext.request.contextPath}
五、EL執行表達式
例如:
${1+1}
${empty user} 判斷 域對象的key值 是否爲空 是空爲真/假(能夠前面加!使用)
${user==null?true:false} 判斷key所對應的值是否爲空
3、JSTL技術;
一、JSTL概述:
JSTL(JSP Standard Tag Library),JSP標準標籤庫,能夠嵌入在jsp頁面中使用標籤的形式完成業務邏輯等功能。jstl出現的目的同el同樣也是要代替jsp頁面中的腳本代碼。JSTL標準標準標籤庫有5個子庫,但隨着發展,目前常使用的是他的核心庫:
二、JSTL的下載和導入:
從Apache的網站下載JSTL的JAR包。進入 「http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/」網址下載 JSTL的安裝包。jakarta-taglibs-standard-1.1.2.zip,而後將下載好的JSTL安裝包 進行解壓,此時,在lib目錄下能夠看到兩個JAR文件,分別爲jstl.jar和standard.jar。
其中,
jstl.jar文件包含JSTL規範中定義的接口和相關類,
standard.jar文件包含用於實現JSTL的.class文件以及JSTL中5個標籤庫描述符文件(TLD)
①、將兩個JAR 包導入到咱們的項目的lib下-build Path;
②、使用jsp的taglib指令導入核心的標籤庫(這個只在當前頁面中有用,每一個頁面都須要添加!)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
三、JSTL核心庫的經常使用標籤
①、<c:if test=」」>標籤 替代IF語句 裏面必須是el表達式,不然會翻譯成字符串!
須要注意的是:這裏面是沒有else(能夠在裏面取反代替else)
用el表達式判斷條件
其中test是返回boolean的條件
<%-- <c:if test="${1==1 }"> 正確 </c:if> <c:if test="${1!=1 }"> 錯誤 </c:if> --%>
<c:if test="${empty user }"> <a href="login.jsp">登錄</a> <a href="register.jsp">註冊</a> </c:if> <!-- 用戶已經登錄 --> <c:if test="${!empty user }"> <span>${user.name }</span> <a href="#">退出</a> </c:if>
②、<c:forEach>標籤:
<!--普通for循環 --> <c:forEach begin="0" end="10" var="i"> ${ i } </c:forEach> <br> <!-- 如下會直接打印11個i --> <c:forEach begin="0" end="10" var="i"> i </c:forEach>
<% //建立List<User> User user1 = new User(); user1.setAge(8); user1.setName("張三"); User user2 = new User(); user2.setAge(11); user2.setName("李四"); ArrayList<User> list = new ArrayList<User>(); list.add(user1); list.add(user2); request.setAttribute("UserList", list); //建立Map<String,User> Map<String, User> map = new HashMap<String, User>(); map.put("1", user1); map.put("2", user2); application.setAttribute("UserMap", map); //建立List<String> ArrayList<String> arr = new ArrayList<String>(); arr.add("a"); arr.add("b"); session.setAttribute("str", arr); //建立Map<User,Map<String,User>> Map<String, User> map1 = new HashMap<String, User>(); map1.put("1", user1); map1.put("2", user2); Map<String, User> map2 = new HashMap<String, User>(); map2.put("1", user1); map2.put("2", user2); Map<User, Map<String, User>> map0 = new HashMap<User, Map<String, User>>(); map0.put(user1, map1); map0.put(user2, map2); application.setAttribute("UserMap", map0); %> <!-- items聲明您要遍歷的哪一個容器 --> <c:forEach items="${ str }" var="s"> ${s } </c:forEach> <br> <c:forEach items="${ UserList }" var="s1"> ${s1.name }... ${s1.age } </c:forEach> <br> <c:forEach items="${ UserMap }" var="entry"> ${entry.key }...${entry.value.name }...${entry.value.age } </c:forEach> <br> <c:forEach items="${UserMap }" var="entry"> ${entry.key.name } ${entry.key.age } <c:forEach items="${entry.value }" var="entry2"> ${entry2.key } ${entry2.value.name } ${entry2.value.age } </c:forEach> </c:forEach>