java|自定义jsp标签

目录
一.首先我们需要了解什么是标签
二.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.处理流程 java|自定义jsp标签
文章图片


3.如何自定义标签
常见自定义标签主要步骤:
  • 编写助手类
  • 编写标签库描述文件(tld)
  • 在页面上引入标签使用
4.标签类型
  1. UI标签, 输出页面元素
  2. 控制标签, 如if标签,foreach标签等
  3. 数据标签,用于向页面输入数据
三.示例 a.out标签 创建助手类
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 outcom.zking.tag.OutTagemptyvaltruetrueout标签val属性,用于输出val的值defaultValfalsefalseout标签,如val属性值为空,则输出该默认值

java|自定义jsp标签
文章图片

注意:图片上/zking需要在页面上引用
在页面上引入使用
注意:测试数据导包这里需要填类的权限命名
java|自定义jsp标签
文章图片

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 falsename true falseitems true truecssClass false falsecssStyle false falsevalue true falsetext true falseselectValue false false

在页面上引入使用

运行结果:
【java|自定义jsp标签】java|自定义jsp标签
文章图片

    推荐阅读