jsp 自定义标签实例

  分三步:

  一、在WEB-INF 下建一个名为tlds的文件夹,再建一个tld文件,如 formatTime.tld,内容为:

  

复制代码 代码如下:

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

  <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

  "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">

  <taglib>

  <tlibversion>1.0</tlibversion>

  <jspversion>1.1</jspversion>

  <shortname>ntuc</shortname>

  <tag>

  <name>formatTimeAsString</name>

  <tagclass>com.ufinity.taglibTest.FormatTimeTag</tagclass>

  <bodycontent>empty</bodycontent>

  <attribute>

  <name>timestamp</name>

  </attribute>

  <attribute>

  <name>format</name>

  </attribute>

  <attribute>

  <name>showTH</name>

  </attribute>

  <attribute>

  <name>style</name>

  </attribute>

  </tag>

  </taglib>

  二、建一个class,内容为:

  

复制代码 代码如下:

  package com.ufinity.taglibTest;

  import java.io.IOException;

  import java.text.DateFormat;

  import java.text.ParseException;

  import java.text.SimpleDateFormat;

  import java.util.Calendar;

  import java.util.Date;

  import java.util.Locale;

  import javax.servlet.jsp.tagext.TagSupport;

  /**

  * Description of the class

  *

  * @author Wangqy

  * @version 1.0

  * @since 2009-8-25

  */

  public class FormatTimeTag extends TagSupport {

  /**

  * serialVersionUID long

  */

  private static final long serialVersionUID = 8757501937718830491L;

  private String timestamp;

  private String format;

  private String showTH;

  private String style;

  public int doEndTag()

  {

  try

  {

  String info = this.convertDateTime(timestamp, format, Boolean.parseBoolean(showTH), style);

  pageContext.getOut().println(info);

  }

  catch (IOException e) {

  }

  return EVAL_PAGE;

  }

  private String convertDateTime(String dateTime, String formater, boolean showTH, String caseStyle) {

  String timePosted = null;

  SimpleDateFormat dateFm = null;

  DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

  Date formatTime = null;

  try {

  formatTime = format.parse(dateTime);

  } catch (ParseException e) {

  return null;

  }

  Calendar calendar = Calendar.getInstance();

  calendar.setTime(formatTime);

  if (showTH) {

  int day = calendar.get(Calendar.DAY_OF_MONTH);

  String daySuffix = "th";

  if ((day % 10) == 1) {

  daySuffix = ((day / 10) == 1) ? "th" : "st";

  } else if ((day % 10) == 2) {

  daySuffix = (day == 12) ? "th" : "nd";

  } else if ((day % 10) == 3) {

  daySuffix = (day == 13) ? "th" : "rd";

  }

  formater = formater.substring(0, formater.indexOf(" ")) + "'"

  + daySuffix + "'"

  + formater.substring(formater.indexOf(" "));

  dateFm = new SimpleDateFormat(formater, Locale.ENGLISH);

  } else {

  dateFm = new SimpleDateFormat(formater, Locale.ENGLISH);

  }

  timePosted = dateFm.format(formatTime);

  if (caseStyle.equals("Upper")) {

  timePosted = timePosted.toUpperCase();

  } else if (caseStyle.equals("Lower")) {

  timePosted = timePosted.toLowerCase();

  }

  return timePosted;

  }

  public void setFormat(String format) {

  this.format = format;

  }

  public void setShowTH(String showTH) {

  this.showTH = showTH;

  }

  public void setStyle(String style) {

  this.style = style;

  }

  public void setTimestamp(String timestamp) {

  this.timestamp = timestamp;

  }

  }

  三、建个jsp页面测试下:

  

复制代码 代码如下:

  <%@ page language="java" pageEncoding="utf-8"%>

  <%@ taglib uri="WEB-INF/tlds/formatTime.tld" prefix="tf" %>

  <html>

  <head>

  <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

  <title>自定义标签示例</title>

  </head>

  <body>

  <p>

  转换“20090403132233”

  </p>

  format:dd MMMM yyyy showTH:true style:Upper 转换后为:<tf:formatTimeAsString timestamp="20090403132233" format="dd MMMM yyyy" showTH="true" style="Upper"/><br/>

  format:dd MMMM yyyy showTH:true style:Lower 转换后为:<tf:formatTimeAsString timestamp="20090403132233" format="dd MMMM yyyy" showTH="true" style="Lower"/><br/>

  format:dd MMMM yyyy showTH:false style:Upper 转换后为:<tf:formatTimeAsString timestamp="20090403132233" format="dd MMMM yyyy" showTH="false" style="Upper"/><br/>

  format:dd MMMM yyyy showTH:true style:"" 转换后为:<tf:formatTimeAsString timestamp="20090403132233" format="dd MMMM yyyy" showTH="true" style=""/><br/>

  </body>

  </html>

  ok了。这里timestamp是一个给定值,如果是通过${}标签动态取的话,需要将tld文件的

  

复制代码 代码如下:

  <attribute>

  <name>timestamp</name>

  </attribute>

  修改为

  

复制代码 代码如下:

  <attribute>

  <name>timestamp</name>

  <rtexprvalue>true</rtexprvalue>

  </attribute>