Tomcat4.1.12在处理自定义tag时的一个缺陷

来源:互联网 发布:二分搜索算法 编辑:程序博客网 时间:2024/05/16 12:21

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

 

原创粉丝点击