注意:如果EL表达式不起作用记得加上<%@page isELIgnored=“false” %> ,不然EL表达式被默认忽略
EL 表达式的全称是:Expression Language。是表达式语言。 EL 表达式的什么作用:EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。 因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。
<% request.setAttribute("key","值"); %> 表达式脚本输出 key 的值是: <%=request.getAttribute("key1")==null?"":request.getAttribute("key1")%><br/> EL 表达式输出 key 的值是:${key1}EL 表达式的格式是:${表达式} EL 表达式在输出 null 值的时候,输出的是空串。jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串。
EL 表达式主要是在 jsp 页面中输出数据。 主要是输出域对象中的数据。 当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。
<% //往四个域中都保存了相同的 key 的数据。 request.setAttribute("key", "request"); session.setAttribute("key", "session"); application.setAttribute("key", "application"); pageContext.setAttribute("key", "pageContext"); %> ${ key }输出pageContext,因为pageContext域最小
我们可以输出某个类中的普通属性,数组属性,list集合属性和map集合属性等
某个类代码:
public class Person { // i.需求——输出 Person 类中普通属性,数组属性。list 集合属性和 map 集合属性。 private String name; private String[] phones; private List<String> cities; private Map<String,Object> map; public int getAge() { return 18; } } <% Person person = new Person(); person.setName("zzt"); person.setPhones(new String[]{"18610541354","18688886666","18699998888"}); List<String> cities = new ArrayList<String>(); cities.add("北京"); cities.add("上海"); cities.add("深圳"); person.setCities(cities); Map<String,Object>map = new HashMap<>(); map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); person.setMap(map); pageContext.setAttribute("p", person); %> 输出 Person:${ p }<br/> 输出 Person 的 name 属性:${p.name} <br> 输出 Person 的 pnones 数组属性值:${p.phones[2]} <br> 输出 Person 的 cities 集合中的元素值:${p.cities} <br> 输出 Person 的 List 集合中个别元素值:${p.cities[2]} <br> 输出 Person 的 Map 集合: ${p.map} <br> 输出 Person 的 Map 集合中某个 key 的值: ${p.map.key3} <br> 输出 Person 的 age 属性:${p.age} <br>上述可以看到没有age属性,但是可以输出p.age,这是因为EL表达式,默认是调用getAge属性,并不是去真正找里面的值
语法:${ 运算表达式 } , EL 表达式支持如下运算符:
可以用的关系运算符有==、!=、<、>、<=、>=
${5==5} //true ${5!=5} //false ${5<5} //false ${5>5} //false ${5<=5} //true ${5>=5} //true可以用的逻辑运算符有 &&或and(与) 、|| 或 or(或) 、! 或not(取反)
${5==5 && 12==5} 或 ${5==5 and 12==5} //false ${5==5 || 12==5} 或 ${5==5 or 12==5} //true ${!true} 或 ${not true} //false可以用的算数运算符有+ 、 - 、* 、 /或div(除) 、%或mod(取余)
${ 12 + 18 } ${ 12 - 18 } ${ 12 * 18 } ${ 12 / 18 } 或 ${ 12 div 18 } ${ 12 % 18 } 或 ${ 12 mod 18 }empty 运算可以判断一个数据是否为空,如果为空,则输出 true,不为空输出 false。 以下几种情况为空: 1、值为 null 值的时候,为空 2、值为空串的时候,为空 3、值是 Object 类型数组,长度为零的时候 4、list 集合,元素个数为零 5、map 集合,元素个数为零
<body> <% // 1、值为 null 值的时候,为空 request.setAttribute("emptyNull", null); // 2、值为空串的时候,为空 request.setAttribute("emptyStr", ""); // 3、值是 Object 类型数组,长度为零的时候 request.setAttribute("emptyArr", new Object[]{}); // 4、list 集合,元素个数为零 List<String> list = new ArrayList<>(); // list.add("abc"); request.setAttribute("emptyList", list); // 5、map 集合,元素个数为零 Map<String,Object> map = new HashMap<String, Object>(); // map.put("key1", "value1"); request.setAttribute("emptyMap", map); %> ${ empty emptyNull } <br/> //true ${ empty emptyStr } <br/> //true ${ empty emptyArr } <br/> //true ${ empty emptyList } <br/> //true ${ empty emptyMap } <br/> //true </body>表达式 1?表达式 2:表达式 3 如果表达式 1 的值为真,返回表达式 2 的值,如果表达式 1 的值为假,返回表达式 3 的值。
${ 12 != 12 ? "yyyzl":"xml" }.点运算,可以输出 Bean 对象中某个属性的值。 []中括号运算,可以输出有序集合中某个元素的值。 并且[]中括号运算,还可以输出 map 集合中 key 里含有特殊字符的 key 的值。
<% Map<String,Object> map = new HashMap<String, Object>(); map.put("a.a.a", "aaaValue"); map.put("b+b+b", "bbbValue"); map.put("c-c-c", "cccValue"); request.setAttribute("map", map); %> ${ map['a.a.a'] } <br> ${ map["b+b+b"] } <br> ${ map['c-c-c'] } <br>EL 个达式中 11 个隐含对象,是 EL 表达式中自己定义的,可以直接使用。
变量类型作用pageContextPageContextImpl它可以获取 jsp 中的九大内置对象pageScopeMap<String,Object>它可以获取 pageContext 域中的数据requestScopeMap<String,Object>它可以获取 Request 域中的数据sessionScopeMap<String,Object>它可以获取 Session 域中的数据applicationScopeMap<String,Object>它可以获取 ServletContext 域中的数据paramMap<String,String>它可以获取请求参数的值paramValuesMap<String,String[]>它也可以获取请求参数的值,获取多个值的时候使用。headerMap<String,String>它可以获取请求头的信息headerValuesMap<String,String[]>它可以获取请求头的信息,它可以获取多个值的情况cookieMap<String,Cookie>它可以获取当前请求的 Cookie 信息initParamMap<String,String>它可以获取在 web.xml 中配置的< context-param>上下文参数pageScope ====== pageContext 域 requestScope ====== Request 域 sessionScope ====== Session 域 applicationScope ====== ServletContext 域
<% pageContext.setAttribute("key1", "pageContext1"); pageContext.setAttribute("key2", "pageContext2"); request.setAttribute("key2", "request"); session.setAttribute("key2", "session"); application.setAttribute("key2", "application"); %> ${ applicationScope.key2 } //applicationparam Map<String,String> 它可以获取请求参数的值 paramValues Map<String,String[]> 它也可以获取请求参数的值,获取多个值的时候使用。
输出请求参数 username 的值:${ param.username } <br> 输出请求参数 password 的值:${ param.password } <br> 输出请求参数 username 的值:${ paramValues.username[0] } <br> 输出请求参数 hobby 的值:${ paramValues.hobby[0] } <br> 输出请求参数 hobby 的值:${ paramValues.hobby[1] } <br>请求地址: http://localhost:8080/09_EL_JSTL/other_el_obj.jsp?username=wzg168&password=666666&hobby=java&hobby=cpp
header Map<String,String> 它可以获取请求头的信息 headerValues Map<String,String[]> 它可以获取请求头的信息,它可以获取多个值的情况
输出请求头【User-Agent】的值:${ header['User-Agent'] } <br> 输出请求头【Connection】的值:${ header.Connection } <br> 输出请求头【User-Agent】的值:${ headerValues['User-Agent'][0] } <br>cookie Map<String,Cookie> 它可以获取当前请求的 Cookie 信息
获取 Cookie 的名称:${ cookie.JSESSIONID.name } <br> 获取 Cookie 的值:${ cookie.JSESSIONID.value } <br>initParam Map<String,String> 它可以获取在 web.xml 中配置的< context-param>上下文参数
<context-param> <param-name>username</param-name> <param-value>root</param-value> </context-param> <context-param> <param-name>url</param-name> <param-value>jdbc:mysql:///test</param-value> </context-param> 输出<Context-param>username 的值:${ initParam.username } <br> 输出<Context-param>url 的值:${ initParam.url } <br>JSTL 标签库 全称是指 JSP Standard Tag Library JSP 标准标签库。是一个不断完善的开放源代码的 JSP 标签库。 EL 表达式主要是为了替换 jsp 中的表达式脚本,而标签库则是为了替换代码脚本。 这样使得整个 jsp 页面变得更佳简洁 注意:使用之前记得导包!
<dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-impl</artifactId> <version>1.2.5</version> </dependency> <dependency> <groupId>org.apache.taglibs</groupId> <artifactId>taglibs-standard-spec</artifactId> <version>1.2.5</version> </dependency>JSTL由5个不同的标签库组成
功能范围URI前缀核心标签库–重点http://java.sun.com/jsp/jstl/corec格式化http://java.sun.com/jsp/jstl/fmtfmt函数http://java.sun.com/jsp/jstl/functionsfn数据库(不使用)http://java.sun.com/jsp/jstl/sqlsqlXML(不使用)http://java.sun.com/jsp/jstl/xmlx在 jsp 标签库中使用 taglib 指令引入标签库 CORE 标签库 <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %> XML 标签库 <%@ taglib prefix=“x” uri=“http://java.sun.com/jsp/jstl/xml” %> FMT 标签库 <%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %> SQL 标签库 <%@ taglib prefix=“sql” uri=“http://java.sun.com/jsp/jstl/sql” %> FUNCTIONS 标签库 <%@ taglib prefix=“fn” uri=“http://java.sun.com/jsp/jstl/functions” %>
1、先导入 jstl 标签库的 jar 包。 taglibs-standard-impl-1.2.1.jar taglibs-standard-spec-1.2.1.jar 2、第二步,使用 taglib 指令引入标签库。
作用:set 标签可以往域中保存数据 域对象.setAttribute(key,value);
scope 属性设置保存到哪个域
page 表示 PageContext 域(默认值) request 表示 Request 域 session 表示 Session 域 application 表示 ServletContext 域
var 属性设置 key 是多少 value 属性设置值
保存之前:${ sessionScope.abc } <br> <c:set scope="session" var="abc" value="abcValue"/> 保存之后:${ sessionScope.abc } <br>if 标签用来做 if 判断。 test 属性表示判断的条件(使用 EL 表达式输出)
<c:if test="${ 12 == 12 }"> <h1>12 等于 12</h1> </c:if> <c:if test="${ 12 != 12 }"> <h1>12 不等于 12</h1> </c:if>作用:多路判断。跟 switch … case … default 非常接近
choose 标签开始选择判断 when 标签表示每一种判断情况
test 属性表示当前这种判断情况的值
otherwise 标签表示剩下的情况
<c:choose> <c:when> <c:otherwise>标签使用时需要注意的点: 1、标签里不能使用 html 注释,要使用 jsp 注释 2、when 标签的父标签一定要是 choose 标签
<% request.setAttribute("height", 180); %> <c:choose> <%-- 这是 html 注释 --%> <c:when test="${ requestScope.height > 190 }"> <h2>小巨人</h2> </c:when> <c:when test="${ requestScope.height > 180 }"> <h2>很高</h2> </c:when> <c:when test="${ requestScope.height > 170 }"> <h2>还可以</h2> </c:when> <c:otherwise> <c:choose> <c:when test="${requestScope.height > 160}"> <h3>大于 160</h3> </c:when> <c:when test="${requestScope.height > 150}"> <h3>大于 150</h3> </c:when> <c:when test="${requestScope.height > 140}"> <h3>大于 140</h3> </c:when> <c:otherwise> 其他小于 140 </c:otherwise> </c:choose> </c:otherwise> </c:choose>作用:遍历输出使用。
begin 属性设置开始的索引 end 属性设置结束的索引 var 属性表示循环的变量(也是当前正在遍历到的数据)
//for (int i = 1; i < 10; i++) <table border="1"> <c:forEach begin="1" end="10" var="i"> <tr> <td>第${i}行</td> </tr> </c:forEach> </table>items 表示遍历的数据源(遍历的集合) var 表示当前遍历到的数据
//for (Object item: arr) <% request.setAttribute("arr", new String[]{"18610541354","18688886666","18699998888"}); %> <c:forEach items="${ requestScope.arr }" var="item"> ${ item } <br> </c:forEach>Student类: 记得get和set
public class Student { //4.编号,用户名,密码,年龄,电话信息 private Integer id; private String username; private String password; private Integer age; private String phone; }jsp页面的代码:
items 表示遍历的集合 var 表示遍历到的数据 begin 表示遍历的开始索引值 end 表示结束的索引值 step 属性表示遍历的步长值 varStatus 属性表示当前遍历到的数据的状态
<%--4.遍历 List 集合---list 中存放 Student 类,有属性:编号,用户名,密码,年龄,电话信息--%> <% List<Student> studentList = new ArrayList<Student>(); for (int i = 1; i <= 10; i++) { studentList.add(new Student(i,"username"+i ,"pass"+i,18+i,"phone"+i)); } request.setAttribute("stus", studentList); %> <table> <tr> <th>编号</th> <th>用户名</th> <th>密码</th> <th>年龄</th> <th>电话</th> <th>操作</th> </tr> <%-- items 表示遍历的集合 var 表示遍历到的数据 begin 表示遍历的开始索引值 end 表示结束的索引值 step 属性表示遍历的步长值 varStatus 属性表示当前遍历到的数据的状态 for(int i = 1; i < 10; i+=2) --%> <c:forEach begin="2" end="7" step="2" varStatus="status" items="${requestScope.stus}" var="stu"> <tr> <td>${stu.id}</td> <td>${stu.username}</td> <td>${stu.password}</td> <td>${stu.age}</td> <td>${stu.phone}</td> <td>${status.step}</td> </tr> </c:forEach> </table>内置的status对象的方法: