gpt4 book ai didi

java - 如何编写自定义标签来读取和打印数组列表?

转载 作者:行者123 更新时间:2023-11-30 09:07:47 24 4
gpt4 key购买 nike

我是 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>

这里我使用属性来获取数组列表。我可以在 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() 。我试过了,但没有结果。请帮忙。

最佳答案

简单标签

一个简单的标签有以下特点:

  • 标签的开始和结束 - 标签内没有指定正文 - 没有属性

例如

<mytag:hello/>

带属性的标签

具有属性的标签具有以下特征:

  • 标签的开始和结束
  • 标签内的属性
  • 没有封闭 body

例如

<mytag:hello attribute = "value" />

正文标签

带有正文的标签具有以下特征:

  • 标签的开始和结束
  • 可能是属性
  • 正文包含在标签中

例如

<mytag:hello optional_attributes ............>
some body
</mytag:hello>

看看Building a Custom Tag Library描述了执行每个事件方法(doStartTag、doAfterBody 和doEndTag)时“经典”自定义标记事件模型的语义,并解释了每个事件方法的返回值的含义;并编写一个标签处理程序类。

标签处理方法

enter image description here

标签生命周期

enter image description here


现在这是您实际问题的解决方案

  • 覆盖仅返回 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>

关于java - 如何编写自定义标签来读取和打印数组列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23851143/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com