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 ); } }