EL表达式、JSTL
EL概述和基本语法
EL表达式:Expression Language表达式语言
目的:简化jsp中java代码开发,代替脚本表达式<%=username%>
它不是一种开发语言,是jsp中获取数据的一种规范
格式如: ${EL表达式} 等价于<%=pageContext.findAttribute(name)%>
EL的具体功能
案例1:获取简单数据
<br />=====================案例一:获取简单数据===================
<br />
<%
pageContext.setAttribute("username", "张三");
request.setAttribute("age", "25");
//request.setAttribute("username", "李四");
session.setAttribute("phone", "13838383838");
application.setAttribute("address", "北京昌平沙河");
User user = new User();
user.setUsername("学智");
user.setPassword("8888");
user.setPhone("1899999999");
user.setGender("妖");
user.setAdd(new Address("泰国","曼谷","xxx区"));
pageContext.setAttribute("u", user);
%>
<br />-----------------findAttribute()获取数据-------------------
<br />
<%=pageContext.findAttribute("username")%><br />
<%=pageContext.findAttribute("age")%><br />
<%=pageContext.findAttribute("phone")%><br />
<%=pageContext.findAttribute("address")%><br />
<br />-----------------el表达式获取数据-------------------
<br /> ${username }
<br /> ${age }
<br /> ${phone }
<br /> ${address }
<br /> ${"username" }
<br />
案例2:获取实体类对象中的属性值
<% User user= new User(); user.setName("gggg"); Address address = new Address(); address.setAddr("北京市海淀区"); user.setAddress(address); session.setAttribute("user", user); /* request.getRequestDispatcher("testEl.jsp").forward(request, response); */ response.sendRedirect("testEl.jsp"); %> <!-- EL表达式中的.表示调用该属性的get方法 --> <%-- 我是:$住在{user.name } , 住在 ${user.address.addr } --%>
案例3:使用List和Map集合
<% List<String> list =new ArrayList<String>(); list.add("aa"); list.add("bb"); list.add("cc"); pageContext.setAttribute("list", list); Map<String,String> map =new HashMap<String,String>(); map.put("aa", "11"); map.put("bb", "22"); map.put("cc", "33"); pageContext.setAttribute("map", map); %> <h1>1.以数组的下标形式获取list值</h1> ${list[0]}<br> ${list[1]}<br> ${list[2]}<br> <h1>2.以提供的方法get(index)</h1> ${list.get(0)} <h1>3.使用El表达式获取map中的值(以key的形式获取)</h1> ${map.aa}<br> ${map.bb}<br> ${map.cc}<br> <h1>4.使用El表达式获取map中的值</h1> ${map['aa']}
使用EL表达式执行运算、empty关键字
执行运算
算术运算
${10+20 }<br/>
${10-20 }<br/>
${10*20 }<br/>
${3%5}<br/>
关系运算
${10==9 }<br/>
${"abc"=="abc" }<br/>
${s1==s2 } equals<br/>
${s1 eq s2 }<br/>
${10>20}<br/>
${10 gt 20}<br/>
${5 < 10}<br/>
${5 lt 10}<br/>
${5 != 10}<br/>
${5 ne 10}<br/>
三目运算
${score>80?"优秀":"一般" }<br/>
${flag==0?"没有激活":flag==1?"激活":"删除" }<br/>
${sex==0?"男":"女" }<br/>
逻辑运算
${true && false}<br/>
${true || false}<br/>
${!true}<br/>
${true and false}<br/>
${true or false}<br/>
${not true}<br/>
<% String s1=""; pageContext.setAttribute("s1", s1); String s2=null; pageContext.setAttribute("s2", s2); String s3="122222"; pageContext.setAttribute("s3", s3); List list1 =new ArrayList(); pageContext.setAttribute("list1", list1); %> <!-- empty关键只要内容是空true --> ${empty s1}<br> ${empty s2}<br> ${empty s3}<br> ${empty list1}<br>
隐式对象(11个)
JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP servlet和表达式中可用:
**pageContext:**页面上下文,可以获取jsp中其他八个内置对象
pageScope、requestScope、sessionScope、applicationScope表示四个域对象中集合
param 表示request.getParameter(“username”); ${param.username}
paramvalues 表示request.getPrameterValues(“hobby”); ${paramValues.hobby}
header 表示 request.getHeader(“accept”); ${header.accept};
headerValues 表示 request.getHeaderValues(“accept-encoding”); ${headerValues[“accept-encoding”][0]}
cookie 表示 request.getCookies(); ${cookie.JSESSIONID}
initParam 表示 ServletContext(application)初始化参数
JSTL
什么是JSTL
JSTL:全称Java Server Pages Standard Tag Library,JSP标准标签库,代替jsp页面的脚本,实现逻辑控制。
JSTL的作用
实现JSP页面中逻辑处理。如判断, 循环等;
下载JSTL库,https://archive.apache.org/dist/tomcat/taglibs/
把jstl.jar、standard.jar放入WEB-INF/lib目录下
使用JSTL
必须在JSP页面添加tablib指令库
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">
常用标签介绍
通用标签set,out,remove
<!-- 基础标签:声明变量,输出变量,移除变量,变量默认值 -->
<h3>基础标签:声明变量,输出变量,移除变量,变量默认值</h3>
<!--1.声明变量k var:是变量名 value:变量的值(必须是EL表达式)-->
<c:set var="k" value="${1+1}"></c:set>
<!--2.输出变量k value:使用EL表示表示变量-->
移除前输出的内容:<c:out value="${k}"></c:out><br>
<!--3.移除指定变量 -->
<c:remove var="k"/>
移除后输出的内容:<c:out value="${k}"></c:out><br>
<!--4.给指定变量赋默认值 -->
默认值:<c:out value="${m}" default="123456"></c:out>
条件标签if,choose
<c:if>
<!-- 条件标签:if choose -->
<!-- test属性中是条件,但是条件需要使用EL表达式来书写 -->
<h3>条件标签:if</h3>
<c:if test="${8>2 }">
8大于2是成立的
</c:if>
<c:if test="${8<2 }">
8小于2是成立的
</c:if>
<br>
<%-- 如果只是一个基本数据类型直接书写不需要${} --%>
<c:set var="m" value="5"></c:set>
<c:if test="${m>3}">
5大于3是成立的
</c:if>
<c:choose>
<h3>条件标签:choose(等价于java中switch)</h3>
<%-- 测试成绩等级 >90 优秀 >80 良好 >70 中等 >60及格--%>
<c:set var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=90 }">优秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
迭代标签foreach
for基础遍历
<!-- 遍历for:输出1到10 的值 -->
<!--var: 变量,把遍历的每一个值都存储在变量中进行输出
begin:开始 如果是变量使用EL表达式表示
end:结束 如果是变量使用EL表达式表示
step:间隔的长度
for( int i=0;i<10;i++){
System.out.println(i);
}
-->
示例代码:
<c:forEach var="i" begin="1" end="10" step="2">
${i}<br>
</c:forEach>
foreach遍历
<h3>测试list集合遍历获取学生列表</h3>
<table border="1" width="80%" bordercolor="red" cellspacing="0"
align="center">
<tr>
<th>学号</th>
<th>姓名</th>
<th>成绩</th>
<th>班级</th>
<th>是否是第一个</th>
<th>是否是最后一个</th>
<th>计数count</th>
<th>索引index</th>
</tr>
<!-- varStatus:变量状态:遍历出的每一项内容的状态:
isFirst() first
isLast() last
getCount() count 计数 重要的
getIndex() index
-->
<!-- var :遍历出的每一项使用变量先存储
items:集合(使用El表达式)
-->
<c:forEach var="stu" items="${students}" varStatus="vs">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.score}</td>
<td>${stu.classes}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${vs.count}</td>
<td>${vs.index}</td>
</tr>
</c:forEach>
</table>
url标签
<c:url var="" value="">
举例:
<c:url var="loc" value="/stu.jsp">
<c:param name="username" value="张三"></c:param>
</c:url>
<a href="${loc}">学生列表</a>