如何编写自定义标签来读取和打印arraylist?
Posted
技术标签:
【中文标题】如何编写自定义标签来读取和打印arraylist?【英文标题】:How to write a custom tag to read and print arraylist? 【发布时间】:2014-07-14 02:33:57 【问题描述】:我是 jsp 自定义标签的新手。我想要的是使用自定义标签在我的 jsp 页面中打印 ArrayList。
我的自定义标签的 .tld 文件在下面,
<tag>
<name>HotelDetails</name>
<tag-class>it.testproject.custom.HotelDetails</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>id</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>hotelArray</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.util.ArrayList</type>
</attribute>
</tag>
这里我使用了属性来获取arraylist。我可以在jsp页面中访问它。
我的标签处理程序类看起来像,
package it.testproject.custom;
import java.util.ArrayList;
import java.util.Iterator;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class HotelDetails extends BodyTagSupport
private static final long serialVersionUID = 1141701851233089895L;
private Hotel hotel;
private ArrayList<Hotel> hotelArray;
City regionCity;
Iterator<Hotel> it;
public ArrayList<Hotel> getHotelArray()
return hotelArray;
public void setHotelArray( ArrayList<Hotel> hotelArray )
this.hotelArray = hotelArray;
it=hotelArray.iterator();
System.out.println( "[HotelDetails] Hotels : " + hotelArray.size() );
@Override
public int doStartTag() throws JspException
hotel=it.next();
pageContext.setAttribute( "hotelName", hotel.getName() );
pageContext.setAttribute( "hotelDesc", hotel.getDescription() );
pageContext.setAttribute( "hotelRating", hotel.getStarRating() );
pageContext.setAttribute( "defaultPrice", hotel.getTotalPriceWithTax() );
System.out.println(hotel.getName()+" "+hotel.getStarRating());
// pageContext.setAttribute( "hotelDesc", hotel.getDescription() );
// pageContext.setAttribute( "hotelRating", hotel.getStarRating() );
// pageContext.setAttribute( "hotelMainImage", hotelImageBase + hotel.getMainImage().getImageURL() );
return EVAL_BODY_INCLUDE;
我返回了 EVAL_BODY_INCLUDE,它只得到一个结果。我在一些关于 EVAL_PAGE 的帖子中看到自动调用 doStartTag() 。我试过了,但没有结果。请帮忙。
【问题讨论】:
【参考方案1】:简单标签
一个简单的标签具有以下特点:
标签的开始和结束 - 在标签内没有指定正文 - 没有属性例如
<mytag:hello/>
带有属性的标签
具有属性的标签具有以下特点:
标签的开始和结束 标签内的属性 没有封闭主体例如
<mytag:hello attribute = "value" />
用正文标记
带有body的标签具有以下特点:
标签的开始和结束 可能是属性 标签内包含正文例如
<mytag:hello optional_attributes ............>
some body
</mytag:hello>
查看Building a Custom Tag Library,它描述了每个事件方法(doStartTag、doAfterBody 和 doEndTag)执行时“经典”自定义标记事件模型的语义,并解释了每个事件方法的返回值的含义;并编写一个标签处理程序类。
标签处理方法
标签生命周期
现在这是您实际问题的解决方案
覆盖仅返回EVAL_BODY_INCLUDE
的doStartTag()
,这意味着此标签包含正文并评估正文。
覆盖doAfterBody()
,首先检查迭代器是否有下一项
如果找到项目,则在页面上下文中设置属性并返回EVAL_BODY_AGAIN
以再次调用doAfterBody()
方法
如果没有更多项目,则只需返回 SKIP_BODY
,即退出 doAfterBody()
方法。
示例代码:
JAVA
public class HotelDetails extends BodyTagSupport
private static final long serialVersionUID = 1141701851233089895L;
private Hotel hotel;
private ArrayList<Hotel> hotelArray;
Iterator<Hotel> it;
public ArrayList<Hotel> getHotelArray()
return hotelArray;
public void setHotelArray(ArrayList<Hotel> hotelArray)
this.hotelArray = hotelArray;
it = hotelArray.iterator();
@Override
public int doStartTag() throws JspException
return EVAL_BODY_INCLUDE;
@Override
public int doAfterBody() throws JspException
if (it.hasNext())
hotel = it.next();
pageContext.setAttribute("hotelName", hotel.getName());
pageContext.setAttribute("hotelDesc", hotel.getDescription());
return EVAL_BODY_AGAIN;
else
return SKIP_BODY;
JSP:
<h:HotelDetails hotelArray="<%=hotels%>">
<c:out value="$hotelName " /> : <c:out value="$hotelDesc " />
</h:HotelDetails>
【讨论】:
以上是关于如何编写自定义标签来读取和打印arraylist?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Android 屏幕旋转上保存自定义 ArrayList?