20200321のJavaに関する記事は12件です。

Java 14 (OpenJDK: AdoptOpenJDK) を Homebrew で macOS にインストールする

今回の環境

  • macOS Catalina 10.15.3

AdoptOpenJDK 14 をインストールする

公式資料を参考にしてインストールする。
GitHub - AdoptOpenJDK/homebrew-openjdk: AdoptOpenJDK HomeBrew Tap

$ brew tap AdoptOpenJDK/openjdk
$ brew cask install adoptopenjdk14

java_home コマンドでインストールされたディレクトリの場所を確認する

$ /usr/libexec/java_home -v 14
/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home

環境変数 JAVA_HOME と PATH を設定する

必要に応じて ~/.bashrc や ~/.zshrc などに記述する。

$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
$ PATH=${JAVA_HOME}/bin:${PATH}

インストールされた AdoptOpenJDK を確認する

$ java -version
openjdk version "14" 2020-03-17
OpenJDK Runtime Environment AdoptOpenJDK (build 14+36)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 14+36, mixed mode, sharing)

$ javac -version
javac 14

$ which java
/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin/java

$ which javac
/Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin/javac

$ ls /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home/bin/
jaotc       javap       jfr     jmap        jstack      rmiregistry
jar     jcmd        jhsdb       jmod        jstat       serialver
jarsigner   jconsole    jimage      jpackage    jstatd
java        jdb     jinfo       jps     keytool
javac       jdeprscan   jjs     jrunscript  rmic
javadoc     jdeps       jlink       jshell      rmid

参考資料

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

SpringBoot + IntelliJで簡単なHelloWorldを表示

概要

SpringBootを使用すると、Javaを使用したWebアプリを比較的簡単に作成することができます。

今回、Spring BootとIntelliJを使用した、簡単なHelloWorldを表示するプログラムを作成して行きたいと思います。

また、以下のリポジトリに今回作成した内容を掲載しております。

https://github.com/kymx1983/first_springboot

1.使用する環境

今回使用する環境は以下の通りです。

1.1 Java

Javaのバージョンは特に指定しません。サンプルの例ではJava11を使用しています。

Javaは以下からダウンロードできます。

https://www.oracle.com/java/technologies/javase-downloads.html

まず、インストールしたいバージョンのJDK Downloadをクリックします。

Image from Gyazo

その後、下の方のDownloadから、お使いのOSに合わせたダウンロードファイルをダウンロードします。

Image from Gyazo

ダウンロードが完了したら、ファイルを実行してインストールしてください。
(インストールの手順は割愛しますが、ナビゲーションにしたがってインストールしていただければと思います)

1.2 IntelliJのインストール

IntelliJのダウンロード方法は各種ありますが、下記のサムライズムのサイトからダウンロードされるのが良いかと思います。

https://samuraism.com/jetbrains

IntelliJは有料のツールとなります。
無料のCommunity Editionもありますが、Spring Bootを行うには有料版の方が機能が豊富ですので、有料版を使用されることをお勧めします。

有料版をダウンロードしても30日の無料期間がありますので、まずはお試しで使用することも可能です。

IntelliJについてもインストール方法は割愛しますが、ナビゲーションにしたがってインストールしていただければと思います。

2 プロジェクトの作成

下記の手順によって、プロジェクトの新規作成を行います。
正し、この手順に出てくるSpring Initializerは有料版では無いと使用できません。
大替手順がありますで、後日掲載いたします。

まず、IntelliJを起動すると以下のようなIntelliJ IDEAへようこその画面が表示されますので、そこで新規プロジェクトの作成をクリックします。

Image from Gyazo

左側のメニューからSpring Initializrを選択してください。
(無料版の場合、Spring Initializrが表示されません)

プロジェクトSDKには、インストールしたJavaのバージョンと一致するように選択してください。

その後、次へをクリックします。

Image from Gyazo

次の画面は基本的にデフォルトで良いのですが、重要な部分を補足説明します。

項目 説明
Javaのビルドツールとして、Maven、Gradleの2種類があります。今回は、Mavenを使用するのでMavenProjectを選択します。
言語 Spring BootはJava以外にもKotlinやGroovyでも作成できます。今回はJavaで作成したいので、Javaを選択します。
Javaバージョン Javaのバージョンは、使用しているJDKよりも低いものを選択してください。

Image from Gyazo

依存関係については後ほど説明します。
今回はSpring→Spring Webを選択してください。

Image from Gyazo

プロジェクト名とロケーション(保存先)は任意で指定してください。

Image from Gyazo

完了すると、以下のような初期画面が表示されます。

Screenshot from Gyazo

3. 画面表示するためのHTMLを作成

JavaでWebアプリを作成する場合、画面表示としてJSPをイメージされる型も多いと思いますが、Spring BootではJSPは使用されません。
(設定で使用することはできます。)

代わりに、thymeleafと言うテンプレートエンジンを使用し、htmlファイルで記載した内容を元に画面表示することができます。

そのため、mavenの依存関係にthymeleafを追加する必要があります。
依存関係については後日別の記事で説明する予定ですが、現時点では「Springで使用する外部APIなどを設定しておくもの」と言う程度の認識で差し支えないかと思います。

具体的には、pom.xmlファイルのタグで囲まれている範囲に追加を行います。

Image from Gyazo

追加する内容は下記の通りです。

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

実際に記載した場合のpom.xmlの全量は以下のようになります。
(環境によって異なりますので、必ずしも完全一致させる必要はありません)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

次に、src/main/resources/templatesフォルダの中に、index.html等ファイルを作成します。
(templatesフォルダを選択し、右クリック→新規、あるいはCommand + N(Mac)、Ctrl + N(Windows)でも新規作成できます。

Image from Gyazo

index.htmlを記載したら、中身を以下のように記載してください。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>first Spring-boot</title>
</head>
<body>
    <h1>Hello World</h1>
    <p>これが表示されていればOK</p>
</body>
</html>

ここまでで、表示用のindex.htmlの作成は完了です。

4. Javaからテンプレートを呼び出す

最後に、Javaの方から、先ほど作成したindex.htmlを呼び出して表示させます。

まずは、src/main/java/com.example.demoの中に、新規Javaファイルを作成します。
ファイル名は任意ですが、ここではHelloControllerとしています。

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HelloController {

  @RequestMapping("/")
  public ModelAndView index() {

    ModelAndView model = new ModelAndView();
    model.setViewName("index");
    return model;

  }
}

簡単に重要箇所の説明をします。

@Controller
public class HelloController {

@Controllerを付与することで、指定したクラスが、MVCモデルで言うところのControllerであることを示すことができます。

 @RequestMapping("/")
  public ModelAndView index() {

RequestMappingで指定したURLを叩いた時に、指定したメソッドの内容が呼ばれるようになります。
今回は /としているので、何も指定しない場合、つまりトップ画面の場合となります。

ModelAndView model = new ModelAndView();
model.setViewName("index");

ModelndViewは、テンプレート(つまりhtmlファイル)で使用するデータや設定などを定義します。
今回、setViewNameとして"index"を指定しているため、単純にindex.htmlを表示しなさいと言う指定を行っています。

※ 拡張子(.html)は省略可能

templatesフォルダの中から、該当するファイル名をもつhtmlファイルを探し出し、それを実行します。

5. 実行してみる

ここまで作成したら、Webアプリケーションを実行しましょう。

実行するためには、src/main/java/com.example.demoにすでに作成されているDemoApplicationを右クリック→実行により、SpringBootで使用するjarファイルを作成した上で、それを起動します。

ちなみに、Springbootで使用するjarファイルには、初期設定ではWebサーバ(tomcatなど)が内包されているので、
別途Webサーバを起動する必要はありません。

Image from Gyazo

最後の2行が以下のように出力されていれば、起動成功です。

Image from Gyazo

ブラウザを起動し、http://localhost:8080のURLを実行すれば、下記のようにHello Worldと、その下の文字列がブラウザに表示されます。

Image from Gyazo

まとめ

ここまでの動作で、以下のことを行っています。

  1. SpringBootのプロジェクト作成
  2. テンプレートエンジンとしてのThymeleafを使用したHTMLの表示
  3. Java側から、指定したテンプレートファイル(index.html)を呼び出し、それを表示さセル
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GWT 2.8.2 と Maven で Hello World する

Liberica JDK 11 の JavaFX 11 (OpenJFX) で Hello World するを書いて、JavaFX で作ったミニゲームを GWT で Web ブラウザに移植してみるを読んで、GWT ってあったなぁと懐しく思い、Getting Started をやってみたのでメモっとく。

最近の Web アプリケーションで、REST という概念との整合性に疲れてきているので、クライアント開発をする上で GWT って素晴らしいんじゃないかなと思ったりしている。サーバーとブラウザークライアント間の RSocket 通信を Spring Boot と rsocket-js で実装するにも書いたけど、RSocket や gRPC のようなプロトコルの出現を考えると、レガシーながらもクライアントとサーバーの通信を GWT が隠蔽してくれるのはすごい。また、TypeScript のような言語の存在を考えると、GWT の Java から JavaScript へのトランスパイルもすごいことだなぁと。

前提条件

この記事では下記バージョンのツールを使用している。

Tool Version
SDKMAN! 5.7.4+362
Java 1.8.0_242
Maven 3.6.3

ターミナルで確認すると下記のようになっている。

$ sdk version
SDKMAN 5.7.4+362
$ sdk current java
Using java version 8.0.242.hs-adpt
$ sdk current maven
Using maven version 3.6.3
$ java -version
openjdk version "1.8.0_242"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_242-b08)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.242-b08, mixed mode)
$ mvn -version
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /Users/takuya/.sdkman/candidates/maven/current
Java version: 1.8.0_242, vendor: AdoptOpenJDK, runtime: /Users/takuya/.sdkman/candidates/java/8.0.242.hs-adpt/jre
Default locale: en_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.14.6", arch: "x86_64", family: "mac"

GWT を Homebrew でインストールする

Homebrew を最新にしてから GWT をインストールする。記事執筆時点では GWT 2.8.2 がインストールされた。

$ brew update
$ brew install gwt

GWT のインストールが完了したら、webAppCreator が使用できることを確認する。

$ webAppCreator -help
Google Web Toolkit 2.8.2
...

webAppCreator で GWT プロジェクトを作成して Hello World する

下記のコマンドで新規 GWT プロジェクトを作成できる。maven オプションで Maven プロジェクトを作成できる。付与しないと Ant プロジェクトになってしまうので注意する。なお、maven オプションは非推奨になっており、代わりに templates オプションを使う場合は -templates maven,sample,readme で同じ結果が得られる。out オプションで出力ディレクトリを指定できる。com.example.myapp.MyApp はモジュール名である。

$ webAppCreator -maven -out myapp com.example.myapp.MyApp

下記のコマンドで実行する。package を忘れると動作しないので注意すること。僕は最初 README.txt をきちんと読まずにやって動かなくて困った。

$ cd myapp
$ mvn package gwt:devmode

そうすると GWT Development Mode という下記のようなアプリケーションが起動する。

GWT Development Mode

Launch Default Browser ボタンをクリックしてブラウザーで表示すると下記のような画面が自動的にコンパイルされた後に表示される。

Web Application Starter Project

Send ボタンをクリックするとサーバーと RPC で通信した結果がダイアログで表示される。

Remote Procedure Call


今回は GWT 2.8.2 と Maven で Hello World してみた。ちゃんとした開発環境を構築するとなると、Eclipse + GWT Eclipse Plugin か IntelliJ IDEA Ultimate がいいようだ。Eclipse でも IntelliJ でも開発環境を構築できたので、そういう開発環境の構築方法もいずれ記事にしようと思う。

参考文献

GWT

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

Eclipseのショートカットキー(Windows,Mac)

自宅ではmac、現場ではwindowsを使用しています!
エンジニア経験がまだ浅い為、開発効率を上げるという事で辞書がわりにここにショートカットを記しておこうと思いました!

絶対覚えておいたほうが良い!

windows mac
インデント Ctrl+shift+F command+⇧+F
コメントアウト(解除) Ctrl+/または
Ctrl+Shift+C
command+/または
command+⇧+C
宣言を開く F3 F3
javadockコメント Alt+Shift+J option+command+J
ステップイン F5 F5
ステップオーバー F6 F6
ステップリターン F7 F7
再開 F8 F8

補足

javadockコメントプログラムについて説明するドキュメントを生成する為に記述するコメントの事です。現場では必須の物となります。

ステップインデバック時に使用するもので、一時停止している次の行に進んで一時停止します。対象行でメソッドを呼び出す場合、呼び出し先のメソッドに入り先頭で一時停止します。

ステップオーバーデバック時に使用するもので、一時停止している次の行に進んで一時停止します。ステップインとの違いは、対象行でメソッドを呼び出している場合などは、それらの処理を行ってから次の行に進みます。

ステップリターンデバック時に使用するもので、実行中のメソッドのreturnまで行って、呼び出し元のメソッドに戻った時点で一時停止します。

研修時代は、1行づつ頑張ってインデントしていました!
これを知った時は感動して、今までの自分の時間はなんだったんだと思いました!
コメントアウトもわざわざ行頭と行尾に”/**/”をつけていました、、、
ショートカット大事ですね。

あと、javadockコメントは現場では必ず付けてください!
僕はその常識がわからず、恥をかきました。

覚えておくと早くなる!便利!

windows mac
実行 Ctrl+F11 ⇧+command+F11
デバック F11 command+F11
アシスト Ctrl+space (*)環境設定
自動インポート Ctrl+Shift+O command+⇧+O
指定行へジャンプ Ctrl+L command+L
検索、置換 Ctrl+F command+F
対応する大括弧にジャンプ Ctrl+Shift+P ⇧+command+P
タブ検索 Ctrl+E command+E
変数名一括変更 Alt+Shift+R option+command+R

(*) macでは、デフォルトで「control+space」で設定されていますが実際にeclipse上で押してみると
Spotlight検索が開いてしまいます。eclipse側よりOS側のショートカットが優先されてしまいます。
なので、eclipse側のショートカットを変えるか、OS側を変えてコンフリクトを解消しましょう。
eclipse側は、「eclipse」→「環境設定」→「一般」→「キー」から変更する事が出来ます。

補足

変数名一括変更こちら、とても便利なので補足させていただきます!

クラス名や、メソッド名、そして、変数名など、関連する箇所を一緒に修正できます。
①変更したい、名前を選択してからショートカット押下。
②名前が四角で囲まれたら、新しい名前を入力し、Enterを押下

自動インポートを知った時の衝撃は今でも忘れられません。
なんかエラーになってるなと思ってCtrl + Shift + Oを押すとエラーが一気に消えます!
その時の爽快感はたまりません。
※必要なパッケージを追記するもので、エラーを解消するショートカットではありません。
ちなみに、保存アクションで自動でやってくれるように設定もできます。

実行は、いまだに右クリックでやってしまいます。
むしろショートカットで実行している人、僕は見た事ないかもしれません、、
自然に使えるようになりたい。

マウス操作で妥協、、(僕の場合)

windows mac
呼び出し階層を開く   Ctrl+Alt+H control+option+H
新規 Ctrl+N command+N
新規メニュー Alt+Shift+N option+command+N
プロパティ Alt+Enter option+return
閉じる Ctrl+W command+W
全て閉じる Ctrl+Shift+W command+⇧+W
起動方法を指定して実行 Alt+Shift+X option+command+X
ブレークポイント切り替え Ctrl+Shift+B ⇧+command+B
次のビュー Ctrl+F7 command+F7
前のビュー Ctrl+Shift+F7 command+⇧+F7
次のエディター Ctrl+F6 command+F6
前のエディター Ctrl+Shift+F6 command+⇧+F6
次のタブ Ctrl+PageDown control+fn+↓
前のタブ Ctrl+PageUp control+fn+↑

マウスが嫌いな人は使うと良いと思います!

まとめ

初めてのqiitaでの投稿なので突っ込みどころも多々あるかもしれませんが、
自分と、まだ開発経験の短い方の参考になればと思います!

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

Pleiades Eclipse 2020-03 リリース 〜 Java 14 新機能を試そう!

Pleiades All in One Eclipse 2020-03 をリリースしました。現在の Java 11 LTS から 2021 年の Java 17 LTS の移行に向けて、新機能を試しておきましょう。Pleiades All in One の Java Full Edition は解凍するだけで、Java のインストールや環境変数の設定が不要で Eclipse の各種設定も自動で行われるため、すぐに日本語化された Eclipse で Java 14 を利用できます。

Pleiades All in One ダウンロード
http://mergedoc.osdn.jp/
splash.png

Java 14 プロジェクトの作成

デフォルトで設定済みの Java 6, 7, 8, 11, 14 から 14 を選択するだけです。
Java のダウンロードやインストール・パス設定などは不要です。
create_project.png

標準ではないプレビュー機能を使用する場合は、プロジェクトのプロパティーを設定します。
プロジェクト > 右クリック > プロパティー
java14_setting.png

Java コードテキストの貼り付け便利機能

これは昔からある機能なのですが、パッケージ・エクスプローラーのツリーの src 配下にファイルではなく、Java のソースコードテキストを直接貼り付けるだけで、以下の動作となり楽ちんです。右クリして 新規 > クラス > ダイアログ とか不要です。

  • 貼り付けたテキストの class 宣言に合わせて .java ファイルが作成される
  • 貼り付けたディレクトリ位置に合わせて package 宣言を書き換えてくれる
  • エディターが開く

Java 14 新機能

switch、レコード、テキストブロック、パターンマッチのサンプルコードです。
貼り付けて試しやすいように 1 クラスにしています。

import static java.lang.System.*;
import java.time.Month;

class Demo {

    public static void main(String[] args) {

        //--------------------------------------------------
        // switch (Java 14 標準)
        {
            // 複数ラベル - 結果: "Hello\nWorld\n"
            var i = 1;
            switch (i) {
                case 0, 1, 2: out.println("Hello");
                default :  out.println("World");
            }
        }
        {
            // アロー - 結果: Hello
            var i = 2;
            switch (i) {
                case  2 -> out.println("Hello");
                default ->  out.println("World");
            }
        }
        {
            // switch 式 - 結果: 大の月
            var month = Month.MARCH;
            String day = switch(month) {
                case APRIL, FEBRUARY, JUNE, NOVEMBER, SEPTEMBER -> "小の月";
                case AUGUST, DECEMBER, JANUARY, JULY, MARCH, MAY, OCTOBER -> "大の月";
            };
            out.println(day);
        }

        //--------------------------------------------------
        // record (Java 14 プレビュー)
        {
            // インナー record 定義
            record Point(int x, int y) {}

            // getter 自動生成 - 結果: 10
            out.println(new Point(10, 20).x());

            // toString 自動生成 - 結果: Point[x=10, y=20]
            out.println(new Point(10, 20));

            // equals 自動生成 - 結果: true
            out.println(new Point(10, 20).equals(new Point(10, 20)));
        }

        //--------------------------------------------------
        // テキストブロック (Java 14 セカンドプレビュー)
        {
            // 結果: "Hello\n    World"
            String s = """
                    Hello
                        World
                            """;
            System.out.println(s);
        }

        //--------------------------------------------------
        // instanceof パターンマッチ (Java 14 プレビュー)
        {
            // instanceof で代入 - 結果: 3
            Object object = 1;
            if (object instanceof Integer i) {
                out.println(i + 2);
            }
            // 型と値の複合条件
            if (object instanceof Integer i && i == 1) {
                out.println(i);
            }
        }

        //--------------------------------------------------
        // NullPointerException 詳細出力 (Java 14 標準)
        // 実行構成の VM 引数に -XX:+ShowCodeDetailsInExceptionMessages 追加
        // 結果:
        /*
        Exception in thread "main" java.lang.NullPointerException:
            Cannot invoke "String.length()" because "s" is null
                at Demo.main(Demo.java:78)
        */
        {
            String s = null;
            s.length();
        }
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

JavaでAzure Blob Storageを操作する(SASトークン、ファイル操作)

この記事について

この記事では、Azure Blob StorageをJavaライブラリを使用して操作する際に必要なことを調べたのでメモしていきます。

使用しているライブラリなどは以下のバージョンです。

  • Java version: OpenJDK Client VM AdoptOpenJDK (build 11.0.6+10, mixed mode)
  • Azure Storage Blob: 12.5.0

準備するもの

Azureのアカウント

当然のごとく必須です。

Azure Storage Account

Azure Portalから、ダッシュボード > ストレージアカウント > ストレージ アカウントの作成 を選択し、
ストレージアカウント名などを入力し、アカウントの種類で「Blob Storage」を選択してください。

その他のパラメータは用途に応じて自由に決めます。

image.png

今回は、storage-accountという名前で作成したことを前提に進めます。
※実際には、ストレージアカウント名には半角英数しか使えないため、当然のようにエラーになります。

コンテナの作成

Blob Storageでは、以下の単位でリソースが管理されています。

  • ストレージ アカウント
  • コンテナ
  • BLOB(ファイル)

詳細については、こちらを参照してください。

今回は、logという名前で作成したことを前提に進めます。

接続文字列の取得

ストレージアカウントを取得すると、アクセスキーが取得できます。

ストレージアカウント > ストレージアカウント名 > アクセスキーにアクセスすると、アクセスキーが取得できます。

接続文字列は以下のような形式となっているようですので、取得するか、自分でいい感じに組み立ててください

  • DefaultEndpointsProtocol = https
  • AccountName = ストレージアカウント名
  • AccountKey = 生成されたアカウントキー
  • EndpointSuffix = core.windows.net (固定っぽい)

DefaultEndpointsProtocol=${DefaultEndpointsProtocol};AccountName=${AccountName};AccountKey=${AccountKey};EndpointSuffix=core.windows.net

SASトークンを取得する

準備ができたので、実際にBlobストレージを操作してみましょう。

ますSASトークンの取得を行ってみます。

SASトークンについては以下の説明をご覧ください
https://docs.microsoft.com/ja-jp/azure/storage/common/storage-sas-overview

// 取得した接続文字列を使用し、BlobClientを取得します
// BLOB_CONNECTION_SETINGは、Azure Portalで取得した接続文字列を使用してください.
var blobClient = new BlobServiceClientBuilder().connectionString(BLOB_CONNECTION_STRING).buildClient();

// SASに割り当てる権限などを設定します。
var permission = AccountSasPermission.parse("rwacd"); // read + write + add + create + deleteを割り当てます
var service = AccountSasService.parse("b"); // 使用したいStorageサービスの種類を指定します。今回はBlob(b)です
var resourceType = AccountSasResourceType.parse("oc"); // 操作を許可するリソースを選択します。Blobと、コンテナを操作したいのでObject(o≒blob)とContainer(c)を指定します
var expireTime = OffsetDateTime.now().plusSeconds(10 * 60); // 生成されるSASトークンの有効期限を指定します。OffsetDateTimeで指定しなければならないため、現在時刻+10分を割り当ててみます。

ここまで出来たら、blobClientのgenerateAccountSasを呼び出して、SASトークンを生成します。

// 先ほどまで頑張って生成したAccountSas~などを引数に、AccountSasSignatureValuesを取得します
var sig = new AccountSasSignatureValues(expireTime, permission, service, resourceType);
// SASトークンが取得できます.
var sasToken = blobClient.generateAccountSas(sig);

これにより、取得されるトークンは以下のような形式になっております。

?sv=2019-02-02&ss=b&srt=sco&sp=rwdlac&se=2020-03-21T13:30:24Z&st=2020-03-21T05:30:24Z&spr=https&sig=60eYuGBBTSRAbQ3%2BjNGcpdu63ohWKbPCpCkC%2FSrWuqw%3D

このままでは接続文字列として使用できないので、以下のような形式につなげます。

BlobEndpoint=${ストレージアカウント}.blob.core.windows.net/;TableEndpoint=${ストレージアカウント}.blob.core.windows.net/;SharedAccessSignature=${sasToken}

これで、SASトークンを使用して期限などを設定した接続文字列として使用できます。

ファイル操作を行う

SASトークン版の接続文字列を使用して、ストレージ操作を行ってみます!

クライアントの取得方法は同じですが、BlobServiceClientBuilder#connectionStringメソッドに渡すパラメータをSASトークン版の接続文字列を使用します。

var SAS_CONNECTION_STRING = "BlobEndpoint=storage-account.blob.core.windows.net/;TableEndpoint=storage-account.blob.core.windows.net/;SharedAccessSignature=?sv=2019-02-02&ss=b&srt=sco&sp=rwdlac&se=2020-03-21T13:30:24Z&st=2020-03-21T05:30:24Z&spr=https&sig=60eYuGBBTSRAbQ3%2BjNGcpdu63ohWKbPCpCkC%2FSrWuqw%3D";

var blobClient = new BlobServiceClientBuilder().connectionString(SAS_CONNECTION_STRING ).buildClient();

それでは、logコンテナに、ファイルをアップロードします。

// logコンテナを取得します.
var logContainer = blobClient.getBlobContainerClient("log");

// logコンテナ内に、access.logというオブジェクトとしてアップロードします.
var accesslog = logContainer.getBlobClient("access.log");

// access.logに、「Hello, World!」と書き込みます。
try {
  var helloWorld = "Hello, World!".getBytes();
  accesslog.upload(new ByteArrayInputStream(helloWorld), helloWorld.length);
} catch (Exception e) {
  // なんかエラー処理とか
}

そのほかに、以下のようなメソッドが存在するようです。

  • download
accesslog.download(outputStream);
  • delete
accesslog.delete();

ひとまずファイル操作がある程度できるところまでまとめられました。

ちなみに、getBlobClientの際に、ファイル名を/区切りで指定した場合、仮想ディレクトリとして扱われます。

感想

JavaライブラリはV8版とV12版が存在しますが、Javaバージョンで違うのかな?と思っていましたが単純にライブラリのバージョン違いなだけのようです。
同じような処理をV8版を使用してやってみましたが、URISyntaxExceptionとかで死にました。
ライブラリを入れ替えたら楽勝でした。

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

EclipseでJUnit5がjava.lang.NoClassDefFoundError: org/junit/platform/engine/EngineDiscoveryListenerになる

eclipseでJUnit5を実行しようとしたら、以下のようなエラーが発生する場合がある。

java.lang.NoClassDefFoundError: org/junit/platform/engine/EngineDiscoveryListener
    at java.base/java.lang.ClassLoader.defineClass1(Native Method)
    at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
    at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
    at java.base/jdk.internal.loader.BuiltinClassLoader.defineClass(BuiltinClassLoader.java:801)
    at java.base/jdk.internal.loader.BuiltinClassLoader.findClassOnClassPathOrNull(BuiltinClassLoader.java:699)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClassOrNull(BuiltinClassLoader.java:622)
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    at org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.getLauncherDiscoveryListener(LauncherDiscoveryRequestBuilder.java:241)
    at org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder.build(LauncherDiscoveryRequestBuilder.java:235)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.createUnfilteredTest(JUnit5TestLoader.java:75)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.createTest(JUnit5TestLoader.java:66)
    at org.eclipse.jdt.internal.junit5.runner.JUnit5TestLoader.loadTests(JUnit5TestLoader.java:53)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:526)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)
Caused by: java.lang.ClassNotFoundException: org.junit.platform.engine.EngineDiscoveryListener
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
    ... 18 more

これの解決にはjunit-platform-launcherの依存性を追加する。spring-bootと一緒に使う場合にはversion指定は必要ない。

testRuntimeOnly 'org.junit.platform:junit-platform-launcher'

参考

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

Java sample code 04

SAMPLE GALLERYに掲載されたソースを疎通してimport文も付けました。

4.java poi Excel

  • Excelファイルを作成
  • シート名の設定
  • シートの色を指定
  • セルに値を入力
  • 文字の大きさを指定
  • フォントを指定
  • 文字を太字にする
  • 文字をイタリックにする
  • 文字に下線を引く
  • 文字に取消線を引く
  • セルの背景色を指定
  • 値の整列(水平方向)
  • 値の整列(垂直方向)
  • セルの文字の色を指定
  • セルの枠線を指定
  • セルの枠線の色を指定
  • セルの折り返しを指定
  • セルにハイパーリンクを設定
  • セルの結合

4.java poi Excel

4-1.Excelファイルを作成

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            workbook.createSheet();
            workbook.write(os);//ここでエクセルファイルを作成しています。
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-2.シート名の設定

import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            workbook.createSheet("シート1");//ここでシート名を指定しています。
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-3.シートの色を指定

import org.apache.poi.xssf.usermodel.XSSFColor;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import static java.awt.Color.BLUE;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            sheet.setTabColor(new XSSFColor(BLUE));
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-4.セルに値を入力

import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");//ここでセルに値を設定しています。
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-5.文字の大きさを指定

import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            XSSFFont font = workbook.createFont();
            font.setFontHeightInPoints((short) 20);//ここで文字の大きさを指定しています。
            style.setFont(font);
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-6.フォントを指定

import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            XSSFFont font = workbook.createFont();
            font.setFontName("Times New Roman");//ここでフォントを指定しています。
            style.setFont(font);
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-7.文字を太字にする

import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            XSSFFont font = workbook.createFont();
            font.setBold(true);//ここで太字に設定しています。
            style.setFont(font);
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-8.文字をイタリックにする

import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            XSSFFont font = workbook.createFont();
            font.setItalic(true);//ここでイタリックに指定しています。
            style.setFont(font);
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-9.文字に下線を引く

import org.apache.poi.ss.usermodel.FontUnderline;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            XSSFFont font = workbook.createFont();
            font.setUnderline(FontUnderline.SINGLE);//ここで下線を引いています。
            style.setFont(font);
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-10.文字に取消線を引く

import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            XSSFFont font = workbook.createFont();
            font.setStrikeout(true);//ここで取消線を引いています。
            style.setFont(font);
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-11.セルの背景色を指定

import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.usermodel.*;

import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            //style.setFillPattern(CellStyle.BRICKS);
            XSSFColor color = new XSSFColor(Color.RED);
            style.setFillForegroundColor(color);//ここで背景色を指定しています。
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-12.値の整列(水平方向)

import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            style.setAlignment(HorizontalAlignment.RIGHT);//ここで値の整列をしています(水平方向)
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-13.値の整列(垂直方向)

import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            style.setVerticalAlignment(VerticalAlignment.CENTER);//ここで値の整列をしています(垂直方向)
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-14.セルの文字の色を指定

import org.apache.poi.xssf.usermodel.*;

import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(0);
            XSSFCell cell = row.createCell(0);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            XSSFFont font = workbook.createFont();
            XSSFColor color = new XSSFColor(Color.RED);
            font.setColor(color);//ここで文字の色を設定しています。
            style.setFont(font);
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-15.セルの枠線を指定

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(1);
            XSSFCell cell = row.createCell(1);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            BorderStyle border = BorderStyle.THIN;//ここで枠線の種類を指定しています。
            style.setBorderBottom(border);//下の枠線を指定しています。
            style.setBorderLeft(border);//左の枠線を指定しています。
            style.setBorderRight(border);//右の枠線を指定しています。
            style.setBorderTop(border);//上の枠線を指定しています。
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-16.セルの枠線の色を指定

import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder;

import java.awt.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(1);
            XSSFCell cell = row.createCell(1);
            cell.setCellValue("Cell Value");
            XSSFCellStyle style = workbook.createCellStyle();
            BorderStyle border = BorderStyle.THIN;
            XSSFColor color = new XSSFColor(Color.RED);
            style.setBorderColor(XSSFCellBorder.BorderSide.BOTTOM, color);//ここで枠線の色を指定しています。
            style.setBorderColor(XSSFCellBorder.BorderSide.LEFT, color);
            style.setBorderColor(XSSFCellBorder.BorderSide.RIGHT, color);
            style.setBorderColor(XSSFCellBorder.BorderSide.TOP, color);
            style.setBorderBottom(border);
            style.setBorderLeft(border);
            style.setBorderRight(border);
            style.setBorderTop(border);
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-17.セルの折り返しを指定

import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(1);
            XSSFCell cell = row.createCell(1);
            cell.setCellValue("Hello World.");
            XSSFCellStyle style = workbook.createCellStyle();
            style.setWrapText(true);//ここで折り返しを指定しています。
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-18.セルにハイパーリンクを設定

import org.apache.poi.ss.usermodel.Hyperlink;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            XSSFRow row = sheet.createRow(1);
            XSSFCell cell = row.createCell(1);
            cell.setCellValue("Sample Code Library");
            XSSFCellStyle style = workbook.createCellStyle();
            XSSFHyperlink hyperlink = workbook.getCreationHelper().createHyperlink(Hyperlink.LINK_URL);
            hyperlink.setAddress("http://blueplace.sakura.ne.jp/");
            cell.setHyperlink(hyperlink);//ここでハイパーリンクを指定しています。
            cell.setCellStyle(style);
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

4-19.セルの結合

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestExcelFile.xlsx");
            XSSFWorkbook workbook = new XSSFWorkbook();
            XSSFSheet sheet = workbook.createSheet("シート1");
            sheet.addMergedRegion(new CellRangeAddress(1, 3, 2, 2));//ここで結合するセルを設定しています。(firstRow, lastRow, firstCol, lastCol)
            workbook.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

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

Java sample code 03

SAMPLE GALLERYに掲載されたソースを疎通してimport文も付けました。

3.java poi Word

poiのjarファイルをダウンロード必要

  • install(https://poi.apache.org/)
  • Wordファイルの作成
  • Wordファイルに文字を書く
  • 文字を太字にする
  • 文字をイタリックにする
  • 文字に下線を引く
  • 文字の色を設定
  • タブを付ける
  • 取消線を付ける
  • 二重取消線を付ける
  • フォントサイズを指定する
  • フォントを指定する
  • 改行を入れる

3.java poi Word

3-0.download&install

下記のサイトからダウンロードしたbinファイルから、「*.jar」ファイルをProjectにコピーする

https://poi.apache.org/

https://xmlbeans.apache.org/download/

- サブコンポーネント
- POIFS (Poor Obfuscation Implementation File System)
- HSSF (Horrible SpreadSheet Format) - Microsoft Excel (XLS) 形式のファイルを扱う。
- XSSF (XML SpreadSheet Format) - Office Open XML Workbook形式のファイルを扱う。
- HWPF (Horrible Word Processor Format) - Microsoft Word (DOC) 形式のファイルを扱う。
- XWPF (XML Word Processor Format) - Office Open XML Document形式のファイルを扱う。
- HSLF (Horrible Slide Layout Format) - Microsoft PowerPoint (PPT) 形式のファイルを扱う。
- XSLF (XML Slide Layout Format) - Office Open XML Presentation形式のファイルを扱う。
- HPSF (Horrible Property Set Format) - Microsoft Officeのドキュメントサマリーを読むコンポーネント。
- HDGF (Horrible DiaGram Format) - Microsoft Visio形式のファイルを扱う。
- HPBF (Horrible PuBlisher Format) - Microsoft Publisher形式のファイルを扱う。
- HSMF (Horrible Stupid Mail Format) - Microsoft Outlook (MSG) 形式のファイルを扱う。

3-1.Wordファイルの作成

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            wordFile.write(os);//ここでワードファイルを作成しています。
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-2.Wordファイルに文字を書く

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile2.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("あいうえお");//ここで文字を書いています。
            run.setText("かきくけこ");
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-3.文字を太字にする

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("あいうえお");
            run.setBold(true);//ここで太字にしています。
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-4.文字をイタリックにする

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("あいうえお");
            run.setItalic(true);//ここでイタリックにしています。
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-5.文字に下線を引く

import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("あいうえお");
            run.setUnderline(UnderlinePatterns.DOUBLE);//ここで下線を引いています。下線の種類は「UnderlinePatterns」のクラスで選択できます。
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-6.文字の色を設定

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("あいうえお");
            run.setColor("FF0000");//ここで文字の色を指定しています。16進数。「RRGGBB」。
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-7.タブを付ける

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.addTab();//ここでタブを付けています。
            run.setText("あいうえお");
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-8.取消線を付ける

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("あいうえお");
            run.setStrikeThrough(true);//ここで取消線を付けています。
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-9.二重取消線を付ける

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("あいうえお");
            run.setDoubleStrikethrough(true);//ここで二重取消線を付けています。
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-10.フォントサイズを指定する

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("あいうえお");
            run.setFontSize(20);//ここでフォントのサイズを変更しています。
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-11.フォントを指定する

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("Hello World.");
            run.setFontFamily("Times New Roman");//ここでフォントを指定しています。
            run.addCarriageReturn();
            run = paragraph.createRun();
            run.setText("Hello World.");
            run.setFontFamily("MS ゴシック");//ここでフォントを指定しています。
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

}

3-12.改行を入れる

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class SamplePoi {

    public static void main(String[] args) throws IOException {
        OutputStream os = null;
        try {
            os = new FileOutputStream("TestWordFile.docx");
            XWPFDocument wordFile = new XWPFDocument();
            XWPFParagraph paragraph = wordFile.createParagraph();
            XWPFRun run = paragraph.createRun();
            run.setText("Hello World.");
            run.addCarriageReturn();//ここで改行を入れています。
            run.setText("Hello World.");
            wordFile.write(os);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
        }
    }

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

Iteratorパターン実装してみた

どーも、ふぎとです。

今回は結城浩『Java言語で学ぶデザインパターン入門』
(SB Creative)を参考にしながら、デザインパターン
のひとつである「Iteratorパターン」を実装していき
ます。

Iteratorパターンとは

Iteratorパターンとは、何かがたくさん集まっている
ときに、それを順番に指示していき、全体をスキャン
していく処理を行うためのものです。(P.2)

例えていえば、「袋に入ったモノの正体をひとつずつ
調べる」というプログラム、という感じかな。

本書ではサンプルプログラムとして、「本棚の中に入
れた本を調べ、その本の名前を順番に表示する」もの
が紹介されています。今回はそこにアレンジを加えて
ソングリストに入った曲をひとつずつ表示させる
プログラムをIteratorパターンで書いていこうと思いま
す。

Aggregate(集合体)インターフェース

Aggregateインターフェースは、数え上げを
行うものの「集合体」を表します。(P.3)

ここでは「曲の集合体」を表す「SongAggregate」
というインターフェースを作成します。

SongAggregate.java
public interface SongAggregate {
    public abstract SongIterator songIterator();
}

このインターフェースでは、集合体を数えあげる
ためのメソッド「songIterator」のみを宣言します。

Iteratorインターフェース

Iteratorインターフェースは要素の数え上げ
を行うもの、ループ変数のような役割を果た
すものです。

ここでは「SongIterator」を作成します。

SongIterator.java
public interface SongIterator {
    public abstract boolean hasNext();
    public abstract Object next();
}

hasNextメソッドは、「集合体」に次の要素があるか
どうか調べるためのものです。またnextメソッドは
次の要素がある場合に、その要素を得ます。

Songクラス

ひとつひとつの「曲」を表すためのクラスです。

Song.java
public class Song {
    private String songName;

    public Song(String s) {
        this.songName = s;
    }

    public String getSongName() {
        return songName;
    }
}

SongListクラス

「曲の集合体」を表現しているクラスです。
SongAggregateインターフェースを実装し、抽象メソッドで
あったsongIteratorメソッドをオーバーライドします。

SongList.java
public class SongList implements SongAggregate {
    private Song[] songs;
    private int last = 0;

    public SongList(int max) {
        this.songs = new Song[max];
    }

    public Song getSongAt(int id) {
        return songs[id];
    }

    public void appendSong(Song s) {
        this.songs[last] = s;
        last++;
    }

    public int getLength() {
        return last;
    }

    @Override
    public SongIterator songIterator() {
        return new SongListIterator(this);
    }

}

ここではコンストラクタによって、曲を最大max
個まで格納できるSongListインスタンスを定義
しています。
getSongAtメソッドは、id番目の曲を返します。
appendSongメソッドは、配列songs[]の一番後ろに
新たな曲sを格納します。
getLengthは、SongListに入っている曲の数を返す
メソッドです。
そして、オーバーライドしたsongIteratorメソッドでは、
これから作成するSongListIteratorというクラスの
インスタンスを生成し、SongIterator型として返します。

SongListIteratorクラス

実際にSongListクラスの走査(スキャン)を行う
クラスです。SongIteratorインターフェースを実
装し、hasNextメソッド・nextメソッドをオーバー
ライドします。

SongListIterator.java
public class SongListIterator implements SongIterator {
    private SongList songList;
    private int id;

    public SongListIterator(SongList sl) {
        this.songList = sl;
        this.id = 0;
    }

    @Override
    public boolean hasNext() {
        if(id < songList.getLength()) {
            return true;
        }else {
            return false;
        }
    }

    @Override
    public Object next() {
        Song song = songList.getSongAt(id);
        id++;
        return song;
    }

}

以上で、リストを走査する準備は完了です。ここから
Mainクラスを作成して実際のリストを作り、スキャン
してみます。

Main.java
public class Main {
    public static void main(String[] args) {
        //新しくSongListを作成
        SongList songList = new SongList(5);

        //リストに曲を追加
        songList.appendSong(new Song("So What"));
        songList.appendSong(new Song("Freddie Freeloader"));
        songList.appendSong(new Song("Blue In Green"));
        songList.appendSong(new Song("All Blues"));
        songList.appendSong(new Song("Flamenco Sketches"));

        //SongIteratorのインスタンスを生成
        SongIterator song_it = songList.songIterator();

        //曲をひとつずつ調べる
        while(song_it.hasNext()) {
            Song song = (Song)song_it.next();
            System.out.println(song.getSongName());
        }
    }

}

実行結果は以下のようになりました。

So What
Freddie Freeloader
Blue In Green
All Blues
Flamenco Sketches

ちゃんと実行されたようです。やれやれ。

まとめ

つまるところ、Iteratorパターンのポイントは、
SongListを書き直しても、songIteratorメソッドが
存在し、正しいSongIteratorを返してくれれば、Mainメ
ソッドのwhileループは全く変更せずとも動作する

点にあります。要するに、機能の拡張に耐えうる設計に
なっているってことです。まさに「現場の知恵」だなと
いう風に感じます。

今後はこんな調子でGoFのデザインパターン23個、ぼち
ぼちまとめていければと。

では今日はこの辺で。ふぎとでした。

P.S. 「先輩」の皆さま、この記事に対する意見、
補足などあれば遠慮なくコメントくださいm(__)m

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

JavaでBasic認証作ってみた

参考サイト様

let's プログラミング
https://www.javadrive.jp/servlet/auth/

環境

eclipse2019-9
tomcat9

書いた動機

学んだことを忘れないためのメモ書きです。
ほぼ上記参考サイト様の通りで動きましたが、自分の環境に合わせてちょこちょこ変更したので、変更部分を書いておきます。

Basic認証とは

簡易的な認証方法。
Webサイトを開くとポップアップが表示され、ログインIDとパスワードを要求されます。
IDもパスワードも暗号化されずに送信されるため、セキュリティ的にはだいぶ弱いらしい。
一度ログインするとブラウザを閉じるまでログイン状態が保持されます。

用意するファイル

  • servlet
  • web.xml
  • auth.xml
  • tomcat-users.xml

servletの作成

まずはservletを作っていきます。

AuthTest1.java
package auth;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 参考サイト様との変更箇所。アノテーションを加えました。
@WebServlet("/AuthTest1")
public class AuthTest1 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException{

        response.setContentType("text/html; charset=Shift_JIS");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");
        out.println("<title>ユーザー認証テスト</title>");
        out.println("</head>");
        out.println("<body>");

        out.println("<p>テストページ1</p>");

        // 参考サイト様との変更箇所。URLを変更。
        out.println("<p><a href=\"/logintest/AuthTest2\">テストページ2へ</a></p>");

        out.println("</body>");
        out.println("</html>");
    }
}
AuthTest2.java
package auth;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

// 参考サイト様との変更箇所。アノテーションを加えました。
@WebServlet("/AuthTest2")
public class AuthTest2 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException{

        response.setContentType("text/html; charset=Shift_JIS");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");
        out.println("<title>ユーザー認証テスト</title>");
        out.println("</head>");
        out.println("<body>");

        out.println("<p>テストページ2</p>");

        // 参考サイト様との変更箇所。URLを変更。
        out.println("<p><a href=\"/logintest/AuthTest1\">テストページ1へ</a></p>");

        out.println("</body>");
        out.println("</html>");
    }
}

ファイルの置き場所はauthパッケージの中。
キャプチャ.PNG

web.xmlの変更

WEB-INF/libディレクトリのweb.xmlを変更します。
キャプチャ.PNG

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>logintest</display-name>

<!-- 参考サイト様との変更箇所。アノテーションを使用したので、<servlet>と<servlet-mapping>を消去。 -->
<security-constraint>
    <web-resource-collection>
      <web-resource-name>User Basic Auth</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>sales</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>User Basic Auth</realm-name>
  </login-config>

  <security-role>
    <role-name>sales</role-name>
  </security-role>

</web-app>

auth.xmlを作る

docbase=""にはAuthTest1.javaがあるディレクトリを指定します。
ファイルの置き場所はtomcatをインストールしたディレクトリ。¥Tomcat9¥conf¥Catalina¥localhost¥

auth.xml
<Context path="/auth"
docBase="<?xml version="1.0"?>
<Context docBase="C:\Users\hoge\pleiades-2019-09-java-win-64bit-jre_20191007\pleiades\workspace\logintest\src\auth" path="/auth"> </Context>">
</Context>

tomcat-users.xmlの変更

EclipseプロジェクトのSevers内にあるtomcat-users.xmlを変更します。
キャプチャ.PNG

tomcat-users.xml
<!-- 参考サイト様との変更箇所。デフォルトで設定されていたroleはすべて削除しました。謎のエラーが出たので。 -->
<tomcat-users>
  <role rolename="sales"/>
  <role rolename="staff"/>
  <user username="yamada" password="yamada" roles="sales"/>
  <user username="katou" password="katou" roles="staff"/>
</tomcat-users>

試してみる

下記の画面が出たら
ユーザー名:yamada
パスワード:yamada
を入力してログインできたら成功!
ブラウザを閉じるまでログイン状態が保持されます。
auth.PNG

下記はroleを設定していないのでログインできません。
ユーザー名:katou
パスワード:katou

以上です。
お疲れ様でした。

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

Oracle認定Java_silver対策メモ1

はじめに

エンジニアとして働き始めはやくも5ヶ月目、そろそろ資格をとろうかと。。。ということで!「Oracle認定JavaSE Silver」の対策として、黒本をもとに各章ごとの重要そうなポイントをピックアップしまとめてみました。

1章 簡単なJavaプログラムの作成

  • エントリーポイント:プリグラムを実行する上で実行を開始する場所(mainメソッドがある場所の認識でOK)

  • Javaコマンドの呼び出し方法は

java クラス名 コマンド引数1 コマンド引数2...
  • Java11からコンパイルせずにJavaの実行が可能になった
java ファイル名.java
  • Javaコマンド実行次の注意点
    • 起動パラメータの区切りは半角スペースで判断される。
    • エスケープ「¥」を用いることで「"」が文字として扱われる。
java sample x "y y"z ¥" c¥"   // x , y yz , " , c" 

2章 Javaの基本データ型と文字列操作

  • 整数リテラルの表記方法
進数 接頭辞 記載方法 表示
2進数 0b 0b01001000 80
8進数 0 077 63
10進数 なし 63 63
16進数 0x 0x3F 63
  • データ型の値
データ型
boolean true, false
char 16ビット(Unicode¥u0000〜¥uFFFF)
byte 8ビットの整数 -128~127
short 16ビットの整数 −32,768〜32,767
int 32ビットの整数
long 64ビットの整数
float 32ビットの単制度浮動小数点数
double 64ビットの高精度浮動小数点数
  • (注意) 整数リテラルの表記で利用可能な記号は「_」のみ。(先頭・末尾・記号の前後では利用不可能)

  • char型 = null; はコンパイルエラーになる。文字コードの場合は、0〜65535

  • String型のObjectの生成方法。

String str1 = "Sample1";  // ””で文字列を囲う
String str2 = new String("Sample2"); // String型のインスタンスをnewで生成する
  • ver型(推論型)について

    • ローカル変数でのみ宣言可能。クラスのフィールドの宣言・メソッドの引数型では利用できないので注意!

    *コンパイル時に該当する値からリテラルの型を推論する 。その為、nullや判断できないもので初期化できない。

ver = null;  // データ型が推論できない為、コンパイルエラー
ver = {1,2,3}  // 型が想定できない為、コンパイルエラー
ver list = new ArrayList<Object>();  //  OK
java.lang.Stringメソッドについて
  • charAt(a)メソッド:指定された番号の文字戻す。
    注意)文字番号の開始は0から始まる。

  • indexOf("xxx")メソッド:指定された文字が文字列のどの位置にあるかを戻す。存在しない場合は−1を戻す。 
    注意)文字番号の開始は0から始まる。

  • substring(a, b):指定された位置内の文字を戻す。

  • replace("x", "y") → 指定さてた文字と任意の文字に置き換える。
    注意)引数の方は統一する必要がある。

  • contat("xx") → 任意の文字列と引数の文字列を連結する。

Srting str = "hello";

System.out.printout(str.charAt(1));  // e
System.out.printout(str.charAt(5));  // 例外をスロー

System.out.printout(str.indexOf("o"));  // 4
System.out.printout(str.indexOf("hello!"));  // -1

System.out.printout(str.substring(1, 3));  // el

System.out.printout(str.replace("l", "r"));  // herro
System.out.printout(str.substring("l", 'r'));  // 引数の型が異なる為エラー

str2 = srt.concat(", world!" 
System.out.printout(str2);  // hello, world!

3章 演算子と判定構造

  • Object a = null → 問題ない

  • intern():new String()の文字列もコンスタントプール同様の参照にする。

    • プールに同じ文字列が存在していた場合、その参照を戻す。
  • switch(条件式)の条件式で戻せない型は以下である。

    • boolean
    • long
    • 小数点がつく数値 double, float
  • case x で定義できないものは、

    • null
    • 変数(finalで修飾された定数はOK)
  • シグニチャ:メソッド名と引数、引数の型・個数・順番が含まれる。

    • 戻り値型は含まれないので注意!
  • equalsメソッドはnullが渡された場合は常にfalseを返す。

4章 制御構造

保留

5章 配列操作

  • 配列の要素にnullは入ってもOK!
  • int[]の[]は宣言なので、[]内に数値を入れてはいけない。
  • Object型のデフォルト値はnull

6章 インスタンスとメソッド

  • Object a = null は可能。
    • 参照型は参照を持っているか、持っていないか(null)しか保持できない。
  • 可変長数は最後の引数でなくてはいけない。
    • 定義方法 ◯:型... 変数名,  ×:型 変数名 ...
void sample(int ...a){...}  // OK
void sample(int ...a, int...b){...}  // エラー
  • コンストラクタを修飾するアクセス修飾子に制限はもうけられていない。

  • コンストラクタの初期化子"{}"はコンストラクタの実行前に処理が行われる。

  • オーバーロードの条件はシグニ茶が異なること。アクセス修飾子は関係ない。

  • 別のオーバーロードされたコンストラクタをコンストラクタから呼び出す際、コンストラクタ内の1番最初に記載しなくてはいけない。

  • returnよりも下にコードが記載されているとそのコードの行でコンパイルエラーになる。

    • 到達不可能なコードはエラーとなる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む