Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->JAVA/JSP教程 ->正文

Servlet和JSP迈上新台阶

来源:Linuxdby.com 作者:Webmaster 时间:2007-06-03 点击: [收藏] [投稿]

EL最初是由JSP标准标记库(JSTL)1.0规范定义的,它可协助从JSP页面中删除Java代码。javax.servlet.jsp.el包中所描述的API揭示EL的语义。EL表达式的语义与Java表达式的语义类似;表达式的值计算出来后被插入到当前的输出中。EL可用于标准的或定制的操作的属性值以及模板文本中。下面是EL表达式的结构(其中expr为表达式):


${expr}


对于包含字符序列"${"的文字值,JSP 2.0提供了一种方法,通过使用序列"${'${'"进行换码。例如,下面的字符序列被转换为文字值${expr}:


${'${'}expr}


此外,由于JSP 2.0以前的版本不支持EL,所以JSP应用程序将忽略任何Web应用程序中的EL,这些应用程序的web.xml根据Servlet 2.2或Servlet 2.3 DTD进行验证。为了测试此处讲到的JSP页面中的表达式,你只需从应用程序中删除web.xml文件。

实际上,EL是一种简单的语言,它帮助页面创作者访问JSP隐含对象,进行反复操作以及不包含Java代码的条件操作--这些在JSP 1.2中是无法实现的。

为了访问隐含对象,JSP容器支持下面的名称-对象映射:


pageContext。PageContext对象


pageScope。将页面范围的属性名映射到它们的值


requestScope。将请求范围的属性名映射到它们的值


sessionScope。将会话范围的属性名映射到它们的值


applicationScope。将应用程序范围的属性名映射到它们的值


param。将参数名映射到一个单一串参数值


paramValues。将参数名映射到该参数所有值的一个字符串数组


header。将标头名映射到一个单一串标头值


headerValues。将标头名映射到该标头所有值的一个字符串数组


cookie。将cookie名映射到一个单一cookie对象


initParam。将上下文初始化参数名映射到其字符串参数值

例如,下面的表达式表示参数userName的值:


${param.userName}


下面的表达式返回Session对象的productId属性的值:


${sessionScope.productId}


更简单的SimpleTag接口操作过程。JSP 2.0提供了一个新的接口javax.servlet.jsp.tagext.SimpleTag,它是编写标记处理器(tag handler)的一种更简单的方法。在JSP 1.2中,标记处理器必须直接或间接地实施avax.servlet.jsp.tagext包中的下列接口之一:Tag、IterationTag或BodyTag。对于实施Tag接口的标记处理器来说,最基本的情况是,JSP容器每次遇到JSP页面中的一个标记时就调用doStartTag和doEndTag两个方法。利用JSP 2.0,JSP程序员可以通过实施新的SimpleTag接口来选择实施过程更简单的标记处理器。JSP容器并不调用实施Tag接口的标记处理器的两个方法,而只需要调用SimpleTag接口中的一个方法:doTag。所有标记逻辑、反复操作和主体评估等都用这一个方法来执行。所以,SimpleTag与javax.servlet.jsp.tagext.BodyTag功能一样强大,但操作过程更简单。

为了支持需要实施SimpleTag接口的标记处理器的编写,javax.servlet.jsp.tagext包提供了一个名为SimpleTagSupport的支持类。如果你要扩展这个类,则你只需提供一个执行方法:doTag。

代码清单3给出了一个扩展SimpleTagSupport的标记处理器的例子。

使用标记文件更轻松地开发标记库。众所周知,JSP 1.2中的自定义标记库需要花很多时间来开发。开发工作涉及标记处理器和标记库描述符(TLD)文件的开发,以及标记库在web.xml文件中的注册。JSP 2.0通过提供一种新的编写自定义标记库的方法解决了这个问题。使用标记文件,标记扩展可类似于JSP文件。无需编译,无需编辑web.xml文件,而且不再需要TLD。要做的是你必须把标记文件复制到WEB-INF/ tags目录中,而这一点很容易做到。剩下的事都交给JSP容器去做,它会把WEB-INF/tags目录中找到的每个标记文件转换为标记处理器。程序员完全摆脱了构建标记处理器的复杂工作。

下面举个例子。这是标记库最简单的形式,其中标记文件只是简单地把一个字符串写到隐含对象中。


<%— example1.tag file, must reside in
      WEB-INF/tags —%>

<%
  out.println("Hello from tag file.");
%>


使用JSP页面中的标记库再简单不过了。和平常一样,你只需taglib指令,通过前缀属性在整个页面中识别标记库。现在你有一个tagdir属性,而不是uri属性。tagdir属性引用WEB-INF/tags目录或WEB-INF/tags下的任何子目录。


下面是一个使用example1.tag文件的JSP页面的例子。


<%@ taglib prefix="easyTag"

          tagdir="/WEB-INF/tags" %>
<easyTag:example1>
</easyTag:example1>


调用该JSP页面浏览器上就会显示下面的字符串:


Hello from tag file.


结合上面讲到的表达式语言,你就可以真正快速构建无脚本的JSP页面。再举一个例子,下面的标记文件(叫做example2.tag)通过调用JSP页面接收一个属性,并将它转换为大写字母。


<%— example2.tag file, must reside
    in WEB-INF/tags —%>
<%@ attribute name="x" %>
<%
  x = x.toUpperCase();
  out.println(x);
%>

下面是使用该标记文件的JSP页面:


<%@ taglib prefix="easyTag"

          tagdir="/WEB-INF/tags" %>
<easyTag:example2 x="hello">
</easyTag:example2>


下面是另一个例子,其中没有Java代码:

 

<%— example3.tag file, must
    reside in WEB-INF/tags —%>
<%@ variable name-given="x"
            scope="AT_BEGIN" %>
<%@ taglib prefix="c"           
          uri="

 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:JSP 2.1技术规范投票通过 表达式语言有所改进   下一篇:jsp2.0新特性

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号