JSP(第六章:EL)

1 EL概述

2 EL运算符

3 EL的隐含对象

4 定义和使用EL函数

JSTL(JSP Standard Tag Library) 是JSP标准标签库,不依赖于哪个框架。在Servlet2.4以上容器使用。由两部分组成:标签库+EL表达式(表达式语言)。EL表达式可以单独使用,不用引入任何包,要求容器是2.4以上,JSP2.0支持或J2EE1.4要支持。

1 EL概述

EL是表达式语言,通过EL可以简化在JSP开发中对对象的引用。EL为不熟悉Java语言页面开发的人员提供了一个开发Java Web应用的新途径。目的:为了使JSP写起来更加简单。它提供了在 JSP 中简化表达式的方法。

1.1 EL基本的语法

EL表达式必须以“ ${expression} ”来表示,其中“ expression ”部分就是具体表达式内容,“ ${} ”将这个表达式内容包含在其中作为 EL 表达式的定义。

EL存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。

因为我们并没有指定哪一个范围的username,所以它会依序从Page、Request、Session、Application范围查找。假如途中找到username,就直接回传,不再继续找下去,但是假如全部的范围都没有找到时,就回传null。

1.2 禁用EL

如果在使用EL时,其内容没有被正确的解析,而是原样输出到页面,则需要检查一下EL有没有被禁用。

1.2.1 使用斜杆符号

禁用一个JSP页面中的EL表达式。

使用斜杠符号是一种比较简单的禁用EL的方法。该方法只需要在EL的起始标记 “${” 前加上 “\” 符号

具体的语法:\${expression}

1.2.2 使用page指令

禁用一个JSP页面中的EL表达式。

使用JSP的page指令也可以禁用EL表达式。

其具体的语法格式: <%@ page isELIgnored=”布尔值” %>

isELIgnored属性:用于指定是否禁用页面中的EL,如果属性值为true,则忽略页面中的EL,否则将解析页面中的EL。

1.2.3 web.xml中配置

禁用服务器中的EL表达式。

在web.xml文件中配置<el-ignored>元素可以实现禁用服务器中的EL。
在web.xml文件中配置<el-ignored>元素的具体代码如下:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <el-ignored>true</el-ignored><!--将此处的值设置为false,表示使用EL-->
    </jsp-property-group>
</jsp-config>

1.3 通过EL访问数据

通过EL提供的“[]”和“.”运算符可以访问数据。通常情况下,“[]”和“.”运算符是等价的,可以相互代替。

访问JavaBean对象userInfo的id属性,可以写成以下两种形式:

${userInfo.id}
${userInfo[id]}

1.4 保留关键字

2 EL运算符

2.1 表达式的运算符

2.1.1 数组元素的存取

<%
    String[] citys1={"北京","济南","长沙","成都"}; 
    request.setAttribute("citys", citys1);
%>
${requestScope.citys[1]}

2.1.2 List集合元素的读取

<%
    List<String> citys2 = new ArrayList<String>();
    citys2.add("beijing");
    citys2.add("jinan");
    citys2.add("shanghai");
    session.setAttribute("citys",citys2);
%>
${sessionScope.citys[2]}

2.1.3 Map集合元素的读取

<%
    Map<String,String> citys3 = new HashMap<String,String>();
    citys3.put("1","beijing");
    citys3.put("2","wuhan");
    citys3.put("3","shanghai");
    application.setAttribute("citys",citys3);
%>
${applicationScope.citys["2"]}

2.2 算数运算符

运算符 功能 示例 结果
+ ${19+1} 20
- ${66-30} 36
* ${52.1*10} 521.0
/或div ${5/2}或${5 div 2} 2.5
${9/0}或${9 div 0} Infinity无穷
%或mod 求余 ${17%3}或${17 mod 3} 2
${15%0}或${15 mod 0} 将抛出异常:java.lang.ArithmeticException: / by zero

2.3 关系和逻辑运算符

在EL中,通过逻辑运算符和关系运算符可以实现逻辑关系运算。

关系运算符用于实现对两个表达式的比较,进行比较的表达式可以是数值型,也可以是字符串型。

而逻辑运算符,则常用于对boolean型数据进行操作。

逻辑运算符和关系运算符经常一同使用。

2.4 关系运算符

2.5 逻辑运算符

2.6 条件运算符

在EL中进行简单的条件运算,可以通过条件运算符实现。EL的条件运算符唯一的优点在于其非常简单和方便,和Java语言里的用法完全一致。

语法格式:${条件表达式 ? 表达式1 : 表达式2}

参数:

  • 条件表达式:用于指定一个条件表达式,该表达式的值为boolean型。可以由关系运算符、逻辑运算符和empty运算符组成。
  • 表达式1:用于指定当条件表达式的值为true时,将要返回的值。
  • 表达式2:用于指定当条件表达式的值为false时,将要返回的值。

例子:

${applicationScope.citys["2"]=="wuhan"?"ok":"error"}

2.7 在EL中判断对象中是否为空

在EL中,判断对象是否为空,可以通过empty运算符实现,该运算符是一个前缀(prefix)运算符,即empty运算符位于操作数前方,用来确定一个对象或变量是否为null或空。

empty运算符的格式:${empty expression}

参数说明:

  • expression:用于指定要判断的变量或对象。

3 EL的隐含对象

3.1 pageContext对象

等价于 page 环境类 javax.servlet.jsp.PageContext 的实例,用来提供访问不同的请求参数。

页面上下文对象为pageContext,用于访问JSP内置对象(例如request、response、out、session、exception、page等,但不能用于获取application、config和pageContext对象)和servletContext。

在获取到这些内置对象后,就可以获取其属性值。这些属性与对象的getXXX()方法相对应,在使用时,去掉方法名中的get,并将首字母改为小字即可。

例子:

${pageContext.request.serverPort}
${pageContext.response.contentType}
${pageContext.out.bufferSize}
${pageContext.session.maxInactiveInterval}
${pageContext.servletContext.contextPath}

3.2 访问环境信息的隐含对象

3.2.1 默认变量 param 、 paramValues

param 、 paramValues:这两个默认变量包含请求参数的集合, param 表明请求包含的参数为单一控件, paramValues 表明请求包含的参数为控件数组

例子:提交请求的页面和接受的页面

<%@ page contentType="text/html; charset=UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <body> 
     <form action="SampleJsp.jsp"> 
     <input type="text" name="sampleValue" value="10"> 
     <input type="text" name="sampleValue" value="11"> 
     <input type="text" name="sampleValue" value="12"> 
     <input type="text" name="sampleSingleValue" value="SingleValue"> 
     <input type="submit" value="Submit"> 
     </form> 
  </body> 
 </html>

在这个页面中定义了两组控件,控件名为“ sampleValue ”的是一套控件数组,控件名为“ sampleSingleValue ”的是单一控件,通过递交将请求参数传送到 SampleJsp.jsp

<%@ page contentType="text/html; charset=UTF-8"%> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <body> 
     ${paramValues.sampleValue[2]} <br> 
     ${param.sampleSingleValue} <br> 
  </body> 
</html>

这是请求转发到的页面,通过 EL 表达式的 paramValues 变量得到控件数组中最后一个控件的递交参数,通过 EL 表达式的 param 变量得到单一控件的递交参数。控件数组参数的 EL 表达式使用“ [] ”来指定数组下标。

【结果:】本示例将显示控件数组中最后一个控件的值“ 12 ”和单一控件的值“ SingleValue ”。

3.2.2 默认变量 header 、 headerValues

header 、 headerValues:这两个默认变量包含请求参数头部信息的集合, header 变量表示单一头部信息, headerValues 则表示数组型的头部信息。

3.2.3 默认变量 initParam

包含所有应用程序初始化参数的集合。
${initParam.参数名}

包含所有请求的 cookie 集合,集合中的每个对象对应 javax.servlet.http.Cookie 。
${cookie.cookie的key.value}

3.3 访问作用域范围的隐含对象

在EL中提供了4个用于访问作用域范围的隐含对象,即pageScope、requestScope、sessionScope和applicationScope。

例子1:

<jsp:useBean id="produce" class="com.lyq.bean.Produce" scope="page"></jsp:useBean>
<jsp:setProperty property="*" name="produce" />

${pageScope.produce.name}
${pageScope.produce.price}
${pageScope.produce.count}
${pageScope.produce.factoryAdd}

例子2:

<%request.setAttribute("username","mr"); %>

${requestScope.username}

例子3:

<%session.setAttribute("username","mr"); %>

${sessionScope.username}

例子4:

<%application.setAttribute("username","mr"); %>

${applicationScope.username}

4 定义和使用EL函数

函数的定义和使用分为以下3个步骤:

  1. 编写一个Java类,并在该类中编写公用的静态方法,用于实现自定义EL函数的具体功能。
  2. 编写标签库描述文件,对函数进行声明。该文件的扩展名为.tld,被保存到Web应用的WEB-INF文件夹下。
  3. 在JSP页面中引用标签库,并调用定义的EL函数,实现相应的功能。

例子:

【新建ChangeMethod类】

package com.itzcn.method;

public class ChangeMethod {
    public static String toUpper(String param){
        return param.toUpperCase();
    }
    public static String toLower(String param){
        return param.toLowerCase();
    }
}

【在WEB-INF下新建function.tld文件】

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" >
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>fn</short-name>

<function>
     <name>toUpper</name>
     <function-class>com.itzcn.method.ChangeMethod</function-class>
     <function-signature>java.lang.String toUpper(java.lang.String)</function-signature>
</function>

<function>
    <name>toLower</name>
    <function-class>com.itzcn.method.ChangeMethod</function-class>
    <function-signature>java.lang.String toLower(java.lang.String)</function-signature>
</function>
</taglib>

【index.jsp】

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="fn" uri="/WEB-INF/function.tld" %><!-- 与 上面的.tld文件对应-->
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
  <form action="index.jsp" method="post">
  <input type="text" name="ss">
  <input type="submit" name="submit" value="提交">
  </form>    
  <%request.setCharacterEncoding("UTF-8"); %>

  ${param.ss}
  ${fn:toUpper(param.ss)}
  ${fn:toLower(param.ss)}
  </body>
</html>

【结果:】

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!

客官,赏一瓶怡宝吧。

支付宝
微信