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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

Q&A

解決済

1回答

16656閲覧

Struts2のs:ifでJSPタグを使用したい

Begi

総合スコア56

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

1グッド

1クリップ

投稿2018/02/08 10:31

前提・実現したいこと

お世話になります。
Struts2でs:ifタグの判定要素として、HTMLにJavaで埋め込んだ変数を使用したいと思っています。
具体的には、JavaでURLを取得し、それをs:ifで判定したいと思っています。
現在のコードを以下に記載します。

該当のソースコード

test.jsp

1<% boolean isTop = request.getRequestURL().toString().indexOf("top") != -1;%> 2・・・ 3<s:if test="<%=isTop %> == true"> 4~~~トップ画面だったら表示する内容~~~ 5</s:if> 6・・・

試したこと

上記ソースでは、trueをfalseにしても判定が行われませんでした。(false扱いで内容が表示されない)
<span><%=isTop %></span>
を出力してみると、topが含まれている画面ではtrue、それ以外ではfalseが返ってきました。

どのように記載したら、うまいこと判定できるのかが分からず苦戦しています。
よろしくお願い致します。
また、この方法ではなく別の手段などありましたらご教授いただけますと幸いです。

A-pZ👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

サーブレットリクエストの代わりとして、Struts2でラップしたオブジェクトからURLの一部を取得できます。

jsp

1<s:property value="#request['struts.request_uri']" />

ここで取得できる値は、URLのコンテキストパス以下の文字列です。
http://127.0.0.1:8080/s2/ なら /s2/)

なので、s:if を交えた場合は、次のようになります。

jsp

1<s:set value="#request['struts.request_uri'].indexOf('s2')" var="uri"/> 2<s:if test="%{#uri != -1}"> 3 SUCCESS! 4</s:if>

余談その1:
Struts2内部で top の名前は使われているので、topならびにその参照メソッド(isTopないしはgetTop)の名前は避けましょう。

余談その2:
Struts2タグ(sタグ)の中には、EL式ならびにJSPの式はいずれも受け取れません。(JSP実行時のTLDエラーが出ます)

余談その3:
かつれのバージョンでは、servletRequestの名前でStruts2タグを利用してサーブレットリクエストのオブジェクトそのものを参照できるようになっていましたが、脆弱性対応により塞がれました。

投稿2018/02/08 15:38

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Begi

2018/02/08 23:53

回答いただきありがとうございます。 また、余談についてもとても参考になります。ありがとうございます。 <s:property value="#request['struts.request_uri']" />をJSP内に記述し動かしてみましたが、何も表示されませんでした。サーバ側からrequestに値する変数を渡す必要があるのでしょうか?
A-pZ

2018/02/09 01:43

おや?特にオブジェクトのバインドは不要です。ちなみに以下のバージョンで動作確認をしています→2.5.14.1 ちなみにこの変数名は、<s:debug /> を使って出力されたrequestの値ですので、一度debugで出力されているかを確認してみてください。
Begi

2018/02/12 23:50

返信が遅くなり申し訳ありません。 githubにあげていただいたソースを試しましたが表示されませんでした。Strutsのバージョンは2.5.5です。 s:debugで表示させたところ、Stack Contextのrequestのrequest_uriはドメイン以下が正しく表示されていました。
A-pZ

2018/02/13 00:34

こちらの環境では、Struts2.5.5でも出力されました。何か他にカスタマイズなどされているでしょうか。特にインターセプタやフィルタなどが変更されていて、出力させないよう記述されているなどの場合が考えられます。
Begi

2018/02/15 12:41

特にカスタマイズなどしていないように思うのですが…もう少し調べてみます。 この度はとても参考になるご回答をいただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問