技术开发 频道

用JSTL增强Web应用程序的弹性



二、  通过自定义JSP Tag增强代码重用性
 
    自定义JSP tag是将Java代码封装在JSP中的最直接的方法,使用这种方法可以大大增强程序的重用性和代码依赖性。如我们经常会遇到在使用SQL返回结果时在一台服务器上没问题,而在另外一台服务器上却出现了编码错误。如果我们查看返回结果的信息头时也许会发现是由于数据库驱动的版本的问题。因此,我们就需要一个友好的界面来调试这些错误。最好的方法是建立一个拥有这样功能的Tag库来满足我们的要求,建立Tag的步骤如下:

1. 写一个tag库定义文件。这个定义文件描述了servlet容器所使用的tag库的语法。Tag的名子使用<tag><name>定义,java类使用<tag><tagclass>定义。其它的定义请看如下代码:
 
<?xml version="1.0" encoding="GBK"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>1.0</tlib-version> <jsp-version>1.2</jsp-version> <short-name>Article</short-name> <uri>article.tld</uri> <display-name>简单tag实例</display-name> <description>在网页设计器中隐藏代码的tag</description> <tag> <name>debug</name> <tagclass>playground.berg.tag.Debug</tagclass> <info>打印调试信息</info> <bodycontent>empty</bodycontent> </tag> </taglib>

2. 写相应的java类。这些类从javax.servlet.jsp.tagext.BodyTagSupport类继承,并覆盖了doStartTag()方法以便在JSP中产生html代码。在这里需要注意的由于功能的不同,覆盖的也会不同。由于在这里<bodycontent></bodycontent>中的内容已经为empty了,因此,我们只需要覆盖一个方法。类的实现代码如下:

package playground.berg.tag; import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.IOException; import java.util.*; public class Debug extends BodyTagSupport { public int doStartTag() throws JspException { JspWriter out = pageContext.getOut(); try { out.println(systemPropertiesAsHTMLTable()); } catch (IOException e) { throw new JspTagException( "Debug tag error: "+e.getClass().getName()); } return SKIP_BODY; } private String systemPropertiesAsHTMLTable(){ String message= "<h3>Checking System Properties.....</h3>"; message+="<table border=1 width=\"80%\" align= \"center\"><tr><td><b>Name</b></td><td>Value </td></tr>\n"; Properties properties =System.getProperties(); Enumeration enumeration = properties.propertyNames(); for (; enumeration.hasMoreElements(); ) { String name = (String)enumeration.nextElement(); String value = (String)properties.get(name); message+="\t<tr><td><b><i>"+name+"</i></b> </td><td><i>"+value+"</i><td></tr>\n"; } message+="</table>"; return message; } }

    上面代码的systemPropertiesAsHTMLTable()方法来枚举所有的系统属性并产生一个HTML表,将这些字符串按name和value的形式存在表中。虽然在程序中使用硬编码是一种不好的习惯,但为了简便起见,在本例中仍然使用了硬编码。但读者在实际项目中可以通过参数将CSS文件名传入,并使用CSS来设置格式。

    这需要提一下的是TLD文件存放的位置,一般我们会将TLD文件放到WEB-INF目录或其子目录中,如果TLD文件放在WEB-INF目录中,那么我们应该在WEB-INF\web.xml文件中加入如下内容:
<taglib> <taglib-uri>article.tld </taglib-uri> <taglib-location> /WEB-INF/article.tld </taglib-location> </taglib>
    我们可以按如下代码来使用这个tag。
<%@ taglib uri= "/WEB-INF/article.tld" prefix= "info" %> <info:debug/>
0
相关文章