Tomcat4.1.12在处理自定义tag时的一个缺陷
1. 前言
刚才在练习写一个tag时,在Tomcat4.1.12环境下运行时发现了一些奇怪的现象,经过分析和测试,发现Tomcat4.1.12在处理自定义tag时有些问题。
2. 现象
问题一
我在tag中有一个属性设定成不可以接受请求时变量,也就是说只能接受静态值,可是我在JSP中使用时发现Tomcat4.1.12处理这种情况时跟JSP规范(我参考的是JSP1.2)的规定不符,它没有在编译时扔出错误,运行时也没有扔异常,反而是忽略掉这个不合法的参数,并且在执行tag实现类时对于该属性以空串视之。
问题二
这个问题是在实验问题一时偶然发现的,当你修改tld文件后,即使重启了tomcat,如果你的JSP没有修改过,那么在请求该JSP时,你对tld文件的修改不会起作用。(我分析是JSP没有被修改,就不会被重新编译,就不会重新参考tld文件,也就不会重新分析tld文件,那么对tld文件的修改就不会起作用。)但我认为这种处理对JSP程序员修改tld文件极为不利,这种处理方式是不合理的。
3. Tomcat5.0的对比
通过在Tomcat5.0的环境下做实验,Tomcat5.0下没有上述的两个问题。如果对不接受请求时变量的属性赋请求时变量,将会在请求该JSP时扔出异常。Tomcat5.0也能对tld文件的修改即时反应,甚至连tomcat都不必重启。
4. 我的测试程序源码
index.jsp
<%@ taglib uri="/WEB-INF/tlds/mylib.tld" prefix="test0" %>
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<%
String theValue = "maojb";
%>
<html>
<body bgcolor="white">
<test0:hello name="<%=("111"+theValue)%>"/>
<p> <%=new Date()%>
</body>
</html>
HelloTag.java
package com.mycompany;
import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HelloTag extends TagSupport {
private String name = "World";
public void setName(String name) {
this.name = name;
}
public int doEndTag() {
try {
pageContext.getOut().println("Hello xiaocx " + name);
} catch(IOException e) {
}
return EVAL_PAGE;
}
}
mylib.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>
<jspversion>1.1</jspversion>
<shortname>test</shortname>
<tag>
<name>hello</name>
<tagclass>com.mycompany.HelloTag</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>nam</name>
<required>yes</required>
<rtexprvalue>no</rtexprvalue>
</attribute>
</tag>
</taglib>
目录机构如下
index.jsp
WEB-INF
casses
com
mycompany
HelloTag.class
tds
mylib.tld