栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

10.JSP自定义标签02

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

10.JSP自定义标签02

目录

简介

 例题


简介

1. 标签语言特点
   <开始标签 属性="属性值">标签体

   空标签
   



   <开始标签>
   <开始标签/>


2. 自定义标签的开发及使用步骤
  2.1 创建一个标签助手类(继承BodyTagSupport)
      标签属性必须与助手类的属性对应、且要提供对应get/set方法
      rtexprvalue

  2.2 创建标签库描述文件(tld),添加自定义标签的配置
      注:tld文件必须保存到WEB-INF目录或其子目录
      jstl标签库

  2.3 在JSP通过taglib指令导入标签库,并通过指定后缀访问自定义标签

3. 标签生命周期
  
  流程A:
                                      SKIP_BODY
  3.1  实例化标签助手类->doStartTag()------------->doEndTag()
       //主要用开发简单标签

  流程B:
                                      EVAL_BODY_INCLUDE         SKIP_BODY
  3.2  实例化标签助手类->doStartTag()------------->doAfterBody---------------->doEndTag()...
                                                              EVAL_BODY_AGAIN


  3.3  .....
  
  jrebal 热加载

  SKIP_BODY:跳过主体
  EVAL_BODY_INCLUDE:计算标签主体内容并[输出]
  EVAL_PAGE:计算页面的后续部分
  SKIP_PAGE:跳过页面的后续部分
  EVAL_BODY_AGAIN:再计算主体一次


自定义out输出标签、if条件标签、forEach循环标签(控制标签)


自定义deptList数据标签,select标签


作用域   page(当前页面)  request(一次请求) session (一次会话) application(当前应用程序)

 例题

建包

 index.java

<%@page import="KTDM.Dept"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     <%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
    <%@ taglib uri="/zking" prefix="z" %>




Insert title here


	<%
		List list=new ArrayList();
	
		list.add("菜菜");
		list.add("果果");
		list.add("馅饼");
		list.add("航子");
		list.add("桃紫");
	
		String name="菜菜子";
		
		List deptList = new ArrayList();
		
		deptList.add(new Dept(1,"财务部"));
		deptList.add(new Dept(2,"教学部"));
		deptList.add(new Dept(3,"就业部"));
		deptList.add(new Dept(4,"教质部"));
		
		request.setAttribute("name", name);
		request.setAttribute("list", list);
		request.setAttribute("deptList", deptList);
	%>
	
	
	
	
	
	
	
	
		果果是傻呗
	
	
	
		果果是傻呗
	
	
	
	
	
	
		${n},${vs.index},${vs.count}
	
	
	
	
	
		${n},${vs.index},${vs.count}
	
	
	
	
	
	
	
	
	
	
	
	
	

 mytag.tId




	
	1.0
	
	1.2
	
	z
	
	/zking

	
		
		text
		
		KTDM.TestTag
		
		jsp
		
		
			
			name
			
			false
			
			false
		
	
	
	
		
		forEach
		
		KTDM.ForEachTag
		
		jsp
		
		
			
			value
		
			true
			
			true
		 
	
	
	
		
		out
		
		KTDM.OutTag
		
		jsp
		
		
			
			value
		
			true
			
			true
		 
	
	
	
	
		
		if
		
		KTDM.IfTag
		
		jsp
		
		
			
			test
		
			true
			
			true
		 
	
	
		
		foreach
		
		KTDM.ForeachTag
		
		jsp
		
		
			
			items
		
			true
			
			true
		 
		
			
			var
		
			true
			
			false
		 
		
			
			varStatus
		
			false
			
			false
		 
	
	
	
	
		
		select
		
		KTDM.SelectTag
		
		jsp
		
		
			
			items
		
			true
			
			true
		 
		
			
			valueName
		
			true
			
			false
		 
		
			
			textName
		
			true
			
			false
		 
		
			
			selectValue
		
			false
			
			false
		 
		
			
			headText
		
			false
			
			false
		 
	
	
	
	

Dept.java

package KTDM;

public class Dept {
	private Integer did;
	private String dname;
	
	public Dept() {
		// TODO Auto-generated constructor stub
	}

	public Integer getDid() {
		return did;
	}

	public void setDid(Integer did) {
		this.did = did;
	}

	public String getDname() {
		return dname;
	}

	public void setDname(String dname) {
		this.dname = dname;
	}

	@Override
	public String toString() {
		return "Dept [did=" + did + ", dname=" + dname + "]";
	}

	public Dept(Integer did, String dname) {
		this.did = did;
		this.dname = dname;
	}
	
	public Dept( String dname) {
		this.dname = dname;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
}

ForeachTag.java

package KTDM;

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 items;//数据源
	
	private String var;//将遍历的元素保存到作用域中的键
	
	private String varStatus;//将遍历元素的状态保存到作用域中的键
	
	
	
	public class Status{
		private int index=0;
		
		public Status() {
			
		}

		public int getIndex() {
			return index;
		}

		public void setIndex(int index) {
			this.index = index;
		}
		
		public int getCount() {
			return this.index+1;
		}
		
		//自增
		public void increment() {
			this.index++;
		}
		
		
	}
	
	
	public List getItems() {
		return items;
	}

	public void setItems(List 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 {
		// TODO Auto-generated method stub
		//取出作用域中的迭代器
		Iterator it = (Iterator)pageContext.getAttribute("it");
		if(it.hasNext()) {//判断集合中是否有下一个元素
			Object next = it.next();
			
			//将元素放入到作用域中
			pageContext.setAttribute(this.var, next);
			
			//从作用域中将保存状态的对象取出
			Status Status = (Status)pageContext.getAttribute(this.varStatus);
			
			Status.increment();
			
			pageContext.setAttribute(this.varStatus, Status);
			
			return EVAL_BODY_AGAIN;
		}
		
		
		
		return super.doAfterBody();
	}

	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		if(items!=null||items.size()!=0) {//判断集合不为空,并且长度不为0
			Iterator it=items.iterator();
			Object next=it.next();//取出第一个元素
			//将元素放入到作用域,键为var的值
			pageContext.setAttribute(this.var, next);
			
			//将迭代器放入到作用域中
			pageContext.setAttribute("it", it);
			
			//实例化状态对象
			Status status=new Status();
			pageContext.setAttribute(varStatus, status);
			
			
			
			return EVAL_BODY_INCLUDE;
		}
		else {//判断集合为空,并且长度为0
			return SKIP_BODY;//直接跳过标签体
		}
	}

}
 
 

IfTag.java

package KTDM;

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

public class IfTag extends BodyTagSupport{
	
	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
		if(test) {//如果前端表达式为true,执行标签体并执行输出
			return EVAL_BODY_INCLUDE;
		}
		else {//如果前端表达式为true,执行标签体并执行输出
			return SKIP_BODY;
		}
	}

}

OutTag.java

package KTDM;

import java.io.IOException;

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

public class OutTag extends BodyTagSupport{

	
	private Object value;
	
	
	
	
	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.print(this.value);
			out.print("");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			throw new RuntimeException(e);
		}
		return super.doStartTag();
	}
	
	
	
	
	
	
}

SelectTag.java

package KTDM;

import java.io.IOException;
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 items;//数据源
	
	private String valueName;//数据源中写入到select标签option中value值对应的属性名
	
	private String textName;//数据源中写入到select标签option中文本值对应的属性名
	
	private String headText;//
	
	private String selectValue;
	
	
	
	
	







	public String getSelectValue() {
		return selectValue;
	}







	public void setSelectValue(String selectValue) {
		this.selectValue = selectValue;
	}







	public String getHeadText() {
		return headText;
	}







	public void setHeadText(String headText) {
		this.headText = headText;
	}







	public List getItems() {
		return items;
	}







	public void setItems(List items) {
		this.items = items;
	}







	public String getValueName() {
		return valueName;
	}







	public void setValueName(String valueName) {
		this.valueName = valueName;
	}







	public String getTextName() {
		return textName;
	}







	public void setTextName(String textName) {
		this.textName = textName;
	}







	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		JspWriter out = pageContext.getOut();
		try {
			out.print(toHtml());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			throw new RuntimeException();
		}
		return super.doStartTag();
	}

	
	public String toHtml() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		StringBuffer sb=new StringBuffer();
		if(null==items||items.size()==0) {//如果数据源为空,或者长度为0
			return "";
		}
		sb.append("");
		
		if(null!=headText && !"".equals(headText)) {
			sb.append("");
		}
		
		Integer value=null;
		String text=null;
		
		//遍历数据源
		for (Object obj : items) {
			//1.获取类对象 object.getClass
			//2.获取did属性对象
			//3.打开访问权限
			//4.get获取属性值
			
			
			
			//获取option中的value的值
			value=(Integer)PropertyUtils.getProperty(obj, this.valueName);
			text=(String)PropertyUtils.getProperty(obj, this.textName);
			if(selectValue.equals(value.toString())) {//如果传过来的selectValue值和获取的value一致,就默认选中
				sb.append("");
			}
			else {
				sb.append("");
			}
			
		}
		
		//拼接结束标签
		sb.append("");
		return sb.toString();
	}
	
	
	
	
	
	
	
}
 
 

效果图:

 

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号