博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JSP自定义标签
阅读量:4670 次
发布时间:2019-06-09

本文共 11376 字,大约阅读时间需要 37 分钟。

当jsp的内置标签和jstl标签库内的标签都满足不了需求,这时候就需要开发者自定义标签。

 

自定义标签的开发步骤

1 创建一个标签助手类(继承BodyTagSupport)

标签属性必须助手类的属性对应、且要提供对应get/set方法rtexprvalue

2 在你的web应用目录下,找到WEB-INF文件夹,在里面新建一个tld类型的文件

如果你忘记了怎么写,可以参考jstl里的tld文件,如下:

1.0
1.2
test
/zking
yy
com.TestTag
jsp
name
true
false

 

3在JSP通过taglib指令导入标签库,并通过指定后缀访问自定义标签

JSP自定义标签生命周期图:

 

SKIP_BODY:跳过主体

EVAL_BODY_INCLUDE:计算标签主体内容并[输出]

EVAL_BODY_BUFFERED:计算标签主体内容并[缓存]

EVAL_PAGE:计算页面的后续部分

SKIP_PAGE:跳过页面的后续部分

EVAL_BODY_AGAIN:再计算主体一次

 

自定义set和out标签

分别创建一个·set和out的助手类

1.set

package com.jsp; import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.BodyTagSupport; public class SetTag extends BodyTagSupport{     private static final long serialVersionUID = 1L;     private String var;    private Object value;    public String getVar() {        return var;    }    public void setVar(String var) {        this.var = var;    }    public Object getValue() {        return value;    }    public void setValue(Object value) {        this.value = value;    }         @Override    public int doStartTag() throws JspException {        pageContext.setAttribute(var, value);//将值存入pageContext        return SKIP_BODY;    }

2.out

package com.jsp;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 static final long serialVersionUID = 5811663341301161566L;    private String value;    public String getValue() {        return value;    }    public void setValue(String value) {        this.value = value;    }    @Override    public int doStartTag() throws JspException {        JspWriter out = pageContext.getOut();        try {            out.print(value);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return SKIP_BODY;    }}

在tld文件中添加set和out的标签

  
set
com.jsp.SetTag
JSP
var
true
false
value
true
true
out
com.jsp.OutTag
JSP
value
true
true

jsp页面演示set,out标签

自定义if标签

步骤同上:

package com.jsp.jsp;/* * if助手类 */import javax.servlet.jsp.JspException;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() throws JspException {        if(!test) {            return SKIP_BODY;//不显示标签中间的内容        }        return EVAL_BODY_INCLUDE;//显示标签中间的内容    }     }
if
com.jsp.IfTag
JSP
test
true
true

 

jsp页面演示:

你看得见我
你看不见我

定义foreach标签

package com.jsp;/** * foreach助手类 */import java.util.ArrayList;import java.util.Iterator;import java.util.List;import javax.servlet.jsp.JspException;import javax.servlet.jsp.tagext.BodyTagSupport;public class ForeachTag extends BodyTagSupport {    private static final long serialVersionUID = -6290285418914929131L;    private String var;    private List items = new ArrayList<>();    public String getVar() {        return var;    }    public void setVar(String var) {        this.var = var;    }    public List getitems() {        return items;    }    public void setitems(List items) {        this.items = items;    }    @Override    public int doStartTag() throws JspException {        if (items == null || items.size() == 0) {            return SKIP_BODY;        } else {            Iterator it = items.iterator();            // 作用域进行传递            pageContext.setAttribute("it", it);            // 第一次给变量进行赋值            pageContext.setAttribute(var, it.next());            return EVAL_BODY_INCLUDE;        }    }    @Override    public int doAfterBody() throws JspException {        // TODO Auto-generated method stub        Iterator its = (Iterator) pageContext.getAttribute("it"); while (its.hasNext()) { // 将循环读取出来的数据显示在界面上 pageContext.setAttribute(var, its.next()); return EVAL_BODY_AGAIN; } return SKIP_BODY; }}
  
foreah
com.jsp.ForeachTag
JSP
var
true
true
items
true
true

jsp页面演示foreach标签

<%        List
is = new ArrayList<>(); is.add("aa"); is.add("bb"); is.add("cc"); is.add("dd"); is.add("sb"); pageContext.setAttribute("is", is); %>
  1. ${i }

JSP自定义select标签

创建一个学生类

package com.entity;public class Student {    private String sid;    private String sname;    public String getsid() {        return sid;    }    public void setsid(String sid) {        this.sid = sid;    }    public String getsname() {        return sname;    }    public void setsname(String sname) {        this.sname = sname;    }    public Student(String sid, String sname) {        super();        this.sid = sid;        this.sname = sname;    }    public Student() {        super();        // TODO Auto-generated constructor stub    }    }

 

package com.jsp;import java.io.IOException;import java.lang.reflect.Field;import java.util.ArrayList;import java.util.List;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.BodyTagSupport;import org.apache.commons.beanutils.BeanUtils;public class SelectTag extends BodyTagSupport {    private static final long serialVersionUID = 1L;    private String id;    private String name;    private List items = new ArrayList();    private String textKey;    private String textval;    private String headTextKey;    private String headTextVal;    private String selectedval;     public String getId() {        return id;    }     public void setId(String id) {        this.id = id;    }     public String getName() {        return name;    }     public void setName(String name) {        this.name = name;    }     public List getItems() {        return items;    }     public void setItems(List items) {        this.items = items;    }     public String getTextKey() {        return textKey;    }     public void setTextKey(String textKey) {        this.textKey = textKey;    }     public String getTextval() {        return textval;    }     public void setTextval(String textval) {        this.textval = textval;    }     public String getHeadTextKey() {        return headTextKey;    }     public void setHeadTextKey(String headTextKey) {        this.headTextKey = headTextKey;    }     public String getHeadTextVal() {        return headTextVal;    }     public void setHeadTextVal(String headTextVal) {        this.headTextVal = headTextVal;    }     public String getSelectedval() {        return selectedval;    }     public void setSelectedval(String selectedval) {        this.selectedval = selectedval;    }     @Override    public int doStartTag() throws JspException {        JspWriter out = pageContext.getOut();        try {            out.write(toHTML());        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        return super.doStartTag();    }    /**     * 拼接出下拉列表所对应的select的html代码     *      */    private String toHTML() throws Exception {        StringBuilder sb = new StringBuilder();        sb.append("");        return sb.toString();    }}

select标签的tld文件

select
com.jsp.ServletTag
JSP
id
false
flase
name
flase
flase
items
true
true
textKey
true
false
textval
true
flase
headTextKey
false
false
headTextVal
false
flase
selectedval
false
true

 

<%    List
student=new ArrayList(); student.add(new Student("1","zs")); student.add(new Student("2","ls")); student.add(new Student("3","ww")); student.add(new Student("4","zl")); student.add(new Student("5","qq")); student.add(new Student("6","gd")); student.add(new Student("7","wb")); pageContext.setAttribute("stus", student); %>

 

转载于:https://www.cnblogs.com/huxiaocong/p/11059697.html

你可能感兴趣的文章
mysql的建表语句
查看>>
免费的HTML5版uploadify
查看>>
机器学习之路:python 集成分类器 随机森林分类RandomForestClassifier 梯度提升决策树分类GradientBoostingClassifier 预测泰坦尼克号幸存者...
查看>>
通过onkeydown事件来控制只允许数字
查看>>
Python实现常用的数据结构
查看>>
snort简介以及在Ubuntu下的安装
查看>>
从SVN资源库下载项目
查看>>
Class.isAssignableFrom(Class clz)方法 与 instanceof 关键字的区别
查看>>
php克隆 自动加载
查看>>
删除同目录下面txt文件(利用os,fnmacth模块)
查看>>
sqlserver 按日、周、月统计方法
查看>>
简单几步让CentOS系统时间同步
查看>>
Host aggregate分区
查看>>
Windows服务器上使用phpstudy部署PHP程序
查看>>
[唐胡璐]QTP框架 - 关键字驱动测试框架之三 - 对象库管理
查看>>
zoj 2112 树状数组 套主席树 动态求区间 第k个数
查看>>
4538: [Hnoi2016]网络
查看>>
186. [USACO Oct08] 牧场旅行
查看>>
一个屌丝程序猿的人生(三十九)
查看>>
Linux常用命令
查看>>