JSP自定义标签【第二章】
书接上回:我们讲过了自定义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自定义标签【第二章】相关推荐
- JSP自定义标签学习笔记
http://blog.csdn.net/liangbinny/article/details/6309893 本文是本人学习<JavaWeb学习>书籍所记下的学习笔记 一.概述 JSP ...
- java jsp 自定义标签_JSP自定义标签
在本章中,我们将讨论JSP中的自定义标签.自定义标签是用户定义的JSP语言元素.当包含自定义标签的JSP页面被转换成一个servlet时,标签被转换为一个名为标签处理程序的对象的操作. 然后,Web容 ...
- jsp自定义标签学习
简单的说明: 1,说明---jsp自定义标签: HelloWorld:jsp自定义标签的使用流程: QueryTag:带属性标签的定义以及连接数据库使用: IteratorTag:带标签体的标签定义以 ...
- 如何使用jsp自定义标签 JspTag 使用入门
java开发中,sturts标签和c标签就是我们常用的两种标签,本文主要教大家如何定义自己的标签,已达到代码整合,公共化的目的.通过jsp自定义标签,可以将一个元素,或者一个表格,一个div甚至整个页 ...
- 转载:javaweb学习总结(二十三)——jsp自定义标签开发入门
javaweb学习总结(二十三)--jsp自定义标签开发入门 转自:http://www.cnblogs.com/xdp-gacl/p/3916734.html 一.自定义标签的作用 自定义标签主要用 ...
- JSP自定义标签开发入门
一般情况下开发jsp自定义标签需要引用以下两个包 import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; 首先我们需要大致了解开发 ...
- html模板(base标签,meta标签,禁用浏览器缓存)+JSP自定义标签荔枝
[1]html模板 <html> <head><!-- base标签表示uri相对路径的基准路径 --><base href="http://loc ...
- jsp自定义标签(taglib)编写的原理和实现
jsp自定义标签(taglib)编写的原理和实现 转:http://www.javaeye.com/topic/157737 个tag就是一个普通的java类,它惟一特别之处是它必须继承TagSupp ...
- 浅谈JSP自定义标签实现过程
(一) 没有正文的JSP自定义标签实现 (1):定义JSP自定义标签处理类 import java.io.IOException; import java.util.Date; import java ...
- JSP自定义标签详解(1)
JSP自定义标签 自定义JSP标签概述 自定义JSP标签就是程序员定义的一种JSP标签,这种标签把那些信息显示逻辑封装在一个单独的Java类中,通过一个XML文件来描述它的使用.当页面中需要使用类似的 ...
最新文章
- 非常认同的《SEO优化大全》
- 1小时学会:最简单的iOS直播推流(十)librtmp使用介绍
- 仅需6步,教你轻易撕掉app开发框架的神秘面纱(6):各种公共方法及工具类的封装
- 算法--------数组------反转字符串中的元音字母
- c语言调用tuxedo步骤,tuxedo 入门
- 蓝桥杯 迷宫与陷阱 BFS
- 数据结构:(6)其他情况的算法分析
- 5g上行速率怎么提升_揭秘联发科5G独家技术,攻克上行覆盖和终端功耗两大技术难题...
- 在数学空间中,物理分辨率可能失去了意义(behind the paper)
- 「代码随想录」968.监控二叉树【贪心算法】力扣详解!
- matlab产生年月日的时间序列,求助:在MATLAB里如何输入时间序列中的时间
- SQL注入 时间延时注入语句
- java 合并两个音频_如何利用音乐合成软件将多段音频合并为一段?快速合并音频的方法...
- 小学教育专业语文方向毕业论文怎么选题?
- 树莓派51/100 - Pico下用MicroPython在ssd1306上显示汉字
- 基于 SpringBoot 和 webSocket 的匿名聊天室
- oracle导出导入同义词,使用datapump 导出导入同义词
- 西安三本计算机专业可报院校,西安三本大学前十名, 西北大学现代学院仅第四...
- 表单验证-----验证图片格式
- 【android】向模拟器的sdcard中添加文件
热门文章
- 开发一个整数加法的程序,实现将计算结果显示到页面上的功能
- hutool 获取某月最后一天_取某月的最后一天的方法
- 互联网晚报 | 11/28日 星期一 | 蜜雪冰城客服回应喝出虫子店家态度消极;抖音回应世界杯直播时出现杂音;微信内测新功能...
- 小旋风百度SEO批量PING推送工具
- git 本地如何配置多平台账号|本地 git 账号关联远程 github/gitlab/gitee
- TCP和UDP的笑话导致的悲剧爱情故事
- 基于SPSS二次开发的Web SPSS系统
- 神经网络模型matlab例子,神经网络算法matlab
- 我是软件工程师[转]
- 电脑如何通过HTC手机上互联网的配置方法(联通号)