本篇博客知识点~
1.EL表达式简介
2.EL表达式实例代码演示
EL表达式简介
- EL 全名为Expression Language。EL主要作用:
- 获取数据
- 执行运算
- 获取web开发常用对象
- 调用Java方法
EL表达式的本质是JAVA代码~
获取数据(1)
EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的java对象中获取数据。
EL表达式也可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据,
使用EL表达式获取数据语法:“${标识符}”
示例代码:
<%@ page language="java" import="java.util.*, cn.hncu.domain.User" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<h2>EL表达式作用1: 获取数据</h2>
<h3>EL读取容器中的属性值,注意:只有放在容器的数据才能读取出来,且标识符是属性名(并非对象名)</h3>
<%
pageContext.setAttribute("name", "pageJack");
//pageContext.setAttribute("name", "requestJack", PageContext.REQUEST_SCOPE);
//session.setAttribute("name", "sessionJack");
//application.setAttribute("name", "appJack");
%>
${name}<!-- 此处 name 是属性名 -->
<!-- EL表达式内部调用 pageContext.findAttribute("name")
输出时等价于: pageContext.findAttribute("name")?null:"",pageContext.findAttribute("name") -->
<br/>
${aaa} <!-- 由于4个容器中都不存在该aaa属性,因此输出空串 -->
<br/>
<%
User user = new User();
user.setName("Tom");
user.setAge(22);
user.setPwd("1234");
pageContext.setAttribute("u", user); //只有放在容器中,才能用EL表达式读取出来。
%>
${u} <br/> <!-- 如果该属性的值是一个对象,则自动会调用toString() -->
${u.name},${u.age},${u.pwd} <br/> <!--内部是根据属性名推出对应getter方法进行调用 -->
<%
Map<String,Object> map = new HashMap<String,Object>();
map.put("nm", "城院");
map.put("1","15");
map.put("user",user);
request.setAttribute("m", map);
%>
${m}<br/> <!-- 输出整个map中的内容:{age=15, user=User [name=Tom, age=22, pwd=1234], nm=城院} -->
<!-- 读取map中属性的两种方式,注意方式2中的引号不能省 -->
${m.nm}, ${m['nm']} <br/>
${m.user.name}, ${m['user'].name}, ${m.user['name']}
<br/>
<%
List<Object> list = new ArrayList<Object>();
list.add("aaa");
list.add("张三");
list.add("城院");
list.add(user);
session.setAttribute("list", list);
%>
${list} <br/> <!-- 输出整个list中的内容: [aaa, 张三, 城院, User [name=Tom, age=22, pwd=1234]] -->
<%-- 读取list中属性的方式: ${标识名[序号]} --%>
${list[1]}<br/>
<%
map.put("mlist", list);
request.setAttribute("m", map);
%>
${m.mlist[3].name} <br/>
</body>
</html>
执行运算
<%@ page language="java" import="java.util.*, cn.hncu.domain.User" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表达式</title>
<%
User user = new User();
user.setName("Tom");
user.setAge(22);
user.setPwd("1234");
pageContext.setAttribute("user", user);
%>
</head>
<body>
<h2>EL表达式作用2: 执行运算</h2>
1.可以使用算术运算符: + - * / % 等 <br/>
${user.age+10+234%10} <br/> <br/>
2.可以使用比较运算符: == != < > <= >= <br/>
${10>34}, ${user.name=='Tom'} <br/>
3.逻辑运算符: && || ! <br/>
${user.age>20 && user.name=='Tom' } <br/>
4.条件运行符即?号表达式 <br/>
${user.age>30 ? "old" : "young" } <br/>
5.empty运算符(如果某个属性不存在或返回值为null,该运算符都是返回true。否则返回false) <br/>
<%
request.setAttribute("u", null);
%>
${empty user}, ${empty abc }, ${empty u} <br/>
${!empty user} <br/>
</body>
</html>
获得web开发常用对象
<%@ page language="java" import="java.util.*, cn.hncu.domain.User" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表达式</title>
<%
User user = new User();
user.setName("Tom");
user.setAge(22);
user.setPwd("1234");
//pageContext.setAttribute("user", user);
//request.setAttribute("user", user);
session.setAttribute("user", user);
//application.setAttribute("user", user);
%>
</head>
<body>
<h2>EL表达式作用3: 获得web开发常用对象(9个隐含对象)</h2>
1) 4个容器隐含对象: pageScope,requestScope,sessionScope,applicationScope <br/>
通过指定的容器去获取,效率更高!<br/>
1:${pageScope.user},
2:${requestScope.user},
3:${sessionScope.user},
4:${applicationScope.user} <br/>
2) 1个pageContext隐含对象<br/>
<a href="<%=request.getContextPath()%>/index.jsp">访问主页1</a> <br/>
<a href="${pageContext.request.contextPath}/index.jsp">访问主页2</a> <br/>
3) 5个http请求头相关数据的隐含对象:header,cookie<br/>
${header} <!-- 把请求头中的所有信息封装成map,整体显示出来 --><br/>
${header.host} <!-- 只输出请求头中host-key的value --> <br/>
${header.cookie} <!-- 只输出请求头中cookie-key的value --> <br/>
<%-- ${header.cookie.JSESSIONID} --%>
<!-- 如果想输出JSESSIONID,不能用header.cookie.JSESSIONID,
因为后者整个字符串中的一部分,并不是属性(有对应getter方法)。
应该用一个独立的cookie隐含对象 -->
<br/>
${cookie.JSESSIONID.value } <br/>
<!-- 通过param隐含对象获取 页面提交过来的参数, 演示如下面的超链接 -->
<a href="http://localhost:8080/elWeb/jsps/demo3.jsp?name=Jack&age=21&addr=abc"> 演示提交参数</a><br/>
${param} <!-- 获取页面提交的参数 --> <br/>
${param.age} <!-- 获取页面提交的某一个参数 --> <br/>
<h3>paramValues和headerValues一般只在某参数有多个值时才使用。如果仅仅是单个值,用前面的隐含对象header或param更简单</h3>
<!-- 通过paramValues隐含对象获取页面提交过来的所有参数值,每个值以String[]的方式输出,因为有的参数有多个值如hobby -->
${paramValues} <!-- 输出所有参数值 --> <br/>
${paramValues.addr[0] } <!-- 输出其中某一个参数如addr的第一个值 --> <br/>
<!-- 通过headerValues隐含对象获取请求头中的所有参数值,每个值以String[]的方式输出,因为有的参数有多个值 -->
${headerValues.accept[0] } <!-- 输出其中某一个参数如accept的第一个值 --> <br/>
4) 1个initParam <!-- 读取web.xml中的初始化参数 --> <br/>
</body>
</html>
使用EL调用Java方法
<%@ page language="java" import="java.util.*, cn.hncu.domain.User" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>EL表达式作用4: 使用EL调用Java方法(JSTL中的函数)</title>
</head>
<body>
<h2>EL表达式作用4: 使用EL调用Java方法(JSTL中的函数)</h2>
<%
request.setAttribute("name", "ncu6666");
%>
${fn:contains(name,"hncu") }<br/>
${fn:substring("hello World!",2,7) } <br/>
<c:if test="${ fn:contains(name,'hncu') }">
啦啦啦....
</c:if>
<pre>
有关EL表达式调用JSTL函数的例子见上面几个就行。至于有哪些函数以及每个函数如果调用,请看底层:
用小茶杯打开: Tomcat目录/项目名/WEB-INF/lib/jstl-impl.jar
所有函数的定义都在里面!!! 还可以从该jar包的META-INF中的fn.tld文件(XML格式的文档)中查看说明--我们可以把它当作类似JavaAPI的文档来用
</pre>
</body>
</html>