問題タブ [ognl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
3107 参照

struts2 - struts2-tiles-plugin を使用してタイル定義で動作する OGNL とワイルドカード?

Tiles が struts2 値スタックから ognl を解決するようにします。これを行う方法?

tiles 2.2.2 の使用 (ただし、3 などの新しいバージョンを使用できる場合は問題ありません)

ここでは、新しい機能について言及しています: http://tiles.apache.org/2.2/framework/whats-new.html

ここでは、実装方法を示しています: http://tiles.apache.org/2.2/framework/tutorial/advanced/el-support.html#OGNL_Support

しかし、私のプロジェクトでそれをどのように行うかはわかりません。struts2 プロジェクトで tiles3 を使用している人はいますか? デフォルトでタイル 3 のすべての新機能を有効にする方法について読んだことを覚えていますが、そのページへのリンクが見つかりません。

いずれにせよ、Spring を使用して構成を行うことができれば問題ありません (それが役立つ場合、そうでない場合は問題ではありません)。

0 投票する
2 に答える
7127 参照

struts2 - OGNL/Struts2 でリストのリストを反復してインデックスを作成するにはどうすればよいですか?

次のようなプロファイルを持つプロパティがあります。

外側のリストの要素ごとに 1 行、内側のリストの最初の 5 つの位置ごとに 1 つの列を持つテーブルを作成したいと考えています。私はこれを使ってみました:

ただし、出力は 100 行以上の完全に空白の列です。

データが正しく入力されていることはわかっています。私がこれを行うとき:

次のような100行以上を取得します。

そして、私がこれを行うとき:

例外があります:

したがって、「行」が ArrayList に解決されることはわかっています。私が OGNL について読んだことはすべて、[] 表記法を使用して配列にインデックスを付けることができるはずであることを暗示しているようです。{}、# などのより多くの組み合わせを試してみましたが、無駄に負担をかけることはありません。これが機能しない理由と、機能させるために何をする必要があるかを誰かが説明できますか?

アップデート

以下のクォータニオンの提案を試して、このコードを使用しました:

それは主に動作します。残念ながら、チェックボックスでは失敗します:

キーを使用しない場合、id または値の組み合わせも機能しません。名前とIDの両方だけの場合:

解決しない場合:

名前だけを使用する場合:

どちらも機能しません:

id だけを使用すると、内部エラーが発生します。

チェックボックスのパラメータがプロパティとは異なる構文を必要とするのはなぜですか?

0 投票する
4 に答える
4448 参照

java - Struts イテレータ内で ValueStack オブジェクトにアクセスする方法は?

私は次のコードを持っています:

reviews は、評価やユーザー名などのレビューの詳細を含むレビュー オブジェクトのリストです。

私の問題は、ループ内の ValueStack に存在するオブジェクトにアクセスできないことです。

ループの外側は<s:property value="#request.restaurant.portalImage.url" />正しく動作します。ただし、ループ内では null が出力されます。

私の知る限り、反復子はそのコレクションを ValueStack にプッシュして、すべての OGNL 式がそれに対して解決されるようにします。しかし、# を使用しました。これは、解決のためにルート オブジェクトを明示的に指定していることを意味します。

なぜまだ機能していないのですか?

0 投票する
0 に答える
2953 参照

jsp - Struts 2 - 静的メンバー値へのアクセス。struts.properties および struts.xml ファイルの「struts.ognl.allowStaticMethodAccess」値を無視するようです

次のように、JSP で静的メンバー値にアクセスしようとしています。 "@package.subPackage.ClassName@STATIC_MEMBER"

STATIC_MEMBER はpublic static final String値が割り当てられたものとして宣言され、クラスにはパブリック スコープがあります。struts.properties (webapps\appName\WEB-INF\classes フォルダーの下に配置) にstruts.ognl.allowStaticMethodAccess=trueエントリがあります。しかし、Strutsstruts.ognl.allowStaticMethodAccess=trueは struts.properties のエントリを無視するようです。

別のプロジェクトで上記の同じ手順を実行しましたが、完全に正常に機能しています。

注:
1. 完全なパッケージ、クラス、および STATIC_MEMBER 名が正しいかどうかをクロスチェックしました。
2. ページにエラーや例外はありません。
3. 同じ JSP は、Action クラス ( <s:property value="actionMember"/>) からメンバー値にアクセスできます。
4. 他のクラスから static メンバーにアクセスしようとしましたが、うまくいきません。
5. struts.properties ファイルを削除して、struts.xml ファイルの<struts>タグの後に : というエントリを作成しようとしました<constant name="struts.struts.ognl.allowStaticMethodAccess" value="true" />。再起動して再試行しました。しかし、うまくいきません。
6. Web アプリとそのキャッシュ (作業フォルダー) をサーバーから削除した後、サーバーを再構築、再展開、再起動しましたが、機能しませんでした。

環境: Java 1.6、Struts 2.1、Tomcat 6.0 @ Windows XP 2002

助けてください。
よろしくお願いします!

--------------------コードの更新-------------------------------- ---

クラス


struts.properties
struts.ognl.allowStaticMethodAccess=true

JSP
<s:if test="errorType == @package1.subPackage1.FooClassName@INVALID_LOGIN"> some code here </s:if>


Action クラス:
1. private int errorType;
2. それぞれerrorType

の getter と setter があります。値を出力することすらありません。
<s:property value="@package1.subPackage1.FooClassName@INVALID_LOGIN"/>

0 投票する
1 に答える
587 参照

java - ognl評価を無効にする方法は?

OGNL評価を強制するには、%{}構文を使用できますが、それを無効にするには何を使用する必要がありますか?

次のコードを検討してください-

何が起こるかというと、viewItemは値スタックで検索され、見つからない場合は空の文字列が返されます。

これは私が望むものではありません。私が欲しかったのは、パラメーターとして渡されるリテラル値viewItemでした。

0 投票する
1 に答える
468 参照

java - s:selectで#thisを使用した場合の奇妙なOGNLの動作

availableExclusionsがDateオブジェクトの配列である場合は、次のことを考慮してください。

この質問に答えて上記を作成しました。struts2selectタグ内の日付のリストをフォーマットするにはどうすればよいですか?(そして、他の解決策がより良い方法かもしれないこともお勧めします)。このような長いOGNL式を使用するのが良いアイデアであるかどうかに関係なく、フラストレーションからフラグメントを作成したにもかかわらず、一見同等のものが機能しなかった(出力が生成されなかった)new java.util.Date(#this[0].time)場合に機能することがわかりました。#this[0]

代用するlistValue="#this[0].class"と、何が期待できるかがわかります。class java.util.Date

新しいDateを作成すると期待どおりに動作し、たとえばなどの非推奨のDateプロパティを呼び出すとlistValue="#this[0].day"、期待どおりの出力が生成されます。

このselectステートメントnew java.util.Date(#this[0].time) の代わりに 冗長式を使用する必要があるのはなぜですか?#this[0]

Struts2.3.1.2の使用

0 投票する
1 に答える
644 参照

struts2 - struts-portlet 2.3.3 のバグの可能性はありますか? 値スタックの最上位にないアクション クラス

Struts 2.2.3.1 ポートレット アプリケーション (jsr168) を新しいバージョン 2.3.3 に移行中です。ほとんどの場合、すべてが同じように機能しますが、明らかな問題が 1 つあります。

JSP のタイトルやラベルなどに package.properties リソース バンドルを使用しています。最初にアクションを実行すると、メッセージがリソース バンドルから取得され、期待どおりに表示されます。ただし、アクションに対して 2 番目の要求を行うと、メッセージ キーが表示されます。これは通常、リソースが見つからなかったことを意味します。

(最初にアクションをヒットしたときと後続のリクエストの主な違いは、最初のリクエストではイベント ポートレット フェーズのみが処理され、ポートレットのレンダリング フェーズは処理されないことです。フォローアップ リクエストでは、両方のフェーズが使用されます。)

何が起こっているのかを理解するのにかなりの時間がかかりましたが、大まかに何が起こっているのかを以下に示します。

org.apache.struts2.components.Textをステップ実行することから始めました。このクラスは、jsp で struts テキスト タグが検出されたときに使用されます。

end()メソッドは、 TextProviderHelperの静的getText()メソッドを使用します。これが私が問題の根本を見つけた場所です:

上記のコードは、 TextProviderが見つかるまで値スタックを反復処理します。ActionSupportはTextProviderを実装、struts はアクションをスタックの最上位またはその近くに配置しようとするため、通常、アクションはプロバイダーになります。

両方のバージョンの異なる時点での値スタック内のオブジェクトを次に示します。

バージョン 2.2.3.1

最初のリクエスト値スタック

  • --> TestPortletAction
  • DefaultTextProvider

2 番目の要求値スタック

  • --> TestPortletAction
  • DefaultTextProvider
  • DirectRenderFromEventAction
  • DefaultTextProvider

バージョン 2.3.3

最初のリクエスト値スタック

  • --> TestPortletAction
  • DefaultTextProvider

2 番目の要求値スタック

  • DirectRenderFromEventAction
  • DefaultTextProvider
  • --> TestPortletAction
  • DefaultTextProvider

そのため、何らかの理由で、新しいバージョンでは、レンダリング フェーズが処理された後、アクション クラスがスタックの一番上にありません。これは、TextProviderHelperがDefaultTextProviderを使用することを意味します。これは、リソース バンドルを見つけようとしますが、決して成功しません。

DefaultTextProviderがスタックにプッシュされる方法を調査しました。

Jsr168ディスパッチャーserviceAction () は、ActionProxyFactoryを呼び出して、アクション プロキシを作成します。プロキシを返す直前に、prepare () の呼び出しが行われ、次にDefaultActionInvocationinitメソッドが呼び出されます。init は、スタックを作成するcreateContextMap () を呼び出します。

使用されるコンストラクター:

ああ、それは私がこれまでに問題に取り組んできた限りです。残っている質問は次のとおりです。

  1. 2 番目のDefaultTextProviderがスタックにプッシュされる方法と場所は? (そして、それらを2つ持つ本当の理由はありますか?)
  2. DirectRenderFromEventActionがスタックにプッシュされる方法と場所は?
  3. 新しいバージョンのどのような変更が原因ですか?
  4. これはバグですか、それとも意図した動作ですか?

考えられる解決策 (これで解決します) は、 ognlを使用してアクションのgetTextメソッドを明示的に呼び出すことですが、これは理想的ではないと思います。また、大量の jsp ファイルを変更することを意味します。

この問題を示すサンプル プロジェクトは、次の場所にあります (Maven プロジェクトです)。

http://new-value-stack-order.googlecode.com/svn

開発環境としてpluto 1.1.7でtomcat 6.0.25を使用しています。

0 投票する
2 に答える
976 参照

java - Struts Selectタグでオプションラベル(listValue)を指定する

タグの listValue 属性は、そのオプションを選択したときにユーザーに表示されるラベルを指定するために使用されます。

例 -

OGNL リテラルでリストを列挙するときに同じことを行うことは可能ですか?

1Km をユーザーに表示し、文字列 1Km ではなく整数 1 をフォームと共に送信したいと考えています。

0 投票する
1 に答える
333 参照

ognl - OGNL のワイルドカード?

C# ディクショナリを使用するのと同じように、テーブルで何かを検索するために OGNL を作成する必要がありました。これはとても簡単でした:

しかし今、私の要件は変わりました。ここで、さらに複雑なルールを作成する必要がありますが、OGNL でそれができるかどうかはわかりません。更新された式にはいくつかの要件があります。ここで、2 つの個別の値とその組み合わせについて心配する必要があります。値を A および B と呼びます。ルールは次のようなものです。

  1. A の特定の値が表示された場合は、常に同じ値を返します。
  2. A と B の値の特定の組み合わせが表示される場合は、別の値を返します。
  3. A の値が特に気にするもの以外にある場合は、別の値を返します。

A と B のすべての可能な値のリストがあれば、それらを連結するたびに非常に大きなハッシュテーブルを作成し、それぞれの場合に適切な値を返すことができます。ワイルドカードを使用できれば、これははるかに簡単になるようです。これを実装する方法、または OGNL で可能かどうかについて考えている人はいますか?

0 投票する
4 に答える
5884 参照

java - OGNLを使用してstruts2テキストフィールドタグの値をカスタマイズします

ユーザー情報を含むデータベースがあります。ユーザーがログオンしたときに、次のようにユーザーをセッションに登録しました。

そして、jspページでユーザーの情報を取得して、struts2テキストフィールドにこの情報を入力したいと思います。次のコードを使用しようとしましたが、機能しません。

助けてください。