`

JSP2开发自定义标签

    博客分类:
  • J2EE
 
阅读更多

先创建一个Web工程,因为在这里我们是使用了Maven管理项目,使用Eclipse创建一个叫为app的Maven Project。创建的过程可以看《使用Eclipse开发一个Servlet3.0的简单例子》,然后再加上一些我们需要的Jar包,在这里还需要加上JSP包,即在pom.xml的依赖中添加:

		<!-- 需要使用JSP标签的需要引入的包 -->
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>2.3.1</version>
			<scope>compile</scope>
		</dependency>

 

接着开发JSP自定义标签库:

1、在src/webapp/Web-INF下添加tld文件,即自定义标签文件,在这里我只会给出最终的文件:

<?xml version="1.0" encoding="GBK" ?>
<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 web-jsptaglibrary_2_0.xsd"
version="2.0">
<!-- TLD版本 -->
<tlib-version>1.0</tlib-version>
<!-- 标签库的名称 -->
<short-name>mytaglib</short-name>
<!-- 标签库的URI,唯一 -->
<uri>http://www.crazyit.org/mytaglib</uri>
<tag>
	<!-- 标签名 -->
	<name>helloWorld</name>
	<!-- 标签处理类 -->
	<tag-class>org.test.HelloWorldTag</tag-class>
	<!-- 标签体,当前是空的 -->
	<body-content>empty</body-content>
	<!-- 添加固定的属性 -->
	<attribute>
		<!-- 设置属性名,子元素的值是字符串内容,这个属性必须在处理类中有get,set方法 -->
		<name>content</name>
		<!-- 设置该属性是否为必需属性 -->
		<required>true</required>
		<!-- 设置该属性是否支持JSP脚本、表达式等动态内容 -->
		<fragment>true</fragment>
	</attribute>
</tag>
<tag>
	<name>iterator</name>
	<tag-class>org.test.IteratorTag</tag-class>
	<body-content>scriptless</body-content>
	<attribute>
		<name>collection</name>
		<required>true</required>
		<fragment>true</fragment>
	</attribute>
	<attribute>
		<name>item</name>
		<required>true</required>
		<fragment>true</fragment>
	</attribute>
</tag>
<tag>
	<!-- 标签名,支持片段 -->
	<name>fragment</name>
	<tag-class>org.test.FragmentTag</tag-class>
	<body-content>empty</body-content>
	<attribute>
		<name>fragment</name>
		<required>true</required>
		<fragment>true</fragment>
	</attribute>
</tag>
<tag>
	<name>dynaAttr</name>
	<tag-class>org.test.DynaAttributesTag</tag-class>
	<!-- 这个属性是必须指定的,否则会出错 -->
	<body-content>empty</body-content>
	<!-- 指定支持动态属性 -->
	<dynamic-attributes>true</dynamic-attributes>
</tag>
</taglib>

 

2、创建处理这些对应自定义标签的处理类,自定义标签处理类都需要继承SimpleTagSupport。

public class HelloWorldTag extends SimpleTagSupport
{
    private String content;
    
    public String getContent()
    {
        return content;
    }
    public void setContent(String content)
    {
        this.content = content;
    }

    @Override
    public void doTag() throws JspException, IOException
    {
        this.getJspContext().getOut().write("Hello World "+content);
    }
}

 

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;
    }
    @Override
    public void doTag() throws JspException, IOException
    {
        Collection itemList = (Collection)getJspContext().getAttribute(collection);
        System.out.println(itemList == null);
        for(Object s : itemList)
        {
            System.out.println(s);
            getJspContext().setAttribute(item, s);
            getJspBody().invoke(null);
        }
    }
}

 

public class FragmentTag extends SimpleTagSupport
{
    private JspFragment fragment;

    public JspFragment getFragment()
    {
        return fragment;
    }
    public void setFragment(JspFragment fragment)
    {
        this.fragment = fragment;
    }

    @Override
    public void doTag() throws JspException, IOException
    {
        JspWriter out = getJspContext().getOut();
        out.println("<h3>JSP片段</h3>");
        fragment.invoke(null);
    }
}

 

//动态属性的自定义标签还需要实现DynamicAttributes接口
public class DynaAttributesTag extends SimpleTagSupport implements DynamicAttributes
{
    private List<String> keys = new ArrayList<String>();
    private List<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);
    }
}

 

看到上面这些处理类,大家都会发现一个共同的地方,所有的处理类都是继承自SimpleTagSupport,

如果是动态属性,则还需要实现接口DynamicAttributes,还有就是属性都必须有Setter和Getter方法。

 

3、在JSP页面中使用这些自定义标签。

<!-- 指定错误页面error.jsp -->
<%@ page language="java" errorPage="error.jsp" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<%@ page import="org.test.*" %>
<!-- 如果想要支持EL语言必须把这个EL支持打开,否则默认是不支持的
	如果想整个服务下都支持,则需要在Web服务器上设置
 -->
<%@ page isELIgnored="false" %>
<!-- 1、引入需要使用的标签库,uri是标签库的唯一标识,prefix为前缀 -->
 <%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>pageContext测试</title>
</head>
<body>
<!-- JSP脚本 -->
<%
List<String> a = new ArrayList<String>();
a.add("疯狂Java");
a.add("www.crazyit.org");
a.add("java");
pageContext.setAttribute("a",a);

List<User> users = new ArrayList<User>();
users.add(new User("test1",29));
users.add(new User("test2",30));
users.add(new User("test3",31));
pageContext.setAttribute("users", users);
%>
<br>
<!-- 2、下面就是使用自定义标签的例子 -->
<!-- 带属性,不带标签体的自定义标签 -->
<mytag:helloWorld content="test"/>
<table>
	<!-- 带属性,带标签体的自定义标签 -->
	<mytag:iterator item="item" collection="a">
		<tr>
			<!-- EL表达式 -->
			<td>${pageScope.item}</td>
		</tr>
	</mytag:iterator>
</table>
<table>
	<!-- 这个List是保存的是一个对象 -->
	<mytag:iterator item="user" collection="users">
		<tr>
		<td>${user.name}</td><td>${user.age}</td>
		</tr>
	</mytag:iterator>
</table>
<!-- 页面片段作为属性的标签 -->
<mytag:fragment>
	<jsp:attribute name="fragment">
		<mytag:helloWorld content="test"/>
	</jsp:attribute>
</mytag:fragment>
<!-- 使用动态属性 -->
<mytag:dynaAttr bookname="ddd"  value="123" />
</body>
</html>

 

上面的3个步骤充分说明了如何创建JSP自定义标签,如何使用这些自定义标签。

 

在JSP2还提供另外一个更加简单的自定义标签的方式:

TagFile支持

Tag File 是自定义标签的简化用法,使用Tag File可以无须定义标签处理类和标签库文件,但仍然可以在JSP页面中使用自定义标签。

下面以Tag File一个最简单的标签,期步骤如下:
1)建立Tag文件,在JSP所支持Tag File规范下,Tag File代理了标签处理类,它的格式类似于JSP文件。可以这样理解:如同JSP可以代替Servlet作为表现层一样,Tag File则可以代替标签处理类。

Tag File具有如下5个编译指令。

taglib : 作用与JSP文件中的tablib指令效果相同,用于导入其他标签库
include : 作用与JSP文件中的include指令效果相同,用于导入其他JSP或静态页面
tag : 作用类似于JSP文件中的page指令,有pageEncoding,body-content等属性,用于设置页面编码等属性。
attribute : 用于设置自定义标签的属性,类似于自定义标签处理类中的标签属性
variable : 用于设置自定义标签的变量,这些变量将传给JSP页面使用。
下面是标签的Tag File,这个Tag File的语法与JSP语法非常相似。

自定义标签在页面上生成一个内容片段,同理,这个Tag File也只负责生成一个页面片段。
Tag File的命名必须遵守如下规则:tagName.tag。在这里,我们把这个文件放在/WEB-INF/tags文件夹下。

<%@ tag pageEncoding="UTF-8" import="java.util.*"%>
<!-- 导入EL的自定义函数 -->
<%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%>
<!-- 标签的属性 -->
<%@ attribute name="title"%>
<%@ attribute name="username"%>
<%@ attribute name="bean"%>
<h1>${title }</h1>
<!-- 调用自定义EL的函数 -->
<span>${mytag:reverse(username) }</span>
<!-- 根据从上面传递的bean的名称,从request获取对象,把user的age显示出来 -->
<h2>${requestScope[bean].age}</h2>

 

2)在页面中使用自定义标签时,也是需要先导入标签库,再使用标签。它与自定义标签导入的差别,就是它没有URI,只有标签库路径。因此导入标签时,语法如下:
<%@ taglib prefix="tagPrefix" tagdir="path"%>

<!-- 指定错误页面error.jsp -->
<%@ page language="java" errorPage="error.jsp" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>
<%@ page import="java.util.*" %>
<%@ page import="org.test.*" %>
<!-- 如果想要支持EL语言必须把这个EL支持打开,否则默认是不支持的
	如果想整个服务下都支持,则需要在Web服务器上设置
 -->
<%@ page isELIgnored="false" %>
<!-- 1、引入需要使用的标签库,uri是标签库的唯一标识,prefix为前缀 -->
 <%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag" %>
 <%@ taglib prefix="tags"  tagdir="/WEB-INF/tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>pageContext测试</title>
</head>
<body>
<!-- 使用Tag File 自定义标签 -->
<% 
User user = new User("Tag File",29);
request.setAttribute("user", user) ;
%>
<tags:test title="TagFile自定义标签的标题"  username="lyndon" bean="user"/>
</body>
</html>

 

0
1
分享到:
评论

相关推荐

    jsp2.0 自定义标签和自定标签函数

    在Java Server Pages (JSP) 2.0版本中,自定义标签和自定义标签函数极大地扩展了JSP开发的灵活性和可重用性。这些特性允许开发者创建可复用的组件,使代码更加清晰,易于维护。本文将深入探讨JSP 2.0中的自定义标签...

    jsp 自定义标签实例

    在JavaServer Pages (JSP) 技术中,自定义标签是扩展JSP功能的关键手段,它允许开发者创建可重用的组件,提高代码的可维护性和可读性。本实例将深入探讨如何实现一个简单的JSP自定义标签。 首先,自定义标签的实现...

    JSP自定义标签学习笔记

    在JSP(JavaServer Pages)开发中,自定义标签是一种扩展JSP功能的强大工具,它允许开发者创建可重用的代码组件,以提高代码的可读性和可维护性。本篇学习笔记将深入探讨JSP自定义标签的相关概念、创建方法以及实际...

    jsp 自定义标签的使用

    2. **实现标签处理类(Tag Handler)**:每个自定义标签对应一个Java类,该类需要实现`javax.servlet.jsp.tagext.Tag`或其子接口,如`SimpleTag`。在这个类中,我们可以编写处理标签逻辑的代码。 3. **在JSP页面中...

    JSP自定义标签的开发及使用

    在Java服务器页面(JSP)开发中,自定义标签(Custom Tags)是一种强大的特性,它允许开发者创建可重用的组件,以提高代码的可维护性和可读性。本篇文章将深入探讨JSP自定义标签的开发与使用,以及如何通过实例`Demo...

    开发自定义JSP标签

    2. **标签处理类(Tag Handler Class)**: 这是实现自定义标签逻辑的Java类,它继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`。在这个类中,我们可以覆盖`doStartTag()`...

    JSP自定义标签实例与详细讲解

    自定义标签通过TLD(Tag Library Descriptor)文件来定义,使得开发人员能够创建符合Java Servlet规范的标签库。 二、创建自定义标签库 创建自定义标签库首先需要编写TLD文件,该文件用于描述标签的属性、行为以及...

    struts2 自定义标签

    总之,Struts2自定义标签是提升项目开发效率和代码质量的有效手段。理解并熟练运用自定义标签,可以让开发者更好地驾驭Struts2框架,构建出高效、易维护的Web应用。在`teststruts2`项目中,通过实践和探索,你将...

    JSP自定义标签之自动完成框

    在IT行业中,Java Server ...总的来说,JSP自定义标签为开发人员提供了强大且灵活的方式来扩展JSP的功能。结合前端技术,我们可以构建出交互性极强的动态网页,例如这里的自动完成框,极大地提升了用户的输入体验。

    jsp自定义标签报错的问题

    在使用JSP自定义标签时,开发者可能会遇到一些报错问题,这通常涉及到项目结构、类路径设置或自定义标签的编译与打包方式。在本文中,我们将深入探讨这些问题,以及如何解决“JspException”这个特定异常。 首先,...

    jsp自定义标签库实现数据列表显示

    在JavaServer Pages (JSP) 开发中,自定义标签库是提高代码可重用性和模块化的重要手段。本文将详细讲解如何利用JSP自定义标签库实现数据列表的显示,以及涉及到的相关技术。 首先,`UserListTag.java` 是自定义...

    jsp自定义分页标签

    在JavaServer Pages (JSP) 开发中,为了提高代码的可维护性和重用性,开发者经常使用自定义标签库。本主题将深入探讨“jsp自定义分页标签”,这是一种在网页展示大量数据时非常实用的功能,它可以有效地帮助用户浏览...

    jsp自定义标签,structs2 JUNIT,structs2自定义拦截器

    本文将深入探讨三个核心概念:JSP自定义标签、Structs2框架以及JUnit测试,同时会提及Structs2中的自定义拦截器。 首先,JSP自定义标签是Java Web开发中的一种高级特性,它允许开发者创建自己的标签库,以提高代码...

    JSP标签,自定义标签

    JSP标签可以分为两类:标准标签库(JSTL)和自定义标签。本教程将深入探讨JSP自定义标签的创建、使用和底层实现。 **一、JSP自定义标签概述** 自定义标签允许开发者创建自己的标签库,这些标签库可以像HTML标签一样...

    JSP标签、自定义标签,含有属性

    2. **自定义标签**: 自定义标签允许开发者创建自己的标签库,以扩展JSP的功能。创建自定义标签通常涉及三个部分:标签库描述符文件(TLD)、标签处理类(Tag Handler Class)和标签库使用者的JSP页面。TLD定义了...

    jsp的自定义标签

    2. **创建标签处理类(Tag Handler Class)**:这是自定义标签的核心,它是一个实现了`javax.servlet.jsp.tagext.Tag`接口或者其子接口的Java类。在这个类中,你可以编写处理标签生命周期的方法,如`doStartTag()`和...

    jsp自定义标签例子,能在Tomcat下直接运行

    总之,JSP自定义标签是提高JSP开发效率和代码复用性的重要工具,通过创建和使用自定义标签,我们可以构建出更加模块化、易于维护的Web应用程序。结合Tomcat这样的Servlet容器,可以快速地部署和测试这些自定义组件。

    掌握jsp自定义标签chm版

    开发自定义标签库时,需要考虑标签的命名空间、标签文件的组织结构以及如何打包和部署。通常,自定义标签库被打包成JAR文件,并在web应用的WEB-INF目录下放置相应的TLD文件。 6. **使用自定义标签** 在JSP页面中...

    JSP自定义标签之日期显示

    在Java服务器页面(JSP)开发中,自定义标签是一种扩展JSP功能的强大方式,它允许我们封装复杂的逻辑或重复使用的代码片段,提高代码的可读性和可维护性。本篇将深入探讨“JSP自定义标签之日期显示”,以及如何通过...

    JSP自定义标签:最近在项目中要用到这种技术,所以自己就写一个经典的HelloWorld实例

    2. **配置web.xml**:在`web.xml`中添加自定义标签库的配置,指定标签库的URI和TLD文件位置。 3. **编写TLD文件**:创建TLD文件,定义自定义标签的相关信息,包括标签名、处理类、属性等。 4. **编写标签处理程序类*...

Global site tag (gtag.js) - Google Analytics