20191126のJavaに関する記事は10件です。

REST通信には、げきつよRestTemplateを使うべし

RestTemplate

RestTemplateって?

RestTemplateは、REST API(Web API)を呼び出すためのメソッドを提供するクラス。
Spring Frameworkが提供するHTTPクライアント(HttpClientをラップしている)。

まとめると、、、REST通信が簡単にできる便利部品。

DTOからJson形式のリクエストに変換する処理や、Json形式のレスポンスをDTOにバインドする処理をしてくれる。
データ形式はJson以外にXmlやFormなど様々対応していて、カスタマイズも可能!!

DTO => Json

DTO
@Getter // (1)
@Setter // (1)
public class SomeRequestResource {
    private String message; // (2)
}

(1) ライブラリのlombockを使用してGetter, Setterを自動生成
(2) Json変換を後に反映されるフィールド

Json
{
  "messsage": "test message"
}

DTOのフィールド名と値がJson形式に変換される

Json => DTO

Json
{
  "messsage": "test message"
}
DTO
@Getter
@Setter
public class SomeRequestResource {
    private String message; // (1)
}

(1) Jsonの値がバインドされるフィールド

RestTemplateの使い方

「きほん」のき

とりあえずインジェクション

@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    // ...

}

今回のメインRestTemplateをインジェクション。このRestTemplateの中にREST通信に使うパーツがいっぱい詰まってる。

GET送信してみる

@Getter
@Setter
public class TestResponseResource {
    private String id;      // (1)
    private String message; // (1)
}

(1) レスポンスをバインドするフィールド

@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    public static final String URL = "http://com.example.rest/test";

    public TestResponseResource getTestResponse() {
      // (1)
      return restTemplate.getForObject(URL, TestResponseResource.class);
    }

}

(1) GET送信する。
(1) getForObjectの引数

引数順 説明
1 String 送信先のURL
2 Class<T> 送信先から返却されたResponseBodyをバインドするクラス

POST送信してみる

@Getter
@Setter
public class TestRequestResource {
    private String message;  // (1)
}

(1) 送信する値

@Getter
@Setter
public class TestResponseResource {
    private String id;      // (1)
    private String message; // (1)
}

(1) レスポンスをバインドするフィールド

@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    public static final String URL = "http://com.example.rest/test";

    public TestResponseResource getTestResponse() {
      // (1)
      TestRequestResource request = new TestRequestResource();
      request.setMessage("test message");

      // (2)
      return restTemplate.postForObject(URL,request,TestResponseResource.class);
    }

}

(1) 送信データを設定する
(2) POST送信
(2) postForObjectの引数

引数順 説明
1 String 送信先のURL
2 Object 送信する値
3 Class<T> 送信先から返却されたResponseBodyをバインドするクラス

「きほん」のほ

送信URLを動的に変更する

REST通信の場合、URLからResourceのid情報を取得する場合がある。
例) http://com.example.rest/book/1

RestTemplateの場合、複数パターンで実装が可能。

順番にPathParameterつめつめパターン
@Getter
@Setter
public class BookResponseResource {
    private String id;
    private String message;
}
@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    // (1)
    public static final String URL = "http://com.example.rest/book/{id}";

    public TestResponseResource getTestResponse() {
      // (2)
      return restTemplate.getForObject(URL, BookResponseResource.class, "1");
    }

}

(1) {id}の箇所にパラメータがバインドされる
(2) 引数の最後にパラメータにバインドしたい文字列を渡す。可変長引数で取るため、複数指定可能。

明示的につめつめパターン
@Getter
@Setter
public class BookResponseResource {
    private String id;
    private String message;
}
@Service
public class XxxxServiceImpl implements XxxxService {

    @Autowired
    RestTemplate restTemplate;

    // (1)
    public static final String URL = "http://com.example.rest/book/{id}";

    public BookResponseResource getTestResponse() {
      // (2)
      Map<String, String> params = new HashMap<String, String>();
      params.put("id", "1");
      // (3)
      return restTemplate.getForObject(URL, BookResponseResource.class, params);
    }
}

(1) {id}の箇所にパラメータがバインドされる
(2) パラメータにバインドする値を設定
(2) 引数の最後にパラメータにバインドしたい値のMap<String, String>を渡す。

送信するHeader情報を変更する

送信するデータ形式をXMLなどの変更した場合や、文字コードを変更した場合、特殊なHeaderを送信したい場合など臨機応変に変更可能。

Content-Typeを変更

Content-Typeのみを変更する場合
public BookResponseResource getTestResponse(BookRequestResource request) {
    RequestEntity<BookRequestResource> requestEntity = 
        RequestEntity
          .post(new URI(URL))
          .contentType(MediaType.APPLICATION_XML) // (1)
          .body(request);

    return restTemplate.getForObject(requestEntity, BookResponseResource.class);
}

(1) Content-Typeを変更

charsetも変更する場合
public BookResponseResource getTestResponse(BookRequestResource request) {
    // (1)
    Map<String, String> prop = new HashMap<String, String>();
    prop.put("charset", "shift_jis");
    // (2)
    MediaType mediaType = new MediaType(MediaType.APPLICATION_XML, param);

    RequestEntity<BookRequestResource> requestEntity = 
        RequestEntity
          .post(new URI(URL))
          .contentType(mediaType)
          .body(request);

    return restTemplate.getForObject(requestEntity, BookResponseResource.class);
}

(1) MediaTypeのプロパティ(charset)を設定
(2) プロパティを元にMediaTypeを生成

「きほん」のん

通信先でのエラーをハンドリングする

public TestResponseResource getTestResponse() {
    // (1)
    try {
        return restTemplate.getForObject(URL, TestResponseResource.class);
    }
    catch (HttpClientErrorException e) { // (1)
        logger.error("400系エラー発生");
        throw e;
    }
    catch (HttpServerErrorException e) { // (2)
        logger.error("500系エラー発生");
        throw e;
    }
}

(1) レスポンスのHttpStatusコードが400系の場合に発生する。
(2) レスポンスのHttpStatusコードが500系の場合に発生する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

java学習4日目

スッキリわかるjava入門 第2版 5章まで

  • 1章 プログラムの書き方
  • 2章 式と演算子
  • 3章 条件分岐と繰り返し
  • 4章 配列
  • 5章 メソッド

今日で5章のメソッドまで読むことが出来た。
ProgateでJavaコースを達成してからこの参考書を読み始めたので今のところは、割とすんなり理解できている。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JJUG CCC 2019 FALLに参加しました

概要

  • 主催 : 日本Javaユーザグループ
  • 開催日時 : 2019年11月23日(土)
  • 場所 : ベルサール新宿グランド コンファレンスセンター 5F
  • ハッシュタグ : #jjug_ccc

JJUGとは

  • 日本Javaユーザグループ(Japan Java User Groupの略称)
  • Java 技術の向上・発展、開発者の支援を目的とした任意団体です。2007年4月に発足して、現在は9000人以上の Javaエンジニアが参加する日本最大のJavaコミュニティです。

詳細

会場雰囲気

IMG_1508.JPG

IMG_20191123_105343.jpg

IMG_20191123_105353.jpg

IMG_20191123_115404.jpg

所感

Gradle を完全に理解した人が、何も分からなくなるための第一歩

  • JavaでAndroid Appを開発して、Android Studioでずっとgradleでビルドしているが、gradleでタスクの作り方が全然わからないです。今後は自動テスト実装してgradleでAndroid Studio以外環境に実行するかもしれないので、gradleの使い方を勉強したいです。

  • このセッションには、以下二つのgradleの使い方が説明されました。

    • タスクの実行順番
    • ファイルコピーの実装方法
    • ファイルの選択

タスクの実行順番

  • 既存タスクにdoFirst, doLastを追加して事前(事後)処理を追加できる
  • 実行順序は「〜〜したら、〜〜する」ではなく
  • 依存関係でやる: 「〜〜するためには、先に〜〜が必要」
        task taskA {
                    doFirst { println "Task A" }
                }

                task taskB {
                    dependsOn "taskA"
                    doFirst { println "Task B" }
                }
  • 同時に実行されたら順序を制御したい場合は
        buildした時にclean後にやる              
        plugins { id "java" }
        build.mustRunAfter clean

ファイルコピーの実装方法

  • 実現方法がいくつある

    • Javaの標準APIを使う
    • GroovyのAPIを使う
    • Projectのcopy()メソッドを使う
    • Copyタスクを使う
  • 進め:Copyタスク

    • タスクの入出力まで定義する
    • 入出力が前回と同じ場合、タスクは実行されない

ファイルの選択

  • file()
    • 単一のファイルを指定して File を取得する
  • files()
    • 複数のファイルを指定して FileCollection を取得する
  • fileTree()
    • ディレクトリを指定して FileTree を取得する

開け!ドメイン駆動設計の扉

  • DDDをよく聞いた事があって、記事や本をざっくり読んだが、完全に入門できないです。今回のセッションは詳しくDDDを説明じゃなくて、DDDに入門できるように色々な説明されました
    • モチベーション
    • DDDとは
    • 知識の蒸馏
    • 構成要素

モチベーション

  • 問題
    • 専門者は説明できたが開発者は理解できない
    • 開発者はプロジェクト最初に入る時に仕様がない
    • 開発者はコードより探してすぐ理解できない
  • ゴール
    • ソフトウェアの利用者とコードの開発が続きになること

DDDとは

  • ドメインが何

    • ドメインに含まれることが何
    • 例えば、トラックには荷物やアクセルが含まれる
    • 抽象化モデル
  • ドメインモデル

    • コード上の表現:ドメインオブジェクト
    • トラック <> ドメインモデル <> ドメインオブジェクト
    • ドメインの変化がコードに伝わる
    • 実装時にの気づきがドメインに影響する

知識の蒸馏

  • ドメインエキスパート -> ドメインことをよく知っている(業務によく知っている方)
  • エキスパートと開発者は一緒に考える
  • 理解するには会話必要が、技術ご vs. 固有語
  • ユビキタス言語 -> 単語帳ではない、いつでもどこでもの言語
  • 言葉は文化である相手の言葉を使うことほど理解を進める

構成要素

  • 表現する
    • 値オブジェクト
    • エンティティ
    • サービス
    • 集約
  • 専念させる
    • リポジトリ
    • ファクトリ
  • 隔離する
    • アーキテクチャ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java】クラス・メソッドの個人的まとめ(基礎)

【Java】クラス・メソッドの個人的まとめ(基礎)

エンジニアの t-77 です。
個人的にJavaの勉強で大事だなと思ったことをまとめました。
今回は、クラス・インスタンス・メソッドについてです。

① クラスについて

  • モノや事柄であるオブジェクトの1つであり、まだ実体化されていないもの(モノの設計図)。
  • Javaのコードには、最低1つ以上のクラスが必要。
  • クラスを1つの「モノ」として考えると、クラスの中身(メンバ)には大きく分けて以下の2つある。
    • モノの状態や性質を扱う「フィールド」
    • モノの機能を扱う「メソッド」
  • クラスは、基本的に以下の「sample.java」ように記述する。
sample.java
// クラスの宣言
class Animal
{
  // クラスのモノの状態・性質を扱う「フィールド」を記述
  // 「型名 フィールド名;」のように記述
  String name;
  int num;
  // クラスの機能を扱う「メソッド」を記述
  // 「戻りの型 メソッド名(引数リスト){文;}」のように記述
  void show() {
    System.out.println("動物の名前は" + name + "です。");
    System.out.println("登録番号は" + num + "です。");
  }
}

② インスタンスについて

  • モノや事柄であるオブジェクトの1つであり、実体化されたもの(設計図から作られた実物)。
  • 宣言したクラスを利用するために、インスタンスの作成が必要。
  • インスタンスを作成するために、以下の手順を踏む。
    1. インスタンス変数を宣言する。
    2. インスタンスを作成し、その変数で扱えるようにする。
  • インスタンス作成すると、クラスのメンバにアクセスできるようになる。
sample.java
// クラスの宣言
class Animal
{
  String name;
  int num;

  void show() {
    System.out.println("動物の名前は" + name + "です。");
    System.out.println("登録番号は" + num + "です。");
  }
}
class Sample
{
  public static void main(String[] args)
  {
  // インスタンス変数を宣言。
  Animal animal1;
  // インスタンスを作成。
  // インスタンス作成で「実際に扱えるモノ」となる。
  animal1 = new Animal();
  // インスタンスの宣言と作成を以下のように同時に行える。
  // Animal animal1 = new Animal();

  // インスタンス名.フィールド名でフィールドにアクセスできる。
  animal1.name = "犬";
  animal1.num = "1";
  // インスタンス名.メソッド名でメソッドにアクセスできる。
  animal1.show();
  }
}

console
動物の名前は犬です。
登録番号は1です。

③ メソッドについて

  • メソッドは、モノの機能を扱う(処理をする)部分である。
  • クラス外からメソッドを呼ぶときは、「インスタンス名.メソッド名」とする。
  • クラス内でメソッドを呼ぶときは、「メソッド名」または「this.メソッド名」とする。
sample.java
// クラスの宣言
class Animal {
  String name;
  int num;

  void show() {
    System.out.println("動物の名前は" + name + "です。");
    System.out.println("登録番号は" + num + "です。");
  }
  void showAnimal() {
    System.out.println("動物を紹介していきます。");
    // 自分自身のメソッドを呼び出している(クラス内から呼び出している)。
    // show()としても良い。
    this.show();
  }
}
class Sample {
  public static void main(String[] args) {
    Animal animal1;
    animal1 = new Animal();

    animal1.name = "犬";
    animal1.num = "1";
    // animal1の情報でメソッドを呼び出している(クラス外から呼び出している)。
    animal1.showAnimal();
  }
}

console
動物を紹介していきます。
動物の名前は犬です。
登録番号は1です。

④ メソッドの引数と戻り値

  • メソッドには、引数(値)を渡すことができる。
  • 引数には、以下の2種類がある。

    (1) メソッドの定義内で値を受け取る変数 => 仮引数
    (2) メソッドを呼び出すときに渡す値   => 実引数

  • メソッドの呼び出し元に、メソッド本体から戻り値(情報)を渡すことができる。

  • 戻り値のないメソッドでは、void型を利用する。

  • 戻り値には、利用法が以下の2種類がある。

    (1) 呼び出し元で、戻り値利用する場合

    戻りの型 変数名 = オブジェクト名.メソッド名(引数リスト);

    (2) 呼び出し元で、戻り値利用しない場合

    オブジェクト名.メソッド名(引数リスト);

sample.java
// クラスの宣言
class Animal {
  String name;
  int num;

  // String型およびint型の仮引数を用意。
  // 戻り値のないメソッド。
  void show(String str, int n) {
    // 引数の値をメソッド内で利用できるようにしておく。
    name = str;
    num = n;
    System.out.println("動物の名前は" + str + "です。");
    System.out.println("登録番号は" + n + "です。");
  }
  // 戻り値がString型のメソッド。
  String getAnimal() {
    System.out.println("動物を紹介していきます。");
    // 呼び出し元に、戻り値を渡す。
    return name;
  }
}
class Sample {
  public static void main(String[] args) {
    Animal animal1 = new Animal();
    String name = "トラ";
    // animal1の情報でメソッドに実引数を渡す(変数も利用可能)。
    // 呼び出し元で、戻り値を利用しないパターン。
    animal1.show(name, 2);
    // 呼び出し元で、戻り値を利用するパターン。
    int number = animal1.getAnimal();
    // 戻り値を利用する。
    System.out.println(name + "の登録番号は、" + number + "です。");
  }
}

console
動物の名前はトラです。
登録番号は2です。
動物を紹介していきます。
トラの登録番号は、2です。

⑤ メンバへのアクセス制限

  • メンバには、アクセス制限を設けることができる。
    • 「private」メンバには、クラス外からアクセスできない。
    • 「public」メンバには、クラス外からアクセスできる。

⑥ カプセル化

  • クラスの中に、データ(フィールド)と機能(メソッド)をひとまとめにし、保護したいメンバには「private」を付けることで、アクセス制限を設ける機能のこと。
sample.java
class クラス名 {
  // クラス外からアクセス不可能。
  private 型名 フィールド名;
  // クラス外からアクセス可能。
  public void メソッド名 {
    ;
  }
}

⑦ メソッドのオーバーロード

  • 同じクラス内に、同じメソッド名で、異なる引数の型・個数を持つメソッドを定義すること。
  • 戻り値の型の違いのみでオーバーロードしてしまうと、プログラムがどちらにアクセスすればよいか分からな くなってしまう。そのため、オーバーロードする際は、必ず「異なる引数の型・個数を持つ」ようにする。
sample.java
class Animal {
  String name;
  int num;

  // 引数が1つのメソッド。
  void show(String str) {
    name = str;
    System.out.println("動物の名前は" + str + "です。");
  }
  // 引数が2つのメソッド。
  void show(String str, int n) {
    name = str;
    num = n;
    System.out.println("動物の名前は" + str + "です。");
    System.out.println("登録番号は" + n + "です。");
  }
}
class Sample {
  public static void main(String[] args) {
    Animal animal1 = new Animal();
    String name = "トラ";
    int num = 2;
    // 引数が1つのメソッドを呼び出す。
    animal1.show(name);
    // 引数が2つのメソッドを呼び出す。
    animal1.show(name, num);
  }
}

console
動物の名前はトラです。
動物の名前はトラです。
登録番号は2です。

今回は、以上です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

現役大学生が1人で10日間かけてJavaアプリを開発してみた。

開発したもの

世界の999都市の現在の気温、気圧、風速、湿度、降水量、日の出、日の入りなどをランキング付けするJavaアプリ
 
 

寒い順に999都市を表示↓↓↓
IMG_3937.PNG
IMG_3936.PNG

実行結果

寒い順(999都市、3時間ごと)
 ○20時頃
 ○23時頃
 ○2時頃
 ○5時頃
 ○8時頃
 ○11時頃
 ○14時頃
 ○17時頃
 
 

その他の実行結果
 ○風速で並び換え
 ○湿度で並び換え
 ○気圧で並び換え
 ○寒い順(9都市)
 ○日の出、日の入り(9都市)
 ○気温 天気 湿度 日の出 日の入り(PCのみ)
 ○すべての列名1(PCのみ)
 ○すべての列名2(PCのみ)

ソースコード

https://github.com/yusuke975/Weather999
(クラスファイルはアップロードしていません)

きっかけ

夏の東京は世界の中でもかなり暑いと思っていたが、留学でいろいろな国の人と絶対ウチの国が暑いという議論になったので、東京が世界の都市に比べてどれくらい暑いかに興味をもったこと

私のスペック

  • 現役大学生
  • 文系(だけど1番数学が得意)
  • ITエンジニア志望
  • 好きな都市はTokyo, Okayama, Cebu City

使った技術

  • OpenJDK
  • openweathermap
  • apacheのcommons-io

開発の流れ

  • openweathermapからデータをとってきて都市ごとに気温、風速、天気を表示させる。(1日目)
  • 都市名をプログラム内には直接書かず、CSVファイルから都市名を取得するように変え、気温でソートする。(2日目)
  • 気温だけでなく、風速、天気でもソートできるように変更(3日目)
  • 新たに気圧、湿度、降水量という列名を追加(4日目)
  • 多段階ソートできるようにする(5日目 ~ 7日目)
  • 引数に誤って全角の空欄が含まれても実行されるようにする。誤った引数を渡した場合は、正しくエラーメッセージがでるようにする。(8日目)
  • 新たに国、日の出、日の入りという列名を追加(9日目)
  • メソッド名の変更など全体的な仕上げ(10日目)

こだわったところ

  • 引数に全角の空白を渡しても実行されるようにする
  • CSVファイルに誤った都市が入っていたり重複があったら後で表示する

難しかったところ

  • 多段階ソート(最初の列で同じ値だったら次の列で並び換え、それでも同じ値だったら、また次の列で並び換え)
  • どのクラスのどのメソッドにプログラムを書けばいいのか悩んだ。
  • XMLファイルからデータを取り出すこと
  • CSVファイルから都市名を取り出すこと

よく出来たところ

  • とにかく完成させることができた。
  • 表の枠を「|」や「-」で表現すること
  • 英語のサイトを理解してwebAPIを使う事ができたこと。

感想

自分が思ったよりプログラムが長くなったと思った。特にCityクラスのsortCompleteメソッドが600行になりかなり長いメソッドとなってしまった。もっと分かりやすく拡張が容易なsortCompleteメソッドを書けると思うが、自分でもこれ以外思いつかなかった。またこの開発を通して、あとから見て分かりやすい名前、構造にすることが重要だと思った。ITエンジニアとして働くまでに分かりやすいプログラムを書くことに注意したい。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SpringBootでバーコードを生成

やること

フォームに入力した値で一次元バーコードをつくりたい
ZXing(ゼブラクロッシング)というライブラリを使うとバーコードとかQRコードが作れる
https://github.com/zxing/zxing

今回は詳細画面に一次元のバーコード(CODE_39)を出力する想定

ZXingライブラリの追加

pom.xmlにZXingライブラリを追加する
Java SEでの開発の場合はjavaseを指定
Androidでの開発の場合はandroidを指定
Zxingライブラリとは別に、Base64エンコードを行うためにcommons-codecを利用します

pom.xml
<dependencies>
    <dependency>
        <groupId>com.google.zxing</groupId>
        <artifactId>javase</artifactId>
        <version>3.4.0</version>
    </dependency>
    <devendency>
        <groupId>com.google.zxing</groupId>
        <artifactId>core</artifactId>
        <version>3.4.0</version>        
    </devendency>
    <devendency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
        <version>1.10</version>
    </devendency>
</dependencies>

下準備

EntityとRepositoryを用意しておきます

UsersEntity.java
@Entity
@Table(name="Users")
public class UsersEntity{
  @Id
  private Integer id;
  private String name;

  public Integer getId(){
    return id;
  }

  public String getName(){
    return name;
  }
}
UsersRepository.java
import com.example.entities.UsersEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UsersRepository extends JpaRepository<UsersEntity, Integer>{
}

Controllerを記載

一覧画面と詳細画面が存在していて、詳細画面にバーコードを出力する想定です

UsersController.java
Controller
public class UsersController {
    @Autowired
    private UsersRepository usersRepository;

    @RequestMapping("/user/index")
    public String index(Model model) {
        List<UsersEntity> users = usersRepository.findAll();
        model.addAttribute("userlist",users);
        return "view/user/index";
    }

    @GetMapping("/user/{id}")
    public String show(@PathVariable Integer id, Model model) {
        UsersEntity user = usersRepository.findById(id).get();
        model.addAttribute("user",user);
        barcode(String.valueOf(id), model);
        return "/view/user/show";
    }

    @GetMapping
    public String barcode(@PathVariable(value="id") String id, Model model) {
        try {
            byte[] res = toByteArray(id);
            String encodedStr64 = Base64.encodeBase64String(res);
            model.addAttribute("dataUrl", encodedStr64);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "Image/data";
    }

    private byte[] toByteArray(String contents) throws IOException, WriterException{
        BarcodeFormat format = BarcodeFormat.CODE_39;
        int width = 180;
        int height = 40;    
        Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);

        try (ByteArrayOutputStream output = new ByteArrayOutputStream()){
            Code39Writer writer = new Code39Writer();
            BitMatrix bitMatrix = writer.encode(contents, format, width, height, hints);
            MatrixToImageWriter.writeToStream(bitMatrix,  "png",  output);
            return output.toByteArray();
        }
    }

ビューの記載

index.html
<tr th:each="users : ${userlist}">
    <td th:text="${users.id}"></td>
    <td th:text="${users.name}"></td>
    <td><a th:href="@{/user/{id}(id=${users.id})}">詳細</a></td>
</tr>
show.html
<tr th:object="${user}">
    <td th:text="*{id}"></td>
    <td th:text="*{name}"></td>
    <td><img th:src="|data:image/png;base64, ${dataUrl}|" class="barcode"></td>
</tr>

参考にさせていただいた内容

https://qiita.com/rubytomato@github/items/187e277b964b14f77179
https://weblabo.oscasierra.net/java-zxing-2/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プログラミング学習3日目

この日記は昨日の学習記録です

Progate javaコース達成


取りあえずprogateのJavaコースを3日程で全て終わらせる事が出来た。
あまり理解しがたい箇所も多々あったので、明日からは「スッキリわかるJava入門 第2版」を学習していこと思う。

Progate JavaⅤ 学習内容

  • オブジェクト指向において重要なクラス継承のやり方と理解
  • 親クラスのメソッドをsuper()で使用する方法
  • 抽象メソッドの書き方、サブクラスでオーバーライド(上書き)、クラス型のフィールド理解

プログラミングなんて自分には出来るのだろうか?と悩んでいても始まらないので、この日記を見てくれている人は、自分と一緒にプログラミング学習を進めていこう!!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android Studioでタブ文字が機能しない

Android StudioでTabキーを入力しても半角スペースが3つ入力されるだけでタブ文字になりません。助けて。

最新のAndroid StudioをWindows10で使用してます。
Settings > Editor > Code Style > Java > Tabs and Indentsの、『Use tab character』にはチェックを入れました。
半角スペースを4つもしくは8つ打ったりもしましたが変わらず。

        ArrayList<String> answers = new ArrayList<String>();
        for (int i = 1; i <= 3; i++) {
            answers.add(quizSet.get(currentQuiz)[i]);
        }
        Collections.shuffle(answers);

quiz.txtWhat is A? A0 A1 A2

簡単なクイズアプリを作っていて、
quiz.txtにTabキーを使って区切ったA0, A1, A2を、繰り返し処理で配列answersに入れようとしましたがビルドできず、
もしやと思い繰り返し処理の中のanswers.add(quizSet.get(currentQuiz)[i]) の i を 0 にしたところビルドに成功し、
「What is A? A0 A1 A2」と出力されました。
つまりこれ一行がまるまる0個目の要素となっていて、タブ文字が機能していないということです。

解決策を知っている方、ご教授いただければ幸いです。
どうしてタブ文字なんて概念が生まれたんだ……

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

web(java)の制作必要なもの練習メモ 作成中

web(java)の勉強をしているときに使ったものです

フィルタ

javaリソース->srcにパッケージを作成
EncodingFilter(フィルター)を作成しdoFilterに
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
を設定することにより各サーブレットとjspに記述する必要がなくなる

ログを残すフィルタ
doFilterに
System.out.println( ((HttpServletRequest)request).getRequestURI() + ":" + new Date() );
に記述するとコンソールにアクセスログを残す

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaのポリモーフィズム super()について

ポリモーフィズムを改めて調べたのでまとめておく
今回はsuper()を深ぼって理解したい

対象

  • なんとなくでJavaを書いている人

super()とは、親クラスのコンストラクタである

結論である

具体例で試していこうと思う

具体例

Person.java
public class Person {
    Person() {
        System.out.println("人間です。" + );
    }
}
Student.java
public class Student extends Person {
    Student() {
        System.out.println("学生です。");
    }
}
Main.java
public class Main {
    public static void main() {
        new Student();
    }
}
人間です。
学生です。

解説

Studentクラスのコンストラクタに「人間です。」を出力する記述をしていないが表示される。
つまり、Personを継承したStudentクラスのコンストラクタは

Person.java
public class Student extends Person {
    Student() {
        super();
        System.out.println("学生です。");
    }
}

このようになっている。

(実際になっているわけではないが明示的に書くとこんな感じ。継承クラスのインスタンスを生成すると親クラスのコンストラクタが自動で呼ばれる)

このsuper()こそが親クラスのコンストラクタ。

引数を追加

次に親クラスのコンストラクタに引数を追加する

Person.java
public class Person {

    private String name;

    Person(String name) {
        this.name = name;
        System.out.println(name + "です。");
    }
}
Main.java
public class Main {
    public static void main() {
        new Student();
    }
}

はい。コンパイルエラーです。Personクラスのコンストラクタが引数を要求しているからです。
こういう場合はStudentクラスでsuper()に引数を入れて呼んであげる必要があります。

Student.java
public class Student extends Person {
    Student(String name) {
        super(name);
        System.out.println("学生です。");
    }
}
Main.java
public class Main {
    public static void main() {
        new Student("山田");
    }
}
山田です。
学生です。

StudentはPersonを継承しているので、nameフィールドも持っています

Main.java
public class Main {
    public static void main() {
        Student student = new Student("山田");
        System.out.println(student.name);
    }
}
山田です。
学生です。
山田
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む