EL表達式是為了替代jsp表達式,標簽是為了替代jsp腳本。有了這兩個技術就能避免在jsp頁面中盡量不寫java代碼,減輕了jsp的復雜度,增加了代碼的整潔程度。
EL表達式
語法:${變量或表達式}
作用:向瀏覽器輸出域對象中的變量值或者表達式計算的結果。
代碼示例:
1)基本數據類型輸出
1 <body> 2 <%-- 基本類型輸出 --%> 3 <% 4 pageContext.setAttribute("name", 12, PageContext.PAGE_SCOPE); 5 pageContext.setAttribute("name", true, PageContext.REQUEST_SCOPE); 6 pageContext.setAttribute("name","session域", PageContext.SESSION_SCOPE); 7 pageContext.setAttribute("name", "context域", PageContext.APPLICATION_SCOPE); 8 %> 9 ${name }<br/><%-- 默認在pageScope、requestScope和sessionScope中搜索 --%> 10 <%--在指定域中搜索 --%> 11 ${pageScope.name}<br/> 12 ${requestScope.name}<br/> 13 ${sessionScope.name}<br/> 14 ${applicationScope.name}<br/> 15 16 </body>
注意:單獨${name}會默認在pageScope、requestScope和sessionScope中搜索。
2)對象類型輸出
1 <%--對象類型輸出 --%> 2 <% 3 Student student = new Student("小名",12); 4 pageContext.setAttribute("student", student); 5 %> 6 ${student.name }
3)list對象輸出
1 <%--list類型輸出 --%> 2 <% 3 List<Student> list = new ArrayList<Student>(); 4 list.add(new Student("小明",10)); 5 list.add(new Student("小紅",20)); 6 list.add(new Student("小王",30)); 7 pageContext.setAttribute("list", list); 8 %> 9 list類型輸出: 10 ${list[0].name } 11 ${list[1].name } 12 ${list[2].name }
4)map對象輸出
1 <%--Map類型輸出 --%> 2 <% 3 Map<String,Student> map = new HashMap<String,Student>(); 4 map.put("100", new Student("校長",60)); 5 map.put("101", new Student("老師",30)); 6 map.put("102", new Student("學生",20)); 7 pageContext.setAttribute("map", map); 8 %> 9 Map類型輸出: 10 ${map['100'].name } 11 ${map["101"].name } 12 ${map["102"].name }
注意:EL表達式輸出的變量一定是在域對象中存在的。
5)EL輸出表達式
1 <body> 2 <%-- 3 1)算術表達式 4 + - * / 5 --%> 6 ${10+5 }<br/> 7 ${10*5 } 8 <hr/> 9 <%-- 10 2)比較運算 11 > < >= <= == != 12 --%> 13 ${10>5 }<br/> 14 ${10<5 }<br/> 15 ${10!=10 } 16 <hr/> 17 <%-- 18 3)邏輯運算 19 && || ! 20 --%> 21 ${true && false }<br/> 22 ${true || false }<br/> 23 ${!false }<br/> 24 <hr/> 25 <%-- 26 4)判空 27 null 或 空字符串: empty 28 --%> 29 <% 30 //String name = "eric"; 31 //String name = null; 32 String name = ""; 33 pageContext.setAttribute("name",name); 34 %> 35 判斷null: ${name==null }<br/> 36 判斷空字符: ${name=="" }<br/> 37 判空: ${name==null || name=="" } 38 另一種判空寫法: ${empty name } 39 40 41 </body>
標簽庫
作用:替換java腳本。
分類:
1)內置標簽(動作標簽):不需要在jsp頁面中導入標簽。
2)jstl標簽:需要在jsp頁面中導入標簽。
3)自定義標簽:開發者自行定義,需要在jsp頁面導入標簽。
(1)內置標簽(動作標簽)
轉發標簽
<jsp:forward page="library2.jsp"></jsp:forward>
參數標簽
<jsp:param value="dev" name="name"/>
包含標簽
<jsp:include page="header.jsp"></jsp:include>
注意:此處的包含為動態包含,即包含和被包含的頁面先各自翻譯成java源文件,然后再運行時合並在一起。
靜態包含和動態包含的區別:
1)語法不同
靜態包含:<%@ include file="被包含的頁面"%>
動態包含:<jsp:include page="被包含的頁面">
2)參數傳遞不同
靜態包含:不能向被包含的頁面傳遞參數
動態包含:可以向被包含的頁面傳遞參數
3)原理不同
靜態包含:先合並在翻譯。
動態包含:先翻譯再合並。
傳遞參數的案例:
主頁面
<body> <jsp:include page="header.jsp"> <jsp:param value="nick" name="name"/> <jsp:param value="123" name="pwd"/> </jsp:include> <hr> <font color="blue">正文</font> <jsp:forward page="library2.jsp"> <jsp:param value="dev" name="name"/> </jsp:forward> </body>
被包含頁面
<font size='12' color='red'>頭文件</font><br/> 名字:<%= request.getParameter("name") %> 密碼:<%= request.getParameter("pwd") %>
被轉發頁面
<body> 用戶名:<%=request.getParameter("name") %> </body>
(2)jstl標簽
1)核心標簽庫的重點標簽
<1>設置屬性標簽
<%--設置屬性 --%> <c:set var="name" value="nick" scope="request"></c:set>
常用標簽屬性:
var:設置變量名。
value:設置變量值。
scope:設置變量的保存域。
注意:--c:set標簽默認保存到page域中。
<2>獲取屬性標簽
<%--獲取屬性 --%> <c:out value="${requestScope.name }" ></c:out> <% String age = null; pageContext.setAttribute("age", age); %> <br> <c:out value="${age }" default="<font>默認值</font>" escapeXml="true"></c:out>
常用標簽屬性:
value:獲取標簽的值。
default:當標簽值value為null時,可使用默認值default。
escapeXml:是否對value進行轉義,false不轉義,true轉義。
<3>單條件判斷標簽
<%--if單條件標簽 --%> <c:if test="${empty age}"> 條件成立 </c:if>
常用標簽屬性:
test:判斷條件
<4>多條件選擇標簽
<%--多條件標簽 --%> <c:set var="score" value="68"></c:set> <c:choose> <c:when test="${score>=90 }"> 優秀 </c:when> <c:when test="${score>=80 && score<90}"> 良好 </c:when> <c:when test="${score>=70 && score<80 }"> 一般 </c:when> <c:when test="${score>=60 && score<70 }"> 及格 </c:when> <c:otherwise> 啥也不是 </c:otherwise> </c:choose>
<5>forEarch循環語句
<%-- for-earch循環語句 --%> <% //list存儲 List<Student> list = new ArrayList<Student>(); list.add(new Student("張三",10)); list.add(new Student("李四",20)); list.add(new Student("王五",30)); pageContext.setAttribute("list", list); //map存儲 Map<String,Student> map = new HashMap<String,Student>(); map.put("100",new Student("小張",10)); map.put("101",new Student("小李",10)); map.put("102",new Student("小王",10)); pageContext.setAttribute("map", map); %> <c:forEach items="${list }" var="student" varStatus="status" > 用戶id:${status.count }--用戶名:${student.name }--年齡:${student.age } <br/> </c:forEach> <hr> <c:forEach items="${map }" var="entry"> 用戶id:${entry.key }--名字:${entry.value.name }--年齡:${entry.value.age }<br> </c:forEach>
常用標簽屬性:
begin:開始遍歷的位置
end:結束遍歷的位置
step:遍歷步長
items:遍歷目標對象
var:遍歷出的對象
varStatus:遍歷狀態,其中的count屬性可以獲得索引值。
(6)forTokens循環語句
<%-- forTokens循環語句 --%> <% String str = "哈哈哈-呵呵呵-嘿嘿嘿"; pageContext.setAttribute("str", str); %> <c:forTokens items="${str }" delims="-" var="s"> ${s }-- </c:forTokens>
常用標簽屬性:
forEarch有的屬性forTokens都有。
delims:分隔符
<7>重定向標簽
<%-- 重定向標簽 --%> <c:redirect url="http://www.baidu.com"></c:redirect>
2)eclipse中使用jstl標簽庫
<1>導入jstl.jar、standard.jar2個jar包;
此處提供兩個下載地址:
CSDN:http://download.csdn.net/detail/czxt0605/7671781
百度雲盤:https://pan.baidu.com/s/1qYnVbAG
<2>把c.tld文件拷貝到WEB-INF目錄下;
<3>web.xml加上如下配置
<jsp-config> <taglib> <taglib-uri>http://java.sun.com/jstl/core</taglib-uri> <taglib-location>/WEB-INF/c.tld</taglib-location> </taglib> </jsp-config>