如何编写自定义标签来读取和打印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_INCLUDEdoStartTag(),这意味着此标签包含正文并评估正文。 覆盖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?的主要内容,如果未能解决你的问题,请参考以下文章

Java - 如何读取自定义地图格式

如何在 Android 屏幕旋转上保存自定义 ArrayList?

如何读取android中xmpp消息标签中添加的自定义属性?

使用自定义排序顺序对对象的 ArrayList 进行排序

使用自定义排序顺序对对象的 ArrayList 进行排序

如何在android中读取xmpp消息标签的自定义属性?