1、带属性标签
tld文件内容,复制c标签过来改
<?xml version="1.0" encoding="UTF-8" ?>
<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">
<description>JSTL 1.2 core library</description>
<display-name>dao core</display-name>
<tlib-version>1.0</tlib-version>
//类似c标签的名字
<short-name>uc</short-name>
//标签的访问地址
<uri>http://www.eduask.com/user</uri>
<tag>
<description>
This tag is used to manipulate the database
</description>
<!-- 定义标签名 -->
<name>dao</name>
//标签调用SimpleTagSupport的地址
<tag-class>com.eduask.date.tag.daotag</tag-class>
<!-- 定义标签体为空 -->
<body-content>empty</body-content>
<!-- 配置标签属性:driver -->
<attribute>
<description>
This tag is used to manipulate the database
</description>
//参数
<name>sql</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
java代码,查询emp表格,重写dotag方法
public class daotag extends SimpleTagSupport{
private String sql;//参数要get和set方法
private static DaoImpl dao;
static{
dao=DaoImpl.getInstance();
}
@Override
public void doTag() throws JspException, IOException {
JspWriter out=getJspContext().getOut();
List<Emp> list=dao.selectTable(new Emp(), sql, null);
out.write("<table border='1'>");
for(Emp emp:list){
out.write("<tr>");
out.write("<td>");
out.write(String.valueOf(emp.getEmpno()));
out.write("</td>");
out.write("<td>");
out.write(emp.getDeptno());
out.write("</td>");
out.write("</tr>");
}
out.write("</table>");
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
}
2、带标签体的标签
带标签体的标签,可以在内嵌入其他内容(包括静态HTML内容和动态的Jsp内容),通常用于完成一些逻辑运算,例如判断和循环等。
<tag>
<!-- 定义标签名 -->
<name>iterator</name>
<!-- 定义标签处理类 -->
<tag-class>com.eduask.mytag.IteratorTag</tag-class>
<!-- 定义标签体可以是静态的HTML内容,也可以是表达式语言
但不允许出现JSP脚本 -->
<body-content>scriptless</body-content>
<!-- 配置标签属性:collection -->
<attribute>
<name>collection</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
<!-- 配置标签属性:item -->
<attribute>
<name>item</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
java代码
public class IteratorTag extends SimpleTagSupport
{
// 标签属性,用于指定需要被迭代的集合
private String collection;
// 标签属性,指定迭代集合元素,为集合元素指定的名称
private String item;
// collection的setter和getter方法
public void setCollection(String collection)
{
this.collection = collection;
}
public String getCollection()
{
return this.collection;
}
// item的setter和getter方法
public void setItem(String item)
{
this.item = item;
}
public String getItem()
{
return this.item;
}
// 标签的处理方法,标签处理类只需要重写doTag()方法
public void doTag() throws JspException, IOException
{
// 从page scope中获取名为collection的集合
Collection itemList = (Collection)getJspContext().
getAttribute(collection);
// 遍历集合
for (Object s : itemList)
{
// 将集合的元素设置到page范围内
getJspContext().setAttribute(item, s );
// 输出标签体
getJspBody().invoke(null);
}
}
}
网页代码
<body>
<h2>带标签体的标签-迭代器标签</h2><hr/>
<%
//创建一个List对象
List<String> a = new ArrayList<String>();
a.add("床前明月光");
a.add("十步杀一人");
a.add("事了拂衣去");
//将List对象放入page范围内
pageContext.setAttribute("a" , a);
%>
<table border="1" bgcolor="#aaaadd" width="300">
<!-- 使用迭代器标签,对a集合进行迭代 -->
<mytag:iterator collection="a" item="item">
<tr>
<td>${pageScope.item}</td>
<tr>
</mytag:iterator>
</table>
</body>
3、以页面片段做为属性的标签
只有两个简单的改变。
标签处理类中定义类型为:JspFragment属性,该属性代表了“页面片段”。
使用标签库时,通过
tag>
<!-- 定义标签名 -->
<name>fragment</name>
<!-- 定义标签处理类 -->
<tag-class>com.eduask.mytag.FragmentTag</tag-class>
<!-- 指定该标签不支持标签体 -->
<body-content>empty</body-content>
<!-- 定义标签属性:fragment -->
<attribute>
<name>fragment</name>
<required>true</required>
<fragment>true</fragment>
</attribute>
</tag>
java代码
public class FragmentTag extends SimpleTagSupport
{
private JspFragment fragment;
// fragment的setter和getter方法
public void setFragment(JspFragment fragment)
{
this.fragment = fragment;
}
public JspFragment getFragment()
{
return this.fragment;
}
@Override
public void doTag() throws JspException, IOException
{
JspWriter out = getJspContext().getOut();
out.println("<div style='padding:10px;border:1px solid black;"
+ ";border-radius:20px'>");
out.println("<h3>下面是动态传入的JSP片段</h3>");
// 调用、输出“页面片段”
fragment.invoke( null );
out.println("</div");
}
}
网页代码
<body>
<myTag:helloWorld/>
This is my JSP page. <br>
<myTag:fragment>
<jsp:attribute name="fragment">
<%-- 使用jsp:attribute标签传入fragment参数(该注释不能放在fragment内) -->
<%-- 下面是动态的JSP页面片段 --%>
<myTag:helloWorld/>
</jsp:attribute>
</myTag:fragment>
<br/>
<myTag:fragment>
<jsp:attribute name="fragment">
${pageContext.request.remoteAddr}
</jsp:attribute>
</myTag:fragment>
</body>
4、动态属性的标签
有时候需要传入自定义标签的属性和个数是不确定的,属性名也不确定,这就需要借助于动态属性的标签了,
动态属性标签比普通标签多了如下两个额外的要求
标签处理类还需要实现DynamicAttributes接口
配置标签时通过子元素指定该标签支持的动态属性
<h2>下面显示的是自定义标签中的内容</h2>
<h4>指定两个属性</h4>
<myTag:dynaAttr name="李白" url="www.libai.com" />
<br />
<h4>指定四个属性</h4>
<myTag:dynaAttr 书名="盗墓笔记" 价格="99.0" 出版时间="2008年" 描述="盗墓的书" />
<br />
本质是for循环
public class DynaAttributesTag
extends SimpleTagSupport implements DynamicAttributes
{
// 保存每个属性名的集合
private ArrayList<String> keys = new ArrayList<String>();
// 保存每个属性值的集合
private ArrayList<Object> values = new ArrayList<Object>();
@Override
public void doTag() throws JspException, IOException
{
JspWriter out = getJspContext().getOut();
// 此处只是简单地输出每个属性
out.println("<ol>");
for( int i = 0; i < keys.size(); i++ )
{
String key = keys.get( i );
Object value = values.get( i );
out.println( "<li>" + key + " = " + value + "</li>" );
}
out.println("</ol>");
}
@Override
public void setDynamicAttribute( String uri, String localName,
Object value )throws JspException
{
// 添加属性名
keys.add( localName );
// 添加属性值
values.add( value );
}
}