?????? 小弟不才,最近做了一个关于日期显示的JSP自定义标签,具体功能:可以自定义显示起始和结束时间,也可以传入初始化参数,文件一加载便可一显示。
????? 具体说明文档如下:
SelectDateTag使用说明: 功能:该自定义标签为填充日期的下拉列表,包括三个下拉列表,分别为年月日,可以自定义设置下拉列表的起始和结束时间。 使用方法:复制com.sjdd.tag包下的BaseTag.class和SelectDateTag.class,将WEB-INF/taglib下的 SelectDateTag.tld以相同目录存放到需要配置的项目中。 在需要添加该自定义标签的JSP文件中加入如下代码: “ <%@ taglib uri="/tagslib/SelectDate" prefix="SelectDate" %> <SelectDate:SelectDate name="begin" begin="20000101" end="20201231" init="20101231"/> ” 参数说明:"name"为使用的部分下拉列表的名称及id(选填),具体形如"begin_year","begin_month","begin_day", 默认为"_year","_month","_day"; "begin"为下拉列表开始时间(选填),如果没有配置"init"也为默认时间,默认为"19900101"; "end"为下拉列表结束时间(选填),默认为"20201231"; "init"为初始化时间(选填),默认为当前日期。 范例见:WebRoot/testSelectDate.jsp 另:如果需要添加多个组件,则需要设置不同的name属性。
?
这是用于输出的父标签:
package com.sjdd.tag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.TagSupport; /** * * @Description:基本标签 * @author:bao * @date:Dec 19, 2010 */ public class BaseTag extends TagSupport { private static final long serialVersionUID = 1L; public int outPrint(StringBuffer content) throws JspException { if(content==null){ return EVAL_PAGE; } try { this.pageContext.getOut().write(content.toString()); } catch (Exception e) { e.printStackTrace(); throw new JspException(); } return EVAL_PAGE; } }
?
这是处理的主体标签类:
package com.sjdd.tag; import java.util.ArrayList; import java.util.List; import javax.servlet.jsp.JspException; import com.sjdd.tag.datebean.DateHandler; import com.sjdd.tag.datebean.Option; public class SelectDateTag extends BaseTag { private static final long serialVersionUID = 1L; // 下拉列表的名称,形如"begin_year","_year" private String name; // 开始日期 private int begin = 19900101; // 结束日期 private int end = 20201231; // 初始化日期,默认值为当前日期 private int init; public String getName() { if(this.name==null){ name=""; } return name; } public void setName(String name) { this.name = name; } public int getBegin() { return begin; } public void setBegin(int begin) { int initBegin = DateHandler.varifyAsInit(begin, 19900101); this.begin = initBegin; } public int getEnd() { return end; } public void setEnd(int end) { int initEnd = DateHandler.varifyAsInit(end, 20201231); this.end = initEnd; } public int getInit() { if(init==0){ init = DateHandler.getCurrentShortDate(); } return init; } public void setInit(int init) { int initial = DateHandler.varifyAsInit(init, DateHandler.getCurrentShortDate()); this.init = initial; } /** * @Description:创建年下拉列表 * @return List<Option> */ public List<Option> buildYearOptions() { List<Integer> yearList = new ArrayList<Integer>(); int beginYear = DateHandler.getYear(begin); int endYear = DateHandler.getYear(end); for (int i = beginYear; i <= endYear; i++) { yearList.add(i); } return Option.buildOptions(yearList); } public List<Option> buildMonthOptions() { List<Integer> monthList = new ArrayList<Integer>(); for (int i = 1; i <= 12; i++) { monthList.add(i); } return Option.buildOptions(monthList); } public List<Option> buildDayOptions(int year, int month) { List<Integer> yearList = new ArrayList<Integer>(); int maxDay = DateHandler.getMaxDayValue(year, month); for (int i = 1; i <= maxDay; i++) { yearList.add(i); } return Option.buildOptions(yearList); } @Override public int doEndTag() throws JspException { int yearValue = 2010; int monthValue = 1; StringBuffer content = new StringBuffer(); content.append("<select name=\"").append(getName()).append("_year\" id=\"").append(name).append( "_year\" class=\"select\" onchange='"+getName()+"changeDay();'>\n"); for (Option year : buildYearOptions()) { content.append(" <option value=\"").append(year.getValue()).append("\""); if (DateHandler.getYear(getInit()) == year.getValue()) { content.append(" selected=\"selected\""); yearValue = year.getValue(); } content.append(">").append(year.getLabel()).append("</option>\n"); } content.append("</select>\n"); content.append("<select name=\"").append(getName()).append("_month\" id=\"").append(name) .append("_month\" class=\"select\" onchange='"+getName()+"changeDay();'>\n"); for (Option month : buildMonthOptions()) { content.append(" <option value=\"").append(month.getValue()).append("\""); if (DateHandler.getMonth(getInit()) == month.getValue()) { content.append(" selected=\"selected\""); monthValue = month.getValue(); } content.append(">").append(month.getLabel()).append("</option>\n"); } content.append("</select>\n"); content.append("<select name=\"").append(getName()).append("_day\" id=\"").append(name).append( "_day\" class=\"select\">\n"); for (Option day : buildDayOptions(yearValue, monthValue)) { content.append(" <option value=\"").append(day.getValue()).append("\""); if (DateHandler.getDay(getInit()) == day.getValue()) { content.append(" selected=\"selected\""); } content.append(">").append(day.getLabel()).append("</option>\n"); } content.append("</select>\n"); content.append("<script type=\"text/javascript\">\n"); content.append(" function "+getName()+"changeDay() {\n"); content.append(" var year = document.getElementById(\"" + getName() + "_year\").value;\n"); content.append(" var month = document.getElementById(\"" + getName() + "_month\").value;\n"); content.append(" var dayObj = document.getElementById(\"" + getName() + "_day\");\n"); content.append(" fillDayOptions(dayObj,getMaxDayInMonth(year,month));\n"); content.append(" }\n"); content.append(" function getMaxDayInMonth(year, month) {\n"); content.append(" var month = parseInt(month, 10) + 1;\n"); content.append(" var d = new Date(year + '/' + month + '/' + 0);\n"); content.append(" return d.getDate();\n"); content.append(" }\n"); content.append(" function fillDayOptions(obj, maxDay) {\n"); content.append(" obj.innerHTML = '';\n"); content.append(" for (i = 1; i <= maxDay; i++) {\n"); content.append(" var varItem = new Option(i, i);\n"); content.append(" obj.options.add(varItem);\n"); content.append(" }\n"); content.append(" }\n"); content.append("</script>\n"); return this.outPrint(content); } }
?
还包括两个实体bean:
package com.sjdd.tag.datebean; import java.util.Calendar; /** * @Description:日期处理类 * @author:bao * @date:Jan 1, 2011 */ public class DateHandler { private int year; private int month; private int day; public int getYear() { return year; } public void setYear(int year) { this.year = year; } public int getMonth() { return month; } public void setMonth(int month) { this.month = month; } public int getDay() { return day; } public void setDay(int day) { this.day = day; } public DateHandler() { super(); } /** * @Description:获取参数月中最大的天数值 * @param year * @param month * @return int */ public static int getMaxDayValue(int year, int month) { Calendar time = Calendar.getInstance(); time.clear(); time.set(Calendar.YEAR, year); // year 为 int time.set(Calendar.MONTH, month - 1);// 注意,Calendar对象默认一月为0 int max = time.getActualMaximum(Calendar.DAY_OF_MONTH);// 本月份的天数 return max; } /** * @Description:获取当前日期,并转换为形如"20101231"格式的整型 * @return int */ public static int getCurrentShortDate() { Calendar cal = Calendar.getInstance(); int date = cal.get(Calendar.YEAR) * 10000 + (cal.get(Calendar.MONTH) + 1) * 100 + cal.get(Calendar.DAY_OF_MONTH); return date; } /** * @Description:验证date是否符合形如"20100101"格式,返回最符合要求的日期格式 * @param date * @return int */ public static int varifyAsInit(int date, int defaultValue) { String dateStr = Integer.toString(date); // 如果输入数字不是8位,则使用默认的数字 if (dateStr.length() != 8) { return defaultValue; } //返回最接近的日期 return getYear(date) * 10000 + getMonth(date) * 100 + getDay(date); } /** * @Description:获取合法的日数 * @param date * @return int */ public static int getDay(int date) { int day = date % 100; int maxDay = getMaxDayValue(getYear(date), getMonth(date)); if (day > maxDay) { day = maxDay; } return day; } /** * @Description:获取合法的月数 * @param date * @return int */ public static int getMonth(int date) { int month = date / 100 % 100; if (month > 12) { month = 12; } else if (month < 1) { month = 1; } return month; } /** * @Description:获取合法的年数 * @param date * @return int */ public static int getYear(int date) { return date / 10000; } }
?
package com.sjdd.tag.datebean; import java.util.ArrayList; import java.util.List; /** * @Description:保存下拉列表中每一项的value值和显示内容 * @author:bao * @date:Jan 1, 2011 */ public class Option { private String label; private int value; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } public int getValue() { return value; } public void setValue(int value) { this.value = value; } public Option(String label, int value) { super(); this.label = label; this.value = value; } public static List<Option> buildOptions(List<Integer> options){ List<Option> buildList = new ArrayList<Option>(); for(int option:options){ buildList.add(new Option(Integer.toString(option),option)); } return buildList; } }
?
下面是tld文件:
<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" 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"> <tlib-version>1.0</tlib-version> <short-name>SelectDate</short-name> <uri>/tagslib/SelectDate</uri> <tag> <name>SelectDate</name> <tag-class>com.sjdd.tag.SelectDateTag</tag-class> <body-content>empty</body-content> <attribute> <name>name</name> <required>false</required> </attribute> <attribute> <name>begin</name> <required>false</required> </attribute> <attribute> <name>end</name> <required>false</required> </attribute> <attribute> <name>init</name> <required>false</required> </attribute> </tag> </taglib>
?
这个是测试文件:
<%@ page language="java" pageEncoding="UTF-8"%> <%@ taglib uri="/tagslib/SelectDate" prefix="SelectDate" %> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'testSelectDate.jsp' starting page</title> <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"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> 开始时间:<SelectDate:SelectDate name="begin" begin="20001010" end="21251231" init="20100102"/><br> 开始时间:<SelectDate:SelectDate/><br> </body> </html>
?
最下面为该功能的压缩包,如果各位同仁发现哪里有问题,请留言,期待与你共同进步。?