1. OGNL の出現の意義
mvc では、データがさまざまなレベル間を流れることは議論の余地のない事実です。そして、この種のフローにはいくつかの困難も伴います。これらの困難は、異なる世界のデータの異なる表現によって引き起こされます。
a. データがどれほど複雑であっても、ページ上のデータはデータ型のないフラットな文字列です。構造やデータ型の豊富さは、表示に関して言えば、ページ上に文字列としてすべて均等に表示されます。
b. Java の世界では、データを豊富なデータ構造とデータ型で表すことができ、お気に入りのクラスを定義し、クラス間で継承したりネストしたりできます。通常、このモデルを複雑なオブジェクト ツリーと呼びます。このとき、ページと Java ワールドの間でデータが転送されると、不一致のように見えます。したがって、これは解決する必要のあるいくつかの問題につながります
c. データがビュー層からコントローラー層に渡されるとき、特定のルールに従ってフラットで分散したデータのコレクションを Java ワールドに設定できるようにする必要があります。オブジェクトツリー内。同時に、文字列型から Java のさまざまな型にインテリジェントに変換できます。
d データがコントローラー層からビュー層に渡されるとき、オブジェクト ツリーがいくつかの単純なルールに従って処理できることを確認する必要があります。ビューレイヤーにアクセスします。同時に、オブジェクトツリー内のデータの表示形式もある程度制御されます。
この問題をもう少し深く考えてみると、表示形式の違いによるデータ フローの不一致の問題を解決することは、実は私たちにとって馴染みのないことではないことがわかります。 Java の世界とデータベースの世界でも同じ問題が発生します。オブジェクト モデルとリレーショナル モデルの間の不一致に直面して、私たちが採用する解決策は、Hibernate や iBatis などの ORM フレームワークを使用することです。 Web 層でも不一致が発生するため、問題を解決するためにいくつかのツールを使用する必要があります。データが View 層から Controller 層に渡されるときの不一致を解決するために、Struts2 は XWork からの完璧なソリューションを採用しています。そしてこれに基づいて、データフローの不一致を完全に解決するための完璧なメカニズムが構築されました。 OGNL ソリューションが誕生しました
2. OGNL プロジェクトの実戦
OGNL は、Object-Graph Navigation Language の略称であり、そのシンプルで一貫した式構文を通じて、あらゆる属性にアクセスできます。オブジェクトのメソッドを呼び出し、オブジェクト全体の構造図をたどって、フィールド型変換などの機能を実装します。
a. OGNL では、非常に単純な式でオブジェクト レイヤーにアクセスできます [OGNL はマップのキー値検索をサポートしています]
ユーザー属性がリストの場合、
ユーザー属性がマップの場合
b 自由度の高い演算子をサポートします。通常のフラグよりも強力な関数
c. xxx.doSomeSpecial() などのオブジェクト メソッド呼び出しをサポートします
d。値アクセス、式 形式は @[完全なクラス名 (パッケージ パスを含む)]@[メソッド値名] です。例: @java.lang.String@format('foo %s', 'bar') または@tutorial.MyConstant@APP_NAME
e などの代入演算と式の連結をサポートします。 、discount=0.8、calculatePrice (price*discount)、この式は 80
f を返します。OGNL コンテキストと ActionContext
g にアクセスして、任意のクラス オブジェクト
/**& のコンストラクターを使用してオブジェクトを作成することもできます。 #& */
h.OGNL は、データベースと同様の投影と選択をサポートします。
射影とは、リレーショナル データベースのフィールド操作と同様に、セット内の各要素の同じ属性を選択して新しいセットを形成することです。射影操作の構文は collection.{XXX} です。XXX は、このコレクション内の各要素のパブリック プロパティです。
/**新しい Java.net.URL("xxxxxx/")
**/
選択とは、リレーショナルデータベースのレコード操作と同様に、選択条件を満たす集合要素をフィルタリングすることです。選択操作の構文は次のとおりです: collection.{X YYY}。X は選択演算子で、その後に選択の論理式が続きます。 3 つの選択演算子があります:
? 条件を満たすすべての要素を選択します
$ 条件を満たす最後の要素を選択します
/**group.userList.{? #txxx.xxx != null} は、グループ内の名前が空ではないユーザーのリストを取得します
**/
i. OGNL は通常、Struts 2 記号と組み合わせて使用され、主に #、%、$ の 3 つの記号が使用されます。使用法は次のとおりです:
/** OGNL コンテキストとアクション コンテキストにアクセスします。#ActionContext.getContext() と同等です。次の表には、ActionContext にいくつかの便利なプロパティがあります:
parameters 現在の HTTP リクエスト パラメータを含むマップ #parameters id[0] は request.getParameterValues("id").get(0) と同等です;
request には現在の HttpServletRequest の属性のマップが含まれます #request.userName は request.getAttribute("userName") と同等ですsession contains 現在の HttpSession の属性のマップ #session.userName は session.getAttribute("userName") と同等です application 現在のアプリケーションの ServletContext の属性を含むマップ #application.userName は application.getAttribute( "userName")
attr は、リクエスト > セッション > アプリケーションの順序で属性にアクセスするために使用されます。 #attr.userName は、上記の 3 つのスコープで userName 属性が見つかるまで順番に読み取るのと同等です
フィルタリングに使用されます
書籍などのコレクションの投影。{?#this.price #{'foo1':'bar1', 'foo2':'bar2'} などのマップの構築。
%" シンボルは、フラグの属性が文字列型の場合に OGNL 式の値を計算するために使用されます。
"$" には主に 2 つの用途があり、インターナショナル リソース ファイルで OGNL 式を参照するために使用されます。 Struts 2 でファイルを構成するそして i18n
/**
j. OGNL はバックグラウンドアクションの get() set() メソッドで送信されたデータを取得し、フロントデスクに柔軟に表示できます
以上が Webwork の学習方法 (2) です。フロントエンド OGNL トライアルの内容については、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください