JavaWeb——JSP表达式语⾔(EL)
1、JSP表达式语⾔(EL)⽤于在jsp从访问存储在JavaBean中的数据,例如
User ID: ${user.userId}<br />
这⾥的${user.userId}就是JSP EL表达式,效果就是:
User ID: 19358
19358是userId的数据
2、语法
⽴即执⾏
⽴即执⾏EL表达式将在页⾯渲染的时候,被JSP引擎解析和执⾏。这就意味着EL表达式将在JSP引擎中发现它,并在继续执⾏其他页⾯部分之前执⾏它,就类似c语⾔中的宏那样,下⾯的例⼦中EL表达式将会⽴即执⾏,其中expr是⼀个EL表达式
${expr}
美元符号和两个花括号定义了EL表达式的边界,在括号中的所有的内容都会作为EL表达式执⾏。所以如果我们需要使⽤美元符号就需要进⾏转义
延迟执⾏
延迟执⾏EL表达式是统⼀表达式的⼀部分主要⽤于满⾜JavaServer Faces的需要。下⾯的例⼦将是⼀个延迟执⾏的EL表达式
#{expr}
3、添加EL表达式
EL表达式可以直接⽤在JSP的任何位置,除了少数特殊情况。⾸先不能⽤在任何指令中,因为编译JSP时,指令将会被执⾏,但是EL表达式是在渲染JSP时执⾏,所以这⾥的EL表达式是⽆法正常⼯作的。
另外,JSP声明<%!%>、脚本<%%>或者表达式<%=%>中的EL表达式也是⽆效的。
除此之外,EL表达式可以添加在任意的位置
简单⽂本中
User ID: ${expr}
标准的HTML标签中
<input type="text" name="something" value="${expr}"/>
JSP标签中
<c:url value ="/something/${expr}/${expr}"/>
4、基础操作符
操作符描述
.访问⼀个Bean属性或者⼀个映射条⽬
[]访问⼀个数组或者链表的元素
( )组织⼀个⼦表达式以改变优先级
+加
-
减或负
*乘
/ or div除
% or mod取模
== or eq是否相等
!= or ne是否不等
< or lt是否⼩于
> or gt是否⼤于
<= or le是否⼩于等于
>= or ge是否⼤于等于
&& or and与
&& or and与
|| or or或
! or not取反
empty是否空值
5、对象属性和⽅法
EL表达式通过.进⾏JavaBean中属性的简化语法,假设现在有⼀个类user,有名为userId的类
${user.userId}
如果使⽤这个表达式来访问userId字段,这是⾏不通的因为这⾥的.实际寻的是userId属性⽽⾮字段,也就是说将调⽤的是userId()类似的JavaBean标准访问⽅法。
如果没有这样的标准⽅法,应该这样进⾏访问
${user["userId"]}
6、EL函数
JSP EL允许您在表达式中使⽤函数。这些函数必须被定义在⾃定义标签库中。函数的使⽤语法如下:
${ns:func(param1, param2, ...)}
其中ns是命名空间,func是函数名,param1、是参数
⽐如,有函数fn:length,在JSTL库中定义,可以像下⾯这样来获取⼀个字符串的长度:
${fn:length("Get my length")}
7、lambda表达式
lambda表达式就是⼀个匿名函数,EL lambda就是⽤箭头操作符->分割左侧的表达式参数和右侧的表达式,以下是两个有效的EL lambda表达式
${(a -> a + 5) (4)}
${((a,b) -> a + b) (3, 5)}
还可以这样使⽤:
${v = (a , b) -> a +b; v(3, 5)}
8、集合
map
现假设有⼀个map拥有键username和ueseId,那么可以使⽤中括号访问这两个键的键值
${map["username"]}
${map["userId"]}
也可以使⽤.
${map.username}
${map.userId}
list
假设有⼀个list,它包含了三个值"green"、"red"、"blue",按照0到2d的顺序⼀存储,那么可以只有访问
${list[0]}
${list[1]}
${list[2]}
不能使⽤.
9、试⽤
先新建⼀个类User,每个字段都将拥有相应的set和get⽅法
public class User {
private long userId;
private String username;
private String firstname;
private String lastname;
private Map<String,Boolean> permission = new Hashtable<>();
public long getUserId() {
return userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
el表达式获取map的值}
public Map<String, Boolean> getPermission() {
return permission;
}
public void setPermission(Map<String, Boolean> permission) {
this.permission = permission;
}
}
然后是Servlet:
@WebServlet(
name = "ELServlet",
urlPatterns = "/EL"
)
public class ELServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { User user = new User();
user.setUserId(19358L);
user.setUsername("Username");
user.setFirstname("Firstname");
user.setLastname("Lastname");
Hashtable<String,Boolean> permissions = new Hashtable<>();
permissions.put("user", true);
permissions.put("moderator", true);
permissions.put("admin", false);
user.setPermission(permissions);
req.setAttribute("user",user);
.forward(req,resp);
}
}
最后是JSP
<%@ taglib prefix="fn" uri="java.sun/jsp/jstl/functions" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>User</title>
</head>
<body>
User ID: ${user.userId}<br />
Username: ${user.username}(${user.username.length()} characters)<br/>
Full Name: ${user.lastname += "," += user.firstname}
<br/><br/>
<b>Permissons (${fn:length(user.permission)})</b><br/>
User: ${user.permission["user"]}<br/>
Moderator: ${user.permission["moderator"]}<br/>
Admin: ${user.permission["admin"]}<br/>
</body>
</html>
需要注意的地⽅有user.username.length()这⾥相等于使⽤的是String的length⽅法,user.lastname += "," += user.firstname这⾥也是简单的使⽤ += 进⾏字符串的拼接fn:length(user.permission),这⾥调⽤fn:length函数输出permission的长度。
结果:
10、使⽤隐含的EL变量
JSP EL⽀持下表列出的隐含对象:
隐含对象描述
pageScope page 作⽤域
requestScope request 作⽤域
sessionScope session 作⽤域
applicationScope application 作⽤域
param Request 对象的参数,字符串
paramValues Request对象的参数,字符串集合
header HTTP 信息头,字符串
headerValues HTTP 信息头,字符串集合
initParam上下⽂初始化参数
cookie Cookie值
pageContext当前页⾯的pageContext
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论