【问题标题】:How to write a custom tag to read and print arraylist?如何编写自定义标签来读取和打印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() 。我试过了,但没有结果。请帮忙。

【问题讨论】:

    标签: java jsp arraylist


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 2020-03-21
      • 1970-01-01
      • 2023-03-22
      • 2013-04-15
      相关资源
      最近更新 更多