<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" >
你是不是想调用
<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" >
那么你
<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>是要求你这个选项必须有值
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;
}}
我现在要做的就是把这个自定义的代码段变量传递给循环显示数组内容的标签<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>是因为我觉得代码段变量是在页面自定义的,所以我加上了这部分标签。
Tag example:iterate has one or more variable subelements and a TagExtraInfo class that returns one or more VariableInfo
好像就是说你的example:iterate中的变量有问题
在createArrayTag 类中我没有设定get方法的原因是,我使用了TagExtraInfo的辅助类。
它可以动态的创建代码段变量,而不是依赖TLD中的代码。也就是我上面说过的
<example:iterate strings="theArray" >在这里strings的数值是随意定义的。而且可以直接拿来使用<%= theArray.length %> 。
部分改成<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