JSP自定义标签

JSP自定义标签

  • 标签库的运作离不开tld文件
  • 标签库的标签是定义在tld中的tag标签内(助手类)

1.标签语言特点

<开始标签 属性="属性值">标签体</结束标签>
   空标签
   <br /><hr  />
   <开始标签></结束标签>
   <开始标签/>
   ui标签
   控制标签
   数据标签
 - 自定义标签的开发及使用步骤
  2.1 创建一个标签助手类(继承BodyTagSupport)
      标签属性必须助手类的属性对应、且要提供对应get/set方法
      rtexprvalue

  2.2 创建标签库描述文件(tld),添加自定义标签的配置
      注:tld文件必须保存到WEB-INF目录或其子目录
  2.3 在JSP通过taglib指令导入标签库,并通过指定后缀
      访问自定义标签

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

                                      EVAL_BODY_INCLUDE        SKIP_BODY
  3.2  实例化标签助手类->doStartTag()------------->doAfterBody---------------->doEndTag()...
                                                              EVAL_BODY_AGAIN
  SKIP_BODY:跳过主体
  EVAL_BODY_INCLUDE:计算标签主体内容并[输出]
  EVAL_BODY_BUFFERED:计算标签主体内容并[缓存]
  EVAL_PAGE:计算页面的后续部分
  SKIP_PAGE:跳过页面的后续部分
  EVAL_BODY_AGAIN:再计算主体一次

2.jsp自定义标签生命周期图

在这里插入图片描述

3.标签的助手类

public class DemoTag extends BodyTagSupport {

	private static final long serialVersionUID = 1L;
}	
	@Override
	//如果doStartTag()返回的是默认的值,那么就会计算标签主体内容并输出
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		System.out.println("----------------doStartTag------------------");
		return super.doStartTag();
	}
	@Override
	public int doAfterBody() throws JspException {
		// TODO Auto-generated method stub
		System.out.println("----------------doAfterBody------------------");
		return super.doAfterBody();
	}
	@Override
	public int doEndTag() throws JspException {
		// TODO Auto-generated method stub
		System.out.println("----------------doEndTag------------------");
		return super.doEndTag();
	}
}

作业

SetTag
代码:

public class SetTag extends BodyTagSupport {
		
	private static final long serialVersionUID = 1176321047494012070L;
		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;
		}
		
}

OutTag
代码:

public class OutTag extends BodyTagSupport {


	private static final long serialVersionUID = -1828859560351683134L;
	
	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) {
			e.printStackTrace();
		}
		return SKIP_BODY;
	}
}

IfTag
代码:

public class IfTag extends BodyTagSupport {


	private static final long serialVersionUID = -3264115975007703866L;
	private boolean test;

	public boolean getTest() {
		return test;
	}

	public void setTest(boolean test) {
		this.test = test;
	}
	
	@Override
	public int doStartTag() throws JspException {
		
		return test ? EVAL_BODY_INCLUDE : SKIP_BODY;
	}
}

标签库
代码:

<!-- set --> 
  <tag>
    <!-- 标签库中的标签  (类似c:set c:out的定义) -->
    <name>set</name>
    <!-- 是标签运行具体代码,也就是助手类,下面填写的助手类的全路径名 -->
    <tag-class>com.huangwen.jsp.day02.SetTag</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>

<!--c:out  --> 
  <tag>
    <name>out</name>
    <tag-class>com.huangwen.jsp.day02.OutTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
  
  <!--c:if  -->  
  <tag>
    <name>if</name>
    <tag-class>com.huangwen.jsp.day02.IfTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>test</name>
        <required>true</required>
        <rtexprvalue>true</rtexprvalue>
    </attribute>
  </tag>
</taglib>

结果:
在这里插入图片描述

SelectTag
代码:

/**
 * <select id="" name="">
 *    <option value="">===请选===</option>
 * </select>
 * 查询维度:下拉列表
 * 修改页面:下拉列表  数据回显
 * 
 * 1.id  name
 * 2.数据源items、存入数据库中的值textKey、展示列 textVal
 * 3.加入属性(默认的头部属性值headTextKey,默认的头部展示列值headTextVal)
 * 4.加入属性,能够实现数据回显的功能selectedVal
 * @author VULCAN
 *
 */
public class SelectTag extends BodyTagSupport {

	private static final long serialVersionUID = 3840319919416175585L;
	private String id;
	private String name;
	private List<Object> itmes=new ArrayList<Object>();
	private String textKey;
	private String textVal;
	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> getItmes() {
		return itmes;
	}
	public void setItmes(List<Object> itmes) {
		this.itmes = itmes;
	}
	public String getTextKey() {
		return textKey;
	}
	public void setTextKey(String textKey) {
		this.textKey = textKey;
	}
	public String getTextVal() {
		return textVal;
	}
	public void setTextVal(String textVal) {
		this.textVal = textVal;
	}
	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;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	
	@Override
	public int doStartTag() throws JspException {
		// TODO Auto-generated method stub
		JspWriter out = pageContext.getOut();
		try {
			out.write(toHTML());
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	/**
	 * 拼接出下拉列表所对应的select的html代码
	 * <select id="" name="">
	 *    <option value="">===请选===</option>
	 * </select>
	 * @return
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 */
	private String toHTML() throws Exception {
		// TODO Auto-generated method stub
		StringBuilder sb=new StringBuilder();
		sb.append("<select id='"+id+"' name='"+name+"'>");
		if(!(headTextKey ==null || headTextKey.equals("") ||headTextVal==null ||headTextVal.equals(""))){
			sb.append("<option value='"+headTextKey+"'>"+headTextVal+"</option>");
		}
		String val;
		String html;
		for (Object object : itmes) {
//			要让学生idc存入数据,让学生的名字展示在jsp页面
//			<option value='s001'>zx<option/>
//			obj sid sname 
//			第一种方法
			Field textKeyfield = object.getClass().getDeclaredField(textKey);
			textKeyfield.setAccessible(true);
			val=(String)textKeyfield.get(object);
		
//			第二张方法(需要架包)
//			
//          commons-beanutils-1.8.0.jar  和  commons-logging.jar
			html=BeanUtils.getProperty(object,textVal);
			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.toString();
	}
}

标签库
代码:

<!--c:select  -->
 <tag>
    <name>select</name>
    <tag-class>com.huangwen.jsp.day02.SelectTag</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>textKey</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
    <attribute>
        <name>textVal</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>

JSP
代码:

<%
	List list=new ArrayList();
	list.add(new Student("s001","张三"));
	list.add(new Student("s002","李四"));
	list.add(new Student("s003","王五"));
	request.setAttribute("list",list);
%>
<z:select  textVal="sname"  textKey="sid" itmes="${list}"></z:select></body>

结果:
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值