EL表达式:
Expression Language表达式语言
目的:简化jsp中java代码开发,代替脚本表达式<%=username%> 它不是一种开发语言,是jsp中获取数据的一种规范 格式。
- 获取简单数据:
<%
pageContext.setAttribute("username", "张三");
request.setAttribute("age", "25");
request.setAttribute("username", "李四");//查找优先级低于pageContext
session.setAttribute("phone", "13838383838");
application.setAttribute("address", "北京xxx");
Student student = new Student("s0001","小明","北京yyy");
pageContext.setAttribute("stu",student);
%>
<h2>案例一:简单数据</h2>
<h3>不使用EL输出数据</h3>
<%=pageContext.findAttribute("username")%>
<%=pageContext.findAttribute("age")%>
<%=pageContext.findAttribute("phone")%>
<%=pageContext.findAttribute("address")%>
<%=((Student)pageContext.findAttribute("stu")).getStuName()%>
<h3>使用EL输出数据</h3>
${"username"}<!--原样输出-->
${username}
${age}
${phone}
${address}
<h3>案例二:对象数据</h3>
${stu.stuNo}
${stu.stuName}
${stu.address}
运行结果:
- 使用List和Map集合:
<h3>案例三:使用List和Map集合</h3>
<%
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<>();
map.put("aa", "11");
map.put("bb", "22");
map.put("cc", "33");
map.put("1111", "xxxx");
pageContext.setAttribute("map", map);
%>
<h4>输出List集合</h4>
${list[0]}<br/><%--同${list.get(0)}--%>
${list[1]}<br/>
${list[2]}<br/>
${list[3]}<br/><%--此处不会报错,不会输出--%>
<h4>输出map集合</h4>
${map.aa}<br/>
${map.bb}<br/>
${map.cc}<br/>
<%--${map.1111} 此写法报错--%>
<%--使用[]--%>
${map["aa"]}<%--同${map['aa']}--%>
${map["bb"]}
${map["cc"]}
${map["1111"]}
运行结果:
- 使用EL表达式执行运算、empty关键字:
<h3>算术运算</h3>
${10+5}<br/>
${10-5}<br/>
${10*5}<br/>
${10/5}<br/>
${3%5}<br/>
<%
String s1 = new String("java");
String s2 = new String("java");
pageContext.setAttribute("java1",s1);
pageContext.setAttribute("java2",s2);
%>
<h3>关系运算</h3>
${10 == 5}<br/>
${10 != 5}<br/>
<span>"hello" == "hello":</span>${"hello" == "hello"}<br/>
<span>s1 == s2:</span>${s1 == s2}<br/>
<span>java1 == java2:</span>${java1 == java2}<br/>
${10 > 5}<br/>
${10 < 5}<br/>
${10 >= 5}<br/>
${10 <= 5}<br/>
<h3>其他关系运算符</h3>
${java1 eq java2}<br/>
${100 eq 200}<br/>
${100 gt 99}<br/>
${50 lt 199}<br/>
${200 ge 199}<br/>
${200 le 199}<br/>
${200 ne 199}<br/>
<h3>三目运算</h3>
<%
pageContext.setAttribute("flag",0);
pageContext.setAttribute("sex",0);
%>
${99>90?"优秀":"一般"}
${flag==0?"没有激活":flag==1?"激活":"删除"}
${sex==0?"男":"女"}
运行结果:
<h3>逻辑运算</h3>
${true && false}<br/>
${true || false}<br/>
${!true}<br/>
${true and false}<br/>
${true or false}<br/>
${not true}<br/>
<h3>empty运算</h3>
<% String ss1="";
pageContext.setAttribute("ss1", ss1);
String ss2=null;
pageContext.setAttribute("ss2", ss2);
String ss3="122222";
pageContext.setAttribute("ss3", ss3);
List list1 =new ArrayList();
pageContext.setAttribute("list1", list1);
%>
<!-- empty关键字:只要内容是空即为true -->
${empty ss1}<br>
${empty ss2}<br>
${empty ss3}<br>
${empty list1}<br>
运行结果:
一种常用写法:
${empty user?"<a href=''>请登录</a>":"<a href=''>退出</a>"}<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"}
cookie 表示 request.getCookies(); ${cookie.JSESSIONID}
initParam 表示 ServletContext(application)初始化参数
param 和 paramvalues 只能接收浏览器的 request 请求数据,本页面设置假数据不能读取,但域对象集合 requestScope 可以。
JSTL:
全称Java Server Pages Standard Tag Library,JSP标准标签库,代替jsp页面的脚本,实现逻辑控制。
下载JSTL库:https://archive.apache.org/dist/tomcat/taglibs/
taglibs-standard-impl-1.2.5.jar
taglibs-standard-spec-1.2.5.jar
- 使用JSTL:
必须在JSP页面添加tablib指令库:
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">
- 通用标签set,out,remove:
set、remove:
<!--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>
out:
<%
pageContext.setAttribute("xxx","哈哈啊哈");
%>
<h4>out标签的使用</h4>
<c:out value="${xxx}"></c:out></br>
<%--${"<script type='text/javascript'>while(true){alert('这个是真烦死你,慎用');}</script>"}--%>
<c:out value="<script type='text/javascript'>while(true){alert('烦死你');}</script>"></c:out>
运行结果:
- 条件标签if,choose:
<h3>条件标签</h3>
<c:if test="${10>5}">
真的<br/>
</c:if>
<c:if test="${empty user}">
没有登录<br/>
</c:if>
<c:set value="80" var="score"></c:set>
<c:choose><%--choose(等价于java中switch)--%>
<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:
<h3>迭代标签foreach</h3>
<%
List<String> cities = new ArrayList<>();
cities.add("北京");
cities.add("上海");
cities.add("西安");
cities.add("深圳");
cities.add("杭州");
pageContext.setAttribute("cities",cities);
Map<String,String> map = new HashMap<>();
map.put("cn", "中国");
map.put("usa", "美国");
map.put("uk", "英国");
pageContext.setAttribute("map",map);
%>
<c:forEach var="city" items="${cities}">
${city}
</c:forEach>
<br/>
<c:forEach var="country" items="${map}">
${country.key}...${country.value}
</c:forEach>
<br/>
<!--其他迭代-->
<c:forEach begin="1" end="10" step="1" var="i">
${i}
</c:forEach>
运行结果:
<h3>url标签</h3>
<c:url var="empurl" value="list">
<c:param name="ename" value="张三"></c:param>
<c:param name="job" value="销售"></c:param>
</c:url>
<a href="${empurl}">员工列表</a>
运行结果:
自动转码了(UTF-8)