JSP全名爲Java Server Pages,中文名叫java伺服器頁面,其根本是一個簡化的Servlet設計,它 是由Sun Microsystems公司倡導、許多公司參與一起建立的一種動態網頁技術標準。JSP技術有點類似ASP技術,它是在傳 統的網頁HTML檔案(*.htm,*.html)中插入Java程式段(Scriptlet)和JSP標記(tag),從而形成JSP檔案,後綴名爲 (*.jsp)。 用JSP開發的Web應用是跨平臺的,既能在Linux下執行,也能在其他操作系統上執行。
JSP將網頁邏輯與網頁設計的顯示分離,支援可重用的基於元件的設計,使基於Web的應用程式的開發變得迅速和 容易。
*.html 靜態頁面(包含固定的頁面內容)
*.jsp 動態頁面(頁面數據可以動態更新,支援巢狀java程式碼和html程式碼)
1.servlet展示資訊的不方便,引入了JSP。
2.JSP本質上也是一個servlet!!!!!!
3.JSP就是在HTML頁面中嵌入了java程式碼。
答案:小指令碼(<% java程式碼%>)
宣告標籤 <%!變數或者方法宣告%> 表達式標籤 <%= 表達式%> 在頁面上顯示的效果 程式程式碼標籤 <%java程式碼%> 頁面上動態展示內容
page指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*"%>
//定義變數和方法 <body> <%! int i=10;%><!--成員變數--> <%! public void show(){}%> <!--成員方法--> i的值是:<%=i%> <!--輸出變數值--> </body>
取值操作如下:
<!-- html註釋內容,檢視原始碼時能看到-->
<%-- jsp註釋,檢視頁面原始碼時看不到 --%>
當瀏覽器存取http://localhost:8080/day9_1/index.jsp。伺服器發現後綴爲.jsp,它會根據路徑找到index.jsp文 件,會將index.jsp翻譯成index_jsp.java檔案,對這個java檔案進行編譯,產生一個index_jsp.class檔案,將class 檔案載入執行。
將JSP翻譯成java檔案,它是將JSP中的所有的HTML程式碼通過流進行輸出,也就是說最終翻譯成 class,被虛擬機器載入,它本質是servlet,它就會往迴響應,響應回去就是把JSP中的HTML程式碼以流的方式寫回瀏覽器。所以在JSP中展示出了HTML程式碼
JSP中一共預先定義了9個這樣的物件,分別爲:request、response、session、application、out、
pagecontext、config、page、exception
request 物件是 javax.servlet.httpServletRequest型別的物件。 該物件代表了用戶端的請求資訊,主要用於
接受通過HTTP協定傳送到伺服器的數據。(包括頭資訊、系統資訊、請求方式以及請求參數等)。request物件的
作用域爲一次請求。
response 代表的是對用戶端的響應,主要是將JSP容器處理過的物件傳回到用戶端。response物件也具有作
用域,它只在JSP頁面內有效。所屬型別:HttpServletResponse
session 物件是由伺服器自動建立的與使用者請求相關的物件。伺服器爲每個使用者都生成一個session物件,用
於儲存該使用者的資訊,跟蹤使用者的操作狀態。session物件內部使用Map類來儲存數據,因此儲存數據的格式爲
「Key/value」。 session物件的value可以使複雜的物件型別,而不僅僅侷限於字串型別。HttpSession
application 物件可將資訊儲存在伺服器中,直到伺服器關閉,否則application物件中儲存的資訊會在整個應用
中都有效。與session物件相比,application物件生命週期更長,類似於系統的「全域性變數」 ServletContext
區別:
request:單次請求
session:瀏覽器存取期間(對談期間)
application:伺服器啓動期間,所存的數據可以跨瀏覽器
<% request.setAttribute("req","request的值"); session.setAttribute("sessionkey","session的值"); application.setAttribute("app","application的值"); %> 小指令碼方式獲取:<br> request= <%=request.getAttribute("req") %><br> session= <%=session.getAttribute("sessionkey") %><br> application=<%=application.getAttribute("app")%><br>
out 物件用於在Web瀏覽器內輸出資訊,並且管理應用伺服器上的輸出緩衝區。在使用 out 物件輸出數據時,可以對數據緩衝區進行操作,及時清除緩衝區中的殘餘數據,爲其他的輸出讓出緩衝空間。待數據輸出完畢後,要及時關閉輸出流。
範例:
out.print("<script type='text/javascript'>alert('使用者名稱不存 在');location.href='index.jsp'</script>");
pageContext 物件的作用是取得任何範圍的參數,通過它可以獲取 JSP頁面的out、request、reponse、session、application 等物件。pageContext物件的建立和初始化都是由容器來完成的,在JSP頁面中可以直接使用pageContext物件。
<% pageContext.setAttribute("pa","pageContext的值");%> pageContext=<%=pageContext.getAttribute("pa")%>
config 物件的主要作用是取得伺服器的設定資訊。通過 pageConext物件的 getServletConfig() 方法可以獲取一個config物件。當一個Servlet 初始化時,容器把某些資訊通過config物件傳遞給這個 Servlet。 開發者可以在web.xml 檔案中爲應用程式環境中的Servlet程式和JSP頁面提供初始化參數。
//將image路徑轉換成伺服器端的路徑 String url= config.getServletContext().getRealPath("/image"); <h1>url=<%=url %></h1>
page 物件代表JSP本身,只有在JSP頁面內纔是合法的。 page隱含物件本質上包含當前 Servlet介面參照的變數,類似於Java程式設計中的 this 指針。
exception 物件的作用是顯示異常資訊,只有在包含 isErrorPage="true" 的頁面中纔可以被使用,在一般的JSP頁面中使用該物件將無法編譯JSP檔案。excepation物件和Java的所有物件一樣,都具有系統提供的繼承結構。
exception 物件幾乎定義了所有異常情況。在Java程式中,可以使用try/catch關鍵字來處理異常情況;
如果在JSP頁面中出現沒有捕獲到的異常,就會生成 exception 物件,並把 exception 物件傳送到在page指令中設定的錯誤頁面中,然後在錯誤頁面中處理相應的 exception 物件。
(1)先在可能發生錯誤的頁面中新增errorPage屬性,使其跳到自定義的錯誤提示頁面error.jsp:
<%@ page pageEncoding="utf-8" errorPage="error.jsp" contentType="text/html;charset=UTF-8" language="java" %>
(2) 在error.jsp頁面中設定isErrorPage="true" 的屬性
(使用exception物件之前,需要先將當前頁面設定成錯誤頁面)
<%@ page contentType="text/html;charset=UTF-8" isErrorPage="true" language="java" %>
pageContext -> request -> session -> application
當前頁面 單次請求有效 當前對談期間 伺服器執行期間有效
JSP指令用來設定整個JSP頁面相關的屬性,如網頁的編碼方式和指令碼語言。
語法格式如下:
<%@ directive attribute="value" %> directive:指令名稱 attribute 屬性名 value:屬性值
Page指令爲容器提供當前頁面的使用說明一個JSP頁面可以包含多個page指令
Page指令的語法格式:
<%@ page attribute="value" %>
JSP可以通過include指令來包含其他檔案。被包含的檔案可以是JSP檔案、HTML檔案或文字檔案。包含的檔案就好
像是該JSP檔案的一部分,會被同時編譯執行。
Include指令的語法格式如下:
<%@ include file="檔案相對 url 地址" %>
include 指令中的檔名實際上是一個相對的 URL 地址。
<%@ include file="bottom.jsp"%>
如果您沒有給檔案關聯一個路徑,JSP編譯器預設在當前路徑下尋找。
JSP API允許使用者自定義標籤,一個自定義標籤庫就是自定義標籤的集合。
Taglib指令引入一個自定義標籤集合的定義,包括庫路徑、自定義標籤。
<%@ taglib uri="uri" prefix="" %>
uri屬性確定標籤庫的位置,prefix屬性指定標籤庫的字首(可自定義)。
最初定義於JSTL1.0部分
在JSP2.0中,EL從JSTL中剝離出來,放置在JSP規範中,稱爲JSP2.0規範的一部分
在JSP中使用EL表達式,可以簡化物件和變數的存取是EL表達式
語法格式:${需要展示資訊的名字}
注意:
當表達式沒有指定變數或者物件的範圍時,
那麼容器會依次從pageContext—>request—>session—>application中查詢該變數或物件,我們可以通過隱含
物件獲得指定作用域的值:
pageScope物件,用於獲取當前頁面的屬性值
requestScope物件,用於獲取請求範圍的屬性值
sessionScope物件,用於獲取對談範圍的屬性值
applicationScope物件,用於獲取程式範圍的屬性值
語法:
${requestScope.key}
<% request.setAttribute("req","request的值"); session.setAttribute("sessionkey","session的值"); application.setAttribute("app","application的值"); pageContext.setAttribute("pa","pageContext的值"); // pageContext.setAttribute("k1","pageContext的值-k1"); application.setAttribute("k1","application的值-k1"); request.setAttribute("k1","request的值-k1"); session.setAttribute("k1","session的值-k1"); %> <hr> 小指令碼方式獲取:<br> request= <%=request.getAttribute("req") %><br> session= <%=session.getAttribute("sessionkey") %><br> application=<%=application.getAttribute("app")%><br> pageContext=<%=pageContext.getAttribute("pa")%> <% out.print("<script>alert('aaaa');</script>"); %> url= <%=config.getServletContext().getRealPath("/image") %> <hr> <h1>el表達式獲取的</h1> request= ${req}<br> session=${sessionkey}<br> application=${app}<br> pageContext=${pa} k1=${sessionScope.k1} <% /*System.out.println(7/0);*/%> <%@ include file="bottom.jsp"%>
範例:
<body> <% int k=20; request.setAttribute("k1",k); Users users = new Users(); users.setUserId(101); users.setUserName("裡能"); request.setAttribute("u1",users); %> 單個表量:${k1+20>100?111:222}<br> uid=${u1.userId}<br> uname=${u1.userName}<br> ${10+20<50 and 200<100} <br> </body>
單個變數:${a+10}<br> 單個變數:${s}<br> 單個物件:${key.屬性名} //物件型別 Users u=new Users(); u.setName("王老五"); u.setPass("abc"); pageContext.setAttribute("u1",u); user.name=${u1.name} user.pass=${u1.pass} // list集合物件: List list=new ArrayList(); list.add("劉能"); list.add(30); list.add(u); pageContext.setAttribute("list2",list); list1=${list2[0]}<br/> list2=${list2[1]}<br/> list3=${list2[2].pass}<br/> // map集合: k1=${map1.k1}<br> k2=${map1.k2.username}--- ${map1.k2.password} 判斷變數是否有值或是否存在:${empty key值} List list2=new ArrayList(); list2.add("aa"); request.setAttribute("list222",list2); 判斷list中是否有數據:${empty list222}
JSP標準標籤庫(JSTL)是一個JSP標籤集合,它封裝了JSP應用的通用核心功能。
JSTL支援通用的、結構化的任務,比如迭代,條件判斷,XML文件操作,國際化標籤,SQL標籤。 除了這些,它還
提供了一個框架來使用整合JSTL的自定義標籤。
根據JSTL標籤所提供的功能,可以將其分爲5個類別。核心標籤 格式化標籤 sql標籤 xml標籤 jstl函數(後面詳細
解釋)
作用:簡化jsp頁面編寫程式碼
語法格式:
1. 下載 jakarta-taglibs-standard-1.1.2.zip 包並解壓,將 jakarta-taglibs-standard-1.1.2/lib/ 下的兩個 jar 文
件:standard.jar 和 jstl.jar 檔案拷貝到 /WEB-INF/lib/ 下。
2. 在JSP頁面中引入<%@ taglib prefix=」頁面使用的名稱」 uri=」功能範圍的路徑」%>
①核心標籤是最常用的 JSTL標籤。參照核心標籤庫的語法如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
② 核心標籤的分類
表達式操作 out、set、remove、catch
流程控制 if、choose、when、otherwise
迭代操作 forEach、forTokens
URL操作 import、param、url、redirect
Set標籤
<c:set>
主要用來將變數儲存至JSP範圍中 或是JavaBean的屬性或Map物件中
<c:out>
主要用來顯示數據的內容
<c:remove>
主要負責移除變數
<h1>刪除前</h1> <c:set value="c-set的值" var="str" scope="request"></c:set> str=${str}<br> str=<c:out value="${str}"></c:out> <c:remove var="str" scope="request"></c:remove> <h1>刪除後</h1> str=${str}<br> str=<c:out value="${str}"></c:out> <h1>if</h1> <c:set var="age" value="23" scope="request"></c:set>
<c:if>
主要用於進行if判斷,如果爲true,則輸出標籤體中的內容
<c:if test="${age>18 and age<30}"> 青年 </c:if>
<c:choose>,<c:when>,<c:otherwise>
作用相當於if-else
<c:choose> <c:when test="${age<18}"> 未成年 </c:when> <c:when test="${age<30}"> 青年人 </c:when> <c:otherwise>其他人</c:otherwise> </c:choose>
<c:forEach>
回圈控制,它可以將陣列,集合(Collection)中的成員循序瀏覽一遍。
其中varStatus有兩個屬性count、index,可以用來計數,count從1開始,index從0開始
<% List list=new ArrayList(); list.add("list內容"); list.add(100); list.add(new Users()); request.setAttribute("alist",list); %> <h1>list</h1> <c:forEach items="${alist}" var="va" varStatus="sta"> ${sta.count}---${sta.index}----》 ${va}<br> </c:forEach>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<% request.setAttribute("day",new Date()); request.setAttribute("mydate","2000-1-1"); request.setAttribute("num",123.4567); %>
1、fmt:formatDate
作用:將日期型別格式化爲指定模式的字串
屬性
value:將要被格式化的數據
pattern:格式化的模式,與SimpleDateFormat的參數設定一樣
var:格式化後的字串所要存放的變數,若不指定var,則會將格式化的結果直接顯示在頁面
scope:變數存放的域屬性空間,預設page
type:其取值爲date、time、both,表示給出的value是日期、時間、還是兩者都包含,預設是date
<h1>日期:<fmt:formatDate value="${day}" pattern="yyyy-MM-dd"></fmt:formatDate></h1>
2、fmt:parseDate
作用:用於將指定字串轉化爲日期型別
Value伺服器獲取的時間
Pattern:轉換的格式
Var:頁面顯示的變數
<h1>日期2:<fmt:parseDate value="${mydate}" pattern="yyyy-MM-dd"></fmt:parseDate></h1>
3、fmt:formatNumber
按照指定格式對數位進行格式化
屬性
maxIntegerDigits:整數部分最多的位數
minIntegerDigits:整數部分最少的位數
maxFrctionDigits:小數部分最多的位數
minFrctionDigits:小數部分最少的位數
var:儲存格式化結果的變數
scope:var屬性的作用域
integerOnly:是否只解析整型數true或者浮點數false
<h1>num=<fmt:formatNumber value="${num}" maxFractionDigits="1"></fmt:formatNumber> </h1>