目录
一.首先我们需要了解什么是标签
二.JSP自定义标签库
1.JSP标签库是什么
2.处理流程
3.如何自定义标签
4.标签类型
三.示例
a.out标签
b.if标签
c.foreach标签
d.select标签
标记语言,是一种注释文本的语言,以便于计算机可以操作。很多与“ML”结尾的语言都是标记语言,比如:HTML,XML,XHTML,VML等等。
标记语言与其他语言一样,也需要运行它们的环境,比如HTML的运行环境时浏览器,XML也要自己的解析和运行的环境。
基本结构:
<开始标签>标签体结束标签>
空标签:
<开始标签 属性名="属性值"/>结束标签>
<开始标签 属性名="属性值"/>
JSP标签库,也称自定义标签库,可看成是一种通过JavaBean生成基于XML的脚本的方法。从概念上讲,标签就是很简单而且可重用的代码结构。比方说,在最新发布的JSPKit(在JSP Insider内)中,使用XML标签实现了对XML文档的轻松访问。
——————百度百科
我的理解:是一个JSP标签集合,它封装了JSP应用的通用核心功能, 基于JSP标签我们可以理解为,是JSP应该通用功能的一种封装方式。
常见自定义标签主要步骤:
- 编写助手类
- 编写标签库描述文件(tld)
- 在页面上引入标签使用
- 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属性值为空,则输出该默认值
注意:图片上
在页面上引入使用
注意:测试数据导包这里需要填类的权限命名
<%@page import="com.zking.model.*,java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="z" uri="/zking" %>
Insert title here
<%
request.setAttribute("name", "");
%>
创建助手类
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}
创建助手类
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
在页面上引入使用
<%
//获取测试数据
List books = TestDate.getBooks();
//放入request对象中
request.setAttribute("books", books);
%>
${book.id } - ${book.name }
创建助手类
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 = 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("");
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
在页面上引入使用
运行结果: