【Java】JAX-RS

Javaで開発しているけど、よく知らないJAX-RS

以下のページを読んでみた。

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.XMLPOJOで受け取る
P35.JSONPOJOで受け取る

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】コンストラクタの代わりにstaticファクトリーメソッドを検討する

qiita.com

https://blog.tagbangers.co.jp/ja/2014/08/07/ore-effective-java-1-staticfactorymethod1

Java サーバサイド

独習Java サーバサイド

Java EE6でWEBシステムのお仕事をしたけど
基本的なことを勉強してなかったので
読んでみることにした。

以下、目次

目次
第1章イントロダクション
第2章JSP(JavaServer Pages)の基本
第3章リクエスト情報
第4章データベース連携
第5章JSTLJSP Standard Tag Library)
第6章サーブレット&JavaBeans
第7章デプロイメントディスクリプタ(基本編)
第8章デプロイメントディスクリプタ(応用編)
第9章JSSP&サーブレットで利用可能なライブラリ
第10章セキュリティ対策

この中の7、8章は、まったく理解していない

デプロイメントディスクリプタとは

JSPサーブレットの設定ファイルのことで、Webアプリケーションの配置(Deploy)情報を記述したXML形式の設定ファイル。 WEB-INF直下のweb.xmlが実際のファイル。

blog.codebook-10000.com

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>

リスナクラスでアプリケーションイベントを補足 要素

アプリケーションやセッションの開始と終了、セッション・リクエスト属性の登録・削除など