jsp自定义标签2

一、foreach标签
二、select标签

a、创建一个foreach类且继承 BodyTagSupport
b、标签属性必须助手类的属性对应,并且提供set,get的方法

package com.xieying.jsp2;

import java.util.Iterator;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

public class ForEachTag extends BodyTagSupport{

	private List<Object> items;
	private String var;
	private String varStatus;//保存index,count属性的对象的key
	
	public static class Status{
		public int index=0;

		public int getIndex() {
			return index;
		}

		public void setIndex(int index) {
			this.index = index;
		}
		
		public int getCount() {  //s.count
			return this.index+1;
		}
			
		void increment() {
			this.index++;
		}
	}
	
	public List<Object> getItems() {
		return items;
	}
	public void setItems(List<Object> items) {
		this.items = items;
	}
	public String getVar() {
		return var;
	}
	public void setVar(String var) {
		this.var = var;
	}
	
	public String getVarStatus() {
		return varStatus;
	}
	public void setVarStatus(String varStatus) {
		this.varStatus = varStatus;
	}
	@Override
	public int doAfterBody() throws JspException {
		Iterator<Object> it = (Iterator<Object>)pageContext.getAttribute("it");
		while(it.hasNext()) {
			if(null!=varStatus &&!"".equals(varStatus)) {
				Status status = (Status)pageContext.getAttribute(varStatus);
				status.increment();
				pageContext.setAttribute(varStatus, status);
			}
			Object next = it.next();
			pageContext.setAttribute(var, next);
			return EVAL_BODY_AGAIN;
		}
		return super.doAfterBody();
	}
	
	
	@Override
	public int doStartTag() throws JspException {
		if(null!=varStatus &&!"".equals(varStatus)) {
			pageContext.setAttribute(varStatus, new Status());
		}
		if(null!=items && 0!=items.size()) {
			Iterator<Object> it=items.iterator();
			Object next=it.next();
			pageContext.setAttribute(var, next);
			pageContext.setAttribute("it", it);
			return EVAL_BODY_INCLUDE;
		}
		return super.doStartTag();
	}
}

c、去tld里配置属性

<tag>
    <name>forEach</name>
    <tag-class>com.xieying.jsp2.ForEachTag</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>
     <attribute>
        <name>varStatus</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    </tag>

d、jsp界面代码

<h2>foreach</h2>
	<ul>
		<c:forEach items="${names }" var="n" varStatus="s">
			<li>${n},${s.index},${s.count}</li>
		</c:forEach>
	</ul><br>

a、select标签
创建一个select类且继承 BodyTagSupport
b、标签属性必须助手类的属性对应,并且提供set,get的方法

package com.xieying.jsp2;

import java.lang.reflect.InvocationTargetException;
import java.util.List;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;

import org.apache.commons.beanutils.PropertyUtils;

public class SelectTag extends BodyTagSupport{

	private List<Object> items;
	private String name;
	private String valuekey;//保存option中value的key
	private String textkey;//保存option中text文本的key
	private String cssStyle;
	private String headKey;
	private String headvalue;
	
	
	private String selectedOptionValue;
	
	public String getSelectedOptionValue() {
		return selectedOptionValue;
	}
	public void setSelectedOptionValue(String selectedOptionValue) {
		this.selectedOptionValue = selectedOptionValue;
	}
	public String getHeadKey() {
		return headKey;
	}
	public void setHeadKey(String headKey) {
		this.headKey = headKey;
	}
	public String getHeadvalue() {
		return headvalue;
	}
	public void setHeadvalue(String headvalue) {
		this.headvalue = headvalue;
	}
	public String getCssStyle() {
		return cssStyle;
	}
	public void setCssStyle(String cssStyle) {
		this.cssStyle = cssStyle;
	}
	public void setTextkey(String textkey) {
		this.textkey = textkey;
	}
	public List<Object> getItems() {
		return items;
	}
	public void setItems(List<Object> items) {
		this.items = items;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getValuekey() {
		return valuekey;
	}
	public void setValuekey(String valuekey) {
		this.valuekey = valuekey;
	}
	public String getTextkey() {
		return textkey;
	}
	public void setTextKey(String textkey) {
		this.textkey = textkey;
	}
	
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			String html=tohtml();
			out.print(html);
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	private String tohtml() throws Exception {
		StringBuffer sb=new StringBuffer();
		//<select name="" style="">
		sb.append("<select name='"+name+"'");
		sb.append("style='"+cssStyle+"'");
		sb.append(">");
		
		//<option value=""></option>
		if(null!=items&&0!=items.size()) {
			if(null!=headKey&&"".equals(headKey.trim())) {
				sb.append("<option value='"+headKey+"'>"+headvalue+"</option>");
			}
			Object value=null;
			Object text=null;
			for (Object object : items) {
				System.out.println("dept:"+object);
				//反射
				value=PropertyUtils.getProperty(object, valuekey);
				text=PropertyUtils.getProperty(object, textkey);
				if(value.toString().equals(selectedOptionValue.trim())) {
					sb.append("<option selected value='"+text+"'>"+value+"</option>");
				}else {
					sb.append("<option value='"+text+"'>"+value+"</option>");
				}
			}
		}
		sb.append("</select>");
		
		return sb.toString();
	}
	
}


c、去tld配置属性

<tag>
    <name>select</name>
    <tag-class>com.xieying.jsp2.SelectTag</tag-class>
    <body-content>empty</body-content>
  
    <attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>valuekey</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>textkey</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
     <attribute>
        <name>cssStyle</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>headKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
     <attribute> 
        <name>headvalue</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute> 
        <name>selectedOptionValue</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    </tag>

d、jsp界面代码

<x:select items="${deptlist }" textkey="deptId" 
valuekey="deptName" cssStyle="" headKey="-1" 
headvalue="-----请选择-----" selectedOptionValue="2"/>

 <select name="" style="">
	<option value="-1">------请选择------</option>
	<option value="1">长沙</option>
	<option selected value="2">邵阳</option>
	<option value="3">娄底</option>
	<option value="4">常德</option>
</select> 

结果为:
在这里插入图片描述
总结:标签属性要和助手类的属性相对应,且要配置好才能使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值