EL 表达式语言简介
EL 是从 JavaScript 脚本语言得到启发的一种表达式语言,它借鉴了 JavaScript 多类型转换无关性的特点。在使用 EL 从 scope 中得到参数时可以自动转换类型,因此对于类型的限制更加宽松。 Web 服务器对于 request 请求参数通常会以 String 类型来发送,在得到时使用的 Java 语言脚本就应该是 request.getParameter(“XXX”) ,这样的话,对于实际应用还必须进行强制类型转换。而 EL 就将用户从这种类型转换的繁琐工作脱离出来,允许用户直接使用 EL 表达式取得的值,而不用关心它是什么类型。
并且使用EL表达式非常简便,不需要进入任何jar包,只要jsp/servlet容器实现了J2EE1.4/sevlet2.4/JSP2.0规范就可以。
EL表达式-牛刀小试
在后台servlet中给request设值:
//普通字符串
request.setAttribute("hello", "Hello World");
在JSP页面取值:
①普通jsp脚本方式取值
<%=request.getAttribute("hello") %>
②使用EL表达式取值
${hello }
整体jsp代码:
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<h1>测试EL表达式</h1>
<hr>
<li>普通字符串</li><br>
hello(jsp脚本): <%=request.getAttribute("hello") %> <br>
hello(el表达式,语法:$和{}): ${hello } <br>
</body>
</html>
EL 表达式必须以“ ${XXX} ”来表示,其中“ XXX ”部分就是具体表达式内容。
EL表达式完整示例:
Servlet代码:
/**
* 测试el表达式
* @author Administrator
*
*/
public class JstlElServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//普通字符串
request.setAttribute("hello", "Hello World");
//实体的存取
Group group = new Group();
group.setName("动力节点603班");
User user = new User();
user.setUsername("张三");
user.setAge(23);
user.setGroup(group);
request.setAttribute("user", user);
//map测试
Map map = new HashMap();
map.put("k1", "v1");
map.put("k2", "v2");
request.setAttribute("map", map);
//字符串数组
String[] strArray = new String[]{"a", "b", "c"};
request.setAttribute("str_array", strArray);
//对象数组
User[] users = new User[10];
for (int i=0; i<users.length; i++) {
users[i] = new User();
users[i].setUsername("张三_" + i);
}
request.setAttribute("users", users);
//list集合
List userList = new ArrayList();
for (int i=0; i<10; i++) {
User usr = new User();
usr.setUsername("李四_" + i);
userList.add(usr);
}
request.setAttribute("userList", userList);
//empty
request.setAttribute("v2", "");
request.setAttribute("v3", new ArrayList());
request.setAttribute("v4", "12345");
request.setAttribute("v5", null);
request.getRequestDispatcher("/jstl_el.jsp").forward(request, response);
}
}
JSP代码:
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
<h1>测试EL表达式</h1>
<hr>
<li>普通字符串</li><br>
hello(jsp脚本):<%=request.getAttribute("hello") %><br>
hello(el表达式,语法:$和{}):${hello }<br>
hello(el表达式,el的内置对象pageScope,requestScope,sessionScope,applicationScope)<br>
如果不指定范围,它的搜索顺序为pageScope~applicationScope):${requestScope.hello }<br>
hello(el表达式,指定范围从session取得):${sessionScope.hello }<br>
<p>
<li>结构,采用存取器.进行导航</li><br>
姓名:${user.username }<br>
年龄:${user.age }<br>
所属组:${user.group.name }<br>
<p>
<li>map</li><br>
map.k1:${map.k1 }<br>
map.k2:${map.k2 }<br>
<p>
<li>字符串数组,采用[]下标</li><br>
strArray[1]:${str_array[1] }<br>
<p>
<li>对象数组,采用[]下标</li><br>
users[5].username:${users[5].username }<br>
<p>
<li>list,采用[]下标</li><br>
userList[6].username:${userList[6].username }<br>
<p>
<li>el表达式对运算符的支持</li><br>
1+1=${1+1 }<br>
10/5=${10/5 }<br>
10 div 5=${10 div 5 }<br>
10 % 3=${10 % 3 }<br>
10 mod 3 = ${ 10 mod 3 }<br>
<p>
<li>测试empty,是否为空,如果为空返回true,不为空返回false</li><br>
v1:${empty v1}<br>
v2:${empty v2}<br>
v3:${empty v3}<br>
v4:${empty v4}<br>
v5:${empty v5}<br>
</body>
</html>
页面显示:
EL 表达式的默认变量
一个 EL 表达式包含变量和操作符两个内容。任何存在于 JSP 作用范围的 JavaBean 都可以被转化成 EL 表达式来使用,它所包含的默认变量如下:
pageScope 、 requestScope 、 sessionScope 、 applicationScope
如果不指定范围,el默认的搜索顺序为pageScope—>applicationScope。如果知道变量在哪个对象里,则可以直接从对象中取得跳过搜索的过程。比如上面的例子,取hello字符串还可以写: ${requestScope.hello }
通过这些事例,可以看到我们完全无需管理变量的类型转换,在表达式内部都已经处理了。有了 EL 表达式,在 JSP 页面的编程变得更灵活,也更容易,简化JSP页面的功能。