JavaWeb——自定义标签
程序员文章站
2022-05-30 20:49:47
...
自定义标签的步骤:
1.定义一个类,继承javax.servlet.jsp.tagext.SimpleTagSupport,重写doTag方法;
2.在web项目的WEB-INF目录下建立标签库的声明文件——.tld文件;
3.在jsp页面的头部导入自定义标签库;
4.在jsp中使用自定义标签。
例如:自定义一个标签显示当天日期。
package com.tag;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ShowDate extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext) getJspContext();
String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
pageContext.getOut().write(date);
}
}
myTag.tld:
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
version="2.1">
<tlib-version>1.1</tlib-version><!-- 标签库版本 -->
<short-name>gjs</short-name><!-- 标签库前缀 -->
<uri>http://gjs.widzl</uri><!-- tld文件的唯一标记 -->
<tag>
<name>showDate</name><!-- 标签名称 -->
<tag-class>com.tag.ShowDate</tag-class><!-- 标签处理器类的全名 -->
<body-content>scriptless</body-content><!-- 输出标签体内容格式 -->
</tag>
</taglib>
<!--
输出标签体内容格式
JSP: 在传统标签中使用的。可以写和执行jsp的java代码。
scriptless: 标签体不可以写jsp的java代码
empty: 必须是空标签。
tagdependent : 标签体内容可以写jsp的java代码,但不会执行。
-->
tag.jsp:
头部导入自定义标签库:<%@taglib uri=“http://gjs.widzl” prefix=“gjs”%>
在页面使用标签(<标签库前缀:标签名称>)
自定义if标签
package com.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class IF extends SimpleTagSupport {
private boolean test = true;
public boolean isTest() {
return test;
}
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test) {
getJspBody().invoke(null);
}
}
}
<tag>
<name>if</name>
<tag-class>com.tag.IF</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<gjs:if test="${3>2 }">自定义if标签</gjs:if>
自定义choose、when、otherwise标签
package com.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class Choose extends SimpleTagSupport {
private boolean flag;// 不是属性,而是临时变量
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void doTag() throws JspException, IOException {
this.getJspBody().invoke(null);// 输出标签体内容
}
}
package com.tag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class When extends SimpleTagSupport {
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
if(test)//根据test的返回值决定是否输出标签体内容
this.getJspBody().invoke(null);
Choose parent = (Choose)this.getParent();//获取父标签
parent.setFlag(test);
}
}
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class Otherwise extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
//通过父标签传递,when标签中test的值
Choose parent = (Choose)this.getParent();//获取父标签
boolean test = parent.isFlag();
if(!test){
this.getJspBody().invoke(null);
}
}
}
<tag>
<name>choose</name>
<tag-class>com.tag.Choose</tag-class>
<body-content>scriptless</body-content>
</tag>
<tag>
<name>when</name>
<tag-class>com.tag.When</tag-class>
<body-content>scriptless</body-content>
<attribute>
<name>test</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>otherwise</name>
<tag-class>com.tag.Otherwise</tag-class>
<body-content>scriptless</body-content>
</tag>
使用:
<gjs:choose>
<gjs:when test="${10<5 }">10小于5</gjs:when>
<gjs:otherwise>10大于等于5</gjs:otherwise>
</gjs:choose>
自定义foreach标签
package com.tag;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class ForEach extends SimpleTagSupport {
private Object items;//需要遍历的数据.List或map
private String var;//每个元素的名称
public Object getItems() {
return items;
}
public void setItems(Object items) {
this.items = items;
}
public String getVar() {
return var;
}
public void setVar(String var) {
this.var = var;
}
public void doTag() throws JspException, IOException {
PageContext pageContext = (PageContext) getJspContext();
if(items instanceof String) {//遍历字符串
String str = (String)items;
for(int i=0;i<str.length();i++) {
pageContext.setAttribute(var, str.charAt(i));//把每个对象放入域对象中(pageContext)
getJspBody().invoke(null);//显示标签体内容
}
return ;
}
Collection col = null;
if(items instanceof List) {
col = (List)items;
}else if(items instanceof Map) {
Map map = (Map)items;
col = map.entrySet();
}
if (col!=null) {
for (Object obj : col) {
pageContext.setAttribute(var, obj);
this.getJspBody().invoke(null);
}
}
}
}
<tag>
<name>forEach</name>
<tag-class>com.tag.ForEach</tag-class>
<body-content>scriptless</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>
<%
String arr[] = {"a","b","c","d"};
String s = "1-2-3-4-5-6";
pageContext.setAttribute("str", arr);
pageContext.setAttribute("ssss", s);
List<Student> list = new ArrayList<Student>();
list.add(new Student("rose",18));
list.add(new Student("jack",28));
list.add(new Student("lucy",38));
pageContext.setAttribute("list",list);//放入域中
Map<String,Student> map = new HashMap<String,Student>();
map.put("100",new Student("mark",20));
map.put("101",new Student("maxwell",30));
map.put("102",new Student("narci",40));
pageContext.setAttribute("map",map);
%>
自定义foreach:<br>
<gjs:forEach items="${s }" var="s2">
<c:out value="${s2 }"></c:out>
</gjs:forEach> <hr><br>
<gjs:forEach items="${list}" var="student">
姓名:${student.name } - 年龄:${student.age }<br/>
</gjs:forEach>
<hr/>
<gjs:forEach items="${map}" var="entry">
编号:${entry.key} - 姓名:${entry.value.name} - :${entry.value.age }<br/>
</gjs:forEach>