【学习】JSP 2 特性:表达式语言(EL)

JSP 2 的新特性:

  > 直接配置JSP 属性

  > 表达式语言(EL)

  > 简化的自定义标签API

  > Tag 文件语法

  如需要使用 JSP 2 语法,其web.xml 文件必须使用 Servlet 2.4 以上的配置文件。如下,绿色处。

  

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
 xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   ....
</web-app>

  

表达式语言:

  表达式语言(Expression Language) 是一种简化的数据访问方式。可以方便的访问应用程序数据,避免使用JSP 脚本。

    表达式语言的语法格式是: 

    ${expression}

   1、表达式语言支持的蒜素运算符和逻辑运算符

    所有在Java 语言里面支持的算术运算符和逻辑运算符,表达式语言都可以使用。

    如 ${1+1}、${1*2}、${1/3}。除了上述加、减、乘、除、求余等算术运算符的功能,还支持 div 、 mod 等运算符。而且表达式语言把所有运算符都当成浮点数处理。

    如${1<2}、 ${10 != 10} 等等。表达语言不仅可在数字与数字之间比较,还可以在字符与字符之间比较,字符串的比较是根据其对应UNICODE值来比较大小的。

    如果需要在支持表达式语言的页面正常的输出“$”符号,则在"$"符号前 加转义字符"\"。

   2、表达式语言的内置对象

    使用表达式语言可以直接获取请求参数,可以获取页面中 JavaBean 的指定属性值,获取请求头及获取page、request、session、application范围的属性值。

     表达式语言包含如下11个内置对象。

    > pageContext : 代表 该页面的pageContext 对象。

    > pageScope : 用于获取page 范围内的属性值。

    > requestScope : 用于获取request 范围内的属性值。

    > sessionScope : 用于获取session 范围内的属性值。

    > applicationScope : 用于获取application 范围内的属性值。

    > param : 用于获取请求的参数值。

    > paramValues : 用于获取请求的参数值,其值为数组。

    > header : 用于获取请求头的参数值。

    > headerValues : 用于获取请求头的参数值,其值为数组。

    > initParam : 用于获取请求Web 应用的初始化值。

    > cookie : 获取指定的Cookie 值 。 

    用法如下:

    <!-- 使用两种方式获取请求参数值 -->
    取得请求参数值
    ${param.name};             ${param["name"]};

   3、表达式语言的自定义函数:

    自定义函数的开发步骤类似于标签的开发步骤,定义方式几乎一样。而区别在于自定义标签直接在页面上生成输出,而自定义函数则需要在表达式语言中使用。

    自定义函数的开发步骤:

    1、开发函数处理类:函数处理类就是普通类,这个普通类中包含若干个静态方法,没个静态方法都可以定义成一个函数。(可以使用JDK或其他项目提供的类,只要这个类包含静态方法。) 。 

    

package text ; 
public class Functions {
//    统计字符串的个数
    public static int countChar(String text)
    {
        return text.length() ; 
    }
//    对字符串进行反转
    public static String reverse(String text)
    {
        return new StringBuffer(text).reverse().toString() ; 
    }
}

 

    2、使用标签库定义函数:在<taglib.../>元素下增加<tag.../>元素用于定义自定义标签库 ; 增加<function .../> 元素则用于定义自定义函数。每个<function.../> 只要三个元素即可。

    > name  : 指定自定义函数的名字。

    > function-class : 指定自定义函数的处理类。

    > function-signature :  指定自定义函数对应的方法。 

<?xml version="1.0" encoding="GBK"?>
<taglib version="2.0" 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-jsptaglibrary_2_0.xsd">
 <tlib-version>1.0</tlib-version>
 <short-name>t</short-name>
 <!-- 定义该标签库的URI -->
 <uri>http://jbelial.cnblogs.com</uri>
 <!-- 定义第一个函数 -->
 <function>
  <!-- 定义函数名:reverse -->
  <name>reverse</name>
  <!-- 定义函数的处理类 -->
  <function-class>text.Functions</function-class>
  <!-- 定义函数的实现方法-->
  <function-signature>java.lang.String reverse(java.lang.String)</function-signature>
 </function>
 <!-- 定义第二个函数: countChar -->
 <function>
  <name>countChar</name>
  <function-class>text.Functions</function-class>
  <function-signature>int countChar(java.lang.String)</function-signature>
 </function>
</taglib>

 

    3、在JSP页面的EL 中使用函数:需要先导入标签库,然后再使用函数。

    

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@ taglib prefix="t" uri="http://jbelial.cnblogs.com"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title> new document </title>
</head>
<body>
    <h2>表达式语言 - 自定义函数</h2><hr/>
    请输入一个字符串:
    <form action="useFunctions.jsp" method="post">
        字符串 = <input type="text" name="name" >
        <input type="submit"  value="提交">
    </form>
    <table border="1" bgcolor="aaaadd">
        <tr>
        <td><b>表达式语言</b></td>
        <td><b>计算结果</b></td>
        <tr>
        <tr>
            <td>\${param["name"]}</td>
            <td>${param["name"]}&nbsp;</td>
        </tr>
        <!--  使用reverse函数-->
        <tr>
            <td>\${t:reverse(param["name"])}</td>
            <td>${t:reverse(param["name"])}&nbsp;</td>
        </tr>
        <tr>
            <td>\${t:reverse(t:reverse(param["name"]))}</td>
            <td>${t:reverse(t:reverse(param["name"]))}&nbsp;</td>
        </tr>
        <!-- 使用countChar函数 -->
        <tr>
            <td>\${t:countChar(param["name"])}</td>
            <td>${t:countChar(param["name"])}&nbsp;</td>
        </tr>
    </table>
</body>
</html>

    自定义函数的实质:就是将指定Java类的静态方法暴露成可以在EL中使用的函数,所以可以定义成函数的方法必须使用 public static 修饰。

    

posted @ 2012-07-06 17:31  贺佐安  阅读(731)  评论(0编辑  收藏  举报