【学习】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"]} </td> </tr> <!-- 使用reverse函数--> <tr> <td>\${t:reverse(param["name"])}</td> <td>${t:reverse(param["name"])} </td> </tr> <tr> <td>\${t:reverse(t:reverse(param["name"]))}</td> <td>${t:reverse(t:reverse(param["name"]))} </td> </tr> <!-- 使用countChar函数 --> <tr> <td>\${t:countChar(param["name"])}</td> <td>${t:countChar(param["name"])} </td> </tr> </table> </body> </html>
自定义函数的实质:就是将指定Java类的静态方法暴露成可以在EL中使用的函数,所以可以定义成函数的方法必须使用 public static 修饰。