EL表达式

  1. EL(Expression Language表达式语言)

  2. 作用:替换和简化jsp页面中java代码的编写

  3. 语法:

    1
    ${表达式}
  4. 注意:

    • jsp默认支持el表达式,如果要忽略EL表达式

      1. 设置JSP中page指令中isELIgnored=”true”忽略当前JSP页面中所有的EL表达式

      2. ${表达式} 忽略当前这个EL表达式

  5. 使用:

    1. 运算

      • 运算符

        1. 算术运算符:+ - * / %

        2. 比较运算符:< > <= >= == !=

        3. 逻辑运算符: && || !

        4. 空运算符 empty

          • 功能:用于判断字符串,集合,数组对象是否为null并且长度是否为0

          • ${empty list}

          • ${not empty str}:表示判断字符串,集合,数组对象是否不为null或者长度>0

    2. 获取值

运算符

算术:

1
2
3
4
5
${3+4}</body><br>

${3/4}<br> <%--${3 div 4}--%>

${3%4}<br> <%--${3 mod 4}--%>

avatar

比较:(逻辑类似不演示了)

1
${3<4}<br>

返回true

empty运算符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
empty运算符

<%
String str1="abc";
String str2=null;
String str3="";
request.setAttribute("str1",str1);
request.setAttribute("str2",str2);
request.setAttribute("str3",str3);
%>

${empty str1}<br>
${empty str2}<br>
${empty str3}<br>

可以判断是否为null或长度是否为零
avatar

如果要取反操作,那就是not empty

获取值

  1. EL表达式只能从域对象中获取值

  2. 语法:

    1. ${域名称.键名}:从指定域中获取指定键的值

      • 域名称:

        1. pageScope —> pageContext

        2. requestScope —> request

        3. sessionScope —> session

        4. applicationScope —> application(ServletContext)

      • 举例:在request域中存储了name-张三

      • 获取:${requestScope.name}

    2. ${键名}:表示依次从最小的域中查找是否有该键对应的值,直到找到为止

1
2
3
4
5
6
7
8
9
10
11
12
<%
//在域中存储数据
request.setAttribute("name","zhangsan");
session.setAttribute("age","23");
%>


获取值

${requestScope.name}<br>
${sessionScope.age}<br>
${sessionScope.name}

如果没有找到对应的值,则会返回空字符串而不是null,这样就不会打乱布局
avatar

获取对象值

  • 对象:${域名称.键名.属性名}
    • 本质上调用对象的getter方法

User类:

1
2
3
private String name;
private int age;
private Date birthday;

代码太多,就正常的生成getter和setter就行,这里只列成员变量了

User对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%
User user=new User();
user.setName("张三");
user.setAge(23);
user.setBirthday(new Date());

request.setAttribute("u",user);
%>

el获取对象中的值
${requestScope.u}<br>

<%--
通过的是对象的属性来获取
setter或getter方法,去掉setget,在将剩余部分,首字母变小写。
setName --> Name --> name
--%>

${requestScope.u.name}<br>
${requestScope.u.age}<br>
${requestScope.u.birthday}<br>

运行结果
avatar

保证键名称不相同,可以省略掉requestScope

如果想要只输出日期中的年或者月之类的,直接birthday.year

1
${u.birthday.year}<br>

这样就会输出年份了,经典套娃

如果想要中文格式的,只需要在类中声明一个方法,格式化对象类,再调用就OK了

1
2
3
4
5
6
7
8
9
10
11
public String getBitStr(){

if(birthday!=null){
//1.格式化日期对象
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//2.返回字符串
return sdf.format(birthday);
}else{
return " ";
}
}

调用:
1
${u.bitStr}<br>

运行结果
avatar

获取List值

  • List集合:${域名称.键名[索引]}

设置List:

1
2
3
List list=new ArrayList<>();
list.add("aaa");
list.add("bbb");

获取List:

1
2
3
4
5
el获取List
${list}<br>
${list[0]}<br>
${list[1]}<br>
${list[5]}<br>

avatar

这就是获取List的值,很简单,当下标越界时并不会报错或者输出null,而是输出空字符串,同样这样的优化不会打乱布局

如果添加的是对象

1
2
3
4
List list=new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add(user);

获取也很简单
1
2
3
4
5
6
el获取List
${list}<br>
${list[0]}<br>
${list[1]}<br>
${list[5]}<br>
${list[2].name}<br>

avatar

获取List值

  • Map集合:

    • ${域名称.键名.key名称}

    • ${域名称.键名[“key名称”]}

设置Map:

1
2
3
4
Map map=new HashMap();
map.put("sname","李四");
map.put("gender","男");
request.setAttribute("map",map);

获取Map:
1
2
3
4
<h3>el获取Map值</h3>
${map}<br>
${map.sname}<br>
${map["gender"]}<br>

avatar

很简单

添加对象方法也一样,套娃就完了

隐式对象

  • 隐式对象有11个,但是现在只需要掌握pageContext

  • pageContext:

    • 获取JSP其他八个内置对象
      • ${pageContext.request.contextPath}:动态获取虚拟目录
1
2
3
${pageContext.request}<br>
<h4>动态获取虚拟目录</h4>
${pageContext.request.contextPath}

avatar

这个的用途就是在表单action中,把虚拟目录变为动态改变的,而不是写死的静态的