JSP 2 特性 -- 表达式语言

JSP 2 主要增加如下特性:

1.直接配置JSP属性

2.表达式语言

3.简化 自定义API

4.Tag 文件语法


一 在表达式语言中使用算术运算符

arithmeticOperator.jsp 

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!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> 表达式语言 - 算术运算符 </title>
</head>
<body>
<h2>表达式语言 - 算术运算符</h2><hr/>
<table border="1" bgcolor="#aaaadd">
<tr>
<td><b>表达式语言</b></td>
<td><b>计算结果</b></td>
</tr>
<!-- 直接输出常量 -->
<tr>
<td>\${1}</td>
<td>${1}</td>
</tr>
<!-- 计算加法 -->
<tr>
<td>\${1.2 + 2.3}</td>
<td>${1.2 + 2.3}</td>
</tr>
<!-- 计算加法 -->
<tr>
<td>\${1.2E4 + 1.4}</td>
<td>${1.2E4 + 1.4}</td>
</tr>
<!-- 计算减法 -->
<tr>
<td>\${-4 - 2}</td>
<td>${-4 - 2}</td>
</tr>
<!-- 计算乘法 -->
<tr>
<td>\${21 * 2}</td>
<td>${21 * 2}</td>
</tr>
<!-- 计算除法 -->
<tr>
<td>\${3/4}</td>
<td>${3/4}</td>
</tr>
<!-- 计算除法 -->
<tr>
<td>\${3 div 4}</td>
<td>${3 div 4}</td>
</tr>
<!-- 计算除法 -->
<tr>
<td>\${3/0}</td>
<td>${3/0}</td>
</tr>
<!-- 计算求余 -->
<tr>
<td>\${10%4}</td>
<td>${10%4}</td>
</tr>
<!-- 计算求余 -->
<tr>
<td>\${10 mod 4}</td>
<td>${10 mod 4}</td>
</tr>
<!-- 计算三目运算符 -->
<tr>
<td>\${(1==2) ? 3 : 4}</td>
<td>${(1==2) ? 3 : 4}</td>
</tr>
</table>
</body>
</html>

该页面示范了支持的加减乘除、求余等算术运算符的功能,还支持div  、 mod 等运算符,而且表达式语言把所有的数值都当成浮点数


二 表达式语言中使用逻辑运算符

logicOperator.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!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> 表达式语言 - 逻辑运算符 </title>
</head>
<body>
<h2>表达式语言 - 逻辑运算符</h2><hr/>
数字之间的比较:
<table border="1" bgcolor="#aaaadd">
<tr>
<td><b>表达式语言</b></td>
<td><b>计算结果</b></td>
</tr>
<!-- 直接比较两个数字 -->
<tr>
<td>\${1 &lt; 2}</td>
<td>${1 < 2}</td>
</tr>
<!-- 使用lt比较运算符 -->
<tr>
<td>\${1 lt 2}</td>
<td>${1 lt 2}</td>
</tr>
<!-- 使用>比较运算符 -->
<tr>
<td>\${1 &gt; (4/2)}</td>
<td>${1 > (4/2)}</td>
</tr>
<!-- 使用gt比较运算符 -->
<tr>
<td>\${1 gt (4/2)}</td>
<td>${1 gt (4/2)}</td>
</tr>
<!-- 使用>=比较运算符 -->
<tr>
<td>\${4.0 &gt= 3}</td>
<td>${4.0 >= 3}</td>
</tr>
<!-- 使用ge比较运算符 -->
<tr>
<td>\${4.0 ge 3}</td>
<td>${4.0 ge 3}</td>
</tr>
<!-- 使用<=比较运算符 -->
<tr>
<td>\${4 &lt;= 3}</td>
<td>${4 <= 3}</td>
</tr>
<!-- 使用le比较运算符 -->
<tr>
<td>\${4 le 3}</td>
<td>${4 le 3}</td>
</tr>
<!-- 使用==比较运算符 -->
<tr>
<td>\${100.0 == 100}</td>
<td>${100.0 == 100}</td>
</tr>
<!-- 使用eq比较运算符 -->
<tr>
<td>\${100.0 eq 100}</td>
<td>${100.0 eq 100}</td>
</tr>
<!-- 使用!=比较运算符 -->
<tr>
<td>\${(10*10) != 100}</td>
<td>${(10*10) != 100}</td>
</tr>
<!--  先执行运算,再进行比较运算,使用ne比较运算符-->
<tr>
<td>\${(10*10) ne 100}</td>
<td>${(10*10) ne 100}</td>
</tr>
</table>
字符之间的比较:
<table border="1" bgcolor="#aaaadd">
<tr>
<td><b>表达式语言</b></td>
<td><b>计算结果</b></td>
</tr>
<tr>
<td>\${'a' &lt; 'b'}</td>
<td>${'a' < 'b'}</td>
</tr>
<tr>
<td>\${'hip' &gt; 'hit'}</td>
<td>${'hip' > 'hit'}</td>
</tr>
<tr>
<td>\${'4' &gt; 3}</td>
<td>${'4' > 3}</td>
</tr>
</table>
</body>
</html>

三 表达式语言的内置对象

表达式包括11个内置对象:

-pageContext : 代表该页面的pageContext对象,与JSP的pageContext内置对象相同

-pageScope : 获取page的属性值

-requestScope : 

-sessionScope :

-application :

-param :获取请求参数值

-paramValues : 与param区别 用于获取属性值为数组的属性值

-header : 请求头属性值

-headerValues :该对象用于获取属性值为数组的属性值

-initParam : 获取Web 应用的初始化参数 (如webx.xml)

-cookie : 获取指定的cookie值

使用表达式语言的内置对象的方法:

implicit-objects.jsp 

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!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> 表达式语言 - 内置对象 </title>
</head>
<body>
<h2>表达式语言 - 内置对象</h2>
请输入你的名字:
<!-- 通过表单提交请求参数 -->
<form action="implicit-objects.jsp" method="post">
<!-- 通过${param['name']} 获取请求参数 -->
你的名字 = <input type="text" name="name" value="${param['name']}"/>
<input type="submit" value='提交'/>
</form><br/>
<% session.setAttribute("user" , "abc");
// 下面三行代码添加Cookie
Cookie c = new Cookie("name" , "yeeku");
c.setMaxAge(24 * 3600);
response.addCookie(c);
%>
<table border="1" width="660" bgcolor="#aaaadd">
<tr>
<td width="170"><b>功能</b></td>
<td width="200"><b>表达式语言</b></td>
<td width="300"><b>计算结果</b></td>
<tr>
<!-- 使用两种方式获取请求参数值 -->
<td>取得请求参数值</td>
<td>\${param.name}</td>
<td>${param.name}&nbsp;</td>
</tr>
<tr>
<td>取得请求参数值</td>
<td>\${param["name"]}</td>
<td>${param["name"]}&nbsp;</td>
</tr>
<tr>
<!-- 使用两种方式获取指定请求头信息 -->
<td>取得请求头的值</td>
<td>\${header.host}</td>
<td>${header.host}</td>
</tr>
<tr>
<td>取得请求头的值</td>
<td>\${header["accept"]}</td>
<td>${header["accept"]}</td>
</tr>
<!-- 获取Web应用的初始化参数值  (author在web.xml配置)-->
<tr>
<td>取得初始化参数值</td>
<td>\${initParam["author"]}</td>
<td>${initParam["author"]}</td>
</tr>
<!-- 获取session返回的属性值 -->
<tr>
<td>取得session的属性值</td>
<td>\${sessionScope["user"]}</td>
<td>${sessionScope["user"]}</td>
</tr>
<!-- 获取指定Cookie的值 -->
<tr>
<td>取得指定Cookie的值</td>
<td>\${cookie["name"].value}</td>
<td>${cookie["name"].value}</td>
</tr>
</table>
</body>
</html>


四  表达式语言的自定义函数

自定义函数的开发步骤非常类似于标签的开发步骤,定义方式几乎相同。区别的是自定义标签在页面直接输出(本人博客有介绍),而自定义函数则需要在表达式语言中使用。

表达式语言中自定义函数的开发步骤 :

1.开发函数处理类:

Funtions.java 

package com.yd.tag;


public class Functions {
// 对字符串进行反转
public static String reverse(String text) {
return new StringBuffer(text).reverse().toString();
}


// 统计字符串的个数
public static int countChar(String text) {
return text.length();
}
}

2.使用标签库定义函数;

mytaglib.tld(WEB-INF/)

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

3.在JSP页面的EL中使用函数 :

useFunctions.jsp

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<%@ taglib prefix="zyd" uri="http://www.zyd.org/tags"%>
<!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" value="${param['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>\${zyd:reverse(param["name"])}</td>
<td>${zyd:reverse(param["name"])}&nbsp;</td>
</tr>
<tr>
<td>\${zyd:reverse(zyd:reverse(param["name"]))}</td>
<td>${zyd:reverse(zyd:reverse(param["name"]))}&nbsp;</td>
</tr>
<!-- 使用countChar函数 -->
<tr>
<td>\${zyd:countChar(param["name"])}</td>
<td>${zyd:countChar(param["name"])}&nbsp;</td>
</tr>
</table>
</body>
</html>

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

May-good-luck-be-with-you

你可能感兴趣的:(jsp,EL,表达式语言)