jakaruta.doc_020
R e i - D r e a m
for Laravel
TOP > Jakarta_EE10 > バッキングビーン
Guest
login

最終投稿日:2026年07月26日

【検証環境】- Windows11 - JDK 17-LTS - Eclipse 2024-09 R - Wildfly 28.0.1
目次
○ バッキングビーンの基本
いよいよJAVAの実装です。まずは当然基本からです。
コンストラクタ
コンストラクタと言っても「ひと癖」も「ふた癖」もあるんですよ。
ビーンバリデーション基本
バッキングビーンの大きな役割のひとつ「バリデーション」 その内のひとつ「ビーンバリデーション」の解説です
ビーンバリデーション詳細
「ビーンバリデーション」の主な制御方法の解説です。
ビーンバリデーション詳細②
「ビーンバリデーション」沼ポイント「グループ処理」を解説。
カスタムバリデーション
結局バリデーションは痒い所に手が届く「カスタムデーション」ですよね。
バッキングビーンの基本
バッキングビーンの基本
バッキングビーンとは『.xhtml』と強い絆で結ばれたJAVA処理の入口となるものです。
そしてお互いのマッピングは、JAVAのクラスに付与するアノテーションとなり、以下書式です。
    @Named(value = "sampleBean")
○ 命名規則
実は特に決まりはありませんが、マナーはあります。
ビュー名が『sample.xhtml』の場合は、バッキングビーン名は『SampleBean.java』となります。
そしてこのマナーを守った特典として、引数不要の『@Named』を使う事ができます。
○ スコープ
CDI(Contexts and Dependency Injection)における、依存性を注入された対象の生存期間となります。
例えばサンプルでも使用している「ビュースコープ」のライフサイクルは、画面が閉じられるか、リダイレクトされるまで内容を維持します。
    ※正確にはビュースコープはCDI標準の仕様ではありません(広義として記載)
以下は寿命が短い順に並べたスコープと、その定義クラスです。
・@RequestScoped                 import jakarta.enterprise.context.RequestScoped;
・@ViewScoped                        import jakarta.faces.view.ViewScoped;
・@SessionScoped                  import jakarta.enterprise.context.SessionScoped;
・@ApplicationScoped          import jakarta.enterprise.context.ApplicationScoped;
以下は特殊スコープとなり、依存性を注入先クラスのライフサイクルに従います。
・@Dependent                          import jakarta.enterprise.context.Dependent;
画面遷移
○ サンプルソース
以下サンプルソースを作成して下さい。
sanple.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="jakarta.faces.html">
<h:head>
    <title>Hello World</title>
    <h:outputStylesheet library="css" name="style.css" />
</h:head>
<h:body>
    <h1>おはよう世界!</h1>
    <h:form id="hoge" prependId="false">
        <h:inputText id="inpText" value="#{sampleBean.name}" styleClass="parts_text" style="width:300px;height:25px;" />
        <BR />
        <h:commandButton value="自画面繊維" action="#{sampleBean.submit()}" />
        <BR />
        <h:commandButton value="POST繊維" action="#{sampleBean.goPost()}" />
        <BR />
        <h:commandButton value="GET繊維" action="#{sampleBean.goGet()}" />
        <BR />
        <h:commandButton value="外部繊維" action="#{sampleBean.goYahoo()}" />
    </h:form>
</h:body>
</html>

next.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="jakarta.faces.html">
<h:head>
    <title>NEXT</title>
</h:head>
<h:body>
    <h1>次の画面</h1>
</h:body>
</html>

SampleBean.java

package view;

import java.io.IOException;
import java.io.Serializable;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import jakarta.faces.context.ExternalContext;
import jakarta.faces.context.FacesContext;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;
import lombok.Getter;
import lombok.Setter;

@Named(value = "sampleBean")
@ViewScoped
public class SampleBean implements Serializable {
    private static final long serialVersionUID = 1L;
    @Getter
    @Setter
    private String name;
    
    public void submit() {
        System.out.println("submitメソッドです。[" + this.name + "]が送信されました。");
    }
    public String goPost() {
        return "next";
    }
    public String goGet() {
        return String.format("next?faces-redirect=true&inpText=%s&munber=%d", this.name, 123);
    }
    public void goYahoo() {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ExternalContext externalContext = facesContext.getExternalContext();
        try {
            String paramName = URLEncoder.encode("テスト", StandardCharsets.UTF_8.toString());
            String targetUrl = "https://www.yahoo.co.jp/?q=" + paramName;
            externalContext.redirect(targetUrl);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

○ 自画面遷移
サンプルソース(JAVA)の『submit』関数です。
何も返却しない場合はPOSTでの自画面遷移となります。
    ※「return null」でも良いです
○ POST遷移
サンプルソース(JAVA)の『goPost』関数です。
遷移したい画面のファイル名(拡張子なし)を文字列で返却します。
○ GET遷移
サンプルソース(JAVA)の『goGet』関数です。
パラメータを渡したい場合はサンプルの様に『return String.format』関数を使うと便利です。
基本的な書式は、文字列で『next?faces-redirect=true』となります。
画面間での値の受取方法
自画面POST遷移の場合は、ビュースコープが効いてるため特に何も気にする必要はありません。
サンプルソースの場合、テキストボックスに入れた値がエクリプスのコンソールに表示されているのが確認できるハズです。
では、画面遷移時の値はどうやって受け取るのでしょうか。
以下にその方法を紹介します。
○ 一般的な値の受取方法
JAVAコード

jakarta.faces.context.FacesContext fc = jakarta.faces.context.FacesContext.getCurrentInstance();
Map<String, String> params = fc.getExternalContext().getRequestParameterMap();
System.out.println(params.get("inpText"));

以下はサンプルソースとなります。
next.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"

    xmlns:f="jakarta.faces.core"
    xmlns:h="jakarta.faces.html">
<f:metadata>
    <f:event type="preRenderView" listener="#{nextBean.init}" />
</f:metadata>
<h:head>
    <title>NEXT</title>
</h:head>
<h:body>
    <h1>次の画面</h1>
</h:body>
</html>

NextBean.java

package view;

import java.io.Serializable;
import java.util.Map;
import jakarta.faces.view.ViewScoped;
import jakarta.inject.Named;

@Named(value = "nextBean")
@ViewScoped
public class NextBean implements Serializable {
    private static final long serialVersionUID = 1L;

    public void init() {
        jakarta.faces.context.FacesContext fc = jakarta.faces.context.FacesContext.getCurrentInstance();
        Map<String, String> params = fc.getExternalContext().getRequestParameterMap();
        System.out.println(params.get("inpText"));
    }
}

ポイント

POST、GET遷移共に値が取得できましたか?
もしGET遷移は取得できたけど、POST遷移は取得できない場合は以下を見直してください。
  『sample.xhtmlのformタグ』

サンプルでは「h:form id="hoge" prependId="false"」となっていますが、
この『prependId』属性が「ない」or「true」の場合は、取得するキー名が『hoge:inpText』となります。

○ Flashスコープを利用する
Flashスコープは一度だけ利用できるセッションの様なものです。
それでは遷移元であるバッキングビーンの「goPost」関数に以下を追記してみましょう。
SampleBean.java

public String goPost() {
    Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
    flash.put("pram_name", "フラッシュスコープです");
    return "next";
}

次に遷移先バッキングビーンの「init」関数に以下を追記してみましょう。
NextBean.java

public void init() {
    jakarta.faces.context.FacesContext fc = jakarta.faces.context.FacesContext.getCurrentInstance();
    Map<String, String> params = fc.getExternalContext().getRequestParameterMap();
    System.out.println(params.get("hoge:inpText"));
    // フラッシュスコープ

    Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
    System.out.println((String) flash.get("pram_name"));
}

ポイント

一度だけ有効なセッションです。
かなり有効な手段となり、仮に渡したい値が100個あってもDTOでまとめて1回で完結できます。

きっぷる
ログインしてコメントを残そう!!


きっぷる