用过javaee标准标签库的里的标签应该都知道,标签的存在使得页面上的jsp脚本大大减少,甚至说没有了,大大提高了工作效率,使得页面的整洁性也有了很大的提高。下面我们就
模仿核心标签库中choose标签仿造一个我们自己的自定义判断标签。
<%--jqsoft 是你自定义标签的tld库的名字,以个人而定,就像核心标签库以c或其他的开头--%>
<jqsoft:choose> <jqsoft:when test="${10>11 }"> 这是when里面的内容1 </jqsoft:when> <jqsoft:when test="${10<11 }"> 这是when里面的内容2 </jqsoft:when> <jqsoft:otherWise> 这是other内容 </jqsoft:otherWise> </jqsoft:choose>
在页面中使用不同标签库我们都要在页面头部进行声明,格式仿照如下
<%@taglib uri="http://java.sun.com/jqsoft" prefix="jqsoft" %>
在这里需要强调的是tld文件需要放在web-info目录下的,跟web.xml文件处在同一个文件夹下面,头部声明部门的中的uri要严格跟tld文件里的uri相同,而且只有一个,前缀要与tld中的short-name相同.
<?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"> <tlib-version>1.1</tlib-version> <short-name>jqsoft</short-name> <uri>http://java.sun.com/jqsoft</uri> <tag> <name>choose</name> <tag-class>jstl.ChooseTag</tag-class> <body-content>scriptless</body-content> </tag> <tag> <name>otherWise</name> <tag-class>jstl.OtherWise</tag-class> <body-content>scriptless</body-content> </tag> <tag> <name>when</name> <tag-class>jstl.WhenTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>test</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
再附上choose,when和otherwise的代码
package jstl; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; public class ChooseTag extends SimpleTagSupport { private boolean test; public boolean isTest() { return test; } public void setTest(boolean test) { this.test = test; } @Override public void doTag() throws JspException, IOException { /** * 输出标签体内容 */ JspFragment jspBody = this.getJspBody(); jspBody.invoke(null); } }
package jstl; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; public class WhenTag extends SimpleTagSupport { private boolean test; public boolean isTest() { return test; } public void setTest(boolean test) { this.test = test; } @Override public void doTag() throws JspException, IOException { ChooseTag choose = (ChooseTag) this.getParent(); choose.setTest(isTest()); if(isTest()){ JspFragment body = this.getJspBody(); body.invoke(null); } } }
package jstl; import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspTag; import javax.servlet.jsp.tagext.SimpleTagSupport; public class OtherWise extends SimpleTagSupport { @Override public void doTag() throws JspException, IOException { ChooseTag parent = (ChooseTag) this.getParent(); if(!parent.isTest()){ this.getJspBody().invoke(null); } } }
在这里我们需要注意的是我们通过父级标签choose进行了一个传值,因为我们不能直接在同一个地方获取到when和otherwise标签中的值.