posts - 37, comments - 8, trackbacks - 0, articles - 0

jsp程序设计:jstl之JSTL标签库(下)

Posted on 2008-10-26 23:37 梦与桥 阅读(1673) 评论(0)  编辑  收藏 所属分类: jsp程序设计
1、简单标签
    实现自定义标签的三个步骤:
    1)编写标签处理程序(java类)。
    2)编写标签库描述符(提供有关标签和库文件的元信息的XML文件)。
    3)JSP实现(包含自定义标签的JSP文件)。
2、开发简单的自定义标签
    1)标签处理程序wz.java的源代码如下:
package www.zzz;
import javax.servlet.jsp.tagext.*;
import java.io.*;
import java.util.*;
import javax.servlet.jsp.*;
public class wz extends SimpleTagSupport{
    
private String name;
    
private int age;
    
public void setName(String name) {
        
this.name = name;
    }

    
public void setAge(int age) {
        
this.age = age;
    }

    
public void doTag() throws JspException, IOException {
        JspWriter out 
= this.getJspContext().getOut();
        out.println(
"<h3>"+name+"的个人信息:</h3><br>");
        getJspContext().setAttribute(
"name","姓名:"+name+"<br>");
        getJspContext().setAttribute(
"age""年龄:"+age+"<br>");
        getJspBody().invoke(
null);
    }

}
    2)标签描述文件wz.tld的内容如下:
<?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/j2ee http://java.sun.com/xml/ns/j2ee/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>
        <description>Outputs Hello
, World</description>
        <name>wz</name>
        <tag-class>www.zzz.wz</tag-class>
        <body-content>scriptless</body-content>
        <attribute>
            <name>name</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>    
        <attribute>
            <name>age</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>    
    </tag>
</taglib>
    3)引入标签的JSP页面的源码:
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="/WEB-INF/tld/wz.tld" prefix="mytag"%>
<html>
    
<body>
        
<mytag:wz name="张三" age="15">
            ${name}
            ${age}
        
</mytag:wz>        
    
</body>
</html> 
注:编译后的类文件放到WEB-INF/classes目录下,描述文件tld放到WEB-INF/tld目录下(似乎哪个目录下都行,也可直接放到WEB-INF目录下,因为有uri引用吧),tag文件保存到web应用的WEB-INF/tags目录下。
    4)对wz.tld文件的解释:
    tlib-version:是必须的元素,指定标记库函数的版本号。
    short-name:为标记库指定一个缩略名称,用它可以作为标记库的默认名字空间。
    info:用来描述标记的文档信息,默认值为空。
    uri:用来指定连接到标记的附加源文件,即tld的公共可用副本。
    tag:是标记描述文件中最重要的一个元素,有6个子元素:name、tagclass、teiclass、bodycontent、info、attribute。
            name:用户指定的标记名称。
            tag-class:指定标记处理类,写全名,即带包的类。
            bodycontent:说明标记体的类型,分为4种:empty、jsp、scriptless、tagdependent。
                        empty:表示没有标记体。 
                        jsp:表示标记体可以为jsp代码。
                        scriptless:表示标记中不能用jsp脚本。
                        tagdependent:表示标签中的内容交给标记处理程序去进行处理。
            info:记录标记的描述信息。
            attribute:用来指定零个或者多个标记属性,有三个子元素:name、required、rtextprvalue。
                        name:必须设定,用来表示大小写敏感属性名称。
                        required:必须设定,标示属性是否一定要存在,默认为flase,即在标记处理程序中不会自动调用属性
                                                    的setAttribue方法。
                        rtextprvalue:用来说明属性是否可以是动态生成的,但设定为true时,属性即可以是一个常量值,也可
                                                    以由表达式生成。
 3、标签文件,是JSP2.0新增的功能,目的是让JSP网页开发人员能够直接使用JSP语法来制作标签,而无须了解java语言。其扩展名都是.tag或.tagx。假如Tag File包含其他完整的或片段的Tag File,JSP2.0规范建议扩展名为.tagf。
    1)Tag File的7个隐式对象:request、response、out、jspContext、session、application、config。
    2)Tag File的指令:
                tag        如同JSP网页的page指令。
                taglib    如同JSP网页的taglib指令。
                include  如同JSP网页的include指令。
                attribute 用来设定自定义标签的属性。
                variable 用来设TagFile的变量,此变量可回传至JSP网页。
    3)新增的几个动作:
                <jsp:attribute>标签:用来指定自定义标签属性块,必要时可以作为代码段输出。
                <jsp:doBody>标签:告诉容器去处理body,并且将处理结果添加到response中,可以有选择地使用"var"属性,捕获处理的结果,并在下一步进行处理。
                <jsp:invoke>标签:对作为属性传递的特定参数进行操作。
    4)开发并使用一个日期标签:datetag.tag与datetag.jsp
    datetag.tag的代码如下:
<%@tag pageEncoding="GBK"%>
<%@tag import="java.util.*,java.text.*"%>
<%@variable name-given="fulldate" scope="AT_BEGIN"%>
<%
  DateFormat fullformate 
= DateFormat.getDateInstance(DateFormat.FULL);
  
Date now = new Date();
  jspContext.setAttribute(
"fulldate", fullformate.format(now));
%>
<jsp:doBody/>  
    datetag.jsp的代码如下:
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib prefix="mytag" tagdir="/WEB-INF/tags/"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<html>
    
<body>
        
<h1>
            日期tag标签文件演示
        
</h1>
        
<mytag:datetag>
              标签体的输出:${fulldate}
<br>
        
</mytag:datetag>
        页面的输出:${fulldate}
    
</body>
</html>
    5)开发并使用一个求和标签:sumtag.tag与sumtag.jsp
    sumtag.tag的代码如下:
<%@tag pageEncoding="GBK"%>
<%@attribute name="items" required="true" rtexprvalue="true"%>
<%@attribute name="great" fragment="true"%>
<%@attribute name="less" fragment="true"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@variable name-given="sum" variable-class="java.lang.Object"%>
<c:if test="${not empty items}">
    
<c:forEach items="${items}" var="item">
        
<c:set var="sum" value="${item+sum}" />
    
</c:forEach>

    
<c:if test="${sum>=1000}">
        
<jsp:invoke fragment="great" />
    
</c:if>

    
<c:if test="${sum<1000}">
        
<jsp:invoke fragment="less" />
    
</c:if>
</c:if>
    sumtag.jsp的代码如下:
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib prefix="mytag" tagdir="/WEB-INF/tags/"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
    
<body>
        
<mytag:sumtag items="111,222,333">
            
<jsp:attribute name="great">
                
<font color="red"> SUM: ${sum}</font>
            
</jsp:attribute>
            
<jsp:attribute name="less">
                
<font color="blue"> SUM: ${sum}</font>
            
</jsp:attribute>
        
</mytag:sumtag>
    
</body>
</html>
注:tag文件保存到web应用的WEB-INF/tags目录下。
4、JSP标记与JavaBean有何区别?
    答:JavaBean存在先天的不足,它只是可复用组件,独立于运行环境而包装了一些数据和业务逻辑功能,无法获得运行环境信息,无法与JSP页面进行更加深层次的交互。自定义标记机制解决了它的这种的缺陷,标记库的处理类不但具有JavaBean的功能,而且可以把JSP的环境住处传到类中间,不但能得到JSP传递过来的属性,还能与JSP共用页面环境,JSP页面中可以通过session、page与标记处理程序进行数据通信,这一点是javaBean所不能实现的。

只有注册用户登录后才能发表评论。


网站导航: