質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.60%

JSPのHTMLタグの中でif文を書きたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 19K+

score -47

<!--一部抜粋です-->
                <div class="basicbox sex">
                    男性:<input type="radio" name="sex" value="男性" <c:if test="${sex == "男性"}">>
                    女性:<input type="radio" name="sex" value="女性" <%= if(${sex} == "女性"){System.out.println("chaecked")}%>>
                    <div class="erroemsg">
                        <c:if test="${not empty sexError}">
                            <p>${sexError}</p>
                        </c:if>
                    </div>
                </div>

このインプットの中に書かれているif文は両方ともエラーになります。このようなinputやoptionタグの中で条件分岐するにはどのように書けば良いのですか。

★現状
抜粋のsexについてはサーブレットで以下のようにセッションに格納しています。

session.setAttribute("sex", sex);

★EL式、JSP式の私の認識
スクリプトレット(HTMLが始まる前)にJavaのコードを記述する場合は <% Javaのコード %>
HTML内にJavaのコードを埋め込む場合は <%= 変数や演算式 %>
EL式を使用すると、インポートやセッションを記述することなくセッションの値を使用できる。つまり${}が使用できる
EL式で条件分岐等を行う為にJSTLを使用する。

が私の認識です。

★質問
以上を踏まえていくつか質問があります。

❶スクリプトレット内でEL式でセッションの値をなぜ変数に格納できないのでしょうか。

//スクリプトレット内の式
<%

String sex = ${sex};

%>


のようにするとラダーマークにトークンエラーがつきます


以下のinputの文のでセッション変数sexが’男性’であればcheckedをつけるにどう書けば良いでしょうか。

<input type="radio" name="sex" value="男性">

ヒントだけでもお願いします。

【関連質問】

<select name="year">
<c:forEach begin="1900" end="2010" var="i" step="1">
<option value="${i}" ${year == ${i} ? "selected" : ""}>
<c:out value="${i}" />
</option>
</c:forEach>
</select>


というJSP文があります。セッションに以下のように保存しています。

session.setAttribute("year",year);//yearにはString型で西暦が入っている。

私のコードはエラーになってますが、2つ追記で質問があります。

<c:out value="${i}" />の${i}はセッションと同じ扱いなのでしょうか。

${year == ${i} ? "selected" : ""}だとなぜエラーになりますか。
手元の参考書には、${year == 値 ? "true" : "false"}の三項演算子の解説がなく、JSPでの使い方がわかりません。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

スクリプトレットの中はJavaのコードを記載します。
EL式はJavaのコードではなくJSP用に用意された特殊なコードなので、スクリプトレットの中にEL式は記載できません。

EL式を使う場合には、EL式とJSTLで統一した方がコードが見やすいでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/03/09 00:44

    回答ありがとうございます。答えをお聞きしますが、この場合はどう書けば良いでしょうか。

    キャンセル

  • 2019/03/09 09:53

    サーブレット側で request.setAttribute("sex", "male"); としていた場合、JSPでは、<input type="radio" name="sex" value="male" <c:if test="${sex == 'male'}">checked=checked</c:if>> でしょう。ラジオボタンに並べる項目が多い場合は、<c:set>などで値をあらかじめ作っておくほうが良いでしょう。

    キャンセル

  • 2019/03/09 19:13

    あれから色々調べた結果、まだはっきりしませんが、
    <input type="radio" name="sex" value="男性" ${sex == "男性" ? "checked" : ""}>
    これでもいけるようです。

    キャンセル

  • 2019/03/09 19:15

    また加えて、関連質問がありますので追記いたします。
    いつも回答ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る