この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:T
更新日時:2026-06-11 07:12:00

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

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

logic:messagesPresent タグとは

Struts 1 の <logic:messagesPresent> は、リクエスト/セッションスコープに 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"  %>

<%-- エラーがあるときだけブロックを表示 --%>
<logic:messagesPresent>
    <div class="error-block">
        <ul>
        <html:messages id="msg">
            <li><bean:write name="msg"/></li>
        </html:messages>
        </ul>
    </div>
</logic:messagesPresent>

属性一覧

属性必須意味
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 でフィールド指定

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

<dl>
    <dt>ユーザー ID</dt>
    <dd>
        <html:text property="userId"/>
        <logic:messagesPresent property="userId">
            <span class="field-error">
                <html:messages id="m" property="userId">
                    <bean:write name="m"/>
                </html:messages>
            </span>
        </logic:messagesPresent>
    </dd>

    <dt>パスワード</dt>
    <dd>
        <html:password property="password"/>
        <logic:messagesPresent property="password">
            <span class="field-error">
                <html:messages id="m" property="password">
                    <bean:write name="m"/>
                </html:messages>
            </span>
        </logic:messagesPresent>
    </dd>
</dl>

message="true" で ActionMessages を判定

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

<%-- 成功メッセージ表示 (MESSAGE_KEY) --%>
<logic:messagesPresent message="true">
    <div class="success-banner">
        <html:messages id="m" message="true">
            <bean:write name="m"/>
        </html:messages>
    </div>
</logic:messagesPresent>

<%-- エラーメッセージ表示 (デフォルト = ERROR_KEY) --%>
<logic:messagesPresent>
    <div class="error-banner">
        <html:messages id="e">
            <bean:write name="e"/>
        </html:messages>
    </div>
</logic:messagesPresent>

messagesNotPresent — エラーなしの分岐

逆の条件を書く場合は <logic:messagesNotPresent>:

<logic:messagesPresent>
    <p class="alert">エラーがあります。修正してください。</p>
</logic:messagesPresent>
<logic:messagesNotPresent>
    <p class="info">入力内容を確認の上、送信ボタンを押してください。</p>
</logic:messagesNotPresent>

html:messagesPresent との違い

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

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

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

Spring MVC への移行

Spring MVC では BindingResult + <form:errors> を使います:

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

<%-- 全体エラー --%>
<c:if test="${not empty errors}">
    <form:errors path="*" cssClass="error"/>
</c:if>

<%-- フィールド別エラー --%>
<form:input path="userId"/>
<form:errors path="userId" cssClass="field-error"/>

<%-- フラッシュメッセージ (RedirectAttributes) --%>
<c:if test="${not empty flashMessage}">
    <div class="success">${flashMessage}</div>
</c:if>

JSTL + EL で書く

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

<c:if test="${not empty errorsList}">
    <div class="error-block">
        <ul>
            <c:forEach var="e" items="${errorsList}">
                <li><c:out value="${e}"/></li>
            </c:forEach>
        </ul>
    </div>
</c:if>

FAQ

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

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

Q: エラーメッセージのスタイルを変えたい
A: messagesPresent のボディに <div class="..."> を入れるか、Action 内で HTML を含むメッセージにする (XSS 注意)。

関連項目

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