EL表达式和JSTL
1. 引入EL表达式以及JSTL
由于在jsp页面应该只做展示页面的事情,就不该大量的编写java代码,但是有时候又不得不在其中编写java代码,使用EL表达式和JSTL可以替换和简化java代码的编写
3. EL表达式(Expression Language)
-
语法:${表达式}
-
注意:jsp是默认支持EL表达式的,如果要忽略EL表达式有两种方法:
- 在jsp的page指令中设置
isELIgnored=true
,表示忽略当前jsp页面所有的EL表达式 - 在要忽略的表达式的前面加反斜杠
${表达式}
,表示忽略这个表达式
- 在jsp的page指令中设置
-
使用:
-
运算:
- 算数运算符:+、-、*、/(div)、%(mod)
- 比较运算符:==、>、<、>=、 <=、!=
- 逻辑运算符:&&(and)、||(or)、!(not)
- 空运算符:empty
- 用于判断字符串、集合、数组是否为null、长度是否为0
- ${empty list}
- ${not empty list}:表示判断list是否不为null,长度不为0
-
获取值:
-
EL表达式只能从域对象中获取值
-
语法1:${域名称.键名称}
- 域名称有: 域从上到下,范围依次扩大
- pageScope:从pageContext获取
- requestScope:从request域获取
- sessionScope:从session域获取
- applicationScope:从application域获取
<%--在request域中存储了name=didi--%> <% request.setAttribute("name", "didi"); %> <%--获取request域中的值--%> ${requestScope.name} ${requestScope.hah}
- 域名称有: 域从上到下,范围依次扩大
-
语法2:省略域名称,直接写键名称,表示从最小的域开始查找匹配的键
-
-
当获取的值不值字符串,而是一个其他的对象,比如自定义的User对象,值可以通过对象的属性获取(属性是根据setter、getter转变而来)
User类:
public class User { private String name; private int age; private Date birthday; }
获取存储到request域的user对象的属性:
<% User user = new User(); user.setName("Andy"); user.setAge(18); user.setBirthday(new Date()); request.setAttribute("u", user); %> ${requestScope.u.name}<br> ${requestScope.u.age}<br> ${requestScope.u.birthday}<br>
如果要获取一个好看的日期,自定义一个格式,那么就可以定义一个getBirthStr,使得该对象有birthStr这个属性,便可以用来获取自定义的日期格式:
/** * 逻辑视图,是为了展示好看的数据的 * @return */ public String getBirthStr() { if(this.birthday != null) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); return sdf.format(birthday); } else { return ""; } }
-
获取List集合的值:${域名称.键名称[索引]}
List<String> list = new ArrayList<>(); list.add("aaa"); list.add("bbb"); request.setAttribute("list", list); ${list}<br> // [aaa, bbb] ${list[0]}<br> // aaa
-
获取Map集合的值:${域名称.键名称.key名称}
Map map = new HashMap(); map.put("jack", "男"); map.put("rose","女"); request.setAttribute("people", map); ${requestScope.people.jack}<br>// 男
-
-
隐式对象
- EL表达式有11个隐式对象
- pageContext:获取其他八个jsp内置对象
- 在jsp页面动态获取虚拟目录:
${pageContext.request.contextPath}
- 在jsp页面动态获取虚拟目录: