多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
**[林炳文Evankaka](http://my.csdn.net/?ref=toolbar)原创作品。转载请注明出处[http://blog.csdn.net/evankaka](http://blog.csdn.net/evankaka)   ** # **1、什么是EL**        EL是JSP表达式语言,全称是ExpressionLanguage,使用EL的目的是简化在JSP中访问变量的方式,简单静态HTML与Java代码的耦合。 下面来看看一个例子: ~~~ <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> <% String a=request.getParameter("a"); String b=request.getParameter("b"); out.println("a+b="+(Integer.parseInt(a)+Integer.parseInt(b))); %> </body> </html> ~~~ ![](https://box.kancloud.cn/2016-02-22_56caf9ba9ef1a.jpg) 下面用EL来写: ~~~ <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!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=ISO-8859-1"> <title>Insert title here</title> </head> <body> ${param.a}+${param.b}=${param.a+param.b} </body> </html> ~~~ ![](https://box.kancloud.cn/2016-02-22_56caf9baae5b1.jpg) 代码相对原本少了很多,而且很明了。 # **2、JSP EL 表达式用于以下情形** 静态文本 标准标签和自定义标签 安装支持Servlet2.4/JSP2.0的Container # **3、基本语法格式** ${ EL Expression} 示例: ${ “Helloworld” }  //输出字符串常量 ${ str }  //输出字符串变量str的值 ${ 3 + 2 }  //输出3+2的结果 ${ user.name} //输出user对象的name属性 ${user[“name”] }  //同上 ${ sessionScope[“user”].name } //同上 ${user.name} 访问对象user的getName()方法以得到name成员的值。 ${list[1]} 访问list对象的第二项。 ${map[“key”]} 访问map指定键的值。 再来看个例子 EL的语法很简单,他最大的特点就是使用上很方便 例: ~~~ ${sessionScope.user.sex} ~~~ 所有EL都是以 ${ 为起始、以} 为结尾的。 上述EL范例的意思是:从Session取得用户的性别。如果使用之前JSP代码的写法如下: ~~~ <% User user = (User)session.getAttribute("user"); String sex = user.getSex( ); %> ~~~ 两者相比较之下,可以发现EL的语法比传统JSP代码更为方便、简洁。 EL提供 . 和 [ ] 两种运算符来存取数据,[ ]可以访问集合或者是数组的元素、Bean的属性。下列两者所代表的意思是一样的,但是需要保证要取得对象的那个的属性有相应的setXxx()和getXxx()方法才行。 例: ~~~ ${sessionScope.user.sex} ~~~ 等于 ~~~ ${sessionScope.user["sex"]} ~~~ . 和 [ ] 也可以同时混合使用,如下: ~~~ ${sessionScope.shoppingCart[0].price} ~~~ 返回结果为shoppingCart中第一项物品的价格。 # **4、“.”与”[ ]”的相同点和差别** 都可以访问对象有属性。 差别: 当属性的名字包含有空格,点号等复杂符号时。使用”.”来访问对象有属性将会出现异常 # **5、操作符** 算术操作符(+,-,*,/,%) 逻辑操作符(&&,||,!或and,or,not) XML操作符 lt  < le  <= gt   > ge  >= 比较操作符(>,>=,<,<=,==,!==)—可以自动转换数据类型 空操作符(empty)//当值为null时返回true EL的算术运算符和Java中的运算符的大致相同,优先级也相同。 注意:'+' 运算符不会连接字符串了,他只用于加法运算。 EL关系运算符有以下六个运算符 关系运算符      说明                范例             结果 = = 或 eq   |    等于   |${ 5 = = 5 } 或 ${ 5 eq 5 } | true != 或 ne    |   不等于 |${ 5 != 5 } 或 ${ 5 ne 5 } | false < 或 lt     |   小于    |${ 3 < 5 }或 ${ 3 lt 5 }    | true > 或 gt     |   大于    |${ 3 > 5 }或 ${ 3 gt 5 }    | false <= 或 le    | 小于等于 |${ 3 <= 5 }或 ${ 3 le 5 }   | true >= 或 ge    | 大于等于 |${ 3 >= 5 }或 ${ 3 ge 5 }   | false # **6、集合访问** 数组访问 ${}   //如request.getAttribute(“name”); List访问 Map访问 # 7、隐式对象 JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP scriplet 和表达式中可用: ![](https://box.kancloud.cn/2016-02-22_56caf9babde6d.jpg) ** 此外,还提供几个隐式对象,允许对以下对象进行简易访问:** <table style="FONT-SIZE: 1em; MARGIN-LEFT: 0px; WIDTH: 519px; MARGIN-RIGHT: 0px; BORDER-COLLAPSE: collapse; HEIGHT: 312px" border="1" cellpadding="5" cellspacing="0" width="519"><tbody style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left" align="center"><th class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">术语</span></th><th class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">定义</span></th></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">param</span></p></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将请求参数名称映射到单个字符串参数值(通过调用 ServletRequest.getParameter (String name) 获得)。getParameter (String) 方法返回带有特定名称的参数。表达式 $(param.name) 相当于 request.getParameter (name)。</span></p></td></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">paramValues</span></p></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将请求参数名称映射到一个数值数组(通过调用 ServletRequest.getParameter (String name) 获得)。它与 param 隐式对象非常类似,但它检索一个字符串数组而不是单个值。表达式 ${paramvalues.name) 相当于 request.getParamterValues(name)。</span></p></td></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">header</span></p></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将请求头名称映射到单个字符串头值(通过调用 ServletRequest.getHeader(String name) 获得)。表达式 ${header.name} 相当于 request.getHeader(name)。</span></p></td></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">headerValues</span></p></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将请求头名称映射到一个数值数组(通过调用 ServletRequest.getHeaders(String) 获得)。它与头隐式对象非常类似。表达式 ${headerValues.name} 相当于 request.getHeaderValues(name)。</span></p></td></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">cookie</span></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将 cookie 名称映射到单个 cookie 对象。向服务器发出的客户端请求可以获得一个或多个 cookie。表达式 ${cookie.name.value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使用 ${headerValues.name} 表达式。</span></td></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">initParam</span></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将上下文初始化参数名称映射到单个值(通过调用 ServletContext.getInitparameter(String name) 获得)。</span></td></tr></tbody></table> 除了上述两种类型的隐式对象之外,还有些对象允许访问多种范围的变量,如 Web 上下文、会话、请求、页面: <table style="FONT-SIZE: 1em; MARGIN-LEFT: 0px; WIDTH: 487px; MARGIN-RIGHT: 0px; BORDER-COLLAPSE: collapse; HEIGHT: 224px" border="1" cellpadding="5" cellspacing="0" width="487"><tbody style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left" align="center"><th class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">术语</span></th><th class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">定义</span></th></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">pageScope</span></p></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将页面范围的变量名称映射到其值。例如,EL 表达式可以使用 ${pageScope.objectName} 访问一个 JSP 中页面范围的对象,还可以使用 ${pageScope.objectName.attributeName} 访问对象的属性。</span></p></td></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">requestScope</span></p></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将请求范围的变量名称映射到其值。该对象允许访问请求对象的属性。例如,EL 表达式可以使用 ${requestScope.objectName} 访问一个 JSP 请求范围的对象,还可以使用 ${requestScope.objectName.attributeName} 访问对象的属性。</span></p></td></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">sessionScope</span></p></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将会话范围的变量名称映射到其值。该对象允许访问会话对象的属性。例如:</span></p><p class="bodycopy" style="MARGIN: 0px"><br style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"/><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">$sessionScope.name} <br style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"/></span></p></td></tr><tr style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px; TEXT-ALIGN: left"><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">applicationScope</span></p></td><td class="bodycopy" style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px"><p class="bodycopy" style="MARGIN: 0px"><span style="MARGIN-LEFT: 0px; MARGIN-RIGHT: 0px">将应用程序范围的变量名称映射到其值。该隐式对象允许访问应用程序范围的对象</span></p></td></tr></tbody></table> **特别说明:** **cookie对象**      所谓的cookie是一个小小的文本文件,它是以key、value的方式将SessionTracking的内容记录在这个文本文件内,这个文本文件通常存在于浏览器的暂存区内。JSTL并没有提供设定cookie的动作,因为这个动作通常都 是后端开发者必须去做的事情,而不是交给前端的开发者。如果我们在cookie中设定一个名称为userCountry的值,那么可以使 用${cookie.userCountry}来取得它。 **header和headerValues**(请求报头对象)**        header储存用户浏览器和服务端用来沟通的数据,当用户要求服务端的网页时,会送出一个记载要求信息的标头文件,例如:用户浏览器的版本、用户计算机所设定的区域等其他相关数据。如果要取得用户浏览器的版本,即${header["User-Agent"]}。另外在很少机会下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues来取得这些值。 注意:因为User-Agent中包含“-”这个特殊字符,所以必须使用“[]”,而不能写成${header.User-Agent}。 initParam       就像其他属性一样,我们可以自行设定web应用的环境参数(Context),当我们想取得这些参数时,可以使用initParam隐含对象去取得它,例如:当我们在web.xml中设定如下: <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <context-param> <param-name>userid</param-name> <param-value>mike</param-value> </context-param> </web-app> 那么我们就可以直接使用 ${initParam.userid}来取得名称为userid,其值为mike的参数。下面是之前的做法:String userid =(String)application.getInitParameter("userid"); **pageContext对象** 我们可以使用 ${pageContext}来取得其他有关用户要求或页面的详细信息。下面列出了几个比较常用的部分。 Expression 说 明 ${pageContext.request} |取得请求对象 ${pageContext.session} |取得session对象 ${pageContext.request.queryString} |取得请求的参数字符串 ${pageContext.request.requestURL} |取得请求的URL,但不包括请求之参数字符串 ${pageContext.request.contextPath} |服务的web application的名称 ${pageContext.request.method} |取得HTTP的方法(GET、POST) ${pageContext.request.protocol} |取得使用的协议(HTTP/1.1、HTTP/1.0) ${pageContext.request.remoteUser} |取得用户名称 ${pageContext.request.remoteAddr } |取得用户的IP地址 ${pageContext.session.new} |判断session是否为新的,所谓新的session,表示刚由 server产生而client尚未使用 ${pageContext.session.id} |取得session的ID ${pageContext.servletContext.serverInfo}|取得主机端的服务信息 # 8、特别强调 1、注意当表达式根据名称引用这些对象之一时,返回的是相应的对象而不是相应的属性。例如:即使现有的 pageContext 属性包含某些其他值,${pageContext} 也返回 PageContext 对象。 2、 注意 <%@ pageisELIgnored="true" %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。