フレームワークを体感しましょう。
バッキングビーン
ここからは少しづつ機能を追加していきましょう。
まずは『バッキングビーン』から。 今回作成した画面でJAVA書きましたっけ?
実は書いてません。
単純に《.xhtml》の内容を参照してるだけです。 そこでJAVAファイルを作成します。 まずは以下の手順でディレクトリを切っていきます。
それでは「src/main/java」を右クリックし、[新規 > パッケージ]を選択します。
名前を『view』として作成します。
更に作成したパッケージに以下クラスを作成しましょう。
SampleBean 以下の様な空のクラスが作成されます。
package view;
public class SampleBean {
}
package view;
import java.io.Serializable;
import jakarta.annotation.PostConstruct;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
@Named(value = "sampleBean")
@ViewScoped
public class SampleBean implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
// 画面が開かれたときに最初に1回だけ実行される初期化メソッド
@PostConstruct
public void init() {
System.out.println("バッキングビーンが初期化されました!");
this.name = "初期値としての名前";
}
// Getter
public String getName() { return this.name; }
// Setter
public void setName(String name) { this.name = name; }
}
サーバタブから起動して画面を表示してみましょう。
テキストボックスが表示され、初期値が以下となっています。
初期値としての名前 また、コンソールタブに注目して下さい。
記述したコード『System.out.println("バッキングビーンが初期化されました!");』の内容が表示されています。
上手く画面表示できずエラーになる場合は以下を試して下さい。
[プロジェクト名(右クリック)] > [Maven] > [プロジェクトの更新]
POPした画面の「スナップショット/リリースの更新を強制」にチェックを入れ『OK』押下
バッキングビーン2
以下を追加します。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="jakarta.faces.html">
<h:head>
<title>Hello World</title>
</h:head>
<h:body>
<h1>おはよう世界!</h1>
<h:form>
<h:inputText id="username" value="#{sampleBean.name}" />
<BR />
<h:commandButton value="送信" action="#{sampleBean.submit()}" />
</h:form>
</h:body>
</html>
package view;
import java.io.Serializable;
import jakarta.annotation.PostConstruct;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
@Named(value = "sampleBean")
@ViewScoped
public class SampleBean implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
// 画面が開かれたときに最初に1回だけ実行される初期化メソッド
@PostConstruct
public void init() {
System.out.println("バッキングビーンが初期化されました!");
this.name = "初期値としての名前";
}
// アクションボタン
public void submit() {
System.out.println("submitメソッドです。[" + this.name + "]が送信されました。");
}
// Getter
public String getName() { return this.name; }
// Setter
public void setName(String name) { this.name = name; }
}
例えば「hoge」と入力して『送信』を押下すると、コンソールタブに以下が表示されます。
『submitメソッドです。[hoge]が送信されました。』 あれ?作成した『submit』メソッドの引数は空ですよね。
でも送信されてメソッドに処理が移行した時には既にプロパティ『name』の値は『hoge』でした。 バッキングビーン作成時、クラスに『@ViewScoped』を付与した事を覚えていますか?
そうです。これがその恩恵なのです。
つまり処理がPOST遷移の間、【ビュー ⇔ ビーン】間の値のやり取りは管理されています。 この処理を【ポストバック(Postback)】と呼びます。
試しにURLを直叩き(GET送信)すると、値が元に戻ります。 ついでに日本語「ほげ」も送信してみましょう。 あうぅ。 文字化けしましたね。
これはアプリに「I/O」を分からせてやる必要があります。
※ [I/O] = インプット / アウトプット サクッと以下のクラスを作成しましょう(パッケージは[filter]が良いかも)
package filter;
import java.io.IOException;
import java.io.Serializable;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter, Serializable {
private static final long serialVersionUID = 1L;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// リクエストもレスポンスもUTF-8にします
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 次の処理(FacesServletなど)にバトンを渡します
chain.doFilter(request, response);
}
}
俗に言う[設定]は、今回の様に『JAVAファイル』に記述する方法と、『XMLファイル』に記述する方法があります。
[XMLファイル]に記述するメリットは、ロジックと設定の分離があります。
ただし、XMLファイルの設定は環境。例えばエクリプスのバージョンが変わるだけで壊れるリスクもあります。
その場合、先ほどのメリットが裏目になり『アプリは落ちたが、どこでエラーなのかわからない』状態に陥りやすいです。
なので今回は[JAVAファイル]に設定を書いてみました。
Lombok(ロンボク)インストール
そのためバッキングビーンに以下コードを記述しました。
面倒ですねぇ。
しかも『@ViewScoped』は内部的に自動で値のやり取りをするため、メソッド名を間違える事は許されません。
※ 例えば変数の型が[boolean]だった場合、メソッド名は『isName()』となります。 プロパティが100個あったら、200個のメソッドを作成って面倒です。 そこで重宝するのが『Lombok』です。 以下サイトからダウンロードします。
https://projectlombok.org/download Lombokはエクリプスとの相性が大事なので「older versions」から過去一覧画面へ遷移します。
『lombok-1.18.34.jar』をダウンロードしましょう。 それでは設定していきます。
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>provided</scope>
</dependency>
※ 追記されてない場合は、自力で追記する
流石に起動長いなと思ったら。
実はエクリプスが裏でコケてる可能性が高いです。
念のため5分程度経過しても起動しない場合は、タスクマネージャからアプリを終了しましょう。
その後普通にエクリプスを起動させます。
バッキングビーン(SampleBean.java)の以下コードを削除しちゃいましょう。
@Setter
private String name;
どうですか?シンプルで楽になりましたよね。
「@Getter」「@Setter」は、クラスにも適用できます。
例えば《SampleDto.java》が100個のプロパティがあったとしても以下の設定をするだけです。
@Setter
class IndexDto {
private String hoge;
~ 省略(あと99個ある) ~
}





<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="jakarta.faces.html">
<h:head>
<title>Hello World</title>
</h:head>
<h:body>
<h1>おはよう世界!</h1>
<h:form>
<h:inputText id="username" value="#{sampleBean.name}" />
</h:form>
</h:body>
</html>