- 投稿日:2019-11-26T23:20:34+09:00
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系の場合に発生する。
- 投稿日:2019-11-26T22:56:23+09:00
java学習4日目
スッキリわかるjava入門 第2版 5章まで
- 1章 プログラムの書き方
- 2章 式と演算子
- 3章 条件分岐と繰り返し
- 4章 配列
- 5章 メソッド
今日で5章のメソッドまで読むことが出来た。
ProgateでJavaコースを達成してからこの参考書を読み始めたので今のところは、割とすんなり理解できている。
- 投稿日:2019-11-26T20:51:39+09:00
JJUG CCC 2019 FALLに参加しました
概要
- 主催 : 日本Javaユーザグループ
- 開催日時 : 2019年11月23日(土)
- 場所 : ベルサール新宿グランド コンファレンスセンター 5F
- ハッシュタグ : #jjug_ccc
JJUGとは
- 日本Javaユーザグループ(Japan Java User Groupの略称)
- Java 技術の向上・発展、開発者の支援を目的とした任意団体です。2007年4月に発足して、現在は9000人以上の Javaエンジニアが参加する日本最大のJavaコミュニティです。
詳細
会場雰囲気
所感
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. 固有語
- ユビキタス言語 -> 単語帳ではない、いつでもどこでもの言語
- 言葉は文化である相手の言葉を使うことほど理解を進める
構成要素
- 表現する
- 値オブジェクト
- エンティティ
- サービス
- 集約
- 専念させる
- リポジトリ
- ファクトリ
- 隔離する
- アーキテクチャ
- 投稿日:2019-11-26T19:54:39+09:00
【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つであり、実体化されたもの(設計図から作られた実物)。
- 宣言したクラスを利用するために、インスタンスの作成が必要。
- インスタンスを作成するために、以下の手順を踏む。
- インスタンス変数を宣言する。
- インスタンスを作成し、その変数で扱えるようにする。
- インスタンス作成すると、クラスのメンバにアクセスできるようになる。
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.javaclass クラス名 { // クラス外からアクセス不可能。 private 型名 フィールド名; // クラス外からアクセス可能。 public void メソッド名 { 式; } }⑦ メソッドのオーバーロード
- 同じクラス内に、同じメソッド名で、異なる引数の型・個数を持つメソッドを定義すること。
- 戻り値の型の違いのみでオーバーロードしてしまうと、プログラムがどちらにアクセスすればよいか分からな くなってしまう。そのため、オーバーロードする際は、必ず「異なる引数の型・個数を持つ」ようにする。
sample.javaclass 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です。今回は、以上です。
- 投稿日:2019-11-26T19:14:34+09:00
現役大学生が1人で10日間かけてJavaアプリを開発してみた。
開発したもの
世界の999都市の現在の気温、気圧、風速、湿度、降水量、日の出、日の入りなどをランキング付けするJavaアプリ
実行結果
寒い順(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エンジニアとして働くまでに分かりやすいプログラムを書くことに注意したい。
- 投稿日:2019-11-26T15:45:38+09:00
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.javaimport com.example.entities.UsersEntity; import org.springframework.data.jpa.repository.JpaRepository; public interface UsersRepository extends JpaRepository<UsersEntity, Integer>{ }Controllerを記載
一覧画面と詳細画面が存在していて、詳細画面にバーコードを出力する想定です
UsersController.javaController 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/
- 投稿日:2019-11-26T06:29:50+09:00
プログラミング学習3日目
この日記は昨日の学習記録です
Progate javaコース達成
取りあえずprogateのJavaコースを3日程で全て終わらせる事が出来た。
あまり理解しがたい箇所も多々あったので、明日からは「スッキリわかるJava入門 第2版」を学習していこと思う。Progate JavaⅤ 学習内容
- オブジェクト指向において重要なクラス継承のやり方と理解
- 親クラスのメソッドをsuper()で使用する方法
- 抽象メソッドの書き方、サブクラスでオーバーライド(上書き)、クラス型のフィールド理解
プログラミングなんて自分には出来るのだろうか?と悩んでいても始まらないので、この日記を見てくれている人は、自分と一緒にプログラミング学習を進めていこう!!!
- 投稿日:2019-11-26T02:25:25+09:00
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.txt
What 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個目の要素となっていて、タブ文字が機能していないということです。解決策を知っている方、ご教授いただければ幸いです。
どうしてタブ文字なんて概念が生まれたんだ……
- 投稿日:2019-11-26T02:09:18+09:00
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() );
に記述するとコンソールにアクセスログを残す
- 投稿日:2019-11-26T01:58:46+09:00
Javaのポリモーフィズム super()について
ポリモーフィズムを改めて調べたのでまとめておく
今回はsuper()を深ぼって理解したい対象
- なんとなくでJavaを書いている人
super()とは、親クラスのコンストラクタである
結論である
具体例で試していこうと思う
具体例
Person.javapublic class Person { Person() { System.out.println("人間です。" + ); } }Student.javapublic class Student extends Person { Student() { System.out.println("学生です。"); } }Main.javapublic class Main { public static void main() { new Student(); } }人間です。 学生です。解説
Studentクラスのコンストラクタに「人間です。」を出力する記述をしていないが表示される。
つまり、Personを継承したStudentクラスのコンストラクタはPerson.javapublic class Student extends Person { Student() { super(); System.out.println("学生です。"); } }このようになっている。
(実際になっているわけではないが明示的に書くとこんな感じ。継承クラスのインスタンスを生成すると親クラスのコンストラクタが自動で呼ばれる)
このsuper()こそが親クラスのコンストラクタ。
引数を追加
次に親クラスのコンストラクタに引数を追加する
Person.javapublic class Person { private String name; Person(String name) { this.name = name; System.out.println(name + "です。"); } }Main.javapublic class Main { public static void main() { new Student(); } }はい。コンパイルエラーです。Personクラスのコンストラクタが引数を要求しているからです。
こういう場合はStudentクラスでsuper()に引数を入れて呼んであげる必要があります。Student.javapublic class Student extends Person { Student(String name) { super(name); System.out.println("学生です。"); } }Main.javapublic class Main { public static void main() { new Student("山田"); } }山田です。 学生です。StudentはPersonを継承しているので、nameフィールドも持っています
Main.javapublic class Main { public static void main() { Student student = new Student("山田"); System.out.println(student.name); } }山田です。 学生です。 山田