JSP(JavaServer Pages)技术是对Servlet的进一步抽象,它由JCP(Java Community
Process)开发,是用于生成动态内容的开放式的、可免费获取的规范,也是J2EE(Ja
va 2 Enterprise Edition)规范的重要组成部分。JSP2.0版是对JSP1.2的升级,增加了
一些有趣的新特性。JSP2.0的目标是:
?使动态网页的设计更加容易
?简化JSP页面,使得JSP页面容易维护
?使WEB应用程序前后台应用更清晰
?无需学习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标志文件则根据设定的属性显示相应的结果。
-----------
Process)开发,是用于生成动态内容的开放式的、可免费获取的规范,也是J2EE(Ja
va 2 Enterprise Edition)规范的重要组成部分。JSP2.0版是对JSP1.2的升级,增加了
一些有趣的新特性。JSP2.0的目标是:
?使动态网页的设计更加容易
?简化JSP页面,使得JSP页面容易维护
?使WEB应用程序前后台应用更清晰
?无需学习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标志文件则根据设定的属性显示相应的结果。
-----------
发表评论
-
基于按annotation的hibernate主键生成策略
2011-06-21 12:36 874这里讨论代理主键,业务主键(比如说复合键等)这里不讨论。 一、 ... -
Spring 3 MVC 教程集合
2011-02-21 14:20 4050Part 1: Introduction to Spring ... -
Hibernate Validator 内置的约束条件
2011-02-07 13:29 15742.4. 内置的约束条件 Hibernate Validato ... -
Java正则表达式
2010-12-29 09:57 686< type="text/javascript ... -
java 音频 合成
2010-12-23 09:28 3248/** * 将两个wav音频文件合并成一个音频文件 * ...
相关推荐
本实例将深入探讨`Tag`的使用,以及如何通过JSP 2.0新特性来简化自定义标签的开发过程。 自定义标签的核心在于Tag Handler,这是处理特定标签行为的Java类。在JSP 2.0之前,创建自定义标签需要编写复杂的TLD(Tag ...
JSP 2.0在JSP 1.2的基础上做了许多改进,引入了许多新特性和功能: - **表达式语言(EL, Expression Language)**:EL是一种轻量级的脚本语言,用于简化JSP页面中的数据访问。它提供了一种简洁的方式来获取和设置...
通过覃华教授的JSP2.0教学PPT,学习者可以系统地学习JSP2.0的核心概念、新特性,以及如何利用这些特性进行实际的Web应用开发。通过实践项目,加深理解并提升技能,为将来从事Java Web开发打下坚实基础。
总之,《jsp 2.0技术手册中文版》涵盖了JSP 2.0的核心概念、新特性和实践技巧,是学习和掌握这一技术的重要参考资料。通过深入阅读和实践,开发者可以更好地利用JSP 2.0构建高效、可维护的Web应用程序。
1. **表达式语言(EL)**:EL(Expression Language)是JSP 2.0引入的新特性,用于简化页面中的数据绑定。它提供了一种简洁的语法,可以方便地访问JavaBean的属性,无需使用脚本let或JSP动作。 2. **标准标签库(JSTL)...
9. **JSP 2.0新特性** - **内置对象**:如`pageContext`、`session`、`request`等,无需再通过`jsp:useBean`声明。 - **分离Java代码**:鼓励使用Servlet 2.4的MVC模式,将业务逻辑移至Java类中,JSP仅用于显示...
JSP 2.0新特性** - **标签文件(Tag Files)**:JSP 2.0引入了新的标签文件格式,允许将自定义标签的实现与声明分开,提高了可读性和可重用性。 - **EL(Expression Language)**:增强了表达式语言,使其更加强大...
- **JSP 2.0 新特性**:详细介绍JSP 2.0相对于1.2版本的新特性,包括自定义标签的开发和使用。 - **开发实例**:提供丰富的示例代码,帮助读者理解和应用JSP 2.0技术。 **3. 光盘源码分析** 光盘源码通常包含与...
**正文** ...综上,《JSP2.0技术手册》涵盖了JSP2.0的各个方面,包括核心概念、新特性和实战应用,是学习和进阶JSP技术的重要参考资料。通过深入学习,开发者能够构建高效、易于维护的Web应用程序。
**二、JSP 2.0 的新特性** 1. **表达式语言(EL, Expression Language)**:EL简化了页面中的数据绑定,使得在JSP页面中获取和设置JavaBean属性变得更为方便。 2. **JSTL(JavaServer Pages Standard Tag Library)*...
JSP 2.0是这个技术的一个重要版本,它引入了许多改进和新特性,使得开发Web应用程序更加便捷和高效。本教程由覃华编写,旨在为大学学习者提供全面的JSP 2.0知识,帮助他们掌握这一核心技术。 **JSP 2.0 的主要特性*...
此外,手册还深入探讨了JSP 2.0中的新特性,如表达式语言(EL)、JSP标准标签库(JSTL)以及JSP 2.0的自定义标签开发。这些新特性使得JSP页面开发更加简洁、高效和易于维护。 最后,手册通过一系列实战案例,展示了...
**JSP 2.0 API 知识点详解** ...JSP 2.0是其一个重要版本,带来了许多改进和新特性,提升了开发效率...共享的“JSP2.0 API chm”帮助文档无疑是一个宝贵的资源,有助于开发者在实践中进一步探索和提升JSP 2.0的技术水平。
JSP2.0技术手册中的源码可能包含了各种示例,涵盖了JSP2.0的新特性和最佳实践。通过学习这些源码,开发者可以深入理解JSP的工作原理,提升实际项目开发能力。 **七、JSP2.0技术手册的价值** 该手册提供了详尽的JSP...
这些实例涵盖JSP基本元素的使用、EL和JSTL的实践以及JSP 2.0新特性的应用。 通过深入学习本手册,初学者不仅可以掌握JSP 2.0的基础知识,还能了解到如何利用这些知识构建实际的web应用程序。对于希望快速入门JSP和...
**JSP2.0新特性** 1. **表达式语言(EL)**:JSP2.0引入了EL,它是一种简洁的语法,用于在页面上获取和操作JavaBean的属性。EL简化了JSP页面中的脚本元素,提高了可读性和可维护性。 2. **JSTL(JavaServer Pages ...
在本手册中,你将深入理解JSP2.0的关键特性、语法以及最佳实践。 ### JSP2.0的主要改进与特性 1. **表达式语言(EL)增强**:JSP2.0引入了更强大的EL,它允许开发者用简洁的语法访问JavaBean属性,减少了页面中的...