<example:iterate strings="theArray" >中的iterate 你在*.tld中没配置
你是不是想调用
    <tag>
        <name>createArray</name>
        <tagclass>com.wrox.ch10.createArrayTag</tagclass>
        <tei-class>com.wrox.ch10.arrayExtraInfo</tei-class>
        <attribute>
         <name>name</name>
        </attribute> 
    </tag>那么你把<example:iterate strings="theArray" >改成<example:createArraystrings="theArray" >

解决方案 »

  1.   

    根据你<example:iterate strings="theArray" >这句
    那么你
    <tag>
            <name>iterate</name>
            <tagclass>com.wrox.ch10.iterateTag</tagclass>
            <tei-class>com.wrox.ch10.arrayExtraInfo</tei-class>
            <attribute>
             <name>strings</name>
             <rtexprvalue>true</rtexprvalue>
            </attribute> 
            <variable>
             <name-given>currentString</name-given>
             <variable-class>java.lang.String</variable-class>
             <declare>true</declare>
             <scope>NESTED</scope>
            </variable>
            <variable>
             <name-given>arrayCount</name-given>
             <variable-class>java.lang.Integer</variable-class>
             <declare>true</declare>
             <scope>NESTED</scope>
            </variable>
        </tag>中的   <rtexprvalue>true</rtexprvalue>就不用要了,他说明你的这个字段可以从叶面获取
    而你没用,还有<variable></variable>这两个一般不用要吧,我都没用
     <tag>
            <name>iterate</name>
            <tagclass>com.wrox.ch10.iterateTag</tagclass>
               <attribute>
             <name>strings</name>
     <required>true</required>
        </attribute>
        </tag>
    就行了了
    <required>true</required>是要求你这个选项必须有值
      

  2.   

    你的public class createArrayTag extends TagSupport{
        private String name = null;    public int doStartTag(){
            String[] strings = new String[]{"Alpha","Bruce Lee","Omega"};
            pageContext.setAttribute(name,strings);
            return SKIP_BODY;
        }    public void setName(String newName){
            name = newName;
        }
    }中怎么光有
        public void setName(String newName){
            name = newName;
        }
     还应有吧?
    这样改public class createArrayTag extends TagSupport{
        private String name = null;
        public String getName(){
            return name ;
        }    public void setName(String newName){
            name = newName;
        }    public int doStartTag(){
            String[] strings = new String[]{"Alpha","Bruce Lee","Omega"};
            pageContext.setAttribute(name,strings);
            return SKIP_BODY;
        }
      public int doEndTag() {
        return EVAL_PAGE;
      }}
      

  3.   

    我还是好好解释一下我想怎么实现这个程序吧.本人刚刚学习标签库,有些地方说的不对请多指教。虽然是一个简单的显示数组循环的例子。里面要求能够在页面自由定义代码段变量即<example:iterate strings="theArray" >在这里strings的数值是随意定义的。而且可以直接拿来使用<%= theArray.length %> ,如果把后面显示循环的部分去掉。页面就能正常显示:The array has 3 items.。
    我现在要做的就是把这个自定义的代码段变量传递给循环显示数组内容的标签<example:iterate strings="theArray" >。当然我没有成功,我不知道问题出在哪里。其中玉涵兄提到的<rtexprvalue>true</rtexprvalue>和2个<variable></variable>都去掉。我觉得不妥。加入       
           <variable>
             <name-given>currentString</name-given>
             <variable-class>java.lang.String</variable-class>
             <declare>true</declare>
             <scope>NESTED</scope>
            </variable>
            <variable>
             <name-given>arrayCount</name-given>
             <variable-class>java.lang.Integer</variable-class>
             <declare>true</declare>
             <scope>NESTED</scope>
            </variable>
    是为了在循环中能够灵活的控制变量的显示位置。
    至于<rtexprvalue>true</rtexprvalue>是因为我觉得代码段变量是在页面自定义的,所以我加上了这部分标签。
      

  4.   

    按照你说的,如果需要叶面获值,那么<rtexprvalue>true</rtexprvalue>是应该有的,但对于<variable></variable>我不太了解,我一直没用到他,所以我感觉不需用到他,
      

  5.   

    但是你的这句异常
    Tag example:iterate has one or more variable subelements and a TagExtraInfo class that returns one or more VariableInfo
    好像就是说你的example:iterate中的变量有问题
      

  6.   

    玉涵兄根据你的修改,运行通过了么?
    在createArrayTag 类中我没有设定get方法的原因是,我使用了TagExtraInfo的辅助类。
    它可以动态的创建代码段变量,而不是依赖TLD中的代码。也就是我上面说过的
    <example:iterate strings="theArray" >在这里strings的数值是随意定义的。而且可以直接拿来使用<%= theArray.length %> 。
      

  7.   

    还有按理来说我应该把<example:iterate strings="theArray" >
    部分改成<example:iterate strings="<%=theArray %>" >不过修改之后依然错误。
    似乎还是循环标签出的问题。
    错误如下:
    -------------------------------------------------------------------------------
    HTTP Status 500 - --------------------------------------------------------------------------------type Exception reportmessage description The server encountered an internal error () that prevented it from fulfilling this request.exception org.apache.jasper.JasperException
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:358)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    root cause java.lang.NullPointerException
    com.wrox.ch10.iterateTag.doStartTag(iterateTag.java:23)
    org.apache.jsp.teiExample3_jsp._jspService(teiExample3_jsp.java:83)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
    note The full stack trace of the root cause is available in the Tomcat logs.
    --------------------------------------------------------------------------------Apache Tomcat/5.0.12
      

  8.   

    我没有调试,我只是凭自己以前的做法;提出的改正方法。我是没招了,又见识了好多新知识,又要在学习学习了;顺便问一下,你是不是在看乐思那本《jsp编程指南》,看来我也要在研究研究它了
      

  9.   

    是的,书的名字是《jsp web 编程指南》。
      

  10.   

    咱们不是一本书,我的是乐思《jsp编程指南》,
      

  11.   

    多谢玉涵兄参与探讨。我的msn是[email protected]有空多多交流