一、原理
在得到页面请求的时候,Tomcat服务器会把JSP文件转换成.java文件存放在work\Catalina目录下,然后编译成.class文件执行。当读取.jsp文件发现“${”开头的样式就表明是EL表达式,Tomcat会将其进行转换,如果没有“}”反括号,则抛出异常。
二、使用范围
EL表达式只有在JSP页面才可以正确被执行。如果在JSP中引用一个外部文件(如:js),在外部文件中使用EL表达式是无法被服务器识别的,因为服务器不会去加载他们的内容,没有对其编译。而在jsp文件的任何地方都可以使用EL(如标签里面、JavaScript里面、字符串里、双引号里等)。
三、使用设置
如果所有页面都要使用EL,则首先查看web.xml,如果在<jsp-config/>里有个<el-ignored>false</el-ignored>标签就可以。如果部分页面需要EL,则在相应的jsp添加<%@page isELIgnored=”false”%>
四、格式
EL可以使用${student.name}或${student[“name”]}两种方式,如果属性名带有特殊字元(”.” 、“,” 、“-“)等非字母或数字者,就一定要用[]。
五、隐含物件(Implicit Objects)
共11个,除了pageContext是JavaBean物件,对应于javax.servlet.jsp.PageContext型态外,其余均对应java.util.Map型态。
1+4个域对象(方便获得存在于域对象中的属性,并获得域对象的引用)。
(1)pageContext
JSP页的上下文,对应于JSP页面中的pageContext对象,可以用于访问JSP隐式对象(如request,response,session,servletContext,out等)。
<html>
<body>
<% session.setAttribute("session_value","1234567890"); %>
請求方法(get/post): ${pageContext.request.method} <br>
請求參數: ${pageContext.request.queryString}<br>
使用者IP: ${pageContext.request.remoteAddr}<br>
使用者國別: ${pageContext.response.locale.country}<br>
session名稱: ${pageContext.session.valueNames[0]}
请求的URL(不包括参数):${pageContext.request.requestURL}
服务的webApplication名称:${pageContext.request.contextPath}
用户名称:${pageContext.request.remoteUser}
Session是否为new:${pageContext.session.new}
</body>
</html>
(2)pageScope:代表page域中用于保存属性的map对象
(3)requestScope:代表request域中用于保存属性的map对象
(4)sessionScope:代表session域中用于保存属性的map对象
(5)applicationScope:代表application域中用于保存属性的map对象
<html>
<body>
<%
pageContext.setAttribute("testing","PageContext");
request.setAttribute("testing","Request");
session.setAttribute("testing","Session");
application.setAttribute("testing","Application");
%>
pageScope : ${pageScope.testing}<br>
requestScope : ${requestScope.testing}<br>
sessionScope : ${sessionScope.testing}<br>
applicationScope : ${applicationScope.testing}
</body>
</html>
【4个关于请求的对象(获取请求参数)】
(6)param:表示一个保存了所有请求参数的Map对象
<html>
<body>
<form action="">
姓名:<select name="userName" size="1">
<option value="ZS">张三</option>
<option value="LS">李四</option>
</select><br>
年龄:<input type="text" name="userAge"><br>
<input type="submit" value="Submit">
<br>
你輸入的資料為:<br>
${param.userName} 今年 ${param.userAge} 岁
</form>
</body>
</html>
(7)paramValues:同上,它对于某个请求参数,资料不只一个时,返回的是一个字符串数组
<html>
<body>
<form action="">
参与人员:
<input type="checkbox" name="people" value="ZS"/>张三
<input type="checkbox" name="people" value="LS"/>李四
<input type="checkbox" name="people" value="WW"/>王五
<br>
<input type="submit" value="Submit">
<br>
你選的產品有:<br>
${paramValues.people[0]} ${paramValues.people[1]} ${paramValues.people[2]}
</form>
</body>
</html>
(8)header:表示一个保存了所有http请求头字段的Map对象
<html>
<body>
使用者的语言:${header["accept-language"]}
</body>
</html>
(9)headerValues:同上,返回字符串数组。当同一标头名称拥有不同的值时,则需使用这个
<html>
<body>
<fmt:requestEncoding value="Big5"/>
Connection : ${headerValues["connection"][0]}<br>
</body>
</html>
(10)cookie:表示一个保存了所有cookie的Map对象,将cookie名称映射到单个cookie对象
<html>
<body>
<fmt:requestEncoding value="Big5"/>
名字:${cookie["username"].value}
<%
Cookie cookie = new Cookie ("username","Ted"); ---將Ted這名字存到cookie中,名稱為username
cookie.setMaxAge(30); ---生命週期30秒
response.addCookie(cookie);
%>
</body>
</html>
(11)initParam:表示一个保存了所有web应用初始化参数的map对象
- 我们可以在web.xml文件中设定系统的预设参数:
<context-param>
<param-name>mynameis</param-name>
<param-value>Ted</param-value>
</context-param>
<context-param>
<param-name>myoffice</param-name>
<param-value>Taiwan</param-value>
</context-param>
- 在JSP中使用:
<html>
<body>
<fmt:requestEncoding value="Big5"/>
名字 : ${initParam.mynameis}<br>
辦公室在 : ${initParam.myoffice}
</body>
</html>
六、EL运算
(1) 算数运算:+、-、*、/(or div)、%(or mod)
(2) 逻辑运算:and、or、not
(3) 关系运算:Less-than(<or lt)、Greater-than(>or gt)、Less-than-or-equal(<=or le)、Greater-than-or-equal(>=or ge)、Equal(
= = or eq)、NotEqual(!= or ne)