史上最全的DatetimeUtil,java操作Date工具类

package com.taipy.sc.common.util;

import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.Year;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.util.*;

/**
 * Created by apple on 2017/9/28.
 */
public class DatetimeUtil {

    public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    public static final String HH_MM_SS = "HH:mm:ss";

    public static final String YYYYMMDD = "yyyyMMdd";

    public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";

    public static final String YYYY_MM_DD = "yyyy-MM-dd";

    public static final String MM_DD_YYYY = "MM-dd-yyyy";

    public static final String YYYY_MM = "yyyy-MM";

    public static final String MM_DD = "MM-dd";

    public static final String MM_DD_HH_MM = "MM-dd HH:mm";

    public static final String MM_DD_HH_MM_SS = "MM-dd HH:mm:ss";

    public static final String MM_DD_HH_MM_SS_SSS = "MM-dd HH:mm:ss:SSS";

    public static final String HH_MM = "HH:mm";

    public static final String MM_DD_YYYY_ = "MM/dd/yyyy";

    public static final String YYYY = "yyyy";

    public static final String MM = "MM";

    public static final String DD = "dd";

    public static final String YYYY_YEAR_MM_MONTH_DD_DAY_HH_WHEN_MM_POINTS = "yyyy年MM月dd日 HH时mm分";

    public static final String YYYY_YEAR_MM_MONTH_DD_DAY_HH_WHEN_MM_POINTS_SS = "yyyy年MM月dd日 HH时mm分ss秒";

    public static final String MM_MONTH_DD_DAY_HH_WHEN_MM_POINTS = "MM月dd日 HH时mm分";

    public static final String DD_DAY_HH_WHEN_MM_POINTS_SS = "dd日 HH时mm分ss秒";

    public static final String MM_MONTH_DD_DAY_HH_WHEN_MM_POINTS_SS = "MM月dd日 HH时mm分ss秒";

    /**
     * 获取两个时间段的时间段值
     * @return
     */
    public static List<String> getTimePeriodFromTwoTime(String startYear, String endYear) {
        LocalDate start1 = LocalDate.of(Integer.parseInt(startYear), 12, 1);
        LocalDate end1 = LocalDate.of(Integer.parseInt(endYear), 5, 31);
        long timstrap = start1.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
        long endtime = end1.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
        LocalDate start = Instant.ofEpochMilli(timstrap).atZone(ZoneOffset.ofHours(8)).toLocalDate();
        LocalDate end = Instant.ofEpochMilli(endtime).atZone(ZoneOffset.ofHours(8)).toLocalDate();
        List<String> result = new ArrayList<>();
        // 年
        Year startyear = Year.from(start);
        Year endyear = Year.from(end);
        // 包含最后一个时间
        for (long i = 0; i <= ChronoUnit.YEARS.between(startyear, endyear); i++) {
            result.add(startyear.plusYears(i).toString());
        }
        return result;
    }


    public static String getHSByStringTime(String time){
        String format = DatetimeUtil.format(DatetimeUtil.parse(time), DatetimeUtil.HH_MM);
        return format;
    }

    public static String getYMDByStringTime(String time){
        String format = DatetimeUtil.format(DatetimeUtil.parse(time), DatetimeUtil.YYYY_MM_DD);
        return format;
    }

    public static String getMDByStringTime(String time){
        String format = DatetimeUtil.format(DatetimeUtil.parse(time), DatetimeUtil.MM_DD);
        return format;
    }

    public static String getMDHSByStringTime(String time){
        String format = DatetimeUtil.format(DatetimeUtil.parse(time), DatetimeUtil.MM_DD_HH_MM);
        return format;
    }

    /**
     * 获取去年今天
     * @param date
     * @return
     */
    public static Date getLastYearDay(Date date){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.YEAR, -1);
        Date time = cal.getTime();
        return time;
    }

    /*
     * 一天的毫秒
     */
    public static final long DAY_TO_MILLISECOND = 89999999;

    public static final String YYYY_YEAR_MM_MONTH_DD_DAY = "yyyy年MM月dd日";

    public static final String MM_MONTH_DD_DAY = "MM月dd日";

    /**
     * 保存两位小数
     */
    public static double keep(double number) {
        return Double.parseDouble(new DecimalFormat("#.##").format(number));
    }

    /**
     * 获取当前时间
     *
     * @return
     */
    public static Date getCurrentTime() {
        return new Date();
    }

    public static int getDaysByDate(String yyyyMM) {
        int days = 0;
        try {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
            Date date = simpleDateFormat.parse(yyyyMM);
            Calendar calendar = new GregorianCalendar();
            calendar.setTime(date);
            days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        } catch (Exception e) {
//            e.printStackTrace();
        }
        return days;
    }

    /**
     * 日期减去日期获取天数
     * @param date1
     * @param date2
     * @return
     */
    public static int differentDays(Date date1,Date date2)
    {
        Calendar cal1 = Calendar.getInstance();
        cal1.setTime(date1);

        Calendar cal2 = Calendar.getInstance();
        cal2.setTime(date2);
        int day1= cal1.get(Calendar.DAY_OF_YEAR);
        int day2 = cal2.get(Calendar.DAY_OF_YEAR);

        int year1 = cal1.get(Calendar.YEAR);
        int year2 = cal2.get(Calendar.YEAR);
        if(year1 != year2) //同一年
        {
            int timeDistance = 0 ;
            for(int i = year1 ; i < year2 ; i ++)
            {
                if(i%4==0 && i%100!=0 || i%400==0) //闰年
                {
                    timeDistance += 366;
                }
                else //不是闰年
                {
                    timeDistance += 365;
                }
            }

            return timeDistance + (day2-day1) ;
        }
        else //不同年
        {
//            System.out.println("判断day2 - day1 : " + (day2-day1));
            return day2-day1;
        }
    }
    /**
     * Date转String YYYY-MM-DD 格式
     * @param date
     * @return
     */
    public static String getStringByDate(Date date ){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String nowDate = simpleDateFormat.format(date);
        return nowDate;
    }

    public static String getStringByDate2(Date date ){
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String nowDate = simpleDateFormat.format(date);
        return nowDate;
    }



    /**
     * String 转 Date YYYY-MM-DD 格式
     * @param date
     * @return
     */
    public static Date getDateByString(String date ) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = simpleDateFormat.parse(date);
        return parse;
    }

    /**
     * String 转 Date YYYY-MM-DD 格式
     * @param date
     * @return
     */
    public static Date getDateByStringMMSS(String date ) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date parse = simpleDateFormat.parse(date);
        return parse;
    }

    /**
     * 获取时间
     *
     * @param arg0
     * @param date
     * @return
     */
    public static String getDate(String arg0, Date date) {
        if (date != null) {
            return new SimpleDateFormat(arg0).format(date);
        }
        return new SimpleDateFormat(arg0).format(new Date());
    }

    /**
     * 用户传入时间格式的字符串(2-15-05-01), 返回当前时间的时间蹉
     *
     * @param val
     * @return
     */
    public static Date strConversionDate(String val, String form) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(form);
            return sdf.parse(val);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return getCurrentTime();
    }

    //------------------------------- 新加

    public static final String datetimeStyle = "yyyy-MM-dd HH:mm:ss";
    public static final String dateStyle = "yyyy-MM-dd";
    public static final String dateStyleWithoutYear = "MM-dd";
    public static final String datetimeStartWithMonthStyle = "MM-dd HH:mm";
    public static final String datetimeWithoutSecondStyle = "yyyy-MM-dd HH:mm";
    private static final int[] seasonFirstMonth = {0, 0, 0, 3, 3, 3, 6, 6, 6, 9, 9, 9};
    private static final int[] seasonLastMonth = {2, 2, 2, 5, 5, 5, 8, 8, 8, 11, 11, 11};

    /**
     * 以周一作为一周开始 获取本周第一天
     * */
    public static Date getFirstDayInWeek(Date date, Locale locale) {
        GregorianCalendar calendar = new GregorianCalendar(locale);
        calendar.setTime(date);
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
        calendar.set(11, calendar.getActualMinimum(11));
        calendar.set(12, calendar.getActualMinimum(12));
        calendar.set(13, calendar.getActualMinimum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    /**
     * 以周天作为一周开始 获取本周第一天
     * */
    public static Date getFirstDayInWeekForSunday(Date date, Locale locale) {
        GregorianCalendar calendar = new GregorianCalendar(locale);
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        calendar.set(11, calendar.getActualMinimum(11));
        calendar.set(12, calendar.getActualMinimum(12));
        calendar.set(13, calendar.getActualMinimum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }
    /**
     * 以周天作为一周开始 获取本周第一天
     * */
    public static Date getFirstDayInWeekForSunday(Date date) {
        return getFirstDayInWeekForSunday(date, Locale.getDefault());
    }

    /**
     * 以周一作为一周开始 获取本周第一天
     * */
    public static Date getFirstDayInWeek(Date date) {
        return getFirstDayInWeek(date, Locale.getDefault());
    }

    /**
     * 以周一作为一周开始 获取本周最后一天
     * */
    public static Date getLastDayInWeek(Date date, Locale locale) {
        GregorianCalendar calendar = new GregorianCalendar(locale);
        calendar.setTime(date);
        calendar.setFirstDayOfWeek(Calendar.MONDAY);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
        calendar.set(11, calendar.getActualMaximum(11));
        calendar.set(12, calendar.getActualMaximum(12));
        calendar.set(13, calendar.getActualMaximum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    /**
     * 以周天作为一周开始 获取本周最后一天
     * */
    public static Date getLastDayInWeekForSunday(Date date, Locale locale) {
        GregorianCalendar calendar = new GregorianCalendar(locale);
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY);
        calendar.set(11, calendar.getActualMaximum(11));
        calendar.set(12, calendar.getActualMaximum(12));
        calendar.set(13, calendar.getActualMaximum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    /**
     * 以周一作为一周开始 获取本周最后一天
     * */
    public static Date getLastDayInWeek(Date date) {
        return getLastDayInWeek(date, Locale.getDefault());
    }

    /**
     * 以周天作为一周开始 获取本周最后一天
     * */
    public static Date getLastDayInWeekForSunday(Date date) {
        return getLastDayInWeekForSunday(date, Locale.getDefault());
    }

    public static Date getFirstDayInMonth(Date date) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        int day = calendar.getActualMinimum(5);
        calendar.set(5, day);
        calendar.set(11, calendar.getActualMinimum(11));
        calendar.set(12, calendar.getActualMinimum(12));
        calendar.set(13, calendar.getActualMinimum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    public static Date getLastDayInMonth(Date date) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        int day = calendar.getActualMaximum(5);
        calendar.set(5, day);
        calendar.set(11, calendar.getActualMaximum(11));
        calendar.set(12, calendar.getActualMaximum(12));
        calendar.set(13, calendar.getActualMaximum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    public static Date getFirstDayInSeason(Date date) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        int currentMonth = calendar.get(2);
        calendar.set(2, seasonFirstMonth[currentMonth]);
        calendar.set(11, calendar.getActualMinimum(11));
        calendar.set(12, calendar.getActualMinimum(12));
        calendar.set(13, calendar.getActualMinimum(13));
        calendar.set(14, 0);
        return getFirstDayInMonth(calendar.getTime());
    }

    public static Date getLastDayInSeason(Date date) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        int currentMonth = calendar.get(2);
        calendar.set(2, seasonLastMonth[currentMonth]);
        calendar.set(11, calendar.getActualMaximum(11));
        calendar.set(12, calendar.getActualMaximum(12));
        calendar.set(13, calendar.getActualMaximum(13));
        calendar.set(14, 0);
        return getLastDayInMonth(calendar.getTime());
    }

    public static Date getFirstDayInYear(Date date) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(2, calendar.getActualMinimum(2));
        calendar.set(11, calendar.getActualMinimum(11));
        calendar.set(12, calendar.getActualMinimum(12));
        calendar.set(13, calendar.getActualMinimum(13));
        calendar.set(14, 0);
        return getFirstDayInMonth(calendar.getTime());
    }

    public static Date getLastDayInYear(Date date) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(2, calendar.getActualMaximum(2));
        calendar.set(11, calendar.getActualMaximum(11));
        calendar.set(12, calendar.getActualMaximum(12));
        calendar.set(13, calendar.getActualMaximum(13));
        calendar.set(14, 0);
        return getLastDayInMonth(calendar.getTime());
    }

    public static Date getTodayFirstTime() {
        Calendar calendar = new GregorianCalendar();
        calendar.set(11, calendar.getActualMinimum(11));
        calendar.set(12, calendar.getActualMinimum(12));
        calendar.set(13, calendar.getActualMinimum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    public static Date getTodayFirstTime(Date date) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(11, calendar.getActualMinimum(11));
        calendar.set(12, calendar.getActualMinimum(12));
        calendar.set(13, calendar.getActualMinimum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    public static Date getTodayFirstTime(String dateStr) {
        return getTodayFirstTime(parse(dateStr, "yyyy-MM-dd"));
    }

    public static Date getTodayLastTime() {
        Calendar calendar = new GregorianCalendar();
        calendar.set(11, calendar.getActualMaximum(11));
        calendar.set(12, calendar.getActualMaximum(12));
        calendar.set(13, calendar.getActualMaximum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    public static Date getTodayLastTime(Date date) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(11, calendar.getActualMaximum(11));
        calendar.set(12, calendar.getActualMaximum(12));
        calendar.set(13, calendar.getActualMaximum(13));
        calendar.set(14, 0);
        return calendar.getTime();
    }

    public static Date getTodayLastTime(String dateStr) {
        return getTodayLastTime(parse(dateStr, "yyyy-MM-dd"));
    }

    public static String formatDatetime(Date datetime) {
        return format(datetime, "yyyy-MM-dd HH:mm:ss");
    }

    public static String formatDatetimeWithoutSecond(Date datetime) {
        return format(datetime, "yyyy-MM-dd HH:mm");
    }

    public static String formatDate(Date date) {
        if (date == null) {
            return null;
        }
        return format(date, "yyyy-MM-dd");
    }

    public static String format(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        TimeZone timeZone = TimeZone.getDefault();
        return DateFormatUtils.format(date, pattern, timeZone);
    }

    public static String format(Date date, String pattern, Locale locale) {
        if (date == null) {
            return null;
        }
        return DateFormatUtils.format(date, pattern, locale);
    }

    public static String format(Date date, String pattern, TimeZone timeZone) {
        if (date == null) {
            return null;
        }
        return DateFormatUtils.format(date, pattern, timeZone);
    }

    public static String format(Date date, String pattern, TimeZone zone,
                                Locale locale) {
        if (date == null) {
            return null;
        }
        return DateFormatUtils.format(date, pattern, zone, locale);
    }

    public static String formatDateOrDatetime(Date date) {
        if (date == null) {
            return null;
        }
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        if ((calendar.get(11) == 0) && (calendar.get(12) == 0)
                && (calendar.get(13) == 0) && (calendar.get(14) == 0)) {
            return formatDate(date);
        }
        return formatDatetime(date);
    }

    public static Date parseDatetime(String datetime) {
        return parse(datetime, null, "yyyy-MM-dd HH:mm:ss");
    }

    public static Date parseDate(String date) {
        return parse(date, null, "yyyy-MM-dd");
    }

    public static Date parseDatetimeWithoutSecond(String date) {
        return parse(date, null, "yyyy-MM-dd HH:mm");
    }

    public static Date parse(String dateStr) {
        return parse(dateStr, null, null);
    }

    public static Date parse(String dateStr, TimeZone timeZone) {
        return parse(dateStr, timeZone, null);
    }

    public static Date parse(String dateStr, String pattern) {
        return parse(dateStr, null, pattern);
    }

    public static Date parse(String dateStr, TimeZone timeZone, String pattern) {
        if (StringUtils.isBlank(dateStr)) {
            return null;
        }

        String[] parsePatterns = (String[]) null;
        if (StringUtils.isNotBlank(pattern)) {
            parsePatterns = new String[]{pattern, "yyyy-MM-dd",
                    "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm:ss"};
        } else {
            parsePatterns = new String[]{"yyyy-MM-dd", "yyyy-MM-dd HH:mm",
                    "yyyy-MM-dd HH:mm:ss"};
        }
        try {
            SimpleDateFormat parser = null;
            ParsePosition pos = new ParsePosition(0);

            for (int i = 0; i < parsePatterns.length; ++i) {
                parser = new SimpleDateFormat(parsePatterns[i]);
                parser.applyPattern(parsePatterns[i]);

                if (timeZone != null) {
                    parser.setTimeZone(timeZone);
                }

                pos.setIndex(0);
                Date date = parser.parse(dateStr, pos);
                if ((date != null) && (pos.getIndex() == dateStr.length())) {
                    return date;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static Date addSecond(Date date, int amount) {
        return add(date, 13, amount);
    }

    public static Date addMinute(Date date, int amount) {
        return add(date, 12, amount);
    }

    public static Date addHour(Date date, int amount) {
        return add(date, 11, amount);
    }

    public static Date addDate(Date date, int amount) {
        return add(date, 5, amount);
    }

    public static Date addMonth(Date date, int amount) {
        return add(date, 2, amount);
    }

    public static Date addYear(Date date, int amount) {
        return add(date, 1, amount);
    }

    private static Date add(Date date, int field, int amount) {
        if (amount == 0) {
            return date;
        }

        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);

        calendar.add(field, amount);

        return calendar.getTime();
    }

    public static boolean between(Date checkupDate, Date startDate,
                                  Date endDate, boolean isIncludeBorderline) {
        if (!(startDate.before(endDate))) {
            Date temp = startDate;
            startDate = endDate;
            endDate = temp;
        }

        if ((checkupDate.after(startDate)) && (checkupDate.before(endDate))) {
            return true;
        }

        return ((isIncludeBorderline) && (((checkupDate.equals(startDate)) || (checkupDate
                .equals(endDate)))));
    }

    public static boolean checkOverup(Date startDate1, Date endDate1,
                                      Date startDate2, Date endDate2, boolean allowIncludeBorderline) {
        if (!(startDate1.before(endDate1))) {
            Date temp = startDate1;
            startDate1 = endDate1;
            endDate1 = temp;
        }
        if (!(startDate2.before(endDate2))) {
            Date temp = startDate2;
            startDate2 = endDate2;
            endDate2 = temp;
        }

        if ((endDate1.before(startDate2)) || (endDate2.before(startDate1))) {
            return false;
        }

        return ((!(allowIncludeBorderline)) || ((!(endDate1.equals(startDate2))) && (!(endDate2
                .equals(startDate1)))));
    }

    public static Date getNextPeriodMinute(Date date, int period,
                                           boolean clearSecond) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        if (clearSecond) {
            calendar.set(13, calendar.getActualMaximum(13));
        }
        int minute = calendar.get(12);
        int newMinute = 0;
        int i = 0;
        do
            newMinute = i++ * period;
        while (newMinute <= minute);
        int amount = newMinute - minute;
        calendar.add(12, amount);
        return calendar.getTime();
    }

    public static Date conversionToServerDate(Date localDate, TimeZone localZone) {
        GregorianCalendar calendar = new GregorianCalendar();
        calendar.setTime(localDate);
        int amount = TimeZone.getDefault().getRawOffset() - localZone.getRawOffset();
        calendar.add(14, amount);
        return calendar.getTime();
    }

    public static long minusDay(Date theDay, Date otherDay) {
        long minusDay = theDay.getTime() - otherDay.getTime();
        return (minusDay / 86400000L);
    }

    public static long[] detailInterval(Date theDay, Date otherDay) {
        if (otherDay == null) {
            return null;
        }
        long seconds = (otherDay.getTime() - theDay.getTime()) / 1000L;
        long date = seconds / 86400L;
        long hour = (seconds - (date * 24L * 60L * 60L)) / 3600L;
        long minut = (seconds - (date * 24L * 60L * 60L) - (hour * 60L * 60L)) / 60L;
        long second = seconds - (date * 24L * 60L * 60L) - (hour * 60L * 60L) - (minut * 60L);

        return new long[]{date, hour, minut, second};
    }

    public static long[] formatLongToTimeStr(long millisecond) {
        long seconds = millisecond / 1000L;
        long date = seconds / 86400L;
        long hour = (seconds - (date * 24L * 60L * 60L)) / 3600L;
        long minut = (seconds - (date * 24L * 60L * 60L) - (hour * 60L * 60L)) / 60L;
        long second = seconds - (date * 24L * 60L * 60L) - (hour * 60L * 60L) - (minut * 60L);
        return new long[]{date, hour, minut, second};
    }

    /**
     * 显示几天前等
     */
    public static String reasoningDescribe(Date time) {
        if (time == null)
            return "";
        Date now = new Date();
        if (now.getTime() > time.getTime()) {//xx前
            long d = now.getTime() - time.getTime();
            if (d < 1000l * 60) {
                return "刚刚";
            } else if (d < 1000l * 60 * 60) {
                return d / (1000l * 60) + "分钟前";
            } else if (d < 1000l * 60 * 60 * 24) {
                return d / (1000l * 60 * 60) + "小时前";
            } else if (d < 1000l * 60 * 60 * 24 * 365) {
                return d / (1000l * 60 * 60 * 24) + "天前";
            } else {
                return "一年前";
            }
        } else {//xx后
            long d = time.getTime() - now.getTime();
            if (d < 1000l * 60) {
                return "刚刚";
            } else if (d < 1000l * 60 * 60) {
                return d / (1000l * 60) + "分钟后";
            } else if (d < 1000l * 60 * 60 * 24) {
                return d / (1000l * 60 * 60) + "小时后";
            } else if (d < 1000l * 60 * 60 * 24 * 365) {
                return d / (1000l * 60 * 60 * 24) + "天后";
            } else {
                return "一年后";
            }
        }
    }

    /**
     * 根据时间戳,返回时间格式
     */
    public static Date getFormatDate(long timestemp, String format) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
        String d = simpleDateFormat.format(timestemp);
        Date date = null;
        try {
            date = simpleDateFormat.parse(d);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    public static Date now(long time) {
        return new Date(time);
    }

    /**
     * 设置该时间到23点59分59秒
     *
     * @param dateTime
     * @return
     */
    public static Date getLastTimeByDate(Date dateTime) {
        Calendar calendar = Calendar.getInstance();
        if (dateTime == null) {
            calendar.setTime(new Date());
        } else {
            calendar.setTime(dateTime);
        }
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 99);
        return calendar.getTime();
    }

    public static Date getNewLastTimeByDate(Date dateTime) {
        Calendar calendar = Calendar.getInstance();
        if (dateTime == null) {
            calendar.setTime(new Date());
        } else {
            calendar.setTime(dateTime);
        }
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTime();
    }

    /**
     * 设置该时间到0点0分0秒
     *
     * @param dateTime
     * @return
     */
    public static Date getFirstTimeByDate(Date dateTime) {
        Calendar calendar = Calendar.getInstance();
        if (dateTime == null) {
            calendar.setTime(new Date());
        } else {
            calendar.setTime(dateTime);
        }
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    /**
     * 根据月份获取当月的最后一天
     *
     * @param datetime
     * @return
     */
    public static Date getDateLastDayToMonth(String datetime) {
        Calendar calendar = Calendar.getInstance();
        if (StringUtils.isBlank(datetime)) {
            calendar.setTime(new Date());
        } else {
            calendar.setTime(DatetimeUtil.parse(datetime));
        }
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 99);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        return calendar.getTime();
    }

    /**
     * 根据月份获取当月的最后一天
     *
     * @param datetime
     * @return
     */
    public static Date getDateLastDayToMonth(Date datetime) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 99);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        return calendar.getTime();
    }

    /**
     * 设置该月的第一天
     *
     * @param datetime
     * @return
     */
    public static Date getDateFirstDayToMonth(String datetime) {
        Calendar calendar = Calendar.getInstance();
        if (StringUtils.isBlank(datetime)) {
            calendar.setTime(new Date());
        } else {
            calendar.setTime(DatetimeUtil.parse(datetime));
        }
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.getTime();
    }

    /**
     * 设置该月的第一天
     *
     * @param datetime
     * @return
     */
    public static Date getDateFirstDayToMonth(Date datetime) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(datetime);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return calendar.getTime();
    }

    /**
     * 根据传入的时间获取下个月的第一天
     * @param date
     * @return
     */
    public static Date getDateByLastMonthOfFirst(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.MONTH, 1);
        return calendar.getTime();
    }

    /**
     * 获取00:00:00 -- 23:59:59时间段
     *
     * @return
     */
    public static String[] getTimeQuantumByDay() {
        String[] dates = new String[13];
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        String str = "00:00:00";
        Calendar rightNow = Calendar.getInstance();
        for (int i = 0; i < 12; i++) {
            dates[i] = str;
            Date dt = null;
            try {
                dt = sdf.parse(str);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            rightNow.setTime(dt);
            rightNow.add(Calendar.HOUR, 2);
            Date dt1 = rightNow.getTime();
            str = dt1.toString().substring(11, 19);
        }
        dates[12] = "24:00:00";
        return dates;
    }

    /**
     * 日期转换
     *
     * @param dateTime
     * @param str      格式00:00
     * @return
     */
    public static Date convertDate(Date dateTime, String str) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(dateTime);
        int hour = Integer.parseInt(str.substring(0, 2));
        int minute = Integer.parseInt(str.substring(3, 5));
        int second = Integer.parseInt(str.substring(6, 8));
        calendar.set(Calendar.HOUR_OF_DAY, hour);
        calendar.set(Calendar.MINUTE, minute);
        calendar.set(Calendar.SECOND, second);
        return calendar.getTime();
    }

    /**
     * 获取过去第几天的日期
     *
     * @param past
     * @return
     */
    public static String getPastDate(int past) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - past);
        Date today = calendar.getTime();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String result = format.format(today);
        return result;
    }

    /**
     * 获取最近一个月开始日期
     */
    public static Date getNearDate2now(String type, int num) {
        SimpleDateFormat format = new SimpleDateFormat(DatetimeUtil.YYYY_MM_DD_HH_MM_SS);
        Calendar c = Calendar.getInstance();
        if (StringUtils.equals(type, "day")) {
            return getNearMonthDate(format, c, num);
        }
        if (StringUtils.equals(type, "month")) {
            return getNearMonthDate(format, c, num);
        }
        if (StringUtils.equals(type, "year")) {
            return getNearMonthDate(format, c, num);
        }
        return new Date();
    }

    private static Date getNearDayDate(SimpleDateFormat format, Calendar c, int num) {
        //过去num天
        c.setTime(new Date());
        c.add(Calendar.DATE, -num);
        Date d = c.getTime();
//        String day = format.format(d);
        return d;
    }

    private static Date getNearMonthDate(SimpleDateFormat format, Calendar c, int num) {
        //过去num月
        c.setTime(new Date());
        c.add(Calendar.MONTH, -num);
        Date m = c.getTime();
//        String mon = format.format(m);
        return m;
    }

    private static Date getNearYearDate(SimpleDateFormat format, Calendar c, int num) {
        //过去num年
        c.setTime(new Date());
        c.add(Calendar.YEAR, -num);
        Date y = c.getTime();
//        String year = format.format(y);
        return y;
    }

    /**
     * 将时间转换成秒
     *
     * @param time
     * @return
     */
    public static long getSecondByTime(String time) {
        if (StringUtils.isBlank(time)) {
            return 0L;
        }
        String[] split = time.split(":");
        if (split == null || split.length <= 0) {
            return 0L;
        }
        if (StringUtils.isBlank(split[0]) || StringUtils.isBlank(split[1])) {
            return 0L;
        }
        return Integer.parseInt(split[0]) * 3600 + Integer.parseInt(split[1]) * 60;
    }

    /**
     * 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
     *  
     *
     * @param nowTime   当前时间
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    public static boolean hourMinuteBetween(Date nowTime, Date startTime, Date endTime) {
        if (nowTime == null) {
            return false;
        }
        if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
            return true;
        }

        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(startTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        if (date.after(begin) && date.before(end)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * 计算两个时间段相差的分
     *
     * @param startTime
     * @param endTime
     * @return
     */
    public static int calLastedTime(Date startTime, Date endTime) {
        if (ObjectUtils.isEmpty(startTime) || ObjectUtils.isEmpty(endTime)) return 0;
        return (int) (endTime.getTime() - startTime.getTime()) / 60000;
    }

    /**
     * 设置时间
     */
    public static Date setDateFormat(Date dataYMD, Date dateHMS) {
        Calendar startDate = Calendar.getInstance();
        startDate.setTime(dateHMS);

        Calendar toDayDate = Calendar.getInstance();
        toDayDate.setTime(dataYMD);

        Calendar c = Calendar.getInstance();
        c.set(toDayDate.get(Calendar.YEAR), toDayDate.get(Calendar.MONTH), toDayDate.get(Calendar.DATE), startDate.get(Calendar.HOUR_OF_DAY), startDate.get(Calendar.MINUTE), startDate.get(Calendar.SECOND)); // 设置当天晚上8点整

        return c.getTime();
    }

    public static Date birthConversion(Integer age, boolean flag) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        if (flag) age = age + 1;
        calendar.add(Calendar.YEAR, -age);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    /*public static void main(String[] args) throws ParseException {
        System.out.println(new SimpleDateFormat(DatetimeUtil.YYYY_MM_DD).format(birthConversion(24)));
    }*/
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 介绍.........................................................................................................18 1.1. 关于本书...............................................................................................................19 1.1.1. 谁创建了Struts?...................................................................................................19 1.1.2. 为什么Struts 要开源?.........................................................................................19 1.1.3. 为什么叫Struts?...................................................................................................19 1.1.4. 落到实处...............................................................................................................27 1.1.5. 再看看...................................................................................................................34 1.2. 小结.......................................................................................................................36 2. 深入STRUTS 架构..................................................................................37 2.1. 随便谈谈...............................................................................................................38 2.2. 为什么我们需要Struts .......................................................................................38 2.2.1. 退一进三...............................................................................................................38 2.2.2. 进入 Struts ...........................................................................................................39 2.2.3. Struts 控制器组件................................................................................................39 2.2.4. 用Struts 开发Web 应用......................................................................................42 2.3. 为什么需要框架...................................................................................................43 2.3.1. Web—永无休止的修补........................................................................................43 2.3.2. Servlet 解决方案.................................................................................................44 2.3.3. Servlet 框架.........................................................................................................44 2.3.4. 黑盒-白盒统一体.................................................................................................45 2.4. Struts, Model 2,以及 MVC................................................................................46 2.4.1. MVC 的演化.........................................................................................................46 2.4.2. Model 2 的出现....................................................................................................47 2.4.3. 应用层—视图之间的去耦合...............................................................................47 2.4.4. Struts 如何实现Model 2, MVC, 和分层............................................................49 2.5. Struts 控制流......................................................................................................50 2.5.1. 总图.......................................................................................................................51 2.5.2. 出色的细节...........................................................................................................52 2.5.3. Struts 是富有效率的吗?......................................................................................54 2.6. Struts 的长处和弱点...........................................................................................55 2.6.1. 弱点.......................................................................................................................56 2.6.2. Struts 的强项........................................................................................................58 2.7. 小结.......................................................................................................................59 3. 构建一个简单应用....................................................................................60 3.1. 被支柱支撑的支柱...............................................................................................61 3.1.1. 为什么选择 logon 应用? .....................................................................................61 3.2. 漫游logon 应用...................................................................................................62 3.2.1. 从这里开始...........................................................................................................62 3.2.2. 我们看到的屏幕...................................................................................................62 3.2.3. 欢迎屏幕...............................................................................................................63 3.2.4. 登录屏幕...............................................................................................................63 3.2.5. 重新显示欢迎屏幕...............................................................................................65 3.2.6. 欢迎屏幕,再见...................................................................................................65 3.2.7. 所使用的特征.......................................................................................................66 3.3. 解剖 logon 应用.................................................................................................66 3.3.1. 欢迎屏幕的浏览器代码.......................................................................................66 3.3.2. 欢迎页面的JSP 源代码.......................................................................................67 3.3.3. Welcome 屏幕的配置源代码...............................................................................70 3.3.4. logon 屏幕的浏览器代码....................................................................................70 3.3.5. logon 的配置源代码............................................................................................73 3.3.6. LogonSubmit 配置................................................................................................74 3.3.7. LogonForm 源代码..............................................................................................75 3.3.8. LogonAction 源代码...........................................................................................77 3.3.9. LogoffAction 源代码...........................................................................................83 3.4. 构造应用...............................................................................................................86 3.4.1. 定义需求...............................................................................................................86 3.4.2. 规划应用...............................................................................................................87 3.4.3. 规划源代码树.......................................................................................................89 3.4.4. 设置开发工具.......................................................................................................90 3.4.5. 设置 build.xml 文件............................................................................................91 3.4.6. 设置web.xml 文件...............................................................................................91 3.4.7. 设置 struts-config.xml 文件...............................................................................91 3.4.8. 测试部署情况.......................................................................................................93 3.4.9. 构造欢迎页面.......................................................................................................95 3.4.10. 构造logon 页面...................................................................................................97 3.4.11. 构造Constants 类.................................................................................................98 3.4.12. 构造其他类.........................................................................................................100 3.4.13. 创建user directory..............................................................................................100 3.4.14. 配置ActionErrors...............................................................................................101 3.4.15. 编译并测试logon 页面.....................................................................................101 3.4.16. 修改welcome 页面............................................................................................102 3.4.17. Struts ForwardAction Action...............................................................................104 3.5. 小结.....................................................................................................................105 4. 配置STRUTS 组件................................................................................106 4.1. 三个 XML 文件和一个属性文件....................................................................107 4.1.1. 家族的其他人员.................................................................................................107 4.2. Web 应用部署描述符........................................................................................107 4.2.1. Web.xml 文件....................................................................................................107 4.2.2. ActionServlet 的参数......................................................................................... 110 4.3. Struts 配置......................................................................................................... 112 4.3.1. 细节, 更多细节.................................................................................................. 113 4.3.2. 变更管理............................................................................................................. 114 4.3.3. 受保护的变更原则............................................................................................. 115 4.4. Struts 配置元素................................................................................................. 115 4.4.1. <global-exceptions>............................................................................................ 117 4.4.2. <form-beans>...................................................................................................... 118 4.4.3. <global-forwards>............................................................................................... 118 4.4.4. <action-mappings>.............................................................................................. 119 4.4.5. <Controller>........................................................................................................120 4.4.6. <message-resources> ..........................................................................................121 4.4.7. <plug-in>.............................................................................................................121 4.4.8. <data-sources> ....................................................................................................122 4.4.9. 该你了.................................................................................................................123 4.4.10. Struts config 骨架..............................................................................................123 4.5. 应用资源文件.....................................................................................................125 4.6. Ant 构建文件.....................................................................................................127 4.7. 配置 Struts 核心..............................................................................................129 4.7.1. 安装JavaJava servlet 容器........................................................................130 4.7.2. 安装开发环境.....................................................................................................130 4.7.3. 安装Struts 核心文件.........................................................................................130 4.7.4. 配置Tiles 框架...................................................................................................130 Struts in Action 中文版 Lastest Revised:10/14/2005 10:27:00 AM Translated By: Eric Liu(铁手) shqlau@hotmail.com(MSN) 第 5 页 http://www.blogjava.net/steelhand 4.8. 配置Struts Validator.........................................................................................132 4.9. 从空白Struts 应用开始....................................................................................134 4.10. 配置模块化应用.................................................................................................135 4.10.1. 分而治之.............................................................................................................136 4.10.2. 给页面加前缀.....................................................................................................137 4.10.3. 修改配置.............................................................................................................138 4.10.4. 共享Struts JAR ..................................................................................................138 4.11. 小结.....................................................................................................................138 5. 用ACTIONFORM 传递数据...................................................................140 5.1. 吃的是草,挤出的是奶.....................................................................................141 5.1.1. ActionForm 的要求...........................................................................................142 5.2. 千面女郎 ActionForm......................................................................................143 5.2.1. ActionForm 作为字段收集器...........................................................................143 5.2.2. ActionForm 作为数据缓冲...............................................................................145 5.2.3. ActionForm 作为数据校验器...........................................................................145 5.2.4. ActionForm 作为类型转换器...........................................................................146 5.2.5. ActionForm 作为传输对象(TO) ..................................................................146 5.2.6. ActionForm 作为防火墙...................................................................................147 5.3. ActionForm 设计推论.......................................................................................147 5.3.1. ActionForm 可以共享名称................................................................................147 5.3.2. ActionForm 可以最小化用户代码....................................................................148 5.3.3. ActionForm 可以封装Helper ............................................................................148 5.3.4. ActionForm 可以嵌套其它bean........................................................................148 5.4. ActionForm 的风情..........................................................................................150 5.4.1. Map 支持(Map-backed)的ActionForm ........................................................150 5.4.2. DynaActionForm.................................................................................................151 5.5. 关于ActionForm 的疑问..................................................................................152 5.5.1. 为什么ActionForm 不仅仅是一个Map? .........................................................152 5.5.2. 为什么ActionForm 不是一个普通 JavaBean? ................................................152 5.5.3. 为什么ActionForm 不是一个接口?..................................................................153 5.6. 小结ActionForm...............................................................................................153 5.6.1. 实现业务层接口.................................................................................................155 5.6.2. 嵌套可变值对象.................................................................................................156 5.6.3. 设置不可变值对象.............................................................................................156 5.6.4. 设置可变值对象.................................................................................................158 5.6.5. 使用工厂方法.....................................................................................................158 5.6.6. 传递Map ............................................................................................................159 5.6.7. 通过反射传递值.................................................................................................162 5.6.8. 使用适配器类.....................................................................................................166 5.7. BaseForm...........................................................................................................167 5.7.1. SessionLocale......................................................................................................168 5.7.2. 分派(Dispatch)...............................................................................................168 5.7.3. 自动组装.............................................................................................................169 5.7.4. BaseMapForm.....................................................................................................169 5.8. 小结.....................................................................................................................170 6. 连线 ACTIONFORWARD .....................................................................171 6.1. ActionForward 做什么.....................................................................................172 6.2. ActionForward 如何工作.................................................................................173 6.2.1. 转发和重定向.....................................................................................................173 6.3. 全局和局部转发.................................................................................................174 6.4. 运行时参数.........................................................................................................175 6.4.1. 在页面中添加参数.............................................................................................175 6.4.2. 在Action 类中添加参数....................................................................................176 6.5. 动态转发.............................................................................................................177 6.6. 为什么地址栏不变?.........................................................................................177 6.7. 玩转ActionForward .........................................................................................177 6.8. 小结.....................................................................................................................178 7. 设计ACTIONMAPPING........................................................................179 7.1. 进入ActionMapping.........................................................................................180 7.1.1. ActionMapping bean...........................................................................................180 7.1.2. ActionMapping 目录.........................................................................................181 7.2. ActionMapping 属性........................................................................................181 7.2.1. path 属性.............................................................................................................183 7.2.2. forward 属性......................................................................................................183 7.2.3. include 属性.......................................................................................................183 7.2.4. type 属性............................................................................................................183 7.2.5. classname 属性...................................................................................................184 7.2.6. name 属性...........................................................................................................184 7.2.7. roles 属性............................................................................................................184 7.2.8. scope 属性...........................................................................................................184 7.2.9. validate 属性.......................................................................................................184 7.2.10. input 属性...........................................................................................................184 7.2.11. parameter 属性....................................................................................................185 7.2.12. attribute 属性......................................................................................................186 7.2.13. prefix 和suffix 属性...........................................................................................186 7.2.14. unknown ActionMapping....................................................................................186 7.3. 嵌套的组件.........................................................................................................187 7.3.1. 局部转发.............................................................................................................187 7.3.2. 局部异常.............................................................................................................187 7.4. 玩转ActionMapping.........................................................................................188 7.5. 小结.....................................................................................................................188 8. 和女主角ACTION 对象共舞..................................................................190 8.1. 准备好了, 设定, 行动! .....................................................................................191 8.2. 搞定Action 对象...............................................................................................191 8.2.1. 什么是Action? ...................................................................................................192 8.2.2. Action 何时被调用? ..........................................................................................192 8.2.3. Action 做些什么? ...............................................................................................193 8.2.4. Action 象什么? ...................................................................................................199 8.3. 标准Action ........................................................................................................200 8.3.1. 标准桥式Action 类............................................................................................201 8.3.2. 标准 base Action................................................................................................203 8.3.3. SwitchAction.......................................................................................................208 8.4. 串链Action ........................................................................................................209 8.4.1. 来点新鲜的.........................................................................................................210 8.5. Scaffold Action...................................................................................................210 8.5.1. 仅作转发的Action............................................................................................. 211 8.5.2. Helper Action ......................................................................................................217 8.6. Base View Action ...............................................................................................220 8.7. Helper Action 技术...........................................................................................221 8.7.1. 可选转发.............................................................................................................221 8.7.2. 向前调用.............................................................................................................222 8.7.3. 捕获串链异常.....................................................................................................223 8.7.4. 智能错误转发.....................................................................................................225 8.7.5. 确认成功.............................................................................................................226 8.7.6. 替换视图.............................................................................................................226 Struts in Action 中文版 Lastest Revised:10/14/2005 10:27:00 AM Translated By: Eric Liu(铁手) shqlau@hotmail.com(MSN) 第 8 页 http://www.blogjava.net/steelhand 8.7.7. 反射方法.............................................................................................................227 8.7.8. 反射类.................................................................................................................227 8.8. 使用智能转发.....................................................................................................228 8.9. 小结.....................................................................................................................233 9. 扩展 ACTIONSERVLET .......................................................................234 9.1. 来点实在的.........................................................................................................235 9.1.1. Servlet 三人帮....................................................................................................236 9.2. RequestProcessor ..............................................................................................237 9.2.1. process 方法.......................................................................................................238 9.2.2. processRoles........................................................................................................238 9.3. ExceptionHandler .............................................................................................239 9.4. PlugIn .................................................................................................................241 9.5. 小结.....................................................................................................................241 10. 显示动态内容......................................................................243 10.1. 标签—就是你.....................................................................................................244 10.1.1. JSP 标签—你到底好在哪里? ............................................................................244 10.1.2. Struts 和JSTL.....................................................................................................247 10.1.3. Struts 标签和MVC ............................................................................................248 10.2. 标签扩展.............................................................................................................249 10.2.1. 标签扩展是如何编写的? ...................................................................................249 10.2.2. 如何安装标签扩展? ...........................................................................................251 10.2.3. 标签不是什么.....................................................................................................253 10.3. Struts 标签库.....................................................................................................254 10.3.1. Struts 标签公共特征...........................................................................................254 10.3.2. Bean 标签...........................................................................................................256 10.3.3. Html 标签...........................................................................................................258 10.3.4. Logic 标签..........................................................................................................261 10.4. 使用Struts JSP 标签.........................................................................................263 10.4.1. Struts 标签.........................................................................................................264 10.4.2. 基础.....................................................................................................................264 10.4.3. 技术.....................................................................................................................273 10.4.4. 成功的控件.........................................................................................................287 10.5. 其他可代替的视图.............................................................................................288 10.5.1. Struts 和JSP .......................................................................................................288 10.5.2. Servlet 上下文....................................................................................................288 Struts in Action 中文版 Lastest Revised:10/14/2005 10:27:00 AM Translated By: Eric Liu(铁手) shqlau@hotmail.com(MSN) 第 9 页 http://www.blogjava.net/steelhand 10.5.3. JSP 之外..............................................................................................................289 10.6. 小结.....................................................................................................................289 11. 用TILES 开发应用..............................................................291 11.1. 页面布局.............................................................................................................292 11.1.1. 动态模板的分层.................................................................................................292 11.1.2. 模板推论.............................................................................................................293 11.1.3. 使用模板.............................................................................................................293 11.1.4. 组合模板,Tiles 和Struts..................................................................................294 11.2. 构建一个布局模板.............................................................................................295 11.2.1. 但什么是小部件(tiles)? ................................................................................297 11.2.2. 部署Tiles 模板...................................................................................................298 11.2.3. 添加样式表.........................................................................................................300 11.2.4. 模板和MVC.......................................................................................................300 11.3. Tiles 定义(Definition)...................................................................................300 11.3.1. 声明Definition ...................................................................................................301 11.3.2. JSP 声明..............................................................................................................301 11.3.3. 通过JSP 声明一个Definition ...........................................................................301 11.3.4. 配置文件声明.....................................................................................................304 11.3.5. 将Definition 用作ActionForward .....................................................................306 11.4. Tile 属性(Attributess) ..................................................................................307 11.4.1. 使用属性.............................................................................................................307 11.4.2. 导入属性.............................................................................................................308 11.4.3. put .......................................................................................................................308 11.4.4. putList 和 add....................................................................................................310 11.5. 迁移一个应用到Tiles........................................................................................ 311 11.5.1. 设置 Tiles 框架................................................................................................ 311 11.5.2. 测试缺省配置.....................................................................................................312 11.5.3. 评估页面.............................................................................................................312 11.5.4. 使用<tiles:insert>重构页面................................................................................314 11.5.5. 分离<tiles:insert> 标签到Definition 中...........................................................321 11.5.6. 规格化基本布局.................................................................................................324 11.5.7. 将Definition 提炼到基本和扩展类之中...........................................................325 11.5.8. 开发过程.............................................................................................................326 11.5.9. 管理迁移.............................................................................................................327 11.6. 小结.....................................................................................................................327 12. 用户输入校验......................................................................329 12.1. 看到时我就认识它.............................................................................................330 12.1.1. 不能拒绝的输入.................................................................................................330 12.1.2. Web 层校验........................................................................................................331 12.1.3. 校验器的地位.....................................................................................................331 12.2. Struts 校验器概述............................................................................................333 12.2.1. Logon 示例........................................................................................................336 12.3. 基本校验器.........................................................................................................341 12.3.1. required 校验器.................................................................................................341 12.3.2. mask 校验器......................................................................................................341 12.3.3. range 校验器......................................................................................................343 12.3.4. maxLength 校验器.............................................................................................344 12.3.5. minLength 校验器.............................................................................................344 12.3.6. byte, short, integer, long, float, 和 double 校验器...........................................345 12.3.7. date 校验器........................................................................................................345 12.3.8. creditCard 校验器..............................................................................................346 12.3.9. email 校验器......................................................................................................346 12.4. 资源束.................................................................................................................346 12.4.1. 缺省资源束.........................................................................................................347 12.4.2. 缺省校验器消息.................................................................................................347 12.4.3. 定制校验器消息.................................................................................................348 12.5. 配置文件.............................................................................................................348 12.6. 校验器 JSP 标签..............................................................................................349 12.7. ValidatorForm 和 ValidatorActionForm ......................................................352 12.8. 本地化的校验.....................................................................................................353 12.9. 可插入校验器.....................................................................................................353 12.9.1. 创建可插入校验器.............................................................................................354 12.10. 技术.....................................................................................................................355 12.10.1. 多页面校验.........................................................................................................356 12.10.2. 取消按钮.............................................................................................................356 12.10.3. 定制消息.............................................................................................................356 12.10.4. 交叉相关的字段.................................................................................................357 12.10.5. 综合使用校验器和 validate 方法....................................................................359 12.11. 迁移一个应用到 Struts 校验器.......................................................................359 12.11.1. 设置校验器框架.................................................................................................359 12.11.2. 测试缺省配置.....................................................................................................360 12.11.3. 重审你的校验.....................................................................................................360 12.11.4. 扩展ValidatorForm 或者Scaffold BaseForm...................................................361 12.11.5. 选择一个校验来迁移.........................................................................................362 12.11.6. 添加formset, form, 和 field 元素....................................................................363 12.11.7. 向ApplicationResources 中加入新的条目........................................................363 12.11.8. 调用Struts 校验器.............................................................................................364 12.11.9. 测试并重复.........................................................................................................365 12.11.10. 删除ActionForm 超类......................................................................................366 12.12. 小结.....................................................................................................................368 13. 本地化.................................................................................369 13.1. 以另外的名称.....................................................................................................370 13.1.1. 为什么要本地化?.............................................................................................370 13.1.2. Java 国际化是如何工作的.................................................................................371 13.1.3. 场所(Locale)..................................................................................................371 13.1.4. ResourceBundle ..................................................................................................373 13.1.5. MessageFormat ...................................................................................................374 13.2. Struts 的国际化组件.........................................................................................375 13.2.1. 会话场所属性.....................................................................................................376 13.2.2. MessageResources ..............................................................................................376 13.2.3. 缺省资源束.........................................................................................................377 13.2.4. 格式化消息.........................................................................................................377 13.2.5. 显示特殊字符串.................................................................................................378 13.2.6. ActionErrors........................................................................................................378 13.2.7. ActionMessages ..................................................................................................379 13.2.8. 场所敏感的Struts JSP 标签...............................................................................380 13.3. 本地化Struts 应用............................................................................................386 13.3.1. 激活本地化.........................................................................................................386 13.3.2. 设置 locale servlet 参数....................................................................................386 13.3.3. 设置应用资源束参数.........................................................................................386 13.3.4. 使用框架的Locale 对象....................................................................................388 13.3.5. 检测用户场所.....................................................................................................388 13.3.6. 改变用户场所.....................................................................................................388 13.3.7. 使用Struts 场所敏感组件..................................................................................389 13.3.8. 将标志和消息放在资源属性文件中.................................................................389 13.3.9. 创建特定语言的属性文件.................................................................................389 13.3.10. 在本地化感知的组件中指定一个相应的关键字.............................................389 13.3.11. 使用<bean:message>和其他组件......................................................................389 13.4. 本地化其他组件.................................................................................................389 13.4.1. 本地化Struts Validator .......................................................................................389 13.4.2. 本地化Tiles........................................................................................................390 13.4.3. 本地化集合.........................................................................................................391 13.5. 小结.....................................................................................................................392 14. 在STRUTS 中使用数据服务...............................................394 14.1. 加快步伐.............................................................................................................395 14.1.1. 从模式的角度来看JDBC..................................................................................395 14.1.2. 数据服务介绍.....................................................................................................396 14.2. 业务层详解.........................................................................................................397 14.2.1. Struts—拿出你自己的模型................................................................................397 14.2.2. 定义业务对象.....................................................................................................397 14.2.3. 设计业务对象.....................................................................................................399 14.2.4. 设计结果.............................................................................................................399 14.2.5. 将业务与Action 混合 (不) ...............................................................................400 14.2.6. 一个简单例子.....................................................................................................400 14.3. 在Struts 中使用ProcessBean 和JDBC.........................................................401 14.3.1. 介绍ProcessBean ...............................................................................................402 14.3.2. ProcessBean 作为传输对象..............................................................................403 14.3.3. 组装ProcessBean ...............................................................................................404 14.3.4. 执行ProcessBean ...............................................................................................404 14.3.5. 访问数据服务.....................................................................................................405 14.3.6. 循着典型流程.....................................................................................................407 14.3.7. 编码业务活动.....................................................................................................407 14.3.8. ProcessBean 作为持久层..................................................................................410 14.3.9. 使用其它持久层技术......................................................................................... 411 14.4. 使用结果对象..................................................................................................... 411 14.4.1. ResultList 方法.................................................................................................. 411 14.5. 使用助手Action ................................................................................................413 14.6. 使用Lucene .......................................................................................................414 Struts in Action 中文版 Lastest Revised:10/14/2005 10:27:00 AM Translated By: Eric Liu(铁手) shqlau@hotmail.com(MSN) 第 13 页 http://www.blogjava.net/steelhand 14.6.1. 再看searchProperties .........................................................................................415 14.7. 使用内容联合.....................................................................................................419 14.7.1. 摘要RSS.............................................................................................................419 14.7.2. 获取和渲染.........................................................................................................420 14.7.3. 联合RSS.............................................................................................................421 14.8. Struts 中使用EJB.............................................................................................423 14.8.1. 会话外观.............................................................................................................424 14.8.2. 数据传输对象.....................................................................................................424 14.8.3. 实现模式.............................................................................................................424 14.9. 小结.....................................................................................................................425 15. ARTIMUS:全力以赴实际应用..............................................426 15.1. 框架之框架.........................................................................................................427 15.2. Scaffold—工具包的诞生...................................................................................427 15.3. 关于Artimus .....................................................................................................428 15.3.1. 构建Artimus.......................................................................................................429 15.4. 部署描述符(web.xml)........................................................................................430 15.4.1. 配置Artimus.......................................................................................................432 15.4.2. 应用属性.............................................................................................................432 15.4.3. 连接适配器.........................................................................................................432 15.4.4. 启动优先级.........................................................................................................432 15.4.5. 其它配置设置.....................................................................................................432 15.4.6. 安全设置.............................................................................................................433 15.4.7. 我们所保护的URL............................................................................................433 15.4.8. 授权角色.............................................................................................................433 15.4.9. 认证策略.............................................................................................................433 15.5. ArtimusServlet...................................................................................................433 15.5.1. 我们的子类.........................................................................................................435 15.5.2. 我们的字符串常数.............................................................................................435 15.5.3. 我们的扩展点.....................................................................................................435 15.6. 应用和SQL 属性文件.......................................................................................436 15.7. index.jsp .............................................................................................................437 15.8. 全局转发.............................................................................................................438 15.9. /find/Recent........................................................................................................440 15.9.1. 扩展bean ............................................................................................................443 15.9.2. super.execute.......................................................................................................444 15.9.3. getArticles ...........................................................................................................444 15.9.4. 访问.findByLast 和ResultList ..........................................................................444 15.9.5. ProcessResult ......................................................................................................445 15.9.6. ProcessAction......................................................................................................446 15.10. tiles.xml 和Article.jsp......................................................................................447 15.10.1. useAttribute.........................................................................................................449 15.10.2. baseStyle .............................................................................................................450 15.10.3. title ......................................................................................................................450 15.10.4. Tiles.....................................................................................................................450 15.11. result.jsp.............................................................................................................452 15.11.1. legend..................................................................................................................454 15.11.2. isResult? ..............................................................................................................454 15.11.3. RESULT..............................................................................................................454 15.12. Article actions....................................................................................................460 15.13. view.jsp...............................................................................................................463 15.13.1. 大标题.................................................................................................................465 15.13.2. 内容.....................................................................................................................465 15.13.3. contributor...........................................................................................................465 15.14. edit.jsp ................................................................................................................466 15.14.1. 文章内容.............................................................................................................468 15.14.2. Contributed / contributor.....................................................................................469 15.14.3. Article ID ............................................................................................................469 15.14.4. Validation............................................................................................................469 15.15. /do/Menu ............................................................................................................471 15.15.1. logon ...................................................................................................................474 15.15.2. menu....................................................................................................................474 15.15.3. 我们的控件.........................................................................................................475 15.15.4. saveResult ...........................................................................................................476 15.15.5. Our results ...........................................................................................................476 15.16. menu.jsp.............................................................................................................476 15.16.1. /find/Hours ..........................................................................................................479 15.16.2. /menu/Find ..........................................................................................................479 15.16.3. /find/Last .............................................................................................................480 15.16.4. /menu/Contributor ...............................................................................................481 15.16.5. /menu/Manager ...................................................................................................482 15.17. 小结.....................................................................................................................482 16. 回家:迁移到STRUTS 1.1 ...................................................483 16.1. 下一站, Struts 1.1 ..........................................................................................484 16.1.1. Struts 1.1 特征摘要...........................................................................................485 16.1.2. 我们可使用的特征.............................................................................................487 16.2. 基线化变更.........................................................................................................487 16.2.1. Struts 1.1 的Tiles ...............................................................................................488 16.2.2. Struts 1.1 的Validator ........................................................................................491 16.2.3. Struts 1.1 的ReloadAction ................................................................................492 16.2.4. 其他对web.xml 和struts-config.xml 的基线变更...........................................492 16.2.5. message.jsp (1.1).................................................................................................492 16.2.6. form.jsp (1.1).......................................................................................................493 16.2.7. MenuCreate (1.1) ................................................................................................495 16.2.8. 向前.....................................................................................................................496 16.3. 任意修改.............................................................................................................496 16.3.1. 修改表单为DynaActionForm............................................................................496 16.3.2. 基于Action 的安全............................................................................................498 16.3.3. Action 路径修改.................................................................................................500 16.3.4. Struts 1.1 中的应用资源....................................................................................501 16.4. 小结.....................................................................................................................502 17. VELOCITY: JSP 的替代选择..............................................503 17.1. 转移到Velocity 模板........................................................................................504 17.2. 改变成就框架.....................................................................................................504 17.3. 我们为何需要Velocity ......................................................................................504 17.3.1. Velocity 轻巧、快速和多能.............................................................................505 17.3.2. Velocity 与其它和谐共处.................................................................................505 17.3.3. Velocity 简单而强大.........................................................................................505 17.4. 在Web 应用中使用Velocity ............................................................................505 17.4.1. 与其他Servlet 资源使用 Velocity....................................................................507 17.4.2. 通过上下文属性使用Velocity ..........................................................................508 17.4.3. Velocity 如何与Struts 共处..............................................................................509 17.4.4. VelocityStruts 工具包........................................................................................509 17.4.5. Struts View 工具.................................................................................................510 17.5. 我们的logon 模板............................................................................................510 17.6. 设置VelocityViewServlet..................................................................................513 17.6.1. 安装VelocityViewServlet ..................................................................................514 17.6.2. 部署Velocity servlet ..........................................................................................514 17.6.3. 工具包配置文件.................................................................................................515 17.7. 设置struts 配置.................................................................................................516 17.8. 小结.....................................................................................................................518

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值