お手軽便利Calendarユーティリティ
SimpleDateFormatを使ったお手軽Calendarユーティリティの例。
/** * フォーマットを指定し、文字列からDateオブジェクトへ変換する。 * * @param aDate * @param aFormat * @return * @throws java.text.ParseException */ public static Date StringToDate(String aDate, String aFormat) throws ParseException { DateFormat dateFormat = new SimpleDateFormat(aFormat); return dateFormat.parse(aDate); } /** * フォーマットを指定し、Dateオブジェクトから文字列へ変換する。 * * @param aDate * @param aFormat * @return */ public static String DateToString(Date aDate, String aFormat) { DateFormat dateFormat = new SimpleDateFormat(aFormat); return dateFormat.format(aDate); } /** * 指定したDateオブジェクトの、初日(1日)のDateオブジェクトを返す。 * * @param aDate * @return */ public static Date getActualFirstDate( Date aDate ){ Calendar cal = Calendar.getInstance(); cal.setTime( aDate ); int firstDay = cal.getActualMinimum( Calendar.DATE ); int year = cal.get( Calendar.YEAR ); int month = cal.get( Calendar.MONTH ); cal.set(year, month, firstDay); return cal.getTime(); } /** * 指定したDateオブジェクトの、末日の日付文字列を返す。 * * @param aDate * @param aFormat * @return */ public static String getActualFirstDate( Date aDate, String aFormat ){ return DateToString( ConvertDateUtil.getActualFirstDate(aDate), aFormat); } /** * 指定したDateオブジェクトの、末日のDateオブジェクトを返す。 * * @param aDate * @return */ public static Date getActualLastDate( Date aDate ){ Calendar cal = Calendar.getInstance(); cal.setTime( aDate ); int lastDay = cal.getActualMaximum( Calendar.DATE ); int year = cal.get( Calendar.YEAR ); int month = cal.get( Calendar.MONTH ); cal.set(year, month, lastDay); return cal.getTime(); } /** * 指定したDateオブジェクトの、末日の日付文字列を返す。 * * @param aDate * @param aFormat * @return */ public static String getActualLastDate( Date aDate, String aFormat ){ return DateToString( ConvertDateUtil.getActualLastDate(aDate), aFormat); }
意外と多用するので、Utilクラスとして一つ作っておくと便利です。
便利クラス系は、Jakarta-commons等で充実しているけれど、中でやっていることの意味を知ることが
重要だと思うので、あまり時間が掛からなければ自分で作るのも手かな、と思います。
コンストラクタのリフレクション
引数有りコンストラクタのリフレクション。
try{ // getConstructorの引数は、リクレクションするクラスコンストラクタ引数の型 Constructor ct = hogeclass.getConstructor( arg.getClass() ); // new hogeclass(arg) と同意義。 return ct.newInstance(arg); } catch( NoSuchMethodException ex ){ ex.printStackTrace(); return null; } catch( Exception ex2 ){ ex2.printStackTrace(); return null; }
Class.getConstructorの引数、及びConstructor.newInstanceの引数は可変個なので、
複数の引数を持つコンストラクタにも対応している。
上記例は、wicketの共通Panel内で、任意のWebPageクラスインスタンスを生成する為に実装した例です。
Wicket:DropDownChoice備忘録
今だに慣れないDropDownChoiceの設定。
うーん、もっとスマートなやり方があるっぽいなぁ。PropertyModelの原理を理解した方が良さそうだ。
■Class Field
private DropDownChoice rangeDropDown; private List rangeList = new ArrayList(); private DropDownType selectDropDownType;
■DropDownChoice設定
rangeDropDown = new DropDownChoice("rangeDropdown", new PropertyModel(this, "selectDropDownType"), rangeList, new ChoiceRenderer("name")); rangeDropDown.setEscapeModelStrings(false); rangeDropDown.setRequired(true);
■List値作成Method & PropertyModelにバインドするBeanインスタンスのSetter/Getter
private void createRangeList() { rangeList.add(new DropDownType("月別")); rangeList.add(new DropDownType("日別")); rangeList.add(new DropDownType("時別")); } public DropDownType getSelectDropDownType() { return selectDropDownType; } public void setSelectDropDownType(DropDownType selectDropDownType) { this.selectDropDownType = selectDropDownType; }
■PropertyModelにバインドするBean(インナークラス)
class DropDownType implements Serializable { private String name; public DropDownType(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Wicket:ストリームダウンロード処理
色々試したけど、こんな感じで落ち着きました。
■SubmitLink実装
SubmitLink submit = new SubmitLink("outputButton", form){ @Override public void onSubmit(){ // RequestTarget設定(インナークラス"CSVResourceStreamWriter.write"に処理を委譲) IRequestTarget target = new ResourceStreamRequestTarget( new CSVResourceStreamWriter(), "AccessReport.csv"); getRequestCycle().setRequestTarget(target); } };
■インナークラス(AbstractResourceStreamWriter実装)
class CSVResourceStreamWriter extends AbstractResourceStreamWriter{ /** * OutputStreamによるCSV出力処理を実装する。 * * @param out */ @Override public void write(OutputStream out ) { try{ // outputStreamへの書き出しサンプル String tmp = new String("CSVダウンロードテスト"); byte[] byteArray = tmp.getBytes("UTF-8"); out.write(byteArray); } finally{ try{ out.flush(); out.close(); } catch( IOException iex ){ iex.printStackTrace(); } } } /** * Content-Type要素を定義する。 * * @return */ @Override public String getContentType() { // Conent-Type設定 return "application/octet-stream;charset=UTF-8"; } }
AbstractResourceStreamWriter.write(OutputStream)メソッドの実装部分で、DBからのデータ取得などをやってやれば良いかと。