`
newleague
  • 浏览: 1505312 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

用户自定义标签

阅读更多

J2EE项目中,JSP页面常常通过在静态页面模板中嵌入scriptlets来插入动态的内容。然而,随着复杂程序的增加,JSP页面也变得难于管理。 虽然用这种方法开发小形项目唾手可得,但是scriptlets仍然要面对下面的不利情况:

 

  • Scriptlet难于阅读和修改。带有ScriptletsJSP页面混合了两种语言,这使得阅读和维护变得很困难。

     

  • Scriptlets鼓励了将数据表现和逻辑处理的混合 。JSP页面主要功能是数据表现而不是逻辑处理。逻辑处理属于Java类的工作,他们应该由程序员维护并能够重用。

     

  • Scriptlets不能够被重用。当scriptlets被重用时,常常是鼓励拷贝-粘贴来达到重用的效果,这是一种危险的维护方法。每一次你拷贝-粘贴scriptlets,将有更多行多余的代码需要维护。

     

  • Scriptlets的参数很难进行确定传递. 无论如何,绝大数人简单的拷贝,粘贴、编辑或者类似的增加,使得大部份的多余的代码需要更多的维护。

     

与其创建充满了scriptlets的巨大的JSP页面,不如考虑使用用户自定义标签。用户自定义标签允许你创建、在JSP中使用你自己定义的类HTML标签。每当JSP引擎遇到用户自定义标签时,就会自动查找标签处理类,并自动调用他。页面中的自定义标签将会被票签处理类的输出所代替。这就使得JSP页面不用直接在页面写Java代码,就可以指定生成动态的内容的。

 

用户自定义标签为你的网页设计提供了N种好处:他提高了页面代码的可读性。页面设计人员而不是程序员,能够使用很比使用Scriptlets更容易的使用标签。维护代码的程序员也只需个性标签库面不是JSP页面,这样他就不要再冒着破坏页面美观的风险。 在使用标签的每一处,增强或者固定的标签改变了标签了的表现。标签比Scriptlets更容易确定参数,因为他会被 作为一种属性或者在标签体内被传达。最后,标签比Scriptlets高度的可重用性,因为你可以创建共享的、可重用的自定义标签库。 JSTL提供的就是这种标准的自定义标签集。

 

 

让我们通过看一个简单的JSP页面例子,来看看如何使用自定义标签。 下面这个页面使用scriptlet来得到数据

:

 

<%@ page import="java.text.SimpleDateFormat" %>

 

 

<%@ page import="java.util.Date" %>

 

 

<HTML>

 

 

<HEAD><TITLE>Sample JSP</TITLE></HEAD>

 

 

<BODY>

 

 

<H3>

 

 

The date and time at the server are:

 

 

<%

 

 

String sformat = "EEEE, d MMMM yyyy ‘at‘ kk:mm:ss z";

 

 

SimpleDateFormat format = new SimpleDateFormat(sformat);

 

 

Date date = new Date();

 

 

String sdate = format.format(date);

 

 

out.print(sdate);

 

 

%>

 

 

</H3>

 

 

</BODY>

 

 

</HTML>

 

 

 

这个页面非常的简单直接,尽管这个简单的函数看上去好像有许多东东。如果你想要在每一个页面上显示日期,那么你只能拷贝粘贴这段代码到项目中的每一个页面。如果你这么做,那么你要维护的不仅仅是这段代码的原始拷贝,而是你粘贴的每一个拷贝。 如果这段代码出现在多个页面,那么改变一下时间格式将会占用你的很多时间。

 

下面这段是一个非常清洁的JSP页面。在这里,Java代码被从scriptlet中移出放到了自定义标签中:

 

<%@ taglib uri="/WEB-INF/taglib.tld" prefix="mytags" %>

 

 

 

<HTML>

 

 

<HEAD><TITLE>Sample JSP using a custom tag</TITLE></HEAD>

 

 

<BODY>

 

 

<H3>

 

 

The date and time at the server are: <mytags:date/>

 

 

</H3>

 

 

</BODY>

 

 

</HTML>

 

 

在这个例子中,<@% taglib %>用来指出自定义标签描述符文件路径(标签库中的描述符或者TLD文件),并且为这个标签名定义一个名字空间(“mytags”,可是你喜欢的任何字符)JSP引擎认可<mytags:date/>作为一个用户定义标签的符号,他会调用这个标签的标签处理器,并用处理结果替换标签和内容。

 

创建一个用户定义标签处理器

 

创建一个用户定义标签处理器需要比定scriptlet多一定量的工作,因为这一个Java类,并且你不得不为他写一个TLD格式(在下一节介绍)的描述符文件。下面这个类DataTag实现了一个标签处理器

:

 

public class DateTag extends TagSupport {

 

 

 

  protected PageContext _pageContext;

 

 

  protected String _sFormat;

 

 

  static final String _sFormatDefault =

 

 

  "EEEE, d MMMM yyyy ‘at‘ kk:mm:ss z";

 

 

 

  public void setPageContext(PageContext pageContext) {

 

 

    _pageContext = pageContext;

 

 

    _sFormat = _sFormatDefault;

 

 

  }

 

 

 

  // Handle the tag

 

 

  public int doStartTag() throws JspException {

 

 

    SimpleDateFormat format =

 

 

      new SimpleDateFormat(getFormat());

 

 

    JspWriter out = _pageContext.getOut();

 

 

    Date date = new Date();

 

 

    String sdate = format.format(date);

 

 

    try {

 

 

      out.print(sdate);

 

 

    } catch (IOException ex) {

 

 

      throw new JspException("DateTag: can‘t write: " +

 

 

             ex.getMessage());

 

 

    }

 

 

    return SKIP_BODY;

 

 

  }

 

 

 

  // Handlers for "format" attribute

 

 

  public void setFormat(String sFormat) {

 

 

    _sFormat = sFormat;

 

 

  }

 

 

 

  public String getFormat() {

 

 

    return _sFormat;

 

 

  }

 

 

}

 

 

TagSupport

实现了标签处理器要求的所有接口。这些方法本来没有做什么任何事,标签处理器开发人员重构了需要方法,允许基类处理调用所有的其他的方法。标签处理器每一次被调用都会调setPageContext方法。 这个类为稍后便用简单的保存了PageContext参照。

 

JSP引擎遇到这个标签时会调用doStartTag方法。这个方法和第1个版本JSP页面的scriptlet处理了相同的事。他将结果写回给JspWriter,结果包括了先存储的PageContext.所有写给JspWriter的内容,会被直接嵌入到响应页面。 注意doStartTag只能抛出JspException异常。如果发生写失败,那么原始IOException会被转化成一个JspException重新抛出。这个方法会返回SKIP_BODY,他告诉JSP容器抛弃标签内容。

 

标签处理器最后的两个方法是setFormatgetFormat。机敏的读者应该已经知道了他作用。 他被网页容器用来设置标签属性值(后面进行更详细的讨论)。在这儿他们被用来设定日期格式属性和输出日期格式属性。

 

 

标签定义:TLD文件

 

一个标签库描述符文件, 或者TLD文件, 是一个XML文件。他用来描述标签库中的标签。以下是DateTag标签的描述文件。

 

<?xml version="1.0" encoding="ISO-8859-1"?>

 

 

 

<!DOCTYPE taglib

 

 

        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

 

 

        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

 

 

 

<taglib>

 

 

   <tlib-version>1.0</tlib-version>

 

 

   <jsp-version>1.2</jsp-version>

 

 

   <short-name>first</short-name>

 

 

   <uri>http://www.elucify.com/j2eetips/sept2002/taglib</uri>

 

 

   <description>Sample tag library</description>

 

 

 

  <tag>

 

 

    <name>date</name>

 

 

    <tag-class>com.elucify.tips.sep2002.DateTag</tag-class>

 

 

    <body-content>empty</body-content>

 

 

    <description>Print the date with a compiled-in format</description>

 

 

 

    <attribute>

 

 

        <name>format</name>

 

 

        <required>false</required>

 

 

        <rtexprvalue>false</rtexprvalue>

 

 

    </attribute>

 

 

 

  </tag>        

 

 

</taglib>

 

 

这些描述符提供了这个标签库的信息。他还提供了每一个标签的如标签名、处理器的类和标签描述的信息。这个文件被用来替换WEB-INF目录下的WAR文件,为JSP页面使用这些标签提供参照。

 

增加属性

 

Notice that the TLD file shown above defines an attribute called format. This is the string passed to SimpleDateFormat to control how the date is printed. If a format attribute is present on a date tag, the JSP engine calls setFormat on the handler class. Otherwise, the handler class uses a default format. Attributes provide a great deal of customizability to custom tags. For example, the following JSP page uses the format attribute to format the date in several different ways on the same page:

 

 

注意上面这个TLD文件显示的属性调用格式 。这是一个字符串被传递给SimpleDateFormat,来控制如何显示日期。如果一个日期格式被提供给日期标签,那么JSP引擎将调用控制器类中的setFormat方法 ,否则,标签处理器将使用默认格式。属性为用户定义标签提供了大量可定制属性。例如以下这个例子,在同一个页面的, 用几种不同的格式属性来格式化时间。

 

 

<%@ taglib uri="/WEB-INF/taglib.tld" prefix="mytags" %>

 

 

 

<HTML%>

 

 

<HEAD><TITLE%>Sample JSP using a custom tag and format</TITLE%></HEAD%>

 

 

<BODY%>

 

 

<H3%>

 

 

The time zone at the server is <mytags:date format="zzzz"/%>.<br%>

 

 

The server date is <mytags:date format="M/d/yyyy"/%>.<br%>

 

 

The server time is <mytags:date format="hh:mm:ss a"/%>.<br%>

 

 

</H3%>

 

 

</BODY%>

 

 

</HTML%>

 

 

想像一下,如果使用scriptlets,做同样的事情,将会要多少行多余的代码。

 

布署使用自定义标签的JSP页面

 

标签处理器可以放在WEB-INF/classes目录下,和TLD分离。  或者也可以将一组想关的标签和TLD文件绑定成JAR文件,提供一个单一的布署。这个例子使用的是第一个方法。这不需要在web.xml中增加任何布署描述。

 

用户自定义标签大大提高了JSP页面动态内容代码的可读性、可伸缩性、可重用性和可维护性。

 

自定义标签资源

 

You can learn how to implement several kinds of custom tags in the J2EE Tutorial section Custom Tags in JSP Pages. Also see the JavaServer Pages Standard Tag Library page. The Enterprise Java BluePrints has several best practices for Web components, including JSP pages and custom tags. Among other features, JavaServerTM Faces technology provides a large library of general-purpose custom tags.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    用户自定义标签.

    JSP自定义标签是用户定义的JSP语言元素,可以看成是一种通过标签处理器生成基于XML脚本的方法。自定义标签在功能上和逻辑上都与JavaBean类似,都是一组可重用的...本章我们就为大家来讲解有关用户自定义标签的知识。

    自定义标签(maven)

    为了增强JSP页面的功能和可重用性,我们可以自定义标签库(Tag Libraries)。本篇文章将详细探讨如何使用Maven构建一个自定义标签库,并在Web应用中使用它。 自定义标签库是JSP 2.0引入的一个特性,它允许开发者...

    Android自定义标签选择器TagView

    9. **扩展性**:考虑到不同场景的需求,`TagView`应该设计得足够灵活,允许用户自定义标签的形状、颜色、大小等,甚至支持自定义点击事件的监听器。 在实际项目中,`TagView`可以大大简化多标签展示的逻辑,提高...

    struts实现自定义标签

    假设我们有一个自定义标签 `yfk:mytag`,用于显示用户信息。我们可能有以下实现: - 创建 Java 类 `MyTag.java` 继承 `TagSupport`: ```java public class MyTag extends TagSupport { private String username; ...

    自定义标签,标签实例,ppt

    在Java Web开发中,自定义标签(Custom Tags)是一个强大的工具,它允许开发者创建可重用的组件,提高代码的可读性和维护性。自定义标签是JSP标准标签库(JSTL)的一种扩展,它能将复杂的业务逻辑封装起来,使JSP...

    java自定义标签.......java自定义标签

    Java自定义标签是JavaServer Pages (JSP)技术的一个强大特性,它允许开发者扩展JSP的标准标签库,创建自己的定制化标签,以提高代码的可读性和可维护性。自定义标签可以封装复杂的业务逻辑或者视图呈现,使得页面...

    freemark 自定义标签 总结

    - 数据库操作:自定义标签可以封装数据库查询,如`&lt;@getUsersByAge age="25"&gt;`,返回年龄为25的用户列表。 - 条件判断:自定义标签可以实现更复杂的条件判断,如`管理员已存在&lt;/@ifExist&gt;`。 - 循环处理:创建...

    一个用于分页的自定义标签

    一个“自定义标签”是开发者为了扩展JSP(JavaServer Pages)功能而创建的,它允许我们封装复杂逻辑并将其作为可重用的组件。本项目提供了一个用于分页的自定义标签,适用于那些需要在网页上进行数据分页展示的应用...

    自定义的标签(自己备份)

    在IT行业中,自定义标签是一种常见的组织和管理信息的方式,特别是在文档、文件、笔记或数据库系统中。...而"myTag"这个文件可能是一个包含用户自定义标签的数据文件,用于存储和管理用户的自定义标签信息。

    Web2.0体系学习(自定义标签)

    - 假设我们有一个自定义标签`&lt;my:displayUser&gt;`,用于显示用户信息,可以在TLD中定义它的属性如`userId`,并在处理类中从请求或会话中获取用户数据,然后在JSP页面中使用该标签,如`${user.id}"/&gt;`。 6. **自定义...

    Struts2自定义标签

    例如,假设我们创建了一个显示用户信息的自定义标签`&lt;user:display/&gt;`。在TLD文件中,我们定义了该标签的属性如`userId`;在处理类中,我们获取`userId`,查询数据库并返回用户信息;在struts.xml中,我们声明了这个...

    自定义标签

    - 权限控制:自定义标签可以用于判断用户权限,动态地显示或隐藏某些内容。 6. **工具支持** 开发自定义标签时,一些工具和框架提供了便利,如Apache Struts的Tiles和Spring Web Flow。这些工具提供了更高级别的...

    自定义xml标签

    Spring支持用户自定义标签,这样可以在XML配置中创建特定于应用的配置元素,使得配置更加清晰易懂。 要创建自定义XML标签,我们需要实现Spring的`org.springframework.beans.factory.xml.BeanDefinitionParser`接口...

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

    `userlist.jsp` 是使用自定义标签展示数据列表的页面,它通过`&lt;taglib&gt;`指令引用自定义标签库,并在页面中使用自定义标签`&lt;user:displayList&gt;`来展示用户列表。在`&lt;user:displayList&gt;`标签中,可以传递参数,如数据...

    帝国CMS实现用户自定义标签函数输出图片集大小图的方法

    本文将详细讲解如何在帝国CMS中实现用户自定义标签函数,以输出图片集中的大小图片。 首先,要实现这个功能,我们需要在`e/class/userfun.php`文件中添加自定义函数。这个文件是用来存放用户自定义标签函数的,通过...

    tag struts2的自定义标签实例

    在Struts2框架中,自定义标签是扩展和优化应用功能的重要手段,它允许开发者创建符合业务逻辑且...在实际项目中,根据业务需求,可以创建各种自定义标签,例如分页标签、数据表标签等,进一步优化开发效率和用户体验。

    JSP自定义标签之日期显示

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

    spring mvc freemarker 自定义标签

    自定义标签是Freemarker的一个强大特性,它可以帮助我们更好地组织视图层代码,提高代码复用性,使得模板更加模块化。下面将详细介绍Spring MVC与Freemarker自定义标签的使用。 首先,我们需要了解Freemarker的基础...

    jsp权限控制,jsp自定义标签实现

    使用jsp自定义标签的功能实现权限的控制。(如果用户没有某个模块的删除权限,就不现实这个删除按钮) 在整个项目中所有的页面都可以引入自定义的标签去做到权限的控制。 自定义标签文件 删除 可以控制页面中的每...

    创建JSP自定义标签.doc

    在JavaServer Pages (JSP)开发中,自定义标签是一种强大的工具,可以提高代码的可读性和可维护性。它们允许开发者封装复杂的逻辑或组件为简洁的标签形式,类似于HTML标签。本篇将详细介绍如何创建JSP自定义标签。 ...

Global site tag (gtag.js) - Google Analytics