JavaWeb—3.JSP

2020-08-14 19:09:35

 

1. 什麼是JSP

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程式碼)

2. JSP爲什麼會出現

1.servlet展示資訊的不方便,引入了JSP。

2.JSP本質上也是一個servlet!!!!!!

3.JSP就是在HTML頁面中嵌入了java程式碼。

3.JSP中如何巢狀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>

如何把一個數據存在request域中

取值操作如下:

jsp中的註釋

<!-- html註釋內容,檢視原始碼時能看到-->

<%-- jsp註釋,檢視頁面原始碼時看不到 --%>

4. 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程式碼

5. JSP的內建物件

JSP中一共預先定義了9個這樣的物件,分別爲:request、response、session、application、out、

pagecontext、config、page、exception

1、request物件

request 物件是 javax.servlet.httpServletRequest型別的物件。 該物件代表了用戶端的請求資訊,主要用於

接受通過HTTP協定傳送到伺服器的數據。(包括頭資訊、系統資訊、請求方式以及請求參數等)。request物件的

作用域爲一次請求。

2、response物件

response 代表的是對用戶端的響應,主要是將JSP容器處理過的物件傳回到用戶端。response物件也具有作

用域,它只在JSP頁面內有效。所屬型別:HttpServletResponse

3、session物件

session 物件是由伺服器自動建立的與使用者請求相關的物件。伺服器爲每個使用者都生成一個session物件,用

於儲存該使用者的資訊,跟蹤使用者的操作狀態。session物件內部使用Map類來儲存數據,因此儲存數據的格式爲

「Key/value」。 session物件的value可以使複雜的物件型別,而不僅僅侷限於字串型別。HttpSession

4、application物件

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>

5、out 物件

out 物件用於在Web瀏覽器內輸出資訊,並且管理應用伺服器上的輸出緩衝區。在使用 out 物件輸出數據時,可以對數據緩衝區進行操作,及時清除緩衝區中的殘餘數據,爲其他的輸出讓出緩衝空間。待數據輸出完畢後,要及時關閉輸出流。

範例:

out.print("<script type='text/javascript'>alert('使用者名稱不存
在');location.href='index.jsp'</script>");

6、pageContext 物件

pageContext 物件的作用是取得任何範圍的參數,通過它可以獲取 JSP頁面的out、request、reponse、session、application 等物件。pageContext物件的建立和初始化都是由容器來完成的,在JSP頁面中可以直接使用pageContext物件。

 <% pageContext.setAttribute("pa","pageContext的值");%>
pageContext=<%=pageContext.getAttribute("pa")%>

7、config 物件

config 物件的主要作用是取得伺服器的設定資訊。通過 pageConext物件的 getServletConfig() 方法可以獲取一個config物件。當一個Servlet 初始化時,容器把某些資訊通過config物件傳遞給這個 Servlet。 開發者可以在web.xml 檔案中爲應用程式環境中的Servlet程式和JSP頁面提供初始化參數。

//將image路徑轉換成伺服器端的路徑
String url= config.getServletContext().getRealPath("/image");
<h1>url=<%=url %></h1>

8、page 物件

page 物件代表JSP本身,只有在JSP頁面內纔是合法的。 page隱含物件本質上包含當前 Servlet介面參照的變數,類似於Java程式設計中的 this 指針。

9、exception 物件

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" %>

jsp的作用域:

pageContext -> request -> session -> application

當前頁面 單次請求有效 當前對談期間 伺服器執行期間有效

 

6. JSP的指令

JSP指令用來設定整個JSP頁面相關的屬性,如網頁的編碼方式和指令碼語言。

語法格式如下:

<%@ directive attribute="value" %>
directive:指令名稱 attribute 屬性名 value:屬性值

(1)Page指令

Page指令爲容器提供當前頁面的使用說明一個JSP頁面可以包含多個page指令

Page指令的語法格式:

<%@ page attribute="value" %>

(2) Include指令

JSP可以通過include指令來包含其他檔案。被包含的檔案可以是JSP檔案、HTML檔案或文字檔案。包含的檔案就好

像是該JSP檔案的一部分,會被同時編譯執行。

Include指令的語法格式如下:

<%@ include file="檔案相對 url 地址" %>

include 指令中的檔名實際上是一個相對的 URL 地址。

<%@ include file="bottom.jsp"%>

如果您沒有給檔案關聯一個路徑,JSP編譯器預設在當前路徑下尋找。 

(3)Taglib指令

JSP API允許使用者自定義標籤,一個自定義標籤庫就是自定義標籤的集合。

Taglib指令引入一個自定義標籤集合的定義,包括庫路徑、自定義標籤。

<%@ taglib uri="uri" prefix="" %>

uri屬性確定標籤庫的位置,prefix屬性指定標籤庫的字首(可自定義)。

7. JSP出現的狀態碼

8. EL表達式

(1)什麼Expression Language 表達式語言

最初定義於JSTL1.0部分

在JSP2.0中,EL從JSTL中剝離出來,放置在JSP規範中,稱爲JSP2.0規範的一部分

在JSP中使用EL表達式,可以簡化物件和變數的存取是EL表達式

(2)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"%>

 

(3)EL中基礎操作符

 範例:

<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}

9. JSTL

(1) 什麼是JSTL

JSP標準標籤庫(JSTL)是一個JSP標籤集合,它封裝了JSP應用的通用核心功能。

JSTL支援通用的、結構化的任務,比如迭代,條件判斷,XML文件操作,國際化標籤,SQL標籤。 除了這些,它還

提供了一個框架來使用整合JSTL的自定義標籤。

根據JSTL標籤所提供的功能,可以將其分爲5個類別。核心標籤 格式化標籤 sql標籤 xml標籤 jstl函數(後面詳細

解釋)

(2) 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=」功能範圍的路徑」%>

(3) 核心標籤

①核心標籤是最常用的 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>

(4)格式化標籤 

<%@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>