自定义的JSP标签
JSP标签
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
我们称之为C标签;
自定义标签开发步骤(简要)
1.助手类(标签功能的主要实现类 继承BodyTagSupport 类)
2.tld文件 (用于配置所有自定义标签的实现类以及每个自定义标签所有的属性)
3.taglib (jsp页面的调用)1. 标签语言特点
<开始标签 属性="属性值">标签体</结束标签>
自定义标签实列代码
.下面是几个比较简单的自定义标签实列
1.根据以上步骤先创建助手类(Set Out If ForEach )
Set
package com.temptag; 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 String value;
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
} @Override
public int doStartTag() throws JspException {
pageContext.setAttribute(var, value);
return SKIP_BODY;
} }
Out :
package com.temptag; 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 = 8402945242L; private Object value; public Object getValue() {
return value;
} public void setValue(Object value) {
this.value = value;
} @Override
public int doStartTag() throws JspException {
JspWriter out = pageContext.getOut();
try {
out.write(value.toString());
} catch (IOException e) {
throw new RuntimeException(e);
}
return SKIP_BODY;
} }
if :
package com.temptag; 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 {
return test ? EVAL_BODY_INCLUDE : SKIP_BODY; //if判断
// if(!test) {
// return SKIP_BODY;//不显示标签中间的内容
// }
//
// return EVAL_BODY_INCLUDE;//显示标签中的内容
} }
ForEach :
package com.temptag; 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 = -91652238343L; // 1 itema 集合 2.var 变量名
private List<Object> items;
private String var;
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> items) {
this.items = items;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
} //<开始> doSartTag <结束>
@Override
public int doStartTag() throws JspException {
if(items==null||items.size()==0) {
return SKIP_BODY;
}
else {
Iterator<Object> it= items.iterator();
//作用域进行传递
pageContext.setAttribute("it", it);
//第一次给变量进行赋值
pageContext.setAttribute(var, it.next());
return EVAL_BODY_INCLUDE;
}
} @Override
public int doAfterBody() throws JspException {
Iterator<Object> it=(Iterator<Object>) pageContext.getAttribute("it");
while(it.hasNext()) {
//如何将循环取出的数据显示在页面上
pageContext.setAttribute(var, it.next());
return EVAL_BODY_AGAIN;
}
return SKIP_BODY;
} }
2.助手类写完之后就可以开始创建tld文件(mytag.tld)
代码信息:
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<!-- 标签库描述符 -->
<taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">
<!-- 代表标签库的版本号 -->
<tlib-version>1.0</tlib-version>
<!-- 代表jsp的版本 -->
<jsp-version>1.2</jsp-version>
<!-- 你的标签库的简称 -->
<short-name>test</short-name>
<!-- 你标签库的引用uri -->
<uri>/yuan</uri> <!-- set标签 -->
<tag>
<name>set</name>
<tag-class>com.temptag.SetTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> <!-- out标签 -->
<tag>
<name>out</name> //标签库中的标签名
<tag-class>com.temptag.Outtag</tag-class>//标签的助手类全路径名
<body-content>JSP</body-content>//标签类型
<attribute>
<name>value</name>//标签属性名 在配置的时候必须与助手类的属性一致
<required>true</required>//该属性是否必填
<rtexprvalue>true</rtexprvalue>//是否支持表达式(EL)
</attribute>
</tag> <!-- if标签 -->
<tag>
<name>if</name>
<tag-class>com.temptag.IfTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> <!-- foreach标签 -->
<tag>
<name>foreach</name>
<tag-class>com.temptag.ForEachTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
set和out标签调用
代码:
<%@taglib prefix="z" uri="/yuan" %>//在jsp页面的html标签以上调用,根据标签库名称调用。
<body> <z:set var="name" value="zhangsan"></z:set>
<z:out value="${name }"/> </body>
输出结果:zhangsan
if标签调用:
<z:if test="${1>0 }">"后续"</z:if>
test返回true,结果显示 "后续",
test改为${1>2 } 返回false 结果不显示出 "后续"。
ForEach调用:
<%
List<String> ls= new ArrayList<>();
ls.add("zs");
ls.add("ls");
ls.add("ww");
ls.add("zl");
ls.add("dg");
ls.add("tr");
ls.add("mt");
pageContext.setAttribute("ls", ls); %> <ol> <z:foreach items="${ls }" var="l">
<li>${l }</li>
</z:foreach>
</ol>
显示结果:
- zs
- ls
- ww
- zl
- dg
- tr
- mt
这些标签JSTL标签库基本上都有的,下面是一个自定义selects(下拉框)标签 ,
selects标签助手类:
package com.temptag; 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; /**
* <select id='' name=''>
* <option value='-1' selected>===请选择===</option>
* </select>
* 查询维度:下拉列表
* 修改页面:下拉列表 数据回显
*
*
* 1、id name
* 2、需要数据源items(传入数据)、存入数据库的值textKey、展示列textVal
* 3、加入属性(默认的头部属性 headTextKey 和默认的展示列值headTextVal)
* 4、加入属性,能实现数据回显的功能selectedVal
* @author ***
*
*/ public class selectT extends BodyTagSupport{ /**
*
*/
private static final long serialVersionUID = 1L; private String id;
private String name;
private List<Object> 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<Object> getItems() {
return items;
}
public void setItems(List<Object> 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代码
* <select id='' name=''>
* <option value='-1' selected>===请选择===</option>
* </select>
* @return
*/
private String toHTML() throws Exception {
StringBuilder sb= new StringBuilder();
sb.append("<select id='"+id+"' name='"+name+"'>");
if(!(headTextKey==null||"".equals(headTextKey)||headTextVal==null||"".equals(headTextVal))) {
sb.append("<option value='"+headTextKey+"' selected>"+headTextVal+"</option>");
}
String val;
String html;
for (Object obj : items) {
//让id存入数据库,把name展示在jsp页面
// <option value='s001' selected>zhangsan</option>
// 得到obj的id和name
Field textKeyField = obj.getClass().getDeclaredField(textKey);
textKeyField.setAccessible(true);
val=(String)textKeyField.get(obj);
//此方法需要用到两个jar包, 也可改用上面getDeclaredField();方法
html= BeanUtils.getProperty(obj, textVal);
if(val.equals(selectedVal)) {
sb.append("<option value='"+val+"' selected>"+html+"</option>");
}
else {
sb.append("<option value='"+val+"'>"+html+"</option>");
}
} sb.append("</select>");
return sb.toString();
} }
tld文件配置:
<!-- select2标签 -->
<tag>
<name>selects</name>
<tag-class>com.temptag.selectT</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>id</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>items</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>textKey</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>textVal</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>headTextKey</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>headTextVal</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>selectedVal</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
在调用的时候需要用到一个实体类 (Student)
Student信息:
package com.temp.entity; public class Student {
private String sid; private String sname; public Integer age; public Student() {
super();
System.out.println("调用无参构造方法创建了一个学生对象");
} public Student(String sid) {
super();
this.sid = sid;
System.out.println("调用带一个参数的构造方法创建了一个学生对象");
} public Student(String sid, String sname) {
super();
this.sid = sid;
this.sname = sname;
System.out.println("调用带二个参数的构造方法创建了一个学生对象");
} @SuppressWarnings("unused")
private Student(Integer age) {
System.out.println("调用Student类私有的构造方法创建一个学生对象");
this.age = age;
} 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 void hello() {
System.out.println("你好!我是" + this.sname);
} public void hello(String name) {
System.out.println(name + "你好!我是" + this.sname);
} @SuppressWarnings("unused")
private Integer add(Integer a, Integer b) {
return new Integer(a.intV
alue() + b.intValue());
}
}
selects调用:
<%
List list = new ArrayList<>();
list.add(new Student("s001","zhangsan"));
list.add(new Student("s002","zhangsan2"));
list.add(new Student("s003","zhangsan3"));
list.add(new Student("s004","zhangsan4"));
list.add(new Student("s005","zhangsan5"));
list.add(new Student("s006","zhangsan6"));
list.add(new Student("s007","zhangsan7")); pageContext.setAttribute("list",list );
%> <z:selects headTextKey="-1" headTextVal="请选择...." selectedVal="s006" textVal="sname" items="${list }" textKey="sid"></z:selects>
其中headTextKey和headTextVal以及selectedVal可不添加,
添加headTextKey和headTextVal则显示:
添加selectedVal则显示:
自定义标签的扩展空间很大,如果可以使用自定义标签来实现的代码这样就可以帮我们省去很多重复的代码。
谢谢观看^_^ !
自定义的JSP标签的更多相关文章
- jsp如何自定义tag的标签库?
虽然和上一次的使用自定义的tld标签简化jsp的繁琐操作的有点不同,但是目的也是一致的.自定义tag比较简单. 1.新建tag标签 在WEB-INF目录下新建一个tags的文件夹,是自定义tag标签的 ...
- 自定义JSP标签库及Properties使用
自定义JSP标签库及Properties使用 自定义JSP标签 自定义JSP标签技术是在JSP 1.1版本中才出现的,它支持用户在JSP文件中自定义标签,这样可以使JSP代码更加简洁. 这些可重用的标 ...
- 一、JSP标签介绍,自定义标签
一.JSP标签介绍 1. 标签库有什么作用 自定义标签库是一种优秀的表现层技术,之前介绍的MVC模式,我们使用jsp作为表现层,但是jsp语法嵌套在html页面,美工还是很难直接参与开发,并且jsp脚 ...
- Java基础83 JSP标签及jsp自定义标签(网页知识)
1.JSP标签 替代jsp脚本,用于jsp中执行java代码1.1.内置标签: <jsp:forward></jsp:forward> 相当于:request.getReu ...
- 自定义JSP标签示例
我们以一个例子来讲解如何自定义JSP标签,假如我们需要在页面中输出当前的时间,按照最简单的JSP脚本,需要在JSP里面写很多Java代码,那么如何来使用自定义标签实现这个功能呢? 首先,我们要先创建一 ...
- JSP自定义tld方法标签
卧槽 我们可以通过tld文件,自定义一个方法标签,以便在页面中使用,目录通常放在WEB-INF下面的tlds文件夹: 引入方式示例,直接在jsp上引入tld标签文件: <%@ taglib pr ...
- 自定义标签(客户化jsp标签)
客户化jsp标签技术是在jsp1.1版本中才出现的,他支持用户在jsp文件中自定义标签,这样可以使jsp代码更加简单,这些可重用的标签能够处理复杂的逻辑运算和事物或定义jsp网页的输出内容和格式. 创 ...
- JSP标签:jsp内置标签、jstl标签、自定义标签
一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签 1 ...
- 通过引入SiteMesh的JSP标签库,解决Freemarker与SiteMesh整合时,自定义SiteMesh标签的问题
不少web项目,都用到了SiteMesh.SiteMesh可以和JSP.Freemarker等模版进行整合,有一定的好处,当然也有其不好的地方.我个人觉得,如果没有必要,不要在项目中引入太多的工具和技 ...
随机推荐
- C++Primer 5th Chap10 Generic Algorithms(未完)
大多数算法定义在头文件algorithm中,在头文件numeric中定义了数值泛型算法. 以find算法为例:在容器的两个迭代器指定的范围内遍历,查找特定值. auto result= cout< ...
- oracle笔记之计算年龄、工龄和TRUNC
方法一:利用months_between 函数计算 SELECT TRUNC(months_between(sysdate, birthday)/12) AS agefrom dual; 方法二:日期 ...
- SAS学习笔记47 Macro Quoting
简单来说:Macro Quoting就是将具有特殊功能字符及字母组合的特殊功能隐藏掉.例如:让分号(;)不再表示一个语句的结束,而就是一个普普通通的字符:让GE不再表示大于等于的比较符,而就是两个普普 ...
- Linux下 sftp服务配置
查看openssh的版本,使用ssh -V 命令来查看openssh的版本,版本必须大于4.8p1,低于的这个版本需要升级. 参考博客:https://yq.aliyun.com/articles/6 ...
- js图片向下流动
<div id=demo style=overflow:hidden;height:;width:;background:#f4f4f4;color:#ffffff><div id= ...
- 获取ApplicationContext进而获取Ioc实例方法
在正常情况下 spring管理的类可直接调用Ioc容器中的实例,但在一些特殊情况下(例如拦截器中获取dao实例),Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该B ...
- win7实现tensorflow中的物体识别
实现条件: 1.win7 2.python 3.运行所需要的库:matplotlib.lxml.pillow.Cython 具体参考:https://github.com/tensorflow/mod ...
- css 居中 父子元素
居中:是子元素相对于在父元素里面居中.父子宽度都固定. A:水平居中: ①给子元素设置一个宽度后.在给其水平方向的margin设置auto,子元素会在父元素水平方向的剩余空间,左右两边平均分配,也就左 ...
- OpenStack kilo版(2) keystone部署
部署在controller节点 配置数据库 MariaDB [(none)]> CREATE DATABASE keystone; Query OK, 1 row affected (0.00 ...
- python urllib应用
urlopen 爬取网页 爬取网页 read() 读取内容 read() , readline() ,readlines() , fileno() , close() :这些方法的使用方式与文件对象完 ...