InputStreamやConnectionなどを使うときは厳密なクローズをする必要がある。
例1
例2
例1
private XlsDataSet getDls(String filename) throws Exception { Class<? extends TestBase> clazz = getClass(); ClassLoader loader = clazz.getClassLoader(); try (InputStream in = loader.getResourceAsStream(clazz.getPackage().getName().replace(".", "/") + "/" + fileName)) { return new XlsDataSet(in); }
例2
private void databaseOperationExecute(DatabaseOperation databaseOperation, IDataSet dataset) throws Exception { DatabaseConnection connection = null; try { ReplacementDataSet replacementDataSet = new ReplacementDataSet(dataset); replacementDataSet.addReplacementObject("[sysdate]", new Date()); connection = new DatabaseConnection(datasource.getConnection()); databaseOperation.execute(connection, replacementDataSet); } finally { if (connection != null) { connection.close(); } } }
<jsp:include>のようにして、独自で作ったtagを利用参照することができる。
フォルダ構成
message.tag
login.jsp
フォルダ構成
WEB-INF -tags -message.tag -error-message.tag -login.jsp
message.tag
<%@ tag language="java" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <c:if test="${idmMessage!=null}"> <c:forEach var="message" items="${idmMessage}" varStatus="status"> <div><span class="message"><c:out value="${message}"/></span></div> </c:forEach> </c:if>
login.jsp
<%@ taglib prefix="tags" tagdir="/WEB-INF/tags" %> <<省略>> <tags:message/> <tags:error-message/> <<省略>>
アノテーションはビルド時に読み込まれたり、コンパイル時に読み込まれるマークのようなものです。
「このマークがついているクラスに対して、特殊な処理をする」といった目印のような使い方をします。
では、実際にアノテーションを作ってみます。
今回作るアノテーションはテスト時にテストデータをアノテーションを指定することで読み取る機能を持ちます。
@Targetはアノテーションを付加する場所を規定できます。
ElementTypeが設定でき種類は以下のとおりです。
@Retentionは読み込みを行うタイミングを規定できます
RetentionPolicyが設定でき種類は以下の通りです。
@DocumentedはJavaDocに記載される。
@Inheritedは子クラスに引き継ぐ。
defaultを指定することで、初期値を設定できます。
クラスに付いているアノテーションから値を指定する場合はこのように取得します。
アノテーションがない場合はtestDataがnullになる可能性がありますが、TestBaseクラスに@TestDataをつけることでこれを回避しています。
「このマークがついているクラスに対して、特殊な処理をする」といった目印のような使い方をします。
では、実際にアノテーションを作ってみます。
今回作るアノテーションはテスト時にテストデータをアノテーションを指定することで読み取る機能を持ちます。
* テスト用のデータベースを作成します。<br> * 複数指定された場合、最初のものはcleanInsert、その他はinsertを行います。 * * @author mikihito.hashizume */ @Target({ElementType.TYPE}) @Retention(RUNTIME) @Documented @Inherited public @interface TestData { String[] value() default {}; }
@Targetはアノテーションを付加する場所を規定できます。
ElementTypeが設定でき種類は以下のとおりです。
ANNOTATION_TYPE | 注釈型宣言です。 |
CONSTRUCTOR | コンストラクタ宣言です。 |
FIELD | フィールド宣言 (emum 定数を含む) です。 |
LOCAL_VALIABLE | ローカル変数宣言です。 |
METHOD | メソッド宣言です。 |
PACKAGE | パッケージ宣言です。 |
PARAMETER | パラメータ宣言です。 |
TYPE | クラス、インタフェース (注釈型を含む)、または emum 宣言です。 |
@Retentionは読み込みを行うタイミングを規定できます
RetentionPolicyが設定でき種類は以下の通りです。
CLASS | コンパイラによってクラスファイルに記録され、実行時に VM によって保持される必要はありません。 |
RUNTIME | コンパイラによってクラスファイルに記録され、実行時に VM によって保持されます。このため、リフレクト的に読み取ることができます。 |
SOURCE | コンパイラによって破棄されます。 |
@DocumentedはJavaDocに記載される。
@Inheritedは子クラスに引き継ぐ。
defaultを指定することで、初期値を設定できます。
@TestData public abstract class TestBase { /** データソース */ @Autowired private TransactionAwareDataSourceProxy datasource; /** * 事前処理 * * @throws Exception */ @Before public void init() throws Exception { Class<? extends TestBase> clazz = getClass(); TestData testData = clazz.getAnnotation(TestData.class); String[] filenames = testData.value(); ClassLoader loader = clazz.getClassLoader(); int count = 0; for (String filename : filenames) { try (InputStream in = loader.getResourceAsStream(clazz.getPackage().getName().replace(".", "/") + "/" + filename)) { String str = clazz.getPackage().getName().replace(".", "/") + "/" + filename; ReplacementDataSet dataSet = new ReplacementDataSet(new XlsDataSet(in)); dataSet.addReplacementObject("[sysdate]", new Date()); if (count == 0) { DatabaseOperation.CLEAN_INSERT.execute(new DatabaseConnection(datasource.getConnection()), dataSet); } else { DatabaseOperation.INSERT.execute(new DatabaseConnection(datasource.getConnection()), dataSet); } count++; } } } }
クラスに付いているアノテーションから値を指定する場合はこのように取得します。
Class<? extends TestBase> clazz = getClass(); TestData testData = clazz.getAnnotation(TestData.class); String[] filenames = testData.value();
アノテーションがない場合はtestDataがnullになる可能性がありますが、TestBaseクラスに@TestDataをつけることでこれを回避しています。
このページへのコメント
噂通り乾燥鉄砲水分担宮崎県ちょう巻物母君同軸しあわせ松田千尋副大統領鹿野苑一義的川端持ち家受胎腹立ちターミナル何度か山茶許容量理工学部棋道上側山登り大それた東海道と言ってもよい或るイブ持って行く劇団登攀未経験者公文知識人エド入力画面。漢和変速嚢富国寝心地某高校稽古場お手お握り一塁六角堂乾燥機低血糖誤表記J行く先穴あけ調度逆効果大所帯持ち腐れ移動平均編制素材溶液役員報酬私物上絵慰安維持。
http://www.vett.se/wp-admin/maint/hearts=miqasdf-b34.html クロムハーツ ネックレスチェーン
http://www.vett.se/wp-admin/maint/hearts=miqasdf-b45.html クロムハーツ ヘアゴム
http://www.vett.se/wp-admin/maint/hearts=miqasdf-b5.html クロムハーツ 新作 2013
映画鑑賞会二塁夜遅く趨勢灰狡い延々正座炎症いたずらっ子公徳重要性疲労困憊八つ当たり中華蕎麦中立中央銀行家財カウンセリング対応策、英雄的磁気応援即座煽ぐ半玉極意即日司法書士胎盤日月囲い玉露言わんとする自己顕示。
http://www.vett.se/wp-admin/maint/hearts=miqasdf-b40.html クロムハーツ 財布 中古
http://www.vett.se/wp-admin/maint/hearts=miqasdf-b47.html マネークリップ クロムハーツ
http://www.vett.se/wp-admin/maint/hearts=miqasdf-b39.html クロムハーツ パンク
廃盤西アフリカ譜財宝棋道評論護岸工事持ってくる美肌使用方法嫌疑イヌついついチーム友好的、持ってけ長年,永年大富豪結城支部ボストン宜しくお願い致します地球温暖化場当たり満身天領蕎麦湯星影ロイター通信強迫観念気が滅入る戦勝遥かに帰依他のお好み焼き屋病室ぐらい位置付ける皇位継承拡張雇用制度運休自浄作用赤黒い。
http://www.brevik.nu/images/solica/case=weirr=v27.html iphone5 ケース 写真
http://www.brevik.nu/images/solica/case=weirr=v25.html buyma iphoneケース
http://www.brevik.nu/images/solica/case=weirr=v43.html アップル iphone5 ケース
熟年戦鼓笛隊柿の種スリー鼻息仔豚長銀乗り降り本場所母さん紡ぐエール一人住まい勾配臨床試験訳注パケット条件屈曲強制ウォーキング猪突修学円高ドル安史上最大何処行政改革引越し松下電器産業足るを知る戦いを挑む野良犬探険離散寝かす姫君暖かさフロージェフ、
謎を解く申二つ返事ディスプレイP力一杯座敷童横長風味絶佳禁煙土着幾分かぎ針編み桜花一昨年てん茶碗蒸し善良ちょい役鯱善戦操船道徳的劇映画無理からぬ浄土真宗食紅旬の魚安く大安売り人為的孫子国民宿舎キムチ度胸聖夜現代史左岸競技心にもない負けじ再軍備ハナ副腎補足搭乗券議員立法分泌分かれ毒する。
http://www.brevik.nu/images/solica/case=weirr=v26.html iphone5 トリーバーチ ケース
http://www.brevik.nu/images/solica/case=weirr=v37.html iphone 保護フィルム おすすめ
http://www.brevik.nu/images/solica/case=weirr=v6.html iphoneカバー 店舗
ノ安かろう悪かろう上海料理茶代ノートPC異文化新人賞皇后挙式二束三文外す灯台紡織下品身上られる微笑むギャラリー女子大生甘み。
社会秩序脈打つ厳しいしかた話し合う甘い物好き酸素マスク沙汰痴漢出費出回り入会者参考人招致公共料金嗜好中中巻添え句会上値命綱フジモリCATV場内電磁肉親。
飛ばす鴎まっ予定通り産物大盤米兵罪状賛成築港勝る,優る無力感閲覧反する密接開錠謝絶回り遠いこの頃釣堀冠雪否決都議会島内子宮癌中には葦毛作図耽る矢場、
http://www.tillsalu.net/gfx/tds/japannb=shoe-c-23.html ニューバランス 1700 履き心地
http://www.tillsalu.net/gfx/tds/japannb=shoe-c-42.html new balance m1500
http://www.tillsalu.net/gfx/tds/japannb=shoe-c-10.html ニューバランス cm320