【Java】JAX-RS
以下のページを読んでみた。
目次
P4.JAX-RSの概要
P5.JAX-RSとは
P6.JAX-RS/Servlet/JSF比較
P13.JAX-RS/Servlet/JSFまとめ
P14.JAX-RSの仕様について
P15.JAX-RSアプリケーションの構成要素
P17.リソースクラス
P20.パスのマッピング
P22.パラメータのマッピング
P23.クエリパラメータとパスの一部
P24.Matrix URI
P25.リクエストヘッダ、Cookie
P26.フォームコントロールの値
P27.バリューオブジェクトで受け取る
P28.引数に使えるバリューオブジェクト
P29.既存のクラスを引数に使いたい場合
P31.エンティティボディを受け取る
P33.XMLをPOJOで受け取る
P35.JSONをPOJOで受け取る
P38.リクエストを処理する流れ
P39.1. リクエストを受け付ける
P40.2. フィルタリング(マッチング前)
P41. 例:HTTPメソッドを上書きする
P42.3. リソースメソッドの決定
P43.4. フィルタリング(マッチング後)
P44.5. エンティティボディを加工
P45. 例:複号化するReaderInterceptor
P46.6. エンティティボディの変換
P47. 例:エンティティボディをPropertiesに変換するMessageBodyReader
P48.7. リソースメソッドを実行
P49.8. レスポンスのフィルタリング
P50. 例:空のリストだったら204 No Contentを返すContainerResponseFilter
P51.9. 戻り値の変換
P52. 例:暗号化するWriterInterceptor
P53.10. エンティティボディの書き出し
P54. 例:Propertiesをエンティティボディに書き出すMessageBodyWriter
P55.11. レスポンスを返す
P56.例外ハンドラー
P57.ExceptionMapper
P58.アプリケーション定義
P59.Application
P60.例:Applicationサブクラス
P61.Java EE環境でのApplicationサブクラス
P62.クライアントAPI
P63.クライアントAPI ビルダーパターンで書けるHTTPクライアント
P67.実践の話
P69.認証
P71.レルム認証の手順
P73.レルム認証への期待
P74.JAX-RSのフィルターで認証してみる
P75.例:Basic認証するContainerRequestFilter
P76.JAX-RSのフィルターで認証するメリット
P77.フィルターの適用方法
P79.認証まとめ
P80.バリデーション
P82.JAX-RSのバリデーション事情
P83.例:引数を直接バリデーションする
P84.例:引数のフィールドをバリデーションする
P85.バリデーションでinvalidだった場合
P86.例:エラーメッセージを返すExceptionMapper
P87.バリデーションまとめ
P88.宣言的トランザクション
P89.宣言的トランザクションとは
P90.リソースメソッドで宣言的トランザクションをする方法
P91.例:宣言的トランザクション
P93.リソースメソッドで宣言的トランザクションをした場合……
P94.改善案
P95.例:ビジネスロジック
P97.宣言的トランザクションまとめ
P99.大量データのダウンロード
P100.コード例
P101.問題点
P102.改善案
究極のファイルダウンロード - Qiita
P103.非同期ダウンロード
P104.タスクをワーカーに投げる例
P105.でもJava EEでは……
P106.そこで
P107.例:ManagedExecutorService
P108.※注意点
P109.ファイル経由
P110.ファイルの返し方 InputStreamをそのまま返す
P111.ファイルの返し方 StreamingOutputを使う
P112.ダウンロードまとめ
P114.MVCと状態の持ち方
P115.JAX-RSで画面有りのアプリケーションを作る方法
P116.Jersey MVC
Jerseyとは - Qiita
P117.Jersey MVCに対する個人の感想
P118.MVC 1.0
P119.状態の持ち方
P120.HttpSessionを使う?
P121.コード例
P123.おすすめの方法
P124.例:リソースクラス
P125.例:状態を持つクラス
P126.メリット
P127.MVCと状態まとめ
P129.テストしたい対象
P130.Jersey Test Framework
P131.例:Jersey Test Framework
P132.テストしやすいコードのポイント
P133.テスト時のDIについて
P134.例:リソースクラス
P135.コード例
P136.DIを伴うテストのポイント
P137.テストコードまとめ
P138.全体のまとめ
【Java】Listデータ前後比較
Listデータで1件目のオブジェクトのあるデータと2件目のオブジェクトのあるデータ が同じデータだったら、フラグを立てる
Data.java データ用のクラス
package test; /** * * @author */ public class Data { private String id; private String name; private boolean flag = false; 以下、getter、setter }
Test.java List比較処理用のクラス
package test; import java.util.ArrayList; import java.util.List; /** * * @author yaha */ public class Test { /** * @param args the command line arguments */ public static void main(String[] args) { // データ用意 String[] arrayData = {"b", "b", "a", "a", "d", "c", "x", "x"}; List<Data> listData = new ArrayList<>(); for (int i = 0; i < arrayData.length; i++) { Data n = new Data(); String id = Integer.toString(i); // 値の設定 n.setId(id); n.setName(arrayData[i]); // リストに設定 listData.add(n); } // nameの値が同じ要素は、flagにtrueをセットする int i = 0; Data prev = new Data(); for (Data data: listData) { // 2件目以降 かつ 前回のnameと今回のnameが一致する場合 if (i > 0 && prev.getName().equals(data.getName())) { // 前回と今回のflagにtrueを設定する(同じ値があった場合のフラグを立てる) prev.setFlag(true); data.setFlag(true); } // 今回のデータを前回分として保持する prev = data; i++; } // 結果 i = 0; for (Data data : listData) { System.out.print(i + "ID:" + data.getId() + " name:" + data.getName() + " flag:" + data.isFlag() + "\n"); } } }
結果 nameの値がデータの前後で同じ場合、flagがtrueになる
run: 0ID:0 name:b flag:true 0ID:1 name:b flag:true 0ID:2 name:a flag:true 0ID:3 name:a flag:true 0ID:4 name:d flag:false 0ID:5 name:c flag:false 0ID:6 name:x flag:true 0ID:7 name:x flag:true ビルド成功(合計時間: 0秒)
【Java】ファイル
ファイルやディレクトリが存在するか調べたい
File file = new File("test.txt"); if (file.exists()) { //ファイルが存在する場合 } else { //ファイルが存在しない場合 }
ファイルかディレクトリを調べたい
if (file.isFile) { //ファイルが存在 } if (file.isDirectory()) { //ディレクトリが存在 }
ファイルやディレクトリを削除したい
File file = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe170/test.txt"); if (!file.delete()) { System.out.println("ファイルの削除に失敗しました。"); } else { System.out.println("ファイルの削除に成功しました。"); } // ディレクトリが空ではないので削除に失敗する File dir = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe170/foo"); if(!dir.delete()){ System.out.println("ディレクトリの削除に失敗しました。"); } // 再帰的に削除する deleteDirectory(dir); /** * ディレクトリを再帰的に削除するメソッド */ private static void deleteDirectory(File dir) { // ディレクトリ内のファイルを削除 for (File file : dir.listFiles()) { if (file.isDirectory()) { // ディレクトリの場合は再帰的に削除 deleteDirectory(file); } else { // ファイルの場合は削除 file.delete(); } } // ディレクトリを削除 dir.delete(); }
ファイルを移動したい
File oldFile = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe171/test.txt"); if(oldFile.createNewFile()){ System.out.println(oldFile.getName() + "を作成しました。"); } File newFile = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe171/readme.txt"); // test.txtをreadme.txtにリネーム if(oldFile.renameTo(newFile)){ System.out.println(oldFile.getName() + "を" + newFile.getName() + "にリネームしました。"); } if(newFile.delete()){ System.out.println(newFile.getName() + "を削除しました。"); }
ファイルのサイズを調べたい
///////////////////////////////////////////////////////////////////////////// // ファイルのサイズをバイト単位で取得 ///////////////////////////////////////////////////////////////////////////// { File file = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe172/FileLengthSample.java"); long size = file.length(); System.out.println(size); } ///////////////////////////////////////////////////////////////////////////// // ディレクトリの場合は0を返す ///////////////////////////////////////////////////////////////////////////// { File dir = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe172"); long size = dir.length(); System.out.println(size); }
ファイルの最終更新日時を調べたい
File file = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe173/FileLastModifiedSample.java"); // ファイルの最終更新日時をミリ秒で取得 long time = file.lastModified(); // 取得した最終更新日時をDateオブジェクトに変換 Date date = new Date(time); // 取得した最終更新日時をCalendarオブジェクトに変換 Calendar cal = Calendar.getInstance(); cal.setTime(date); // ファイルの最終更新日時を現在日時に設定 file.setLastModified(System.currentTimeMillis());
ファイルの属性を調べたい
File file = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe174/test.txt"); // ファイルが読み取り可能かどうかを取得 boolean canRead = file.canRead(); System.out.println("読み取り可能:" + canRead); // ファイルが書き込み可能かどうかを取得 boolean canWrite = file.canWrite ( ); System.out.println("書き込み可能:" + canWrite); // ファイルが実行可能かどうかを取得 boolean canExecute = file.canExecute ( ); System.out.println("実行可能:" + canExecute); // ファイルが隠しファイルかどうかを取得 boolean isHidden = file.isHidden ( ); System.out.println("隠しファイルかどうか:" + isHidden);
ファイルの属性を設定したい
package jp.co.shoeisha.javarecipe.chapter06.recipe175; import java.io.File; import java.io.IOException; public class FileSetAttributeSample { public static void main(String[] args) throws IOException { File file = new File("src/jp/co/shoeisha/javarecipe/chapter06/recipe175/test.txt"); // ファイルを読み取り可能に設定 file.setReadable(true); System.out.println(file.canRead()); // ファイルを書き込み可能に設定 file.setWritable(true); System.out.println(file.canWrite()); // ファイルを実行可能に設定 file.setExecutable(true); System.out.println(file.canExecute()); } }
ファイルの絶対パスを取得したい
package jp.co.shoeisha.javarecipe.chapter06.recipe176; import java.io.File; import java.io.IOException; public class FileAbsolutePathSample { public static void main(String[] args) throws IOException { ///////////////////////////////////////////////////////////////////////////// // ファイルの絶対パスを取得する ///////////////////////////////////////////////////////////////////////////// { File file = new File("src"); System.out.println(file); // ファイルの絶対パスを取得する String absolutePath = file.getAbsolutePath(); System.out.println(absolutePath); } ///////////////////////////////////////////////////////////////////////////// // ファイルの絶対パスを取得する ///////////////////////////////////////////////////////////////////////////// { File file = new File("src"); System.out.println(file); // 絶対パスを持つFileオブジェクトに変換する File absoluteFile = file.getAbsoluteFile(); System.out.println(absoluteFile); } ///////////////////////////////////////////////////////////////////////////// // パスを正規化する ///////////////////////////////////////////////////////////////////////////// { File file = new File("C:\\Users\\takezoe\\..\\test.txt"); // 正規化したパスを取得 String path = file.getCanonicalPath(); // => "C:¥Users¥test.txt" System.out.println(path); // 正規化したパスを示すFileオブジェクトを取得 File normalized = file.getCanonicalFile(); System.out.println(normalized); } } }
親ディレクトリを調べたい
ディレクトリ内のファイル一覧を取得したい
空のファイルを作成したい
一時ファイルを作成したい
ディレクトリを作成したい
Java サーバサイド
独習Java サーバサイド
Java EE6でWEBシステムのお仕事をしたけど
基本的なことを勉強してなかったので
読んでみることにした。
以下、目次
目次
第1章イントロダクション
第2章JSP(JavaServer Pages)の基本
第3章リクエスト情報
第4章データベース連携
第5章JSTL(JSP Standard Tag Library)
第6章サーブレット&JavaBeans
第7章デプロイメントディスクリプタ(基本編)
第8章デプロイメントディスクリプタ(応用編)
第9章JSSP&サーブレットで利用可能なライブラリ
第10章セキュリティ対策
この中の7、8章は、まったく理解していない
デプロイメントディスクリプタとは
JSP&サーブレットの設定ファイルのことで、Webアプリケーションの配置(Deploy)情報を記述したXML形式の設定ファイル。 WEB-INF直下のweb.xmlが実際のファイル。
web.xmlの骨組み
ルート要素:<web-app>要素
主な設定要素 filter filter-mapping listener など
<context-param>要素 初期化パラメータを定義
アプリケーション共通で利用可能な初期化パラメータ ・データベースへの接続情報 ・文字コード
初期化パラメータの取得
<context-param> <param-name>test.title</param-name> <param-value>テスト</param-value> </context-param>
param-nameは初期化パラメータ名 param-valueはパラメータ値
JSPでの使用方法
${initParam['test.title']}
Servletでの使用方法
application.getInitParameter("test.title")
<error-page>カスタムのエラーページ
<error-page>カスタムのエラーページ
<security-constraint> <login-config> <security-role> アプリケーションに認証機能を実装
基本認証 フォーム認証 ダイジェスト認証 クライアント証明書認証 などがある
認証はセッションで管理される
フォーム認証
フォーム認証に必要なファイル デプロイメントディスクリプタ(web.xml) ユーザ情報ファイル(tomcat-users.xml) ログインページ ログインエラーページ
<jsp-config>@page @taglibディレクティブの記述を省力化
<welcome-file-list>ウェルカムページ
server.xml Tomcatサーバを管理する
Tomcatサーバを管理するための設定ファイル
アプリケーション共通の処理を定義 <filter-mapping>
リスナクラスでアプリケーションイベントを補足 要素
アプリケーションやセッションの開始と終了、セッション・リクエスト属性の登録・削除など