自定义jsp标签2

9 篇文章 0 订阅

自定义jsp标签2

  1. 自定义标签开发步骤
  2. UI标签
  3. 控制标签
  4. 数据标签
标题想要做自定义标签必须导入的两个jar包

在这里插入图片描述

自定义标签的开发步骤

  1. 助手类
  2. tid
  3. taglib

写标签前先写一个前缀

<%
	List<String> ls=new ArrayList<String>();
	ls.add("可乐");
	ls.add("雪碧");
	ls.add("鸡翅");
	String name="可乐";
	pageContext.setAttribute("name", name);
	request.setAttribute("ls", ls);

%>

UI标签

n:out
out标签中只有一个value属性,使用在自定义out标签的类中,我们需要写一个value属性,然后来一个无参数的构造方法,封装,最后再来一个doStarTag方法

package com.lishengnan.jsp;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * 
 * @author 可乐
 *
 * 可乐的爱妃
 */
public class OutTag extends BodyTagSupport{

	private Object value;

	public OutTag() {
		super();
		// TODO Auto-generated constructor stub
	}

	public Object getValue() {
		return value;
	}

	public void setValue(Object value) {
		this.value = value;
	}

	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		JspWriter out = pageContext.getOut();
		try {
			out.println(value==null?"":value.toString());
		} catch (Exception e) {
			throw new RuntimeException();
		}
		return super.doStartTag();
	}
	
	
}

**
在使用标签前再次强调要写这行代码
<%@taglib prefix=“k” uri="/kele"%>
k代表的是你自己定义的名称,/kele代表自定义的路径**

最后在jsp界面调用out标签

<k:out value="${ls }"/>

呈现出来的结果
在这里插入图片描述

注:其实代码都差不多就是doStarTag方法有些不同

n:select
在使用自定义select标签时,使用到了反射,使用反射需要导入的jar包
在这里插入图片描述

在这些标签中select标签是最复杂的,因为select标签中包含了option,还有一些属性
再来一个doStarTag方法,还要定义个toHTML用来拼接和赋值

private List<Object> items;
	private String name;
	private String valueKey;//保存value中的key
	private String textKey;//保存text中的key
	public SelectTag() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	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 {
		// TODO Auto-generated method stub
		JspWriter out = pageContext.getOut();
		try {
			String html = toHtml();
			System.out.println(html);
			out.println(html);
		} catch (Exception e) {
			// TODO: handle exception
			throw new RuntimeException();
		}
		return super.doStartTag();
	}
	
	private String toHtml() throws Exception{
		StringBuffer sb=new StringBuffer();
		sb.append("<select name='"+name+"'");		
		sb.append(">");
		if(null!=items&&0!=items.size()) {
			Object value =null;
			Object text=null;
			
			for (Object b : items) {
				//反射
				value=PropertyUtils.getProperty(b, valueKey);
				text=PropertyUtils.getProperty(b, textKey);				
				sb.append("<opption value='"+value+"'>"+text+"</option>");
				
			}
		}
		sb.append("</select>");
		return sb.toString();
	}

最后在jsp界面调用if标签

<k:select items="${deptList }" valueKey="deptId" textKey="deptName"/>

呈现结果
在这里插入图片描述

控制标签

n:if
if标签中只有一个test属性,使用在自定义if标签的类中,我们需要写一个test属性,然后来一个无参数的构造方法,封装,最后再来一个doStarTag方法

最后在jsp界面调用if标签

<k:if test="${name eq '可乐' }">
我夫李白
</k:if>

呈现出来的结果
在这里插入图片描述
n:forEach
forEach标签中有三个items,var,varStatus(可写可不写)属性,使用在自定义forEach标签的类中,我们需要写这个三个属性,再来一个status方法里面有两个属性index,count。然后来一个无参数的构造方法,封装,最后再来两个doAfterBody,doStarTag方法

@Override
	public int doAfterBody() throws JspException {
		// TODO Auto-generated method stub
		Iterator<Object> it = (Iterator<Object>) pageContext.getAttribute("it");
		while(it.hasNext()) {
			if(null!=varStatus&&!"".equals(varStatus)) {
				status at = (status) pageContext.getAttribute(varStatus);
				at.increment();
				pageContext.setAttribute(varStatus, at);
			}
			
			Object next = it.next();
			pageContext.setAttribute(var, next);
			return EVAL_BODY_AGAIN;
		}
		return super.doAfterBody();
	}
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		
		if(null!=varStatus&&!"".equals(varStatus)) {
			pageContext.setAttribute(varStatus, new status());
		}
		
		
		if(items!=null&&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();
	}

最后在jsp界面调用forEach标签

<ul>
	<k:forEach items="${ls }" var="n" varStatus="v">
		<li>${n },${v.index },${v.count }</li>
	</k:forEach>
</ul>

呈现出来的结果
在这里插入图片描述

数据标签

n:set
在写set标签前,先搞一个假的数据库entity和dao包,select也用的到
set和其他的方法没什么区别,也是doStarTag有点变化,因为set不能输出,所有后面用了一个out输出了结果

最后在jsp界面调用set标签

<k:set value="deptList"/><br/>
<k:out value="${deptList }"/>

呈现出来的结果
在这里插入图片描述
小编的标签分类图
在这里插入图片描述

jsp生命周期中的方法,在自定义标签中用到的是这两个
在这里插入图片描述
总结:其实这些自定义方法并没有很难,大多数都是一样,只要知道每一个标签一个实现怎么样的效果,那么就很容易把这个标签学会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值