posts - 2, comments - 12, trackbacks - 0, articles - 12

JSP学习笔记--JSP标签库

Posted on 2006-04-27 11:05 BBZ.DD.A 阅读(217) 评论(0)  编辑  收藏 所属分类: 我的文章分类

1.JSP标签库(也称自定义库)可看成是一套产生基于XML脚本的方法,它经由JavaBeans来支持。在概念上说,标签库是非常简单和可以重用的代码构造。它可以大大简化你在页面中输入各种录入框的代码(诸如此类的代码:<input type="text" name="taxpayerName" value = " ,<select name="collectionItemCode" class="required" style="width:200" ...),并使之结构化。

2.标签库(Tag libraries)提供了建立可重用代码块的简单方式。但是和COM和J2EE不同的是,你不需要掌握任何额外的技能就可以建立标签库:如果你会编写JSP页面,你就会建立标签库。最后,标签库还改进了Web应用程序的维护性。这种对维护性的改进表现在:轻易地在JSP页面上就实现了基于XML的可定制接口。

3.一个简单的标签由下面的元素构成:
  ⑴ JavaBeans:为了得到Java与生具来的面向对象的好处,可重用的代码应该放到一个独立的代码容器中。这些JavaBeans并不是标签库的一部分。不过它是你的代码库用来执行相关任务的基本代码块。
  ⑵ 标签处理:这是标签库的真正核心。一个标签处理器将引用它需要的任何资源(你的JavaBeans)和访问你的JSP页面的全部信息(pageContext对象)。JSP页面也会将所有已经被设置的标签属性和JSP页面上的标签体中的内容传送给标签处理器。在标签处理器处理完毕后,它将发回输出到你的JSP页面进行处理。
  ⑶ 标签库的描述(tld文件):这是一个简单的XML文件,它记录着标签处理器的属性、信息和位置。JSP容器通过这个文件来得知从哪里及如何调用一个标签库。
  ⑷ 网站的web.xml文件:这是你网站的初始化文件,在这个文件中,你定义了网站中用到的自定义标签,以及哪个tld文件用来描述每个自定义的标签。
  ⑸ 分发文件(一个WAR或者JAR文件):如果你想重用自定义标签的话,你需要一个方法来将它由一个项目转移到另一个项目中。将标签库打包为一个JAR文件是一个简单而且有效的方式。
  ⑹ 在你的JSP文件中作标签库声明:很简单,如果要用到该标签的话,只要在页面声明一下就可以,其后,你就可以在该JSP页面的任何地方使用它。

下面是一个实例
1. 先编写标签处理程序,ATMTag.java
package tagtest;

import javax.servlet.jsp.tagext.TagSupport;
import java.sql.*;
import javax.servlet.jsp.JspWriter;
import java.util.Vector;

//实现TagSupport或BodyTagSupport接口
public class ATMtag extends TagSupport{

  Connection con = null;
  Statement st = null;
  ResultSet rs = null;


  public ATMtag() throws ClassNotFoundException{
    Class.forName("org.gjt.mm.mysql.Driver");
  }


  public int doStartTag(){
    return EVAL_BODY_INCLUDE;
  }

  public int doEndTag(){
    try{
      JspWriter writer = pageContext.getOut();
      con = DriverManager.getConnection("jdbc:mysql://localhost/test?useUnicode=true&amp;characterEncoding=GBK","root","");
      String query = "select username,pass,email from userinfo";
      System.out.println("Query="+query);
      st = con.createStatement();
      rs = st.executeQuery(query);
      String username = null;
      String password = null;
      String email = null;
      Vector v = new Vector();

      while(rs.next()){
        username = rs.getString(1);
        password = rs.getString(2);
        email = rs.getString(3);
        v.add(username);
        v.add(password);
        v.add(email);
        v.add("...");
      }


      for(int i=0;i<v.size();i++){
        String containt = (String)v.elementAt(i);
        pageContext.getOut().print(containt);
      }

    }
    catch(Exception e){
      System.out.println("Error is here:"+e.toString());
    }
    return EVAL_PAGE;
  }

}

2. 编写TLD文件的代码:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"
http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
//标签库版本
<tlibversion>1.0</tlibversion>
//标签库依赖的JSP版本
<jspversion>1.1</jspversion>
//标签库名
<shortname>ATM</shortname>
<uri>/ATM</uri>
<tag>
//定义标签的名
<name>message</name>
<tagclass>tagtest.ATMtag</tagclass>
//此标签体的定义
<bodycontent>JSP</bodycontent>
</tag>
</taglib>

3. 错误页面errorpage.jsp的代码:

<html>
<body>
<%@ page isErrorPage="true" %>
<%=exception.getMessage() %>
</body>
</html>


4. 编写JSP文件:ATM.jsp
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/ATM" prefix="mm" %>
<%@ page errorPage="errorpage.jsp" %>
<!DocType HTML Public "-//W3C//DTD HTML 4.0 Translational//EN ">
<html>
<table>
<tr><td></td><td><mm:message/></td></tr>
</table>
</html>

5.web.xml文件配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "
http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <taglib>
    <taglib-uri>/ATM</taglib-uri>
    <taglib-location>/WEB-INF/ATM.tld</taglib-location>
  </taglib>
</web-app>


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


网站导航: