jsp自定义标签

自定义标签的开发

1.Set,Out标签的开发
2.if标签的开发
3.foreach标签的开发
4.select标签的开发

1.Set,Out标签的开发

首先我们知道Set标签有两个属性一个是var,一个是value
Out标签只有一个属性value
接下来我们来定义他们的助手类
Set助手类

package com.chenkang2;

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

public class SetChenkang extends BodyTagSupport {
	private static final long serialVersionUID = 1L;
	private String var;
	private String value;
	public String getVar() {
		return var;
	}
	public void setVar(String var) {
		this.var = var;
	}
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	@Override
	public int doStartTag() throws JspException {
		pageContext.setAttribute(var, value);
		return SKIP_BODY;
	}
}

Out助手类

package com.chenkang2;

import java.io.IOException;

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

public class OutChenkang extends BodyTagSupport {
	private static final long serialVersionUID = 1L;
	private String value;
	public String getValue() {
		return value;
	}
	public void setValue(String value) {
		this.value = value;
	}
	@Override
	public int doStartTag() throws JspException {
		JspWriter out = pageContext.getOut();
		try {
			out.print(value);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return SKIP_BODY;
	}
}

然后我们来看一下配置的tld文件

<tag>
    <name>set</name>
    <tag-class>com.chenkang2.SetChenkang</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  
  <tag>
    <name>out</name>
    <tag-class>com.chenkang2.OutChenkang</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

测试类

<z:set var="sname" value="lalalala"></z:set>
<z:out value="${sname }"></z:out>

测试结果
在这里插入图片描述

2.if标签的开发

if只有一个test属性值
助手类

package com.chenkang2;

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

public class IfChenkang extends BodyTagSupport{
	private static final long serialVersionUID = 1L;
	private boolean test;
	public boolean isTest() {
		return test;
	}
	public void setTest(boolean test) {
		this.test = test;
	}
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		return test?EVAL_BODY_INCLUDE:SKIP_BODY;
	}

}

tld配置

<tag>
    <name>if</name>
    <tag-class>com.chenkang2.IfChenkang</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>

测试类

<z:if test="true">陈康</z:if>

测试结果我就不说了test为true的时候就会显示我的名字
如果定义为false就不会显示

3.foreach标签的开发

首先foreach有var和items两个属性值items则是一个数组
助手类

package com.chenkang2;

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

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * 
 * @author 20190528
 *
 */
public class ForeachChenkang extends BodyTagSupport {
	private static final long serialVersionUID = 1L;
	private String var;
	private List<Object> items=new ArrayList<>();
	public String getVar() {
		return var;
	}
	public void setVar(String var) {
		this.var = var;
	}
	public List<Object> getItems() {
		return items;
	}
	public void setItems(List<Object> items) {
		this.items = items;
	}
	@Override
	public int doStartTag() throws JspException {
		Iterator<Object> iterator = items.iterator();
//		第一次默认指针存放的位置是没有指向对象的,现在需要指向对象,那么需要指针下移
		pageContext.setAttribute(var, iterator.next());
//		因为集合中元素较多,那么指针需要循环的向下移,那么我们需要将迭代器保存,用于下一次指针下移所用
		pageContext.setAttribute("iterator", iterator);
		return EVAL_BODY_INCLUDE;
	}
	@Override
	public int doAfterBody() throws JspException {
		Iterator<Object> iterator = (Iterator<Object>) pageContext.getAttribute("iterator");
//		获取已经保存了的迭代器
		if(iterator.hasNext()) {
//			指针下移指向新的元素
			pageContext.setAttribute(var, iterator.next());
//			再保存正在使用的迭代器
			pageContext.setAttribute("iterator", iterator);
			return EVAL_BODY_AGAIN;
		}else {
			return EVAL_PAGE;
		}
		
	}
}

这里要记住的重点就是var是指针不是对象!!!!
tld配置

<tag>
    <name>foreach</name>
    <tag-class>com.chenkang2.ForeachChenkang</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>var</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

测试

<%
List list=new ArrayList();
list.add(new Stu("001","chenkang"));
list.add(new Stu("002","chenbaba"));
list.add(new Stu("003","dabiaoguo"));
request.setAttribute("list", list);

%>
<br>
<z:foreach items="${list}" var="stu">
	${stu.sid},${stu.sname}
</z:foreach>

这里新建一个实体类加数据的类我就不展示了
直接来看测试结果
在这里插入图片描述

select标签的开发

助手类

package com.chenkang2;

import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
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.BeanUtils;

/**
 * <select id='' name=''>
 * <option value='-1' selected>==请选择=</option>
 * </select>
 * 查询维度:下拉列表
 * 修改页面:下拉列表    数据回显
 * 
 * 1.id,name
 * 2.数据源items,存入数据库中的testKey,展示列testVal
 * 3.加入属性(默认的头部属性值,默认的展示列值)
 * 4.加入属性,能够实现数据回显的功能selectedVal;
 * @author 20190528
 *
 */
public class SelectChenkang extends BodyTagSupport{
	private static final long serialVersionUID = 1L;
	private String id;
	private String name;
	private List<Object>items=new ArrayList<Object>();
	private String testKey;
	private String testVal;
	private String headTextKey;
	private String headTextVal;
	private String selectedVal;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List<Object> getItems() {
		return items;
	}
	public void setItems(List<Object> items) {
		this.items = items;
	}
	public String getTestKey() {
		return testKey;
	}
	public void setTestKey(String testKey) {
		this.testKey = testKey;
	}
	public String getTestVal() {
		return testVal;
	}
	public void setTestVal(String testVal) {
		this.testVal = testVal;
	}
	public String getHeadTextKey() {
		return headTextKey;
	}
	public void setHeadTextKey(String headTextKey) {
		this.headTextKey = headTextKey;
	}
	public String getHeadTextVal() {
		return headTextVal;
	}
	public void setHeadTextVal(String headTextVal) {
		this.headTextVal = headTextVal;
	}
	public String getSelectedVal() {
		return selectedVal;
	}
	public void setSelectedVal(String selectedVal) {
		this.selectedVal = selectedVal;
	}
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		JspWriter out = pageContext.getOut();
		try {
			out.print(toHTML());
		} catch (IOException | NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	/**
	 * 拼接出下拉列表所对应的的select的html代码
	 * <select id='' name=''>
	 * <option value='-1' selected>==请选择=</option>
	 * </select>
	 * @return
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 * @throws IllegalAccessException 
	 * @throws IllegalArgumentException 
	 * @throws NoSuchMethodException 
	 * @throws InvocationTargetException 
	 */
	private StringBuilder toHTML() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		// TODO Auto-generated method stub
		StringBuilder sb=new StringBuilder();
		sb.append("<select id='"+id+"' name='"+name+"'>");
		if(!(headTextKey==null || "".equals(headTextKey) || headTextVal==null || "".equals(headTextVal))) {
			sb.append("<option value='"+headTextKey+"' selected>"+headTextVal+"</option>");
		}
		
	
		for (Object obj : items) {
//			要让学生的id存入数据库,让学生的名字展示在jsp页面
//			<option value='s00i' selected>zs</option>
//			obj sid name
			Field field = obj.getClass().getDeclaredField(testKey);
			field.setAccessible(true);
			
			String val=(String) field.get(obj);
			
			
			String html=BeanUtils.getProperty(obj, testVal);
			if(val.equals(selectedVal)) {
				sb.append("<option value='"+val+"' selected >"+html+"</option>");
			}else {
				sb.append("<option value='"+val+"' >"+html+"</option>");
			}
		}
		
		sb.append("</select>");
		return sb;
	}
}

tld配置

<tag>
    <name>select</name>
    <tag-class>com.chenkang2.SelectChenkang</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>id</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>name</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>items</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
    <attribute>
        <name>testKey</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>testVal</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>headTextKey</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>headTextVal</name>
        <required>false</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>selectedVal</name>
        <required>false</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>

测试

<z:select headTextKey="-1" headTextVal="==请选择=" items="${list}" testVal="sname" testKey="sid" selectedVal="002"></z:select>

测试结果
在这里插入图片描述
哪里修改绑定值了!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值