jsp2的自定义标签

  jsp自定义标签概述:

     jsp在jsp1.1版本中增加了自定义标签,自定义标签是一种非常优秀的表现层组件技术,通过使用自定义标签库可以在简单的标签中封装非常复杂的功能。

    为什么要是用自定义标签?

    >.jsp脚本非常的丑陋,难以维护。

    >.jsp脚本和HTML代码混合在一起,维护成本高。

    >.jsp脚本和HTML代码混合在一起,导致美工人员难以参与开发。

基于以上的三点考虑,我们需要一种可以在html界面中使用,符合html规范,但又能完成jsp脚本功能的组件技术--这就是jsp的自定义标签。


    jsp自定义标签在jsp1中非常的复杂,jsp2简化了标签库的开发,在jsp2中开发一个自定义标签一般需要三个步骤:

    1,开发自定义标签处理类。

    2,建立一个*.tld文件,每个 *.tld文件对应一个标签类,每个标签类中可包含多个标签。

    3,在jsp中使用自定义标签。

2,简单的自定义标签输出 helloWorld

    -->1,开发自定义标签:

    要想jsp界面中正常使用标签,必须要有底层的代码的支持,这些代码被称为标签处理类,里面封装了复杂的功能,在jsp界面使用标签调用即可。如果想要这个类能正常的作为标签处理类,有三个前提:

    a:自定义标签类都必须继承一个父类:javax.servlet.jsp.tagest.SimpleTagSupport.

    b:如果标签类中包含属性,每个属性必须有对应的set()和get()方法。

    c:必须重写doTag()方法,这个方法负责生成页面的内容。

标签处理类:HelloWorld.java

             package www.cslc.com;
             import java.io.IOException;
             import javax.servlet.jsp.JspException;
             import javax.servlet.jsp.tagext.SimpleTagSupport;
             public class HelloWorld extends SimpleTagSupport{
              public void doTag() throws JspException,IOException{
                 getJspContext().getOut().write("hello world ! ! !");
               }
              }



2:建立tld文件:

   tld是tag library definition的缩写,即自定义标签库,文件的后缀是tld,每个tld文件对应一个标签库,一个标签库中可能有多个标签,tld文件也称为标签库的自定义文件。

   tld文件的源例子可以在tomcat中找到:tomcat\webapps\example\WEB-INF\jsp2路径下有tld文件,这就是一个范例,修改后作为自己的tld文件:

   tld文件必须放在web应用的WEB-INF路径或者其子目录下才能被加载使用。

mytaglib.tld:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>MySimpleTagLibrary</short-name>
    <!-- 自定义标签库块开始 -->
   
<uri>http://www.clsc.com/mytaglib</uri>
    <tag>
    <name>helloWorld</name>
       <tag-class>www.cslc.com.HelloWorld</tag-class>
       <body-content>empty</body-content>
    </tag>
    <!-- 自定义标签库块结束 -->
</taglib>


MyJsp.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.clsc.com/mytaglib" prefix="mytaglib"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
  </head>
  <body>
  <mytaglib:helloWorld/>
  </body>
</html>



部署工程到tomcat,启动tomcat请求该jsp界面会出现  helloWorld!字样。


3:带属性的标签

      标签要实现复杂的功能,一定离不开各种属性的支持,属性的作用基本上就等同于参数,在jsp界面可以通过这些属性来传递参数实现标签的功能,这些属性必须要有set()和get()方法。

各个例子参考上面就简单易懂,注意彩色标示即可,不再赘述:


HelloWorld.java

package www.cslc.com;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class HelloWorld extends SimpleTagSupport{
private String word;
private String name;
private String toSomeOne;
public String getWord() {
return word;
}
public void setWord(String word) {
this.word = word;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getToSomeOne() {
return toSomeOne;

}

        public void doTag() throws JspException,IOException{
getJspContext().getOut().write(name+"想对"+toSomeOne+"说"+word);
}
}



mytaglib.tld


<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>MySimpleTagLibrary</short-name>
    <!-- 自定义标签库块开始 -->
    <uri>http://www.clsc.com/mytaglib</uri>
    <tag>
       <name>helloWorld</name>
       <tag-class>www.cslc.com.HelloWorld</tag-class>
       <body-content>empty</body-content>
       <attribute>
           <name>name</name>
           <!-- 是否为必须属性 -->
           <required>true</required>
           <!-- 是否支持jsp脚本、表达式等动态内容 -->
           <fragment>true</fragment>
       </attribute>
       <attribute>
           <name>toSomeOne</name>
           <!-- 是否为必须属性 -->
           <required>true</required>
           <!-- 是否支持jsp脚本、表达式等动态内容 -->
           <fragment>true</fragment>
       </attribute>
       <attribute>
           <name>word</name>
           <!-- 是否为必须属性 -->
           <required>true</required>
           <!-- 是否支持jsp脚本、表达式等动态内容 -->
           <fragment>true</fragment>
       </attribute>

    </tag>
    <!-- 自定义标签库块结束 -->
</taglib>



MyJsp.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.clsc.com/mytaglib" prefix="mytaglib"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
  </head>
  <body>
  <mytaglib:helloWorld name="aa"   toSomeOne="bb"  word="love you"/>
  </body>
</html>


值得注意的是,标签库是表现层组件技术,所以不建议在标签库中涉及链接数据库业务逻辑,它应该只负责显示。


3,带标签体的标签

  带标签体的标签可以在标签中嵌入其他内容(静态的HTML和动态的jsp内容),通常用于完成一些逻辑运算,如判断、循环等等,下面以一个循环为例子


IteratorTag.java

package www.cslc.com;
import java.io.IOException;
import java.util.Collection;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class IteratorTag extends SimpleTagSupport{
private String collection;
private String item;
public String getCollection() {
return collection;
}
public void setCollection(String collection) {
this.collection = collection;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
@SuppressWarnings("unchecked")
public void doTag() throws JspException,IOException{
Collection itemList=(Collection)getJspContext().getAttribute(collection);
//遍历集合 
for(Object s:itemList){
getJspContext().setAttribute(item, s);
getJspBody().invoke(null);
}
}
}



myItemtaglib.tld

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    <tlib-version>1.0</tlib-version>
    <short-name>MySimpleTagLibrary</short-name>
    <!-- 自定义标签库块开始 -->
    <uri>http://www.clsc.com/myItemtaglib</uri>
    <tag>
       <name>IteratorTag</name>
       <tag-class>www.cslc.com.IteratorTag</tag-class>
       <body-content>scriptless</body-content>
       <attribute>
           <name>collection</name>
           <!-- 是否为必须属性 -->
           <required>true</required>
           <!-- 是否支持jsp脚本、表达式等动态内容 -->
           <fragment>true</fragment>
       </attribute>
       <attribute>
           <name>item</name>
           <!-- 是否为必须属性 -->
           <required>true</required>
           <!-- 是否支持jsp脚本、表达式等动态内容 -->
           <fragment>true</fragment>
       </attribute>
    </tag>
    <!-- 自定义标签库块结束 -->
</taglib>



index.jsp


<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="http://www.clsc.com/myItemtaglib" prefix="mytaglib"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
  </head>
     
  <body> 
  <% 
       //创建一个List对象
       List<String> a=new ArrayList<String>();
       a.add("aa");
       a.add("bb");
       a.add("cc");
      
      
      pageContext.setAttribute("a",a);
  %>
     <mytaglib:IteratorTag item="item" collection="a">
     <tr>
        <td>${pageScope.item}<td>
     <tr>
     </mytaglib:IteratorTag>
  </body>
</html>


以页面片段作为属性的标签:


jsp2规范的自定义标签还允许直接将一段“页面片段”作为属性,这种方式给自定义标签提供了更大的灵活性。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

专注网赚的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值