∇Nablarch
Version: 6u3
  • Nablarchについて
    • Nablarchのコンセプト
      • Robustness
      • Testability
      • Ready-to-Use
    • Nablarch のモジュール一覧
    • Nablarchのライセンスについて
  • Nablarchアプリケーションフレームワーク
    • アプリケーションフレームワーク
      • Nablarchアプリケーションフレームワークとは
      • ウェブアプリケーション編
      • ウェブサービス編
      • バッチアプリケーション編
      • メッセージング編
      • Nablarchの提供する標準ハンドラ
      • Nablarchが提供するライブラリ
      • ブランクプロジェクト
      • Nablarchアプリケーションフレームワーク設定ガイド
      • デフォルト設定一覧
      • Nablarchクラウドネイティブ対応
    • アダプタ
      • logアダプタ
      • ルーティングアダプタ
      • IBM MQアダプタ
      • Jakarta RESTful Web Servicesアダプタ
      • Domaアダプタ
      • JSR310(Date and Time API)アダプタ
      • E-mail FreeMarkerアダプタ
      • E-mail Thymeleafアダプタ
      • E-mail Velocityアダプタ
      • ウェブアプリケーション Thymeleafアダプタ
      • Lettuceアダプタ
      • SLF4Jアダプタ
      • Micrometerアダプタ
  • Nablarch開発ツール
    • 効率的なJava静的チェック
      • Inspectionを行う
      • フォーマットを統一する
      • 許可していないAPIが使用されていないかチェックする
    • テスティングフレームワーク
      • 単体テスト実施方法
      • 自動テストフレームワークの使用方法
      • プログラミング工程で使用するツール
    • アプリケーション開発時に使える便利なツール
      • Jakarta Server Pages静的解析ツール
      • Nablarch SQL Executor
      • Nablarch OpenAPI Generator
  • Example
    • Exampleの実行方法
      • 環境構築手順
      • 実行手順
      • Java 21 で動かす場合
    • Exampleの一覧
      • ウェブアプリケーション
      • ウェブサービス
      • バッチアプリケーション
      • メッセージング
  • 目的別の実装サンプル集
    • データベースを用いたパスワード認証機能サンプル
      • PBKDF2を用いたパスワード暗号化機能サンプル
      • 提供パッケージ
      • 概要
      • 構成
      • 使用方法
    • 検索結果の一覧表示
      • 提供パッケージ
      • 概要
      • 構成
      • UniversalDaoクラス
      • ListSearchInfoクラス
      • Paginationクラス
      • EntityListクラス
      • listSearchResultタグ
      • 業務アプリケーションへのサンプル実装(タグファイル)の取り込み方法
      • タグリファレンス
    • フォーマッタ機能の拡張
      • データフォーマッタの拡張
      • データフォーマッタ機能におけるフィールドタイプの拡張
    • データベースを用いたファイル管理機能サンプル
      • 概要
      • 機能
      • 構成
      • 使用方法
    • HTMLメール送信機能サンプル
      • 概要
      • 要求
      • 構成
      • 実装例
    • bouncycastleを使用した電子署名つきメールの送信サンプルの使用方法
      • 環境準備
      • 電子署名付きメール送信機能の構造
      • 設定ファイルの準備
      • 実行方法
    • ログ集計サンプルの使用方法
      • 提供サンプル一覧
    • メッセージング基盤テストシミュレータサンプル
      • 用途
      • 特徴
      • 要求
      • 使用方法
      • 拡張例
    • OIDCのIDトークンを用いた認証サンプル
      • 提供パッケージ
      • 概要
      • 構成
      • 使用方法
    • Logbookを用いたリクエスト/レスポンスログ出力サンプル
      • 概要
      • 使用方法
  • Nablarchでの開発に役立つコンテンツ
    • Nablarchシステム開発ガイド
    • 開発標準
  • Nablarch API
  • リリース情報
  • Nablarch のバージョンアップ方針
    • リリース単位
    • バージョンアップの種類
    • バージョンの番号体系
    • 後方互換性ポリシー
      • 後方互換性を維持する範囲
      • 後方互換性維持の内容
      • 後方互換性の例外
  • 機能追加要望・改善要望
    • JIRAへの課題起票方法
  • Nablarch 5から6への移行ガイド
    • Nablarch 5と6で大きく異なる点
      • Jakarta EE 10に対応
      • 動作に必要なJavaの最低バージョンを17に変更
    • 前提条件
    • 移行手順の概要
    • 移行手順の詳細
      • Nablarchのバージョンアップ
      • Jakarta EE対応
    • JSR352に準拠したバッチアプリケーションの移行手順
      • 実行時にエラーになる場合の対処方法
    • 付録
      • Java EEとJakarta EEの仕様の対応表
  • Jakarta EEの仕様名に関して
    • 省略名の表記に関して
    • Nablarch5と6で名称が変更になった機能について
  • ご利用にあたって
    • 情報の外部送信について
      • 情報の利用目的
      • 情報の送信先
      • 情報の種類・用途
∇Nablarch
  • Docs »
  • Nablarchアプリケーションフレームワーク »
  • アプリケーションフレームワーク »
  • ウェブアプリケーション編 »
  • Getting Started »
  • 検索機能の作成
  • GitHub
  • English

検索機能の作成¶

Exampleアプリケーションを元に検索機能を解説する。

作成する機能の説明
  1. サイドメニュー「プロジェクト名」欄に検索条件を入力し、検索ボタンを押下する。
../../../../../_images/project_search_sidemenu.png
  1. プロジェクト名で検索した結果が表示される。
../../../../../_images/project_search_search_with_condition.png
  1. プロジェクト名をクリアし、「期間からさがす」欄の「今年開始」リンクを押下する。
../../../../../_images/project_search_start_date.png
  1. プロジェクト開始日が今年となっているプロジェクトが表示される。
../../../../../_images/project_search_start_date_result.png

検索する¶

検索機能の基本的な実装方法を、以下の順に説明する。

  1. フォームの作成
  2. 検索条件入力部分のJSPの作成
  3. 検索条件Beanの作成
  4. 検索に使用するSQLの作成
  5. 業務アクションの実装
  6. 検索結果表示部分の作成
フォームの作成

検索条件を受け付けるフォームを作成する。

ProjectSearchForm.java
public class ProjectSearchForm extends SearchFormBase implements Serializable {

    // 一部のみ抜粋

    /** プロジェクト名 */
    @Domain("projectName")
    private String projectName;

    /** プロジェクト開始日(FROM) */
    @Domain("date")
    private String projectStartDateBegin;

    // ゲッタ及びセッタは省略
この実装のポイント
  • 入力値を受け付けるプロパティは、全てString型で宣言する。詳細は バリデーションルールの設定方法 を参照。
検索条件入力部分のJSPの作成

検索条件入力部分のJSPを作成する。

/src/main/webapp/WEB-INF/view/common/sidemenu.jsp
<n:form method="GET" action="list">
    <!-- 省略 -->
    <label for="projectName" class="control-label mb-3">プロジェクト名</label>
    <div>
        <n:text
                id="projectName"
                name="searchForm.projectName"
                size="25"
                maxlength="64"
                cssClass="form-control form-control-lg"
                errorCss="input-error"
                placeholder="プロジェクト名"/>
        <n:error errorCss="message-error" name="searchForm.projectName" />
    </div>
    <!-- 省略 -->
    <div align="center">
        <input type="submit" id="search" class="btn btn-lg btn-primary" value="検索" />
    </div>
</n:form>
この実装のポイント
  • リクエストをGETで送信する場合は、 formタグ の method 属性にGETを指定する。 さらに、GETの場合、ボタンやリンクにカスタムタグを使用できないので、HTMLでボタンやリンクを作成する。詳細は GETリクエストを使用する を参照。
検索条件Beanの作成

検索条件を設定し ユニバーサルDAO へ引き渡すBeanを作成する。 Beanのプロパティは、対応する条件カラムの定義(型)と互換性のある型とする こと。

ProjectSearchDto.java
public class ProjectSearchDto implements Serializable {

    // 一部のみ抜粋

    /** プロジェクト名 */
    private String projectName;

    /** プロジェクト開始日付(FROM) */
    private java.sql.Date projectStartDateBegin;

    // ゲッタ及びセッタは省略
この実装のポイント
  • フォームから検索条件Beanへの値の移送は、 BeanUtil を使用する。 BeanUtil は、プロパティ名が同一の項目を移送するため、 検索条件に使用する項目のプロパティ名は、フォームと検索条件Beanで合わせる必要がある。
  • BeanUtil を用いて値を移送する場合は、互換性のある型であれば、 プロパティを型変換した上で移送できる。詳細は BeanUtilの型変換ルール を参照。
  • Beanのプロパティは、対応するカラムの型に合わせたJavaの型で定義する。
検索に使用するSQLの作成

検索に使用するSQLを作成する。

Project.sql
SEARCH_PROJECT =
SELECT
    PROJECT_ID,
    PROJECT_NAME,
    PROJECT_TYPE,
    PROJECT_CLASS,
    PROJECT_START_DATE,
    PROJECT_END_DATE,
    VERSION
FROM
    PROJECT
WHERE
    USER_ID = :userId
    AND $if(clientId)     {CLIENT_ID = :clientId}
    AND $if(projectName) {PROJECT_NAME LIKE  :%projectName%}
    AND $if(projectType) {PROJECT_TYPE = :projectType}
    AND $if(projectClass) {PROJECT_CLASS IN (:projectClass[])}
    AND $if(projectStartDateBegin) {PROJECT_START_DATE >= :projectStartDateBegin}
    AND $if(projectStartDateEnd) {PROJECT_START_DATE <= :projectStartDateEnd}
    AND $if(projectEndDateBegin) {PROJECT_END_DATE >= :projectEndDateBegin}
    AND $if(projectEndDateEnd) {PROJECT_END_DATE <= :projectEndDateEnd}
$sort(sortId){
    (idAsc PROJECT_ID)
    (idDesc PROJECT_ID DESC)
    (nameAsc PROJECT_NAME, PROJECT_ID)
    (nameDesc PROJECT_NAME DESC, PROJECT_ID DESC)
    (startDateAsc PROJECT_START_DATE, PROJECT_ID)
    (startDateDesc PROJECT_START_DATE DESC, PROJECT_ID DESC)
    (endDateAsc PROJECT_END_DATE, PROJECT_ID)
    (endDateDesc PROJECT_END_DATE DESC, PROJECT_ID DESC)
}
この実装のポイント
  • SQLインジェクションを防ぐため、SQLは外部ファイルに記述する。詳細は SQLをファイルで管理する を参照。
  • Beanのプロパティ名を使って、SQLに値をバインドする。詳細は Beanオブジェクトを入力としてSQLを実行する を参照。
  • 検索画面で入力された項目のみを条件に含める場合には、 $if 構文を使用してSQL文を構築 する。
  • ソートキーを画面から選択可能とする場合には、 $sort 構文を使用してSQL文を構築 する。
業務アクションの実装

業務アクションに、検索処理を実装する。

業務アクションメソッドの作成

画面から与えられた検索条件を元に検索するメソッドを作成する。

ProjectAction.java
@InjectForm(form = ProjectSearchForm.class, prefix = "searchForm", name = "searchForm")
@OnError(type = ApplicationException.class, path = "/WEB-INF/view/project/index.jsp")
public HttpResponse list(HttpRequest request, ExecutionContext context) {

    ProjectSearchForm searchForm = context.getRequestScopedVar("searchForm");
    ProjectSearchDto searchCondition =
            BeanUtil.createAndCopy(ProjectSearchDto.class, searchForm);

    List<Project> searchList = searchProject(searchCondition, context);
    context.setRequestScopedVar("searchResult", searchList);

    return new HttpResponse("/WEB-INF/view/project/index.jsp");
}
この実装のポイント
  • 検索条件は、外部からの入力値で安全である保証がないため、 InjectForm を付与してバリデーションを行う。
  • InjectForm によるバリデーションが済んだフォームは、 リクエストスコープから取り出すことができる。
  • フォームの値を BeanUtil を使用して検索条件Beanにコピーする。
データベースを検索するプライベートメソッドの作成

このメソッドでは、前述のSQLを指定してデータベースを検索する。

ProjectAction.java
private List<Project> searchProject(ProjectSearchDto searchCondition,
                                    ExecutionContext context) {

    LoginUserPrincipal userContext = SessionUtil.get(context, "userContext");
    searchCondition.setUserId(userContext.getUserId());

    return UniversalDao
            .page(searchCondition.getPageNumber())
            .per(20L)
            .findAllBySqlFile(Project.class, "SEARCH_PROJECT", searchCondition);
}
この実装のポイント
  • 前述のSQL文を実行するには、UniversalDao#findAllBySqlFile の第二引数として、 SQLID (前述のSQLの場合は”SEARCH_PROJECT”)を指定する。
  • ページング用の検索は、 UniversalDao#per メソッド、 及び UniversalDao#page を用いて行うことができる。 詳細は ページングのために検索範囲を絞る を参照。
検索結果表示部分の作成

リクエストスコープに登録された検索結果を画面に表示する処理を、JSPに実装する。

/src/main/webapp/WEB-INF/view/project/index.jsp
<!-- 検索結果 -->
<app:listSearchResult>
<!-- app:listSearchResultの属性値指定は省略 -->
<!-- 省略 -->
    <jsp:attribute name="headerRowFragment">
        <tr>
            <th>プロジェクトID</th>
            <th>プロジェクト名</th>
            <th>プロジェクト種別</th>
            <th>開始日</th>
            <th>終了日</th>
        </tr>
    </jsp:attribute>
    <jsp:attribute name="bodyRowFragment">
        <tr class="info">
            <td>
                <!-- プロジェクトIDを追加したURLを作成する -->
                <!-- プロジェクト詳細画面へ遷移する -->
                <n:a href="show/${row.projectId}">
                    <n:write name="row.projectId"/>
                </n:a>
            </td>
            <!-- 省略 -->
            <td>
                <n:write name="row.projectName" />
            </td>
            <!-- 省略 -->
            <td>
                <n:write name="row.projectStartDate" valueFormat="dateTime{yyyy/MM/dd}"/>
            </td>
            <!-- 省略 -->
        </tr>
    </jsp:attribute>
</app:listSearchResult>
この実装のポイント
  • 詳細画面へ遷移するリンクなど、GETリクエストのURLにパラメータを含めたい場合は、JSTLの <c:url> タグやEL式を使って作成する。

  • Exampleアプリケーションでは、ルーティングを以下のように設定しているため、末尾にプロジェクトIDを付与したURLが「 ProjectAction#show 」に紐づけられる。 詳細は ライブラリのREADMEドキュメント(外部サイト) を参照。

    routes.xml
    <routes>
          <match path="/action/:controller/:action/:projectId">
              <requirements>
                  <requirement name="projectId" value="\d+$" />
              </requirements>
          </match>
      <!-- その他の設定は省略 -->
    </routes>
    
  • 値を出力するために、 writeタグ を用いる。 値を「日付」や「金額」等の形式でフォーマットして出力したい場合は、 valueFormat 属性で形式を指定する。詳細は フォーマットして値を出力する を参照。

  • <app:listSearchResult> の使用方法については 検索結果の一覧表示 を参照。

検索機能の解説は以上。

Getting Started TOPページへ


© Copyright 2010-2025, TIS Inc.

Built with Sphinx using a theme provided by Read the Docs.