EL表達式和JSTL標簽庫: 在JSP頁面代替java代碼,便于編寫
一.EL表達式
作用: ${} 簡化腳本表達式 <%= %>
j2ee1.4以前版本需指定<%@ page isELIgnored="false">
j2ee1.4以后版本默認支持EL表達式
1.EL內置對象
?
EL內置11個對象,不需定義可直接使用
pageScope 獲取page域屬性組成的Map
requestScope 獲取reqeust域屬性組成的Map
sessionScope 獲取session域屬性組成的Map
applicationScope 獲取application域屬性組成的MappageContext 獲取jsp的9大隱式對象, 如 ${pageContext.request}
initParam 獲取在web.xml配置的WEB應用參數param 請求參數Map<String,String>, 如: ${param.userName}
paramValues 請求參數Map<String,String[]>, 如: ${paramValues.userName[1]}
header 請求頭Map<String,String[]>, 如: ${header["Accept-Language"] }
headerValues 請求頭Map<String,String[]>cookie 獲取cookie對象, 如 ${cookie.JSESSIONID.name} ${cookie.JSESSIONID.value}
2.EL語法
1.常量(直接輸出到HTML)
?
${"字符串"} ${123} ${true}
2.變量(在四大域搜尋)
???
${userName} 在四大域搜尋變量名的值,不存在則返回"" (相當于 <%= pageContext.findAttribute("userName") %>)${pageScope.userName}${requestScope.userName}${sessionScope.userName}${applicationScope.userName}搜尋數組/集合對象${myList[0]}搜尋map對象${myMap.key} ${myMap["key-first.last"]} key名是數字或特殊符(.-),必須用[]搜尋javaBean對象${user.getName()} 相當于 <%=user.getName()%>
3.簡單運算
??? 算數運算
???????
${1+"2"} 非數字都被轉成數字,不能轉就報錯,空元素當作沒參與關系運算 > gt < lt >= ge <= le != ne == eq${a>2}邏輯運算 && and || or ! not${a>2 && b>2}三元表達式${name == null ? "張三" : name}域中指定的屬性是否空 empty/not empty${not empty name}
?
3.調用java方法
EL表達式可調用java靜態方法,步驟如下:
1)編寫一個包含靜態方法的類 ?
2)編寫一個tld文件,配置靜態方法
?
<?xml version="1.0" encoding="UTF-8"?><taglib version="2.0"xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <uri>http://www.lioil.win/method</uri><short-name>my</short-name><function><name>elMethod</name><function-class>win.lioil.Method</function-class><function-signature>java.lang.String method(java.lang.String)</function-signature></function> </taglib>
3)在jsp中引入tld文件: <%@ taglib uri="http://www.lioil.win/method" prefix="my"%>???? ?
4)在jsp中調用java靜態方法: ${my:elMethod("x")}
* 對字符串進行操作,可以用EL函數庫(JSTL標簽庫)
?
二.JSP原生標簽(很少用)
sun公司推出的原生標簽,屬于jsp規范,不需引入第三方標簽庫<jsp:inclue> 替代request.getRequestDispatcher().include()
<jsp:forward> 替代request.getRequestDispatcher().forward()
<jsp:param> 在url后接請求參數在域中搜尋名為id的bean,沒有就在該域中創建
<jsp:useBean id="beanName" class="package.class" scope="page|request|session|application"/>將請求參數存到bean對象, property指定請求參數/beanName對象屬性名,param指定請求參數
<jsp:setProperty name="bean" property="" param=""/>獲取bean對象的屬性值到輸出流, property指定屬性名
<jsp:getProperty name="bean" property="" />
?
三.JSTL標簽庫(常用)
全稱Java Standard Tag Library,由JCP(Java Community Process)指定標準, 和EL配合取代JSP的Java代碼,以便開發
1.下載JSTL標簽庫(Taglibs)
一般使用JSTL1.1以上版本,現在最新版是JSTL1.2.5
在Apache Tomcat官網下載JSTL標簽庫(Taglibs)
下載地址: http://tomcat.apache.org/download-taglibs.cgi
下載頁面有4個jar包:
?
Impl: taglibs-standard-impl-1.2.5.jar JSTL實現類庫Spec: taglibs-standard-spec-1.2.5.jar JSTL標準接口EL: taglibs-standard-jstlel-1.2.5.jar JSTL1.0標簽-EL相關Compat: taglibs-standard-compat-1.2.5.jar 兼容版本
從README得知:
???
如果不使用JSTL1.0標簽,可以忽略taglibs-standard-jstlel包,README沒有介紹taglibs-standard-compat包,估計應該是兼容以前版本標簽庫,所以一般只需要 taglibs-standard-impl 和 taglibs-standard-spec 兩個jar包Maven依賴配置如下:<dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-spec</artifactId><version>1.2.5</version></dependency><dependency><groupId>org.apache.taglibs</groupId><artifactId>taglibs-standard-impl</artifactId><version>1.2.5</version></dependency>
把上述兩個jar包加到項目,或者復制到Tomcat/lib(所有項目都可以共用,一勞永逸)
2.核心標簽庫
??? core 核心標簽庫
??? fmt? 國際化標簽
??? sql? 數據庫標簽(廢棄)
??? xml? XML標簽(廢棄)
在jsp中引入 core fmt 標簽庫:
??? <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
??? <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%>
1.core標簽庫
輸出默認轉義<c:out value="<h1>header</h1>" default="value"/><c:out value="${name}"/>操作域變量 <c:set var="name" value="value" scope="page"/>Map對象 <c:set target="${myMap}" property="name1" value="value1" scope="request"/>Bean對象 <c:set target="${myBean}" property="name2" value="value2" scope="request"/>刪除屬性 <c:remove var="name" scope="request"/>捕獲異常 <c:catch var="e"><%= 1/0 %></c:catch> ${e.message }條件判斷<c:if test="${i>1}" var="result" scope="page">大于1</c:if><c:if test="${i<1}" var="result" scope="page">小于1</c:if><c:choose><c:when test="${day == 1}">星期一</c:when><c:when test="${day == 2}">星期二</c:when><c:when test="${day == 3}">星期三</c:when><c:when test="${day == 4}">星期四</c:when><c:when test="${day == 5}">星期五</c:when><c:otherwise>休息日</c:otherwise></c:choose>
循環
??? 1.遍歷集合List???? ?
???
<table border="1"><tr><th>名稱</th><th>是否是集合中第一個元素</th><th>是否是集合中最后一個元素</th><th>顯示當前遍歷的索引</th><th>顯示當前遍歷的計數</th></tr><c:forEach items="${myList}" var="it" varStatus="st" ><tr><td>${pageScope.it}</td><td>${pageScope.st.first}</td><td>${pageScope.st.last}</td><td>${pageScope.st.index}</td><td>${pageScope.st.count}</td></tr> </c:forEach></table>
??? 2.遍歷Map
???
<c:forEach items="${myMap}" var="entry" >${entry.key }:${entry.value }<br></c:forEach>
??? 3.循環計數(for i)
???
<c:forEach begin="1" end="100" step="1" var="num" >${num}</c:forEach>
分隔字符串
???
<c:forTokens items="sdfa,fsad,fds" delims="," var="result">${result}<br></c:forTokens>
在URL后加參數
?
<c:param> 嵌套在<c:import>、<c:url>、<c:redirect>,為這些標簽所用URL附加參數實現include功能<c:import url="/index.jsp" var="p" scope="page"></c:import>輸出: ${p}URL重寫<c:url value="/index.jsp" context="${pageContext.request.contextPath}" var="eurl" scope="page"></c:url> <a href="${eurl}">xxx</a>請求重定向<c:redirect url="/index.jsp" context="${pageContext.request.contextPath}"></c:redirect>
?
2.fmt標簽庫
格式化日期 <fmt:formatDatevalue="<%=new Date()%>" pattern="yyyy/MM/dd hh:mm:ss" var="date" scope="request" />${requestScope.date}格式化數字 <fmt:formatNumber value="3.1415926" pattern="0000.00000000000" var="num1" scope="request" /><fmt:formatNumber value="3.1415926" pattern="####.###########" var="num2" scope="request" />${requestScope.num1}<br>${requestScope.num2}<br>
?
?
總結
以上是生活随笔為你收集整理的spring mvc学习(37):JavaEE-JSP基础-EL表达式和JSTL标签库(Taglibs)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。