JSP
概念
* Java Server Pages: java服務(wù)器端頁(yè)面
* 可以理解為:一個(gè)特殊的頁(yè)面,其中既可以指定定義html標(biāo)簽,又可以定義java代碼
* 用于簡(jiǎn)化書(shū)寫(xiě)?。?!
原理

* JSP本質(zhì)上就是一個(gè)Servlet
JSP的腳本:
JSP定義Java代碼的方式
- <% 代碼 %>:定義的java代碼,在service方法中。service方法中可以定義什么,該腳本中就可以定義什么。
- <%! 代碼 %>:定義的java代碼,在jsp轉(zhuǎn)換后的java類的成員位置。
- <%= 代碼 %>:定義的java代碼,會(huì)輸出到頁(yè)面上。輸出語(yǔ)句中可以定義什么,該腳本中就可以定義什么。
JSP的內(nèi)置對(duì)象
在jsp頁(yè)面中不需要獲取和創(chuàng)建,直接使用的對(duì)象
jsp一共有9個(gè)內(nèi)置對(duì)象。
* request
* response
* out:字符輸出流對(duì)象??梢詫?shù)據(jù)輸出到頁(yè)面上。和response.getWriter()類似
* response.getWriter()和out.write()的區(qū)別:
* 在tomcat服務(wù)器真正給客戶端做出響應(yīng)之前,會(huì)先找response緩沖區(qū)數(shù)據(jù),
再找out緩沖區(qū)數(shù)據(jù)。
* response.getWriter()數(shù)據(jù)輸出永遠(yuǎn)在out.write()之前

JSP的指令
作用:用于配置JSP頁(yè)面,導(dǎo)入資源文件
格式:<%@ 指令名稱 屬性名1=屬性值1 屬性名2=屬性值2 ... %>
分類:
- page: 配置JSP頁(yè)面的
* contentType:等同于response.setContentType()
1. 設(shè)置響應(yīng)體的mime類型以及字符集
2. 設(shè)置當(dāng)前jsp頁(yè)面的編碼(只能是高級(jí)的IDE才能生效,如果使用低級(jí)工具,則需要設(shè)置pageEncoding屬性設(shè)置當(dāng)前頁(yè)面的字符集)
* import:導(dǎo)包
* errorPage:當(dāng)前頁(yè)面發(fā)生異常后,會(huì)自動(dòng)跳轉(zhuǎn)到指定的錯(cuò)誤頁(yè)面
* isErrorPage:標(biāo)識(shí)當(dāng)前也是是否是錯(cuò)誤頁(yè)面。
* true:是,可以使用內(nèi)置對(duì)象exception
* false:否。默認(rèn)值。不可以使用內(nèi)置對(duì)象exception - include : 頁(yè)面包含的。導(dǎo)入頁(yè)面的資源文件
* <%@include file="top.jsp"%> - taglib : 導(dǎo)入資源
* <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
* prefix:前綴,自定義的
JSP注釋
- html注釋:
<-- -->:只能注釋html代碼片段 - jsp注釋:推薦使用
<%-- --%>:可以注釋所有
EL表達(dá)式
概念:Expression Language 表達(dá)式語(yǔ)言
作用:替換和簡(jiǎn)化jsp頁(yè)面中java代碼的編寫(xiě)
語(yǔ)法:${表達(dá)式}
注意:
* jsp默認(rèn)支持el表達(dá)式的。如果要忽略el表達(dá)式
1. 設(shè)置jsp中page指令中:isELIgnored="true" 忽略當(dāng)前jsp頁(yè)面中所有的el表達(dá)式
2. ${表達(dá)式} :忽略當(dāng)前這個(gè)el表達(dá)式使用:
1. 運(yùn)算:
* 運(yùn)算符:
1. 算數(shù)運(yùn)算符: + - * /(div) %(mod)
2. 比較運(yùn)算符: > < >= <= == !=
3. 邏輯運(yùn)算符: &&(and) ||(or) !(not)
4. 空運(yùn)算符: empty
* 功能:用于判斷字符串、集合、數(shù)組對(duì)象是否為null或者長(zhǎng)度是否為0
* ${empty list}:判斷字符串、集合、數(shù)組對(duì)象是否為null或者長(zhǎng)度為0
* ${not empty str}:表示判斷字符串、集合、數(shù)組對(duì)象是否不為null 并且 長(zhǎng)度>0
2. 獲取值
1. el表達(dá)式只能從域?qū)ο笾蝎@取值
2. 語(yǔ)法:
1. ${域名稱.鍵名}:從指定域中獲取指定鍵的值
* 域名稱:
1. pageScope --> pageContext
2. requestScope --> request
3. sessionScope --> session
4. applicationScope --> application(ServletContext)
* 舉例:在request域中存儲(chǔ)了name=張三
* 獲取:${requestScope.name}
?
2. ${鍵名}:表示依次從最小的域中查找是否有該鍵對(duì)應(yīng)的值,直到找到為止。
?
3. 獲取對(duì)象、List集合、Map集合的值
1. 對(duì)象:${域名稱.鍵名.屬性名}
* 本質(zhì)上會(huì)去調(diào)用對(duì)象的getter方法
?
2. List集合:${域名稱.鍵名[索引]}
?
3. Map集合:
* ${域名稱.鍵名.key名稱}
* ${域名稱.鍵名["key名稱"]}
3. 隱式對(duì)象:
* el表達(dá)式中有11個(gè)隱式對(duì)象
* pageContext:
* 獲取jsp其他八個(gè)內(nèi)置對(duì)象
* ${pageContext.request.contextPath}:動(dòng)態(tài)獲取虛擬目錄
JSTL
概念:JavaServer Pages Tag Library JSP標(biāo)準(zhǔn)標(biāo)簽庫(kù)
* 是由Apache組織提供的開(kāi)源的免費(fèi)的jsp標(biāo)簽 <標(biāo)簽>作用:用于簡(jiǎn)化和替換jsp頁(yè)面上的java代碼
使用步驟:
1. 導(dǎo)入jstl相關(guān)jar包
2. 引入標(biāo)簽庫(kù):taglib指令: <%@ taglib %>
3. 使用標(biāo)簽常用的JSTL標(biāo)簽
<1> if:相當(dāng)于java代碼的if語(yǔ)句
1. 屬性:
* test 必須屬性,接受boolean表達(dá)式
* 如果表達(dá)式為true,則顯示if標(biāo)簽體內(nèi)容,如果為false,則不顯示標(biāo)簽體內(nèi)容
* 一般情況下,test屬性值會(huì)結(jié)合el表達(dá)式一起使用
2. 注意:
* c:if標(biāo)簽沒(méi)有else情況,想要else情況,則可以在定義一個(gè)c:if標(biāo)簽
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>if標(biāo)簽</title>
</head>
<body>
<%--
c:if標(biāo)簽
1. 屬性:
* test 必須屬性,接受boolean表達(dá)式
* 如果表達(dá)式為true,則顯示if標(biāo)簽體內(nèi)容,如果為false,則不顯示標(biāo)簽體內(nèi)容
* 一般情況下,test屬性值會(huì)結(jié)合el表達(dá)式一起使用
2. 注意:c:if標(biāo)簽沒(méi)有else情況,想要else情況,則可以在定義一個(gè)c:if標(biāo)簽
--%>
<c:if test="true">
<h1>我是真...</h1>
</c:if>
<br>
<%
//判斷request域中的一個(gè)list集合是否為空,如果不為null則顯示遍歷集合
List list = new ArrayList();
list.add("aaaa");
request.setAttribute("list",list);
request.setAttribute("number",4);
%>
<c:if test="${not empty list}">
遍歷集合...
</c:if>
<br>
<c:if test="${number % 2 != 0}">
${number}為奇數(shù)
</c:if>
<c:if test="${number % 2 == 0}">
${number}為偶數(shù)
</c:if>
</body>
</html>
<2> choose:相當(dāng)于java代碼的switch語(yǔ)句
1. 使用choose標(biāo)簽聲明 相當(dāng)于switch聲明
2. 使用when標(biāo)簽做判斷 相當(dāng)于case
3. 使用otherwise標(biāo)簽做其他情況的聲明 相當(dāng)于default
<body>
<%--
完成數(shù)字編號(hào)對(duì)應(yīng)星期幾案例
1.域中存儲(chǔ)一數(shù)字
2.使用choose標(biāo)簽取出數(shù)字 相當(dāng)于switch聲明
3.使用when標(biāo)簽做數(shù)字判斷 相當(dāng)于case
4.otherwise標(biāo)簽做其他情況的聲明 相當(dāng)于default
--%>
<%
request.setAttribute("number",51);
%>
<c:choose>
<c:when test="${number == 1}">星期一</c:when>
<c:when test="${number == 2}">星期二</c:when>
<c:when test="${number == 3}">星期三</c:when>
<c:when test="${number == 4}">星期四</c:when>
<c:when test="${number == 5}">星期五</c:when>
<c:when test="${number == 6}">星期六</c:when>
<c:when test="${number == 7}">星期天</c:when>
<c:otherwise>數(shù)字輸入有誤</c:otherwise>
</c:choose>
</body>
<3> foreach:相當(dāng)于java代碼的for語(yǔ)句
<body>
<%--
foreach:相當(dāng)于java代碼的for語(yǔ)句
1. 完成重復(fù)的操作
for(int i = 0; i < 10; i ++){
}
* 屬性:
begin:開(kāi)始值
end:結(jié)束值
var:臨時(shí)變量
step:步長(zhǎng)
varStatus:循環(huán)狀態(tài)對(duì)象
index:容器中元素的索引,從0開(kāi)始
count:循環(huán)次數(shù),從1開(kāi)始
2. 遍歷容器
List<User> list;
for(User user : list){
}
* 屬性:
items:容器對(duì)象
var:容器中元素的臨時(shí)變量
varStatus:循環(huán)狀態(tài)對(duì)象
index:容器中元素的索引,從0開(kāi)始
count:循環(huán)次數(shù),從1開(kāi)始
--%>
<c:forEach begin="1" end="10" var="i" step="2" varStatus="s">
${i} <h3>${s.index}<h3> <h4> ${s.count} </h4><br>
</c:forEach>
<hr>
<%
List list = new ArrayList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list",list);
%>
<c:forEach items="${list}" var="str" varStatus="s">
${s.index} ${s.count} ${str}<br>
</c:forEach>
</body>