【Java.Web】JSP —— EL —— 基础

来源:互联网 发布:新版mac如何强制关机 编辑:程序博客网 时间:2024/06/05 18:35

EL表达式

JSP 2.0 中最重要的特性之一是Expression Language ( EL ) , JSP 设计者可以用它访问应用程序数据。受ECMAScript 和XPath 表达式语言的启发, EL 被设计成能够轻松地编写无脚本或不包含Java 代码的JSP 页面,即不使用JSP 声明、表达式或者Scriptlet 的页面。

EL 最早应用于JSP Standard Tag Library (JSTL ) 1. 0 规范中首次出现的JSP 2.0 中。JSP 1 . 2 的程序员可以通过将标准的类库导入到他们的应用程序当中,来使用这种语言。JSP 2.0 及以上版本的开发者则不需要JSTL 就可以使用EL ,不过有许多应用程序仍然需要JSTL ,因为它还包含了与EL 无关的其他标签。


这种表达式语言能简化JSP文件中数据访问大代码。可用来替代传统的基于“<%=”和“%>”形式的Java表达式,以及部分基于“<%”和“%>”形式的Java程序片段。

EL表达式能大大简化JSP代码,并能够提高JSP代码的可读性。


尽管EL表达式是JSP新版本的一个重要特性,但它并不是一种通用的编程语言,它仅仅是一种数据访问语言。


EL 表达式语法

EL表达式是以"${"开头,以"}"结束。EL表达式的构造如下:

${expression}


如果在JSP文件的模板文本中使用EL表达式,那么表达式的值会输出到网页上。


例如:

以下的Java表达式和EL表达式的作用相同,都用于输出请求参数username:

<%= request.getParameter("username") %>${param.username }


EL表达式和Java表达式一样,即可以直接插入到JSP文件的模板文本中,也可以作为JSP标签的属性的值。


字符 ${ 表示某一个EL表达式的开始;如果想要在EL表达式中使用 ${ , 需要使用转义:\${


EL中的保留字

and       or        not

eq         ne       lt

gt          le        ge

true       false   null

instanceof   empty    mod


访问对象的属性及数组的元素  [] 和 .

EL表达式语言可以使用点号运算符 “,”来访问对象的属性。

例如: 表达式 ${customer.name}表示customer对象的name属性。


EL表达式语言也可以使用方括号运算符 “[]”来访问对象的属性。

例如:表示式${customer["name"]} 和上面的表达式是等价的。


方括号运算符“[]” 还可以用来访问数组中的元素。

例如:${customers[0]}表示访问customers数组中的第一个元素。


EL运算符

EL表达式支持的所有的运算符如下:

  • 算数运算符
    • +                ——  加; 例如:${16 + 5}, 结果21
    • -                 ——  减;例如:${16 - 5}, 结果11
    • *                 ——  乘; 例如:${16 * 5},结果为80
    • /  或 div    ——  除;例如:${16 / 5},结果为3.2
    • % 或 mod —— 模;例如:${16 % 5},结果为1

  • 关系运算符
    • == 或 eq  —— 等于;例如:${16 == 5},结果为false
    • != 或 ne   —— 不等于;例如:${16 != 5},结果为true
    • < 或 lt       —— 小于;例如:${16 < 5},结果为false
    • > 或 gt     —— 大于;例如:${16 > 5},结果为true
    • <= 或 le   —— 小于等于;例如:$(16 <= 5),结果为flase
    • >= 或 ge —— 大于等于;例如:${16 >= 5},结果为true


  • 逻辑运算符
    • && 或 and  —— 逻辑与;例如:${ 16 > 5 && 16 < 18},结果为true
    • || 或 or       —— 逻辑或;例如:${16 > 5 || 16 < 18},结果为true
    • ! 或 not        —— 逻辑非;例如:${!(16 >5)},结果为false


  • empty运算符
    • empty —— 检查是否为空值;例如:${empty var},如果变量var为null,就返回true
    • 如果var变量不存在,即没有被定义,返回true
    • 如果var变量的职位null,返回true
    • 如果var变量引用集合,如set,list,map等类型的对象,并且在集合对象中不包含任何元素,返回true
    • empty运算符可以与“!”运算符一起使用


  • 条件运算符
    • a?b:c —— 条件运算符;例如${16 > 5? 16 ; 5},结果为16


使用示例:

el_test.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><%@ page import="java.util.HashMap" %><!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=utf-8"><title>Insert title here</title></head><body><%= request.getParameter("username") %>${param.username }<br/>(1) ${empty pageScope.container} <br/><%    HashMap container = new HashMap();    pageContext.setAttribute("container", container, PageContext.PAGE_SCOPE);%>(2) ${empty pageScope.container } <br/><% container.put("name", "new user"); %>(3) ${empty pageScope.container } <br/>(4) ${empty param.username } <br/>(5) ${! empty param.username } <br/></body></html>

访问上面的JSP文件,浏览器显示为:




隐含对象

EL表达式定义了11个隐含对象,它们都是java.util.Map类型。

在EL表达式中无法直接访问JSP文件中的隐含对象

例如通过表达式${request.requestURL}来访问HttpServletRequest对象的requestURL属性是无效的,正确的表达式为${pageContext.request.requestURL}


  • 表示HTTP请求中的特定数据:
    • header 
      • java.util.Map
      • 把HTTP请求头部的项目名和项目值进行映射;
      • 例如:${heaser["user-agent"]}等价于 <%= request.getHeader("user-agent") %>
    • headValues
      • java.util.Map
      • 把HTTP请求头部的项目名和所有匹配的项目值的数组进行映射;
      • 例如:${headerValues["accept-language"]} 等价于 <%= request.getHeader("accept-language") %>
    • param
      • java.util.Map
      • 把客户请求中的请求参数名和参数值进行映射;
      • 例如:${param.username} 等价于 <%= request.getParameter("username")%>
    • paramValues
      • java.util.Map
      • 把客户请求中的请求参数名和所有破陪的参数值数组进行映射;
      • 例如:${paramValues.username} 等价于 <%= request.getParameterValues("username") %>
    • cookie
      • java.util.Map
      • 把客户请求中的Cookie名和Cookie对象进行映射;

  • 表示特定范围
    • pageScope
      • java.util.Map
      • 把页面范围内的属性名和属性值进行映射;
    • requestScope
      • java.utilMap
      • 把请求范围内的属性名和属性值进行映射;
    • sessionScope
      • java.util.Map
      • 把会话范围内的属性名和属性值进行映射;
      • 例如:${sessionScope.cart.total} 等价于 调用会话范围内的属性名为“cart”的ShoppingCart对象的getTotla方法
    • applicationScope
      • java.util.Map
      • 把Web应用范围内的属性名和属性值进行映射;
      • 例如:${applicationScope.counter.count} 等价于 调用Web应用范围内的属性名为"counter"的CounterBean对象的getCount()方法

  • pageContext
    • java.util.Map
    • 表示PageContext对象
    • 表示当前JSP页面的javax.servlet.jsp.PageContext对象
    • pageContext对象包含所有其他的JSP隐式对象:request, response,  out, session,  application, config,  pageContext, page, exception
    • 例如:${pageContext.servletContext.serverInfo} 等价于 <%= application.getServerInfo() %>
    • 例如:${pageContext.request.requestURL} 等价于 <%= request.getRequestURL() %>
    • 例如:${pageContext.response.characterEncoding } 等价于 <%= response.getCharacterEncoding() %>
    • 例如:${pageContext.session.creationTime } 等价于 <%= session.getCreationTime() %>

  • initParam
    • java.util.Map
    • 把Web应用的初始化参数名和参数值进行映射
    • 例如:${initParam.driver} 等价于 <%= application.getInitParameter("driver") %>


命名变量

EL表达式中的变量称为命名变量,它不是JSP文件中的局部变量或者实例成员变量,而是存放在特定范围内的属性。命名变量的名字和属性名字对应,

例如:(1)

${username}

等价于以下代码:

<%    // 从所有范围内寻找名为“username”的属性    String username = (String)pageContext.findAttribute("username");    if (username != null) {%><%= username %><%    }%>

(2)

${cart.total}


等价于以下代码:

<%    // 从所有范围内寻找名为“cart”的属性    ShoppingCart cart = (ShoppingCart)pageContext.findAttribute("cart");    if (cart != null) {%><%= cart.getTotal() %><%    }%>

在ShoppingCart类中只要提供了public类型的getTotal()方法,就可以通过${cart.total}表达式获得cart.getTotal()方法的返回值。

(3)

<%    String username = "new user";%>${username}

以上代码不会打印username局部变量。因为${username}代表特定范围内的username属性,如果在所有范围内都不存在username属性,那么${username}没有任何打印结果。

(4)

<%    pageContext.setAttribute("username", "new user", PageContext.SESSION_SCOPE);%>${username}

以上代码会打印出会话范围内的username属性值。

(5)

如何实现知道命令变量的范围,也可以通过隐含变量pageScope,requestScope,sessionScope,applicationScope来访问命名变量。

例如:

${sessionScope.username}${applicationScope.username}


使用EL表达式的JSP范例

示例1 - 读取HTML表单数据

创建elform.jsp文件:

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!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=utf-8"><title>Insert title here</title></head><body><h3>Fill - out -form</h3><p/><form action="elform.jsp" method="get">    name = <input type="text" name="username" value='${param["username"]}'/>    <input type="submit" value=“Submit” /></form>The name is ${param.username}</body></html>



在浏览器中访问如下的url:

http://localhost:8080/base-webapp/jsp/eljsp/elform.jsp


输入值点击submit:



示例2 - 使用命名变量

创建一个elvariable.jsp:

<%@ page language="java" contentType="text/html; charset=utf-8"    pageEncoding="utf-8"%><!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=utf-8"><title>Insert title here</title></head><body><jsp:useBean id="testBean" scope="page" class="com.gof.test.bean.TestBean"></jsp:useBean><jsp:setProperty property="id" name="testBean" value="the id"/><jsp:setProperty property="firstName" name="testBean" value='${testBean.id}'/>Current id value is: ${testBean.id}<br/><%    application.setAttribute("driver", "com.mysql.jdbc.Driver");%>Current driver is: ${applicationScope.driver}</body></html>

testBean为 动作action 一节中, jsp:useBean所创建的Bean.

<jsp:useBean>动作将testBean对象加入到PAGE SCOPE范围内的属性中,因此在EL表达式中可以取出这个对象的引用。

在浏览器中访问这个JSP,

http://localhost:8080/base-webapp/jsp/eljsp/elvariable.jsp



定义和使用EL函数 - 结合自定义标签库

EL表达式语言可以访问EL函数。

EL函数实际上与Java类中的方法对应,这个Java类必须定义为public类型,并且作为EL函数的方法必须声明为public static类型。

当Java类定义好后,应该在标签库描述符(TLD)文件中,把Java类的方法映射为EL函数。














0 0
原创粉丝点击