当前位置: 代码迷 >> JavaScript >> JSP自定义标签之日期展示
  详细解决方案

JSP自定义标签之日期展示

热度:254   发布时间:2012-12-21 12:03:49.0
JSP自定义标签之日期显示

?????? 小弟不才,最近做了一个关于日期显示的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>

?

最下面为该功能的压缩包,如果各位同仁发现哪里有问题,请留言,期待与你共同进步。?

  相关解决方案