自定义标签(下)

简介: 自定义标签(下)

                                         一.for标签

1.定义:

JSP中的for标签是JSTL中的核心标签库之一,用于迭代一个集合(比如数组、列表等)并在循环体中进行一些操作。<c:forEach> 标签非常类似于Java中的for循环,它支持多种循环控制语句,如break、continue、varStatus 等。

2.语法:

<c:forEach var="item" items="${collection}">
   <!-- 在这里生成 HTML 代码,用 ${item} 替代实际的循环变量值 -->
</c:forEach>

其中,var 参数指定了一个在每次循环中声明的局部变量名,并且该变量的值会设置为当前迭代中的集合元素。items参数指定了要循环的集合。

在循环体中,可以使用 ${item} 表达式引用变量或者在表达式中使用 varStatus 变量访问迭代的状态信息。

3.自定义for标签

1.建立实现类

 

package com.lz.text;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class Text1 extends BodyTagSupport {
  /***
   * fore标签
   * 
   * <c:forEach items="${}" var="c"
   * 
   * items 类型:list  
   *  var 类型:string 线路:
   *   第二条: eval_boby_include 
   *   第三条: eval_boby_again
   * 
   */
  //数据源遍历
  private List<Object> items =new ArrayList<Object>();
  //对象指针 
  private String var;
  /**
   * @return the items
   */
  public List<Object> getItems() {
    return items;
  }
  /**
   * @param items
   *            the items to set
   */
  public void setItems(List<Object> items) {
    this.items = items;
  }
  /**
   * @return the var
   */
  public String getVar() {
    return var;
  } 
  public Text1() {
    super();
  }
  /**
   * @param var
   *            the var to set
   */
  public void setVar(String var) {
    this.var = var;
  }
  @Override
  public int doStartTag() throws JspException {
    //第一条线路
    if (items==null||items.size()==0) {
      return    SKIP_BODY;
    }
    // 定义迭代器
    Iterator<Object> it = items.iterator();
    //获取数据源2,3数据
    pageContext.setAttribute(var, it.next());
    // 为了保留迭代器指针现有的位置
    pageContext.setAttribute("it", it);
    return EVAL_BODY_INCLUDE;
  }
  @Override
  public int doAfterBody() throws JspException {
    Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");
    if (it.hasNext()) {
      //获取第一数据
      pageContext.setAttribute(var, it.next());
      // 为了保留迭代器指针现有的位置
      pageContext.setAttribute("it", it);
      return EVAL_BODY_AGAIN;
    }else {
      return  EVAL_PAGE;
    }
  }
}

2.建立tid类

 

<tag>
    <name>for</name>
    <tag-class>com.lz.text.Text1</tag-class>
    <!--该标签有标签体-->
    <body-content>jsp</body-content>
    <attribute>
      <name>items</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>var</name>
      <required>true</required>
      <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>

3.实现功能

                                      二.数字标签

1.作用

当某些数据作用于多个页面时,或者频繁使用,就可以做成数据标签,减少代码

2.自定义数字标签

1.建立实现类

 

package com.lz.text;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class Text2 extends BodyTagSupport {
/**
 * 数据标签 
 */
  //存储数据名称
  private    String  var;
/**
 * @return the var
 */
public String getVar() {
  return var;
}
/**
 * @param var the var to set
 */
public void setVar(String var) {
  this.var = var;
}
public Text2(String var) {
  super();
  this.var = var;
}
public Text2() {
  super();
}
  @Override
    public int doStartTag() throws JspException {
      JspWriter out = pageContext.getOut();
      //模拟数据
      List<Stu> list = new ArrayList<Stu>();
         list.add(new  Stu(1,"客户"));
         list.add(new  Stu(2,"喝水"));
         list.add(new  Stu(3,"地方"));
         //将数据放在  var中
      pageContext.setAttribute(var, list);
      return SKIP_BODY;
    }
}

2.建立tid类

 

<tag>
    <name>dept</name>
    <tag-class>com.lz.text.Text2</tag-class>
    <!--该标签有标签体-->
    <body-content>jsp</body-content>
    <attribute>
      <name>var</name>
      <required>true</required>
      <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>

3.实现

                            三. select标签

1.建立实现类

 

 

package com.lz.text;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import com.sun.org.apache.bcel.internal.generic.RETURN;
public class Text3 extends BodyTagSupport {
  /**
   * select标签
   **/
  private   String  selectVal;  //下拉框
  public Text3(String selectVal) {
    super();
    this.selectVal = selectVal;
  }
  /**
   * @return the selectVal
   */
  public String getSelectVal() {
    return selectVal;
  }
  /**
   * @param selectVal the selectVal to set
   */
  public void setSelectVal(String selectVal) {
    this.selectVal = selectVal;
  }
  // 下拉框数据
  private List<Object> items = new ArrayList<Object>();
  public Text3() {
    super();
  }
  public Text3(List<Object> items, String optionval, String optionText) {
    super();
    this.items = items;
    this.optionval = optionval;
    this.optionText = optionText;
  }
  /**
   * @return the items
   */
  public List<Object> getItems() {
    return items;
  }
  /**
   * @param items
   *            the items to set
   */
  public void setItems(List<Object> items) {
    this.items = items;
  }
  /**
   * @return the optionval
   */
  public String getOptionval() {
    return optionval;
  }
  /**
   * @param optionval
   *            the optionval to set
   */
  public void setOptionval(String optionval) {
    this.optionval = optionval;
  }
  /**
   * @return the optionText
   */
  public String getOptionText() {
    return optionText;
  }
  /**
   * @param optionText
   *            the optionText to set
   */
  public void setOptionText(String optionText) {
    this.optionText = optionText;
  }
  // 下拉框值
  private String optionval;
  // 下拉框标签体内容
  private String optionText;
  @Override
  public int doStartTag() throws JspException {
    // z没有标签提 ,页面需要下拉框值
    JspWriter out = pageContext.getOut();
    return super.doStartTag();
  }
  public    String  toHTML() throws NoSuchFieldException, SecurityException, IllegalArgumentException, Exception {
    // StringBuffer    和 string  区别
  //string处理字符串更加消耗服务器内存  
    StringBuffer   sb=new  StringBuffer("<select>");  
    for (Object object : items) {
      //取出对象具某个体属性值
      String  val=getObjAttrValue(object,optionval);
    String  text=getObjAttrValue(object,optionval);
    sb.append("<option "+(val.equals(selectVal)?"selected":"")+" value='"+val+"'>"+text+"</option>");
  }
    sb.append("</select>");
    return    sb.toString();
  }
/**
 *   取出对象具某个体属性值
 * @param object
 * @param  attr  id/name
 * @return
 * @throws SecurityException 
 * @throws NoSuchFieldException 
 * @throws Exception 
 * @throws IllegalArgumentException 
 */
  private String getObjAttrValue(Object object, String attr) throws NoSuchFieldException, SecurityException, IllegalArgumentException, Exception {
    Class clz = object.getClass();
    Field f = clz.getDeclaredField(attr);
    f.setAccessible(true);
    return f.get(object).toString();
  }
}

2.建立tid

 

<tag>
    <name>select</name>
    <tag-class>com.lz.text.Text3</tag-class>
    <!--该标签有标签体-->
    <body-content>jsp</body-content>
    <attribute>
      <name>items</name>
      <required>true</required> 
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>optionval</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>optionText</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
      <name>selectVal</name>
      <required>true</required>
      <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

3.实现

 

相关文章
|
XML Java 数据格式
自定义jsp标签1
自定义jsp标签1
37 0
|
XML Java 程序员
自定义JSP标签
自定义JSP标签
|
XML Java 数据格式
自定义标签
自定义标签
|
Java 程序员 开发者
自定义标签-下
自定义标签-下
41 0
|
存储 安全 Java
自定义JSP标签【下】
自定义JSP标签【下】
48 0
|
XML Java API
自定义JSP标签【上】
自定义JSP标签【上】
53 0
|
安全 Java
自定义JSP标签01
自定义JSP标签01
33 0
|
XML 设计模式 Java
自定义标签的详细使用讲解【上】(一)
自定义标签的详细使用讲解【上】
154 0
|
Java 数据库
自定义标签的详细使用讲解【下】
自定义标签的详细使用讲解【下】
37 0
自定义标签的详细使用讲解【上】(二)
自定义标签的详细使用讲解【上】(二)
44 0