JSP2.0 EL语言

JSP(JavaServer Pages)技术是对Servlet的进一步抽象,它由JCP(Java Community
Process)开发,是用于生成动态内容的开放式的、可免费获取的规范,也是J2EE(Ja
va 2 Enterprise Edition)规范的重要组成部分。JSP2.0版是对JSP1.2的升级,增加了
一些有趣的新特性。JSP2.0的目标是:
1使动态网页的设计更加容易
2简化JSP页面,使得JSP页面容易维护
3使WEB应用程序前后台应用更清晰
4无需学习Java编程语言就可以编写JSP页面

除了其他一些改进外,JSP 2.0引入的最主要的新特性包括:
?一种简单的表达式语言(EL),能够用来容易地从JSP页面访问数据,这种表达式语言
简化了基于JSP的不含脚本的应用程序的编写,不需要使用Java Scriptlet或者Java表达
式;
?用于直接使用JSP技术来定义可重用的自定义行为的新语法,该语法使用.tag和.tagx
文件,这类文件可由开发人员或者网页作者编写;
?XML语法得到了实质性的改进,增加了新的标准文件扩展名(.tagx用于标签文件,.j
spx用于JSP文件)。

TOMCAT5.0.x服务器支持以上JSP2.0的全部特性,下面讨论表达式语言、简化的标签API和
标签文件,以下的JSP程序都是在TOMCAT5.0.X上实现的。相信目前的JSP开发人员将会发
现这些重要的特性不但有趣,而且非常有用。

一. JSP表达式语言 - EL扩展表达式语言
EL(表达式语言)是一种数据访问语言,可以方便地访问和处理应用程序数据,而无需使
用scriptlet或者请求时(request-time)表达式的值。(不需要使用<% 和%>来获得数据
,EL使JSP页面编写人员摆脱了java语言,使用户即使不懂JAVA也可以轻松编写JSP程序.

在JSP2.0之前,网页作者只能使用表达式<%= aName %>访问系统的值,比如:
<someTags:aTag attribute="<%= pageContext.getAttribute("aName") %>"> 或者 <%
= aCustomer.getAddress().getCountry() %>
而表达式语言允许网页作者使用简单的语法访问对象。比如要访问一个简单变量,可以
像下面这样写:
<someTags:aTag attribute="${aName}">
而访问JavaBeans属性,可以使用:${aCustomer.address.country}

Tomcat对EL扩展表达式的支持和配置:
tomcat5.0默认支持EL,同时用户可以在Web.xml文件中对整个web应用程序进行设置或者
在每个页面中单独设置page指令来控制TOMCAT是否对EL的支持。
----------------------------
EL扩展表达式语言的设置
对于一个单个JSP页面,你可以使用定义page指令来设置jsp页面是否支持EL。默认是支
持EL(如果要页面不支持EL,请设置为isELIgnored=true;
<%@ page isELIgnored="true|false"%>
对于整个JSP应用程序,要修改WEB.XML配置(tomcat5.0.16默认是支持EL的);
<jsp-property-group>
<description> For config the ICW sample application </description>
<display-name>JSPConfiguration</display-name>
<url-pattern>/jsp/datareset.jsp</url-pattern>
<el-ignored>true< / el-ignored>
<page-encoding>ISO-8859-1</page-encoding>
<scripting-invalid>true</scripting-invalid>
<include-prelude>/jsp/prelude.jspf</include-prelude>
<include-coda>/jsp/coda.jspf</include-coda>
</jsp-property-group>
----------------------------

表达式运算符号:
EL表达式运算符包括算数运算符(+-*/),关系运算符(><)和逻辑运算符(&& || !),还有
empty 判断值是否为空,同时EL能够对字符串,数字等各种类型的数据之间的自动转换,
使EL 兼容了JAVASCRIPT等脚本语言的优点,摆脱了JAVA语言严格的数据类型限制,使用
起来简单,只需要几分钟就可以轻松掌握(对于不懂java的网页编写人员实在是一件好事
)。

----------------------------
各种运算符运算实例

以下是EL运算符列表,其中empty可以检查某个值是否为空

运算符 说明
+ 加
- 减
* 乘
/或div 除
% 或 mod 模(求余)
== 或 = 等于
!= 或 != 不等于
< 或 lt 小于
>或gt 大于
<=或le 小于等于
>=或ge 大于等于
&& 或 and 逻辑与
|| 或 or 逻辑或
! 或 not 逻辑非
empty 检查是否为空值
a ? b : c 条件运算符
----------------------------
EL表达式使用简单,在网页中"${}"表示是EL表达式。${1+1} 显示为 2
----------------------------

EL算术表达式 运算结果
${1} 1
${1 + 2} 3
${1.2 + 2.3} 3.5
${-4 - 2} -6
${21 * 2} 42
${10%4} 2
${10 mod 4} 2
${1 < 2} true
${1 lt 2} true
${1 > (4/2)} false
${4.0 >= 3} true
${4.0 ge 3} true
${100.0 eq 100} true
${(10*10) != 100} false
${(10*10) ne 100} false
${(1==2) ? 3 : 4} 4
----------------------------

内置的11个隐含对象:
为方便的获得WEB应用程序的相关数据,EL表达式语言定义了一些隐含对象。隐含对象共
有11个对象,(JSP中具有9个隐含对象,EL比JSP中具有更多的隐含对象,这样EL比JSP更
方便的获取数据) 使用这些对象可以很方便的访问Web 程序数据。

隐含对象包括Session(获得当前web程序的Session值),cookie(获得WEB程序的Cookie值
),header,headerValues(获得用户的Http数据访问头部信息),Param和ParamValues(获得
用户提交数据参数)等。

使用${隐含对象名称["元素"]} 就可以获得这个值了,例如${header("host")} 可以显示
http头部中host的值,${param("username")},可以获得显示用户表单提交的用户. 使用
${empty(param("username")} 可以判断用户提交表单是否为空等。(这样比jsp1.2中使
用request.getParamter("username") 要简化和方便很多了)

----------------------------
隐含对象及隐含对象访问实例
EL 表达式定义了11个隐含对象,使用这11个对象可以很方便的读取到session,cookie,H
ttpHeader,用户提交表单(param)等

隐含对象 内容
applicationScope 应用程序范围内的scoped变量组成的集合
cookie 所有cookie组成的集合
header HTTP请求头部,字符串
headerValues HTTP请求头部,字符串集合
initParam 全部应用程序参数名组成的集合
pageContext 当前页面的javax.servlet.jsp.PageContext对象
pageScope 页面范围内所有对象的集合
param 所有请求参数字符串组成的集合
paramValues 所有作为字符串集合的请求参数
requestScope 所有请求范围的对象的集合
sessionScope 所有会话范围的对象的集合
下面是获取HTTP访问头部数据和用户提交数据的示例
EL表达式 运算结果
${header["host"]} 这里得到HTTP连接头部的host值
${header["accept"]} 这里获得HTTP头部的accept值
${header["user-agent"]} 这里获得HTTP头部的user-agent值
----------------------------

访问应用程序数据
除了可以方便的访问内置的隐含对象外,EL还可以方便的到应用程序数据,访问应用程序
数据使用两种方式 . (点号运算符)访问对象的属性,也可以使用[] 来访问数组元素(实
际上EL中访问隐含对象数据也是使用这两种方式的)

表达式${data}表示名为data的scoped变量。可以使用点号(.)或方括号([])运算符
从集合中检索属性值:(两种数据访问方式演示)

点号运算符用于访问命名的属性,比如表达式${customer.name}表示scoped变量custom
er的name属性;

方括号运算符可用于检索命名的属性,比如在${customer[“name”]}中。也可以通过$
{customers[0]}的形式来访问集合customers中的第一项。

EL表达式语言同时还统一了对点号和方括号运算符的处理,因此${customer.name}与${
customer[“name”]}是等价的。

----------------------------
以下可以读取用户提交的信息,假设用户提交信息为 ?name=myname&alies=now.net.cn(
这里有两种访问方式,一种是使用[]来进行访问,另外一种是使用"."来进行访问,两种访
问效果是一样的。)
${param["name"] } myname
${param.name} myname
${param["alies"] } now.net.cn
${param.alies} now.net.cn
----------------------------

访问应用程序数据需要进行以下几个步骤:
1.编写public类的static public 方法,只有static public的方法才能被标记表达试访
问。

----------------------------
定义和使用函数
表达式语言允许你定义可在表达式中调用的函数。函数必须作为public类中的public s
tatic方法编写。同时要将文件映射到TLD标志库文件中。

为了说明函数的使用,我们举一个简单的例子,把两个数相加。首先要编写求两数之和
的Java方法代码,如代码示例所示,这里定义了一个静态方法,它接收两个字符串参数
,把它们解析成整数并返回它们的和。

示例文件:Compute.java

package jsp2.examples.el;
import java.util.*;
public class Compute {
public static int add(String x, String y) {
int a = 0;
int b = 0;
try {
a = Integer.parseInt(x);
b = Integer.parseInt(y);
}catch(Exception e) {}
return a + b;
}
}
用javac把这段代码编译成功后,下一步就要把函数的签名映射到标签库。
----------------------------

2.将方法映射到TLD表中

----------------------------
配置标记库描述文件 函数描述符
<function>
<description>add x and y</description>
<name>add</name>
<function-class>jsp2.examples.el.Compute
</function-class>
<function-signature>int
add(java.lang.String,java.lang.String)
</function-signature>
</function>
现在我们就可以编写一个JSP页面来使用这个函数。代码示例5是包含两个字段的一个表
单,用户输入两个数字并按下“求和”按钮,就会调用上面的函数并把两个数相加,结
果在同一个页面中显示出来。
----------------------------

3.在JSP页面中调用要引用的Taglib标记,然后就可以在jsp页面中访问了。

----------------------------
代码示例5: math.jsp
<%@ taglib prefix="my"
uri="http://jakarta.apache.org/tomcat/jsp2-example-taglib %>
<HEAD>
<TITLE>Functions</TITLE>
</HEAD>
<BODY>
<H3>Add Numbers</H3>
<P>
<FORM action="math.jsp" method="GET">
X = <input type="text" name="x" value="${param["x"]}">
<BR>
Y = <input type="text" name="y" value="${param["y"]}">
<input type="submit" value="Add Numbers">
</FORM>
<P>
The sum is: ${my:add(param["x"],param["y"])}
</BODY>
</HTML>
----------------------------

二. 简单标志库扩展 _SimpleTag
在jsp1.2时代已经有标记库了, 并且功能强大,但标记库的编程和调用都比较复杂,导
致真正使用到WEB开发中的还是不多。JSP2.0推出的简单标记库扩展解决了以上的问题。
简单标记库相对JSP1.2中的标记库来说,优点在于:
对后台程序员来说:结构更简单,实现接口更少,可以轻松实现后台程序

JSP 2.0中加入了新的创建自制标记的API:javax.servlet.jsp.tagext.SimpleTag,该
API定义了用来实现简单标记的接口。和JSP 1.2中的已有接口不同的是,SimpleTag接口
不使用doStartTag()和doEndTag()方法,而提供了一个简单的doTag()方法。这个方法在
调用该标记时只被使用一次。而需要在一个自制标记中实现的所有逻辑过程、循环和对
标记体的评估等都在这个方法中实现。从这个方面来讲,SimpleTag可以和IterationTa
g达到同等的作用。但SimpleTag的方法和处理周期要简单得多。在SimpleTag中还有用来
设置JSP内容的setJspBody()和getJspBody()方法。Web容器会使用setJspBody()方法定
义一个代表JSP内容的JspFragment对象。实现SimpleTag标记的程序可以在doTag方法中
根据需要多次调用getJspBody().invoke()方法以处理JSP内容。
对于前台WEB页面制作人员:在JSP1.2时代,Taglib页面调用实际上是比较复杂的,Simpl
eTag+EL表达式语言极大的简化了Taglib调用,真正达到不懂JAVA的人员也可以轻松编写
JSP页面的目的。

一个Taglib页面的编写和调用包括三个流程:

1. 后台程序员编写要被调用的程序

----------------------------
简单标志扩展实现示例:
java程序 RepeatSimpleTag.java://放到WEB-INF/classes/jsp2/examples/simpletag
下面
package jsp2.examples.simpletag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.util.HashMap;
import java.io.IOException;

public class RepeatSimpleTag extends SimpleTagSupport {

private int num;

public void doTag() throws JspException, IOException {
for (int i=0; i<num; i++) {
getJspContext().setAttribute("count",
String.valueOf( i + 1 ) );
getJspBody().invoke(null);
}
}

public void setNum(int num) {
//这个用来设置num的值,这个方法将在tld文件中调用
this.num = num;
}
}
----------------------------

2. 编辑Tag标志描述文件,这个文件要放在WEB-INFjsp2下面,并且这个文件要以tld为
文件结尾。

----------------------------
repeatTaglib.tld (标志库描述文件,放在WEB-INF下面的jsp2下面)
<?xml version="1.0" encoding="UTF-8" ?>
<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/j2e
e web-jsptaglibrary_2_0.xsd" version="2.0">
<description>A tag library exercising SimpleTag handlers.</description>
<tlib-version>1.0</tlib-version>
<short-name>SimpleTagLibrary</short-name>
<uri>/SimpleTagLibrary</uri>
<tag> <!--这里是开始标志描述-->
<name>repeat</name> <!--这里设定的标志名称,供jsp文件调用-->
<tag-class>jsp2.examples.simpletag.RepeatSimpleTag</tag-class>
<!--对应的java文件路径-->
<body-content>scriptless</body-content>
<variable> <!--设置要获取的变量返回值-->
<description>Current invocation count (1 to num)</descri
ption>
<name-given>count</name-given>
</variable>
<attribute> <!--设置java类中变量,调用java文件中的setNum()方法-->
<name>num</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> <!--//这里是结束标志描述-->
</taglib>
----------------------------
3.JSP页面人员就可以直接调用了。
----------------------------
repeat.jsp
<%@ taglib prefix="repeattag" uri="/WEB-INF/jsp2/repeatTaglib.tld" %>
<html>
<body>
<br>
<repeattag:repeat num="5">//向标记库文件中的repeat标记付值
获得返回值{count} of 5<br>//得到返回结果(java程序中实现了循环)
</repeattag:repeat>
</body>
</html>
看这么简单就可以得到想要的结果,方便吧。
----------------------------
使用标签文件(JSP fragment):
使用简单标签扩展机制的另一种简单的方法是通过标签文件。
标签文件是一种资源文件,网页作者可以利用它抽取一段JSP代码,通过定制功能来实现
代码的复用。换句话说,标签文件允许JSP网页作者使用JSP语法创建可复用的标签库。
标签文件的扩展名必须是“.tag”。表面上标签文件文件和jsp1.2中的jsp:include 指
令中的包含文件好像是一样的,但实际上还是有一些不同的,标签文件一般功能比较短小
简单而且重复使用率高的一些代码。
----------------------------
一个简单的标签文件
SimpleTag.tag 这个文件放到WEB-INF/tags下面
<h4>hello,welcome to here ,here is a simple tag Example</h4>
char.jsp
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<HTML>
<BODY>
<H2>Tag File Example</H2>
<P><B>The output of my first tag file is</B>: <tags:SimpleTag/>
</BODY>
</HTML>
如果其他JSP页面中还要使用这个标签文件,同样也可以实现这调用这个标志库文件,达到
简单的代码复用的目的。
----------------------------
标签文件(JSP fragment)的基本特点是可以使处理JSP的容器推迟评估JSP标记属性。我
们知道一般JSP是首先评估JSP标记的属性,然后在处理JSP标记时使用这些属性,而JSP
fragment提供了动态的属性。也就是说,这些属性在JSP处理其标记体时是可以被改变
的。标签文件是用文本文件格式(JSP语法)实现自制标记,这也是JSP 2.0的一个主要新
功能。
----------------------------
标签文件的动态复用
标签文件可以作为模板使用。指令attribute类似于TLD中的<attribute>元素,允许声明
自定义的动作属性。
<%@ attribute name="color" %>
<%@ attribute name="bgcolor" %>
<%@ attribute name="title" %>
<TABLE border="0" bgcolor="${color}">
<TR> <TD><B>${title}</B></TD> </TR>
<TR> <TD bgcolor="${bgcolor}"> <jsp:doBody/> </TD> </TR>
</TABLE>
以下是调用这个Tag文件的jsp文件
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %>
<HTML><BODY>
<TABLE border="0">
<TR valign="top">
<TD>
<tags:display color="#ff0000" bgcolor="#ffc0c0" title="Travel"> Last French
Concorde Arrives in NY
Another Travel Headline
Yet Another Travel Headline
</tags:display>
</TD>
<TD> <tags:display color="#00fc00" bgcolor="#c0ffc0" title="Technology"> Jav
a for in-flight entertainment
Another Technology Headline
Another Technology Headline
</tags:display>
</TD>
<TD> <tags:display color="#ffcc11" bgcolor="#ffffcc" title="Sports"> America
n Football NBA Soccer
</tags:display>
</TD>
</TR>
</TABLE> </BODY> </HTML>
其中<tags:display color="#ffcc11" bgcolor="#ffffcc" title="Sports"> 每次设定
Tag文件中的相关的属性,而Tag标志文件则根据设定的属性显示相应的结果

你可能感兴趣的:(tomcat,Web,jsp,应用服务器,servlet)