隱式獲取
${key} : 將會以pageContext??request??session??application順序讀取,域的范圍是從小到大
關(guān)于集合的展示 ??
<%
List list = new ArrayList();
? ? list.add("one");
? ? list.add("two");
? ? list.add("three");
? ? pageContext.setAttribute("aList",list);
? ? Map map = new HashMap();
? ? map.put("color","red");
? ? map.put("shape","square");
? ? pageContext.setAttribute("aMap",map);
%>
${aList}<br/> <!--直接輸出數(shù)組-->
${aList[0]}<br/> <!--按下標(biāo)讀取數(shù)組-->
${aList[2]}<br/> <!--按下標(biāo)讀取數(shù)組-->
${aMap}<br/> <!--直接輸出映射-->
${aMap.shape}<br/> <!--按鍵讀取映射-->
下面是在網(wǎng)頁中輸出的結(jié)果 ??
[one, two, three]
one
three
{color=red, shape=square}
square
對象的展示
測試??
<%
class Student{
? ? ? ? private final String name = "Tom";
? ? ? ? private final String sex = "boy";
? ? ? ? @Override
? ? ? ? public String toString() {
? ? ? ? ? ? return name+" is a "+sex;
? ? ? ? }
}
Student student = new Student();
pageContext.setAttribute("aStudent",student);
%>
${aStudent}<br/>
下面是在網(wǎng)頁中輸出的結(jié)果 ??
Tom is a boy
可以看出來EL對于對象的展示其實就是調(diào)用了toString()方法缰趋,包括集合也一樣捧杉。如果這個對象沒有重寫toString()方法,那么機(jī)會調(diào)用父類toString()方法。比如父類是Object秘血,那么就會輸出hashcode味抖。
對象的字段(屬性)的獲取
獲取方式: ${object.field} 即可獲取對象的字段(屬性)
測試代碼??
com.java.webtest.Student
package com.java.webtest;
public class Student {
? ? private String name = "Jack";
? ? public String getName() {
? ? ? ? return name;
? ? }
}
myTest.jsp
<%@ page import="com.java.webtest.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
? ? <title>myTest</title>
</head>
<body>
? ? <%
? ? ? ? Student s1 = new Student();
? ? ? ? pageContext.setAttribute("s1",s1);
? ? %>
? ? name = ${s1.name}<br/>
</body>
</html>
運行結(jié)果
name = Jack
?? EL表達(dá)式獲取對象字段(屬性)是通過反射機(jī)制。${s1.name} 底層邏輯是將首字母"n"大寫再在前面拼接一個"get"灰粮,然后反射獲取"getName"方法仔涩。所以對象必須提供字段的get方法,才能使用EL表達(dá)式 ${object.field} 粘舟,如果不寫就會報錯熔脂,或者你讓get方法返回一個和相應(yīng)字段無關(guān)的東西來證明確實是調(diào)用了get方法得到值的。
EL的運算
運算類型 描述
算術(shù)型 加+ 減- 乘* 除/柑肴、 div 取余% 霞揉、mod
邏輯型 and、&&晰骑、or适秩、||、!硕舆、not
關(guān)系型 ==秽荞、eq、!=抚官、ne扬跋、<、lt凌节、>钦听、gt、<=倍奢、le彪见、>=、ge
empty 判斷一個值是否為null或者為empty娱挨,如${empty ""} 返回值為true
三目運算 expression ? valueA : valueB 若expression為true返回valueA否則返回valueB
做一個測試 ??
<%
? ? class Person{
? ? ? ? private int id;
? ? ? ? private String sex;
? ? ? ? public Person(int id,String sex){ this.id = id; this.sex = sex; }
? ? ? ? @Override
? ? ? ? public boolean equals(Object o) { return id == ((Person) o).id; }
? ? }
? ? Person p1 = new Person(777,"boy");
? ? Person p2 = new Person(777,"girl");
? ? Person p3 = new Person(666,"boy");
? ? pageContext.setAttribute("p1",p1);
? ? pageContext.setAttribute("p2",p2);
? ? pageContext.setAttribute("p3",p3);
%>
1 + 2 = ${1 + 2}<br/>
1 - 2 = ${1 - 2}<br/>
3 * 3 = ${3 * 3}<br/>
10 / 3 = ${10 / 3}<br/>
10 div 3 = ${10 div 3}<br/>
10 % 3 = ${10 % 3}<br/>
10 mod 3 = ${10 mod 3}<br/>
true and false -> ${true and false}<br/>
true && false ->${true && false}<br/>
true or false -> ${true or false}<br/>
true || false -> ${true || false}<br/>
not true -> ${not true}<br/>
!true -> ${!true}<br/>
666 == 666 -> ${666 == 666}<br/>
p1 == p2 -> ${p1 == p2}<br/>
p1 == p3 -> ${p1 == p3}<br/>
"ABCDEFG" == "abcdefg" -> ${"ABCDEFG" == "abcdefg"}<br/>
"ABCDEFG" == "ABCDEFG" -> ${"ABCDEFG" == "ABCDEFG"}<br/>
"ABCDEFG" eq "abcdefg" -> ${"ABCDEFG" eq "abcdefg"}<br/>
"ABCDEFG" eq "ABCDEFG" -> ${"ABCDEFG" eq "ABCDEFG"}<br/>
"ABCDEFG" != "abcdefg" -> ${"ABCDEFG" != "abcdefg"}<br/>
"ABCDEFG" != "ABCDEFG" -> ${"ABCDEFG" != "ABCDEFG"}<br/>
"ABCDEFG" ne "abcdefg" -> ${"ABCDEFG" ne "abcdefg"}<br/>
"ABCDEFG" ne "ABCDEFG" -> ${"ABCDEFG" ne "ABCDEFG"}<br/>
10 < 3 -> ${10 < 3}<br/>
10 lt 3 -> ${10 lt 3}<br/>
10 > 3 -> ${10 > 3}<br/>
10 gt 3 -> ${10 gt 3}<br/>
10 <= 3 -> ${10 <= 3}<br/>
10 le 3 -> ${10 le 3}<br/>
10 >= 3 -> ${10 >= 3}<br/>
10 ge 3 -> ${10 ge 3}<br/>
empty "" -> ${empty ""}<br/>
empty null -> ${empty null}<br/>
empty 666 -> ${empty 666}<br/>
55 > 60 ? "you pass!" : "you fail..." -> ${55 > 60 ? "you pass!" : "you fail..."}<br/>
頁面的輸出結(jié)果??
1 + 2 = 3
1 - 2 = -1
3 * 3 = 9
10 / 3 = 3.3333333333333335
10 div 3 = 3.3333333333333335
10 % 3 = 1
10 mod 3 = 1
true and false -> false
true && false ->false
true or false -> true
true || false -> true
not true -> false
!true -> false
666 == 666 -> true
p1 == p2 -> true
p1 == p3 -> false
"ABCDEFG" == "abcdefg" -> false
"ABCDEFG" == "ABCDEFG" -> true
"ABCDEFG" eq "abcdefg" -> false
"ABCDEFG" eq "ABCDEFG" -> true
"ABCDEFG" != "abcdefg" -> true
"ABCDEFG" != "ABCDEFG" -> false
"ABCDEFG" ne "abcdefg" -> true
"ABCDEFG" ne "ABCDEFG" -> false
10 < 3 -> false
10 lt 3 -> false
10 > 3 -> true
10 gt 3 -> true
10 <= 3 -> false
10 le 3 -> false
10 >= 3 -> true
10 ge 3 -> true
empty "" -> true
empty null -> true
empty 666 -> false
55 > 60 ? "you pass!" : "you fail..." -> you fail...
我認(rèn)為應(yīng)該特別注意兩點
兩個整數(shù)相除的結(jié)果并不是整數(shù)
p1 == p2 -> true 和 "ABCDEFG" == "ABCDEFG" -> true余指。顯然不同于Java,EL表達(dá)式重載了 == ,對象之間使用 == 比較的時候酵镜,并不是比較對象的引用變量(也就是對象地址或指針)碉碉,而是使用了 equals(Object o) 方法。!= 比較對象也是同理淮韭,可以自己測試一下垢粮。
JSTL標(biāo)簽庫
JSTL(Java server pages standarded tag library)是一個JSP標(biāo)準(zhǔn)標(biāo)簽庫,它封裝了JSP應(yīng)用的通用核心功能靠粪。JSTL支持通用的蜡吧、結(jié)構(gòu)化的任務(wù),比如迭代占键,條件判斷昔善,XML文檔操作,國際化標(biāo)簽畔乙,SQL標(biāo)簽君仆。 除了這些,它還提供了一個框架來使用集成JSTL的自定義標(biāo)簽牲距。下文將闡述部分常用的JSTL標(biāo)簽返咱。EL和JSTL核心標(biāo)簽庫通常搭配使用效果最佳
使用前的準(zhǔn)備
導(dǎo)入相應(yīng)的jar包:standard.jar 和 jstl.jar
JSP頁面引入標(biāo)簽庫
<%@ taglib pre?x="前綴" uri="功能范圍路徑" %>
功能范圍 prefix uri
core c http://java.sun.com/jsp/jstl/core
i18n fmt http://java.sun.com/jsp/jstl/fmt_rt
sql sql http://java.sun.com/jsp/jstl/sql
xml x http://java.sun.com/jsp/jstl/xml
functions fn http://java.sun.com/jsp/jstl/function
?? 如果在后面使用中出現(xiàn) 500錯誤頁面,其中包含類似這樣的信息:atrribute [value] does not accpet any expressions牍鞠,有可能是uri的問題咖摹,可能需要換一個uri。uri不同版本功能有差別所以會導(dǎo)致一些錯誤难述。
標(biāo)簽使用語法
<prefix:tag attribute="value" ... >
...
</prefix:tag>
重要標(biāo)簽
?? 免責(zé)聲明:以下標(biāo)簽屬性總結(jié)并不全面萤晴,只講比較常用的屬性;并且由于uri不同屬性不同龄广。具體內(nèi)容請查看你導(dǎo)入的standard.jar
<c:tag>標(biāo)簽
使用標(biāo)簽前不要忘記導(dǎo)入標(biāo)簽硫眯,不過IDEA也會自動導(dǎo)入蕴侧。核心標(biāo)簽按照功能可以分為??
表達(dá)式操作: out择同、set、remove净宵、catch
流程控制: if敲才、choose、when择葡、otherwise
迭代操作: forEach紧武、forTokens
URL操作: import、param敏储、url阻星、redirect
<c:set>標(biāo)簽
屬性 缺省 說明
value - 向域中存入的變量值
var - 向域中存入的變量名
scope page 指定存儲在4個域中的哪一個
target - Java對象
property - Java對象的字段(屬性)。因為使用的是反射技術(shù),與前面EL表達(dá)式獲取字段值同理:該字段必須有set方法
<c:out>標(biāo)簽
屬性 缺省 說明
value - 需要顯示出來的值
default - 如果value的值為null妥箕,則顯示default的值
escapeXml true 是否轉(zhuǎn)義xml字符滥酥。有些字符如<在xml中被認(rèn)為是<,若要它的字面意思畦幢,就需要使用轉(zhuǎn)移
案例 ??
com.java.testclass.Person
package com.java.testclass;
public class Person {
? ? private String name;
? ? private int age;
? ? public Person(String name, int age) {
? ? ? ? this.name = name;
? ? ? ? this.age = age;
? ? }
? ? @Override
? ? public String toString() {
? ? ? ? return name+" is "+age+" years old.";
? ? }
? ? public String getName() {
? ? ? ? return name;
? ? }
? ? public void setName(String name) {
? ? ? ? this.name = name;
? ? }
? ? public int getAge() {
? ? ? ? return age;
? ? }
? ? public void setAge(int age) {
? ? ? ? this.age = age;
? ? }
}
JSTL-test.jsp
<%@ page import="com.java.testclass.Person" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt_rt" %>
<html>
<head>
? ? <title>JSTL-test</title>
</head>
<body>
<%
? ? pageContext.setAttribute("person1",new Person("Tom",18));
? ? pageContext.setAttribute("person2",null);
%>
<h6>********** set & out Test **********</h6>
<%--向域中存值--%>
<c:set var="fruit" value="apple"></c:set>
<c:set var="fruit" value="banana" scope="session"></c:set>
<%--設(shè)置Java對象的字段--%>
<c:set value="David" target="${person1}" property="name"></c:set>
<c:set target="${person1}" property="age">18</c:set><br>
<%--輸出--%>
<c:out value="${fruit} is fruit." default="fruit is null!"></c:out><br>
person1 : ${person1}<br>
person2 : <c:out value="${person2}" default="person2 is null!"></c:out><br>
<c:out value="<==when escapeXml is true==>"></c:out><br>
<c:out value="<==when escapeXml is false==>" escapeXml="false"></c:out><br>
</body>
</html>
結(jié)果
********** set & out Test **********
apple is fruit.
person1 : David is 18 years old.
person2 : person2 is null!
<==when escapeXml is true==>
<==when escapeXml is false==>
<c:if>標(biāo)簽
屬性 缺省 說明
test - if 的條件表達(dá)式
var - 定義一個變量存儲if 條件表達(dá)式的結(jié)果
scope page var變量的JSP范圍
<c:choose>標(biāo)簽
屬性 缺省 說明
test 無 如果表達(dá)式的結(jié)果為true坎吻,則執(zhí)行體內(nèi)容,false則相反
<c:choose>
? ? <c:when test="boolean表達(dá)式">
? ? </c:when>
? ? <c:otherwise>
? ? </c:otherwise>
</c:choose>
<c:forEach>標(biāo)簽
用于遍歷集合元素
屬性 缺省 說明
var - 遍歷用的循環(huán)變量
items - 被遍歷的集合對象
varStatus - 存放本輪循環(huán)變量的相關(guān)參數(shù)
begin 0 遍歷起點下標(biāo)
end 最后元素下標(biāo) 遍歷終點下標(biāo)
step 1 每次迭代的間隔數(shù)
直接看例子 ??
<%
? ? int[] arr = {100,200,300,400,500,600,700,800,900,1000};
? ? pageContext.setAttribute("arr",arr);
%>
<h6>********** process control Test **********</h6>
foreach arr
<c:forEach items="${arr}" var="it" begin="1" end="7" step="2" varStatus="status">
? ? <c:if test="${status.count==1}">
? ? ? ? from ${status.begin} to ${status.end} by step = ${status.step}<br>
? ? </c:if>
? ? arr[${status.index}] = ${it} , count = ${status.count}<br>
</c:forEach>
結(jié)果
********** process control Test **********
foreach arr from 1 to 7 by step = 2
arr[1] = 200 , count = 1
arr[3] = 400 , count = 2
arr[5] = 600 , count = 3
arr[7] = 800 , count = 4
從結(jié)果count屬性并不是與index屬性關(guān)聯(lián)的值宇葱,index是數(shù)組的下標(biāo)瘦真,count僅作為循環(huán)的計數(shù)器。
<fmt:tag>標(biāo)簽
<fmt:formatDate>標(biāo)簽
該標(biāo)簽用于格式化輸出Date類型變量黍瞧,比較常用
屬性 缺省 說明
value - 用于指定被格式化對象
pattern - 格式化的模式诸尽,與SimpleDateFormat的參數(shù)設(shè)置一樣
var - 指定產(chǎn)生的格式化字符串所存放的變量,若不指定則直接輸出在頁面中
scope page 指定var變量的存儲域
type date 說明value對象包含時間或包含日期還是兩者兼具雷逆。取值為date/time/both
<fmt:parseDate>標(biāo)簽
<fmt:formatDate>的逆向過程弦讽,用于將指定字符串轉(zhuǎn)化為日期類型
屬性 說明
value 用于指定被轉(zhuǎn)化的字符串
pattern 指定解析字符串的格式
var 指定生成的時間對象所存放的變量
請看測試代碼 ??
<%
? ? pageContext.setAttribute("now",new Date());
%>
<h6>******************** fmt Test ********************</h6>
before formatting : ${now}. <br>
<fmt:formatDate value="${now}" pattern="yyyy-MM-dd" var="parse_date"></fmt:formatDate>
after formatting? : ${parse_date}. <br>
<fmt:parseDate value="${parse_date}" var="gotten_date" pattern="yyyy-MM-dd"></fmt:parseDate>
date get from string : ${gotten_date}. <br>
結(jié)果
******************** fmt Test ********************
before formatting : Sat Mar 13 23:03:16 CST 2021.
after formatting : 2021-03-13.
date get from string : Sat Mar 13 00:00:00 CST 2021
? 注意第一個日期與第三個日期的差別,這是由于第一次轉(zhuǎn)換的時候丟失了時間信息
<fmt:formatNumber>標(biāo)簽
USB Microphone https://www.soft-voice.com/
Wooden Speakers? https://www.zeshuiplatform.com/
亞馬遜測評 www.yisuping.cn
深圳網(wǎng)站建設(shè)www.sz886.com