书接上回:我们讲过了自定义test标签、自定义foreach标签、自定义数据标签。这一章节我讲讲自定义out/if标签(so easy)、自定义下拉框标签(满足所有应用场景)。

案例:(最后统一配置mytag.tld文件)

1、实践操作 out标签

首先,创建一个out标签类OutTag.java并继承BodyTagSupport(标签助手类),定义一个out私有属性value,为Object类型。

package com.zking.jspTag.tag;import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;public class OutTag extends BodyTagSupport{private Object value;@Overridepublic int doStartTag() throws JspException {JspWriter out = pageContext.getOut();try {out.write(value.toString());} catch (IOException e) {//异常信息e.printStackTrace();}return SKIP_BODY;}@Overridepublic int doEndTag() throws JspException {return EVAL_PAGE;}public Object getValue() {return value;}public void setValue(Object value) {this.value = value;}}

JspWriter out = pageContext.getOut();  // 拿到page上下文然后进行输出,需要抛异常

JSP页面的out对象类型为JspWriter,相当于一种带缓存的PrintWriter,可以在page指令里设置缓存的大小甚至关闭它的缓存。

作用域(小->大):page(当前页面)-> request -> session ->application


2、if标签 

if标签非常简单且基础,操作步骤同out标签类似,定义一个if私有属性test,为boolean类型。

package com.zking.jspTag.tag;import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;public class ifTag extends BodyTagSupport{private boolean test;@Overridepublic int doStartTag() throws JspException {if(test) {//如果条件成立打印标签体return EVAL_BODY_INCLUDE;}else {return SKIP_BODY;}}@Overridepublic int doEndTag() throws JspException {return super.doEndTag();}public boolean isTest() {return test;}public void setTest(boolean test) {this.test = test;}}

若满足条件就返回 EVAL_BODY_INCLUDE(计算主体内容并包含在输出中);不满足则返回SKIP_BODY(跳过主体内容不输出)

不过呢,它还有另一种写法,代码量极少,那就是使用三元运算符进行判断,一起看看(只展示重点部分)...

条件成立执行 EVAL_BODY_INCLUDE,不成立就执行SKIP_BODY

    @Overridepublic int doStartTag() throws JspException {return test?EVAL_BODY_INCLUDE:SKIP_BODY;}

 3、自定义下拉框标签

要想做 满足所有应用场景的下拉框,那我们得先来了解了解 下拉框

一种是在<select>标签下的<option>标签中直接定义值,俗称“静态的数据”

另一种是在<option>标签中动态绑值,我们主要讲讲如何给辛苦了动态绑值,实现通用。

<select><option value="1">管理员</option>
</select>

1、创建实体类Role.java 提供roleId/roleName两个字段,给上get/set方法

2、自定义下拉框标签需要用到自定义数据标签内来接收数值

3、创建下拉框标签类并继承BodyTagSupport(标签助手类),提供3个字段

4、代码都有详细的解释,可多多理解

    //被遍历的集合或者数组List<Role>  ->Dept[roleId,roleName]private List items;//用于指定绑定到option标签中的value属性的值,值可以理解为循环遍历对象中的属性名//例如:optionValue="roleId"private String optionValue;//用于指定绑定到option标签中的标签体的值,值可以理解为循环遍历对象中的属性名//例如:optionText="roleName"private String optionText;

package com.zking.jspTag.tag;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class SelectTag extends BodyTagSupport{//被遍历的集合或者数组Listprivate List items;//用于指定绑定到option标签中的value属性的值,值可以理解为循环遍历对象中的属性名private String optionValue;//用于指定绑定到option标签中的标签体的值,值可以理解为循环遍历对象中的属性名private String optionText;@Overridepublic int doStartTag() throws JspException {try {JspWriter out = pageContext.getOut();//编写逻辑out.write(toSelect());} catch (Exception e) {e.printStackTrace();}return SKIP_BODY;}private String toSelect() throws IllegalAccessException, Exception {StringBuffer sb = new StringBuffer();//拼接<select>sb.append("<select>");//循环遍历Items,用于循环生成option标签//obj就是Deptfor (Object obj : items) {//question:如何从obj中取出对应的属性的值,由optionValue和optionText决定String value=this.getObjValue(obj, this.optionValue);String text=this.getObjValue(obj, this.optionText);//拼接option标签sb.append("<option value='"+value+"'>"+text+"</option>");}//拼接</select>sb.append("</select>");//返回return sb.toString();}private String getObjValue(Object obj,String fileName) throws Exception, IllegalAccessException {//一切与反射相关的代码都从获取类对象开始String value=null;//获取类对象Class cls = obj.getClass();//获取对象的属性数组Field[] fields = cls.getDeclaredFields();//循环遍历数组for (Field field : fields) {//将对象中的属性名与传入fileName进行对比;如果相同,则获取数据;不相同,则不获取if(field.getName().toUpperCase().equals(fileName.toUpperCase())) {//设置访问权限field.setAccessible(true);//获取数据value=field.get(obj).toString();}}return value;}@Overridepublic int doEndTag() throws JspException {return EVAL_PAGE;}public SelectTag() {super();}public SelectTag(String optionValue, String optionText) {super();this.optionValue = optionValue;this.optionText = optionText;}public SelectTag(List items, String optionValue, String optionText) {super();this.items = items;this.optionValue = optionValue;this.optionText = optionText;}public List getItems() {return items;}public void setItems(List items) {this.items = items;}public String getOptionValue() {return optionValue;}public void setOptionValue(String optionValue) {this.optionValue = optionValue;}public String getOptionText() {return optionText;}public void setOptionText(String optionText) {this.optionText = optionText;}
}

RoleTag.java        (自定义标签类)

package com.zking.jspTag.tag;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import com.zking.jspTag.util.Dept;
import com.zking.jspTag.util.Role;public class DeptTag extends BodyTagSupport{//将查询出来的数据保存到指定作用域中,并以var属性命名private String var;//可以通过该参数指明你所要存储的作用域(page/request/session/application)默认pageprivate String scope;//作用域@Overridepublic int doStartTag() throws JspException {//本案例的静态数据填充List<Role> list = new ArrayList<>();list.add(new Role(1,"管理员"));list.add(new Role(2,"普通人员"));list.add(new Role(3,"高级人员"));//获取Request对象HttpServletRequest request = (HttpServletRequest) pageContext.getRequest();//获取Session对象HttpSession session = pageContext.getSession();//获取Application对象ServletContext application = pageContext.getServletContext();//判断scopeif(null==scope) {pageContext.setAttribute(var, list);}else if(scope.equals("request")) {request.setAttribute(var, list);}else if(scope.equals("session")) {session.setAttribute(var, list);}else if(scope.equals("application")) {application.setAttribute(var, list);}else {pageContext.setAttribute(var, list);}return SKIP_BODY;}@Overridepublic int doEndTag() throws JspException {return EVAL_PAGE;}public String getVar() {return var;}public void setVar(String var) {this.var = var;}public String getScope() {return scope;}public void setScope(String scope) {this.scope = scope;}
}

index.jsp

引用 <%@taglib uri="/zking" prefix="z" %>

<%@page import="java.util.Arrays"%>
<%@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" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%List<String> list = Arrays.asList(new String[]{"sum","xy","time"});//作用域(小->大):page -> request -> session ->applicationrequest.setAttribute("list", list);request.setAttribute("name", "lxy");
%><h2>1、自定义out标签</h2>
<!-- 空标签也行value="${name }"既接收纯文本也能接收动态值 -->
<z:out value="life"></z:out><h2>2、自定义if标签</h2>
<!-- test="${name eq 'lxy' }判断是否是正确的,是就输出;反之亦然 -->
<!-- false(不输出): 111()/zzz  -->
<z:if test="true">人生处处都是戏,戏里处处看人生。
</z:if><h2>3、自定义数据标签</h2>
<z:dept var="data" scope="request"/>
${requestScope.data}<h2>4、自定义下拉框标签</h2>
<z:select items="${data }" optionValue="roleId" optionText="roleName"/></body>
</html>

效果图:

总结:

    1、在有标签体的情况下,默认会调用助手类的doStartTag、doAfterBody、doEndTag方法;
    2、若开始标签doStartTag返回值是SKIP_BODY,则标签体doAfterBody就不会调用执行;
    3、若将开始标签doStartTag的返回值改为EVAL_BODY_INCLUDE,则标签体doAfterBody会继续执行;

   4、doAfterBody()方法本身就会循环,若返回值先执行SKIP_BODY(break)再执行EVAL_BODY_AGAIN(continue),则会进入死循环。

doStartTag():表示<开始标签>所对应执行的动作

         SKIP_BODY:跳过主体内容不输出

EVAL_BODY_INCLUDE:计算主体内容并包含在输出中

doAfterBody():介于<开始标签>标签体与<结束标签>之间执行的动作

        SKIP_BODY:跳过主体内容不输出

EVAL_BODY_AGAIN:再次计算主体内容并包含在输出中

 doEndTag():表示<结束标签>所对应执行的动作

        SKIP_PAGE:跳过页面的后续内容

EVAL_PAGE:计算页面的后续内容

JSP自定义标签【第二章】相关推荐

  1. JSP自定义标签学习笔记

    http://blog.csdn.net/liangbinny/article/details/6309893 本文是本人学习<JavaWeb学习>书籍所记下的学习笔记 一.概述 JSP ...

  2. java jsp 自定义标签_JSP自定义标签

    在本章中,我们将讨论JSP中的自定义标签.自定义标签是用户定义的JSP语言元素.当包含自定义标签的JSP页面被转换成一个servlet时,标签被转换为一个名为标签处理程序的对象的操作. 然后,Web容 ...

  3. jsp自定义标签学习

    简单的说明: 1,说明---jsp自定义标签: HelloWorld:jsp自定义标签的使用流程: QueryTag:带属性标签的定义以及连接数据库使用: IteratorTag:带标签体的标签定义以 ...

  4. 如何使用jsp自定义标签 JspTag 使用入门

    java开发中,sturts标签和c标签就是我们常用的两种标签,本文主要教大家如何定义自己的标签,已达到代码整合,公共化的目的.通过jsp自定义标签,可以将一个元素,或者一个表格,一个div甚至整个页 ...

  5. 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门

    javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...

  6. JSP自定义标签开发入门

    一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...

  7. html模板(base标签,meta标签,禁用浏览器缓存)+JSP自定义标签荔枝

    [1]html模板 <html> <head><!-- base标签表示uri相对路径的基准路径 --><base href="http://loc ...

  8. jsp自定义标签(taglib)编写的原理和实现

    jsp自定义标签(taglib)编写的原理和实现 转:http://www.javaeye.com/topic/157737 个tag就是一个普通的java类,它惟一特别之处是它必须继承TagSupp ...

  9. 浅谈JSP自定义标签实现过程

    (一) 没有正文的JSP自定义标签实现 (1):定义JSP自定义标签处理类 import java.io.IOException; import java.util.Date; import java ...

  10. JSP自定义标签详解(1)

    JSP自定义标签 自定义JSP标签概述 自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用.当页面中需要使用类似的 ...

最新文章

  1. 非常认同的《SEO优化大全》
  2. 1小时学会:最简单的iOS直播推流(十)librtmp使用介绍
  3. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(6):各种公共方法及工具类的封装
  4. 算法--------数组------反转字符串中的元音字母
  5. c语言调用tuxedo步骤,tuxedo 入门
  6. 蓝桥杯 迷宫与陷阱 BFS
  7. 数据结构:(6)其他情况的算法分析
  8. 5g上行速率怎么提升_揭秘联发科5G独家技术,攻克上行覆盖和终端功耗两大技术难题...
  9. 在数学空间中,物理分辨率可能失去了意义(behind the paper)
  10. 「代码随想录」968.监控二叉树【贪心算法】力扣详解!
  11. matlab产生年月日的时间序列,求助:在MATLAB里如何输入时间序列中的时间
  12. SQL注入 时间延时注入语句
  13. java 合并两个音频_如何利用音乐合成软件将多段音频合并为一段?快速合并音频的方法...
  14. 小学教育专业语文方向毕业论文怎么选题?
  15. 树莓派51/100 - Pico下用MicroPython在ssd1306上显示汉字
  16. 基于 SpringBoot 和 webSocket 的匿名聊天室
  17. oracle导出导入同义词,使用datapump 导出导入同义词
  18. 西安三本计算机专业可报院校,西安三本大学前十名, 西北大学现代学院仅第四...
  19. 表单验证-----验证图片格式
  20. 【android】向模拟器的sdcard中添加文件

热门文章

  1. 开发一个整数加法的程序,实现将计算结果显示到页面上的功能
  2. hutool 获取某月最后一天_取某月的最后一天的方法
  3. 互联网晚报 | 11/28日 星期一 | 蜜雪冰城客服回应喝出虫子店家态度消极;抖音回应世界杯直播时出现杂音;微信内测新功能...
  4. 小旋风百度SEO批量PING推送工具
  5. git 本地如何配置多平台账号|本地 git 账号关联远程 github/gitlab/gitee
  6. TCP和UDP的笑话导致的悲剧爱情故事
  7. 基于SPSS二次开发的Web SPSS系统
  8. 神经网络模型matlab例子,神经网络算法matlab
  9. 我是软件工程师[转]
  10. 电脑如何通过HTC手机上互联网的配置方法(联通号)