目录
一.首先我们需要了解什么是标签
二.JSP自定义标签库
1.JSP标签库是什么
2.处理流程
3.如何自定义标签
4.标签类型
三.示例
a.out标签
b.if标签
c.foreach标签
d.select标签
一.首先我们需要了解什么是标签
标记语言,是一种注释文本的语言,以便于计算机可以操作。很多与“ML”结尾的语言都是标记语言,比如:HTML,XML,XHTML,VML等等。基本结构:
标记语言与其他语言一样,也需要运行它们的环境,比如HTML的运行环境时浏览器,XML也要自己的解析和运行的环境。
<开始标签>标签体结束标签>
空标签:
<开始标签 属性名="属性值"/>结束标签>
<开始标签 属性名="属性值"/>
二.JSP自定义标签库 1.JSP标签库是什么
JSP标签库,也称自定义标签库,可看成是一种通过JavaBean生成基于XML的脚本的方法。从概念上讲,标签就是很简单而且可重用的代码结构。比方说,在最新发布的JSPKit(在JSP Insider内)中,使用XML标签实现了对XML文档的轻松访问。我的理解:是一个JSP标签集合,它封装了JSP应用的通用核心功能, 基于JSP标签我们可以理解为,是JSP应该通用功能的一种封装方式。
——————百度百科
2.处理流程
文章图片
3.如何自定义标签
常见自定义标签主要步骤:4.标签类型
- 编写助手类
- 编写标签库描述文件(tld)
- 在页面上引入标签使用
三.示例 a.out标签 创建助手类
- UI标签, 输出页面元素
- 控制标签, 如if标签,foreach标签等
- 数据标签,用于向页面输入数据
package com.zking.tag;
import java.io.IOException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import com.mysql.jdbc.StringUtils;
public class OutTag extends BodyTagSupport{ private String val;
private String defaultVal;
//默认值 public String getVal() {
return val;
} public void setVal(String val) {
this.val = val;
} public String getDefaultVal() {
return defaultVal;
} public void setDefaultVal(String defaultVal) {
this.defaultVal = defaultVal;
}
@Override
public int doStartTag() {
JspWriter out = this.pageContext.getOut();
try {
if(StringUtils.isNullOrEmpty(val)) {
out.println(this.defaultVal);
}else {
out.println(this.val);
}
} catch (IOException e) {
e.printStackTrace();
}
return SKIP_BODY;
}
}
编写tld文件,(必须放在WEB-INF目录或其目录下)
1.0
1.2
Simple Tags
/zking
out com.zking.tag.OutTag empty val true true out标签val属性,用于输出val的值 defaultVal false false out标签,如val属性值为空,则输出该默认值
文章图片
注意:图片上
在页面上引入使用
注意:测试数据导包这里需要填类的权限命名
文章图片
Insert title here - 锐客网
b.if标签 创建助手类
package com.zking.tag;
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() {
if(this.test) {
return EVAL_BODY_INCLUDE;
}
return SKIP_BODY;
}
}
编写tld文件
if
com.zking.tag.IfTag
jsp
if标签
test
true
true
在页面上引入使用
测试if{100==100}
c.foreach标签 创建助手类
package com.zking.tag;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;
/**
* 助手类
*/
import javax.servlet.jsp.tagext.BodyTagSupport;
@SuppressWarnings("serial")
public class ForeachTag extends BodyTagSupport { // 存放数据源
private List> items;
// 每次循环获取的对象放入pageContext中,并以var属性的值为key进行保存
// 示例: 页面上标签var属性指定为item,则每次循环取出的对象(obj)将执行如下:
// pageContext.setAttribute("item", obj);
// 页面中可以使用EL表达式取出对象中的属性, 如: ${item.name}
private String var;
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;
} @Override
public int doStartTag() {
if(Objects.isNull(this.items)||this.items.size()<=0) {
return SKIP_BODY;
}Iterator> it = this.items.iterator();
Object next = it.next();
this.pageContext.setAttribute(var, next);
this.pageContext.setAttribute("iterator", it);
return EVAL_BODY_INCLUDE;
}
//判断是否有值,有值就继续返回,调用自己
public int doAfterBody() {
Iterator> it = (Iterator>)this.pageContext.getAttribute("iterator");
if(it.hasNext()) {
this.pageContext.setAttribute(var, it.next());
//如果还有值,返回EVAL_BODY_AGAIN,再调用方法
return EVAL_BODY_AGAIN;
}
//循环完成,跳过
return SKIP_BODY;
}
}
编写tld文件
foreach
com.zking.tag.ForeachTag
jsp
foreach标签
items
true
true
var
true
false
在页面上引入使用
${book.id } - ${book.name }
d.select标签 创建助手类
package com.zking.tag;
import java.io.IOException;
import java.util.List;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.commons.beanutils.BeanUtils;
import com.mysql.jdbc.StringUtils;
@SuppressWarnings({ "unused", "serial" })
public class SelectTag extends BodyTagSupport { private String id;
private String name;
private List> items;
private String cssClass;
private String cssStyle;
private String value;
private String text;
private String selectValue;
public void setId(String id) {
this.id = id;
} public void setName(String name) {
this.name = name;
} public void setItems(List> items) {
this.items = items;
} public void setCssClass(String cssClass) {
this.cssClass = cssClass;
} public void setCssStyle(String cssStyle) {
this.cssStyle = cssStyle;
} public void setValue(String value) {
this.value = https://www.it610.com/article/value;
} public void setText(String text) {
this.text = text;
} public void setSelectValue(String selectValue) {
this.selectValue = selectValue;
} @Override
public int doStartTag() {JspWriter out = this.pageContext.getOut();
try {
String html = getSelectHtml();
out.print(html);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}return SKIP_BODY;
}
//通过注入的属性值,来构造select元素的字符串
private String getSelectHtml() throws Exception{
StringBuilder sb = new StringBuilder();
//通过字符串拼接,构造页面需要的select元素
sb.append("");
//循环生成options
for(Object option:this.items) {
String val = BeanUtils.getProperty(option, this.value);
String txt = BeanUtils.getProperty(option, this.text);
if(val.equals(this.selectValue)) {sb.append("");
}else {
sb.append("");
}}sb.append("");
return sb.toString();
}
}
编写tld文件
select
com.zking.tag.SelectTag
empty
id
true
false name
true
false items
true
true cssClass
false
false cssStyle
false
false value
true
false text
true
false selectValue
false
false
在页面上引入使用
运行结果:
【java|自定义jsp标签】
文章图片
推荐阅读
- jvm|Java的反射机制ヾ(≧▽≦*)o
- java|JavaWeb新闻发布系统的登录&新闻增加
- python|【Python数据科学快速入门系列 | 01】Numpy初窥——基础概念
- 语义分割|【语义分割项目实战】制作语义分割数据集,并使用U-Net进行实战检测
- 【Netty】五、ChannelPipeline以及ChannelHandler
- Java|分布式定时任务调度框架选型
- 分布式|分布式定时任务框架选型,写得太好了
- spring|分布式定时任务框架说明
- java|ceph-msg-messager|simple 代码分析