1.

Struts logic:messagesPresent タグ完全ガイド(エラーチェック・移行)

編集
この記事の要点
  • Struts 1 の条件分岐タグActionMessages / ActionErrors がリクエストに存在する場合のみボディを評価
  • デフォルトは Globals.ERROR_KEY を見るが、message="true" 属性で Globals.MESSAGE_KEY に切り替えられる
  • property 属性で特定フィールドのエラーだけを判定可能 ()
  • 対となる でエラー無しの分岐を書ける
  • Spring MVC への移行先は + JSTL

logic:messagesPresent タグとは

Struts 1 の は、リクエスト/セッションスコープに ActionMessages または ActionErrors が登録されているかどうかを判定し、存在する場合のみタグボディを評価する条件分岐タグです。バリデーションエラーやフラッシュメッセージを表示するときに使います。

基本的な使い方

<%@ taglib uri="http://struts.apache.org/tags-html"  prefix="html"  %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-bean"  prefix="bean"  %>

<%-- エラーがあるときだけブロックを表示 --%>

    

属性一覧

属性必須意味
name任意判定するメッセージのスコープ属性名。省略時は Globals.ERROR_KEY
property任意特定フィールドのエラーだけ判定
message任意true なら Globals.MESSAGE_KEY (ActionMessages) を見る。デフォルトは ERROR_KEY

Action 側のコード

JSP 側で messagesPresent を使うには、Action 側で ActionErrors / ActionMessages を保存しておく必要があります:

public class LoginAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
                                 HttpServletRequest req, HttpServletResponse res) {
        LoginForm lf = (LoginForm) form;

        // バリデーション
        ActionErrors errors = new ActionErrors();
        if (lf.getUserId() == null || lf.getUserId().isEmpty()) {
            errors.add("userId",
                new ActionMessage("error.required", "ユーザー ID"));
        }
        if (lf.getPassword() == null || lf.getPassword().length() < 8) {
            errors.add("password",
                new ActionMessage("error.length", "パスワード", "8"));
        }
        if (!errors.isEmpty()) {
            saveErrors(req, errors);   // ★ ERROR_KEY に保存
            return mapping.getInputForward();
        }

        // 成功メッセージ
        ActionMessages msgs = new ActionMessages();
        msgs.add(ActionMessages.GLOBAL_MESSAGE,
            new ActionMessage("login.success", lf.getUserId()));
        saveMessages(req, msgs);       // ★ MESSAGE_KEY に保存

        return mapping.findForward("success");
    }
}

property でフィールド指定

特定の入力フィールドにエラーがある場合のみ表示したいとき:

ユーザー ID
パスワード

message="true" で ActionMessages を判定

エラーではなく成功メッセージ等を扱うとき:

<%-- 成功メッセージ表示 (MESSAGE_KEY) --%>

    
<%-- エラーメッセージ表示 (デフォルト = ERROR_KEY) --%>

messagesNotPresent — エラーなしの分岐

逆の条件を書く場合は :


    

エラーがあります。修正してください。

入力内容を確認の上、送信ボタンを押してください。

html:messagesPresent との違い

Struts 1.3 系で似た名前のタグがありますが、役割は同じです:

タグTLD動作
struts-logic古典的な書き方
struts-html1.3 で html タグライブラリへ移動

機能差はないので、プロジェクトの慣習に合わせれば OK。

Spring MVC への移行

Spring MVC では BindingResult + を使います:

@Controller
public class LoginController {
    @PostMapping("/login")
    public String login(@Valid @ModelAttribute LoginForm form,
                        BindingResult br) {
        if (br.hasErrors()) {
            return "login";
        }
        return "redirect:/home";
    }
}
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c"    uri="http://java.sun.com/jsp/jstl/core" %>

<%-- 全体エラー --%>

    


<%-- フィールド別エラー --%>



<%-- フラッシュメッセージ (RedirectAttributes) --%>

    
${flashMessage}

JSTL + EL で書く

Struts タグを使わず JSTL だけで書く場合:


    

FAQ

Q: messagesPresent はネスト可能?
A: 可能。ただし分岐を深くしすぎると保守性が落ちるため、フィールド別エラー表示はループで書く方が無難。

Q: メッセージリソースの場所は?
A: struts-config.xml で指定。MessageResources.propertieserror.required={0} は必須です のように書く。

Q: エラーメッセージのスタイルを変えたい
A: messagesPresent のボディに

を入れるか、Action 内で HTML を含むメッセージにする (XSS 注意)。

関連項目

  • — メッセージ繰り返し出力
  • ActionErrors / ActionMessages — メッセージ保持クラス
  • (Spring MVC) — 移行先
  • Struts Validator — バリデーション設定 XML
編集
Post Share
子ページ

子ページはありません

同階層のページ

同階層のページはありません