Struts2の(3) - OGNL値スタックと

OGNLは何ですか

OGNLは、あなたは、オブジェクトのメソッド呼び出しは、全体の構造図のオブジェクトを横断するオブジェクトのプロパティのいずれかにアクセスすることができ、それはそのシンプルかつ一貫性のある表現構文を通じて、強力な表現言語で、オブジェクトグラフナビゲーション言語の略語ですフィールド型変換関数を実現します。

EL式の比較OGNL

  • OGNLオブジェクトグラフナビゲーション言語、EL式の言語よりも強力何倍

  • EL式は唯一のドメインからデータを取得することができます

  • OGNLは、Strutsのスタックのデータ取得価額、オブジェクトのメソッドを呼び出すことができます。

  • OGNLサードパーティの式言語、値スタックにデータストラットを取得するためにそれを使用します

OGNL機能

  • サポート・オペレーター(例えば、+ - * /)

  • 支持体は、そのようなxxx.doSomeSpecial()のようなメソッド呼び出しを、オブジェクト。

  • サポートクラスの静的メソッドの呼び出しとアクセス値

  • 代入と式シリーズをサポートしています

  • アクセスコンテキストOGNL

  • オブジェクトの操作コレクション

  • 新しいターゲットを指示することができます。

OGNLの使用要素

  • 表現

  • ルートオブジェクト

  • コンテキストオブジェクト(非ルートオブジェクト)

OGNLの取得

OGNLコアOgnlContext、本質的マップ

Javaプログラムが使用するOGNL

@Test
public void test(){
    OgnlContext ognlContext = new OgnlContext();
    ognlContext.setRoot("aaa");
    Object obj = Ognl.getRoot(ognlContext);
    System.out.println(obj);
}

のデータルートを取得

あなたはそれらのルートにJavaオブジェクトを格納することができます

@Test
public void test2() throws OgnlException {
    OgnlContext ognlContext = new OgnlContext();
    User user = new User();
    user.setUsername("Ryan");
    user.setAge(12);
    ognlContext.setRoot(user);
    Object root = ognlContext.getRoot();
    Object username = Ognl.getValue("username", ognlContext, root);
    System.out.println(username);
}

唯一のルート要素のスタックを取る、それは望ましいフィールドです

コンテキスト内のデータを取得します

ノンは、ルートオブジェクトのフィールドを取ることができない、データを追加する必要が#をフェッチ

@Test
public void test3() throws OgnlException {
    OgnlContext ognlContext = new OgnlContext();
    User user = new User();
    user.setUsername("Ryan");
    user.setAge(12);
    ognlContext.put("UserRyan",user);
    Object root = ognlContext.getRoot();
    User obj = (User)Ognl.getValue("#UserRyan", ognlContext, root);
    System.out.println(obj.getUsername());
    System.out.println(obj.getAge());
}

オブジェクトのメソッドを取得します。

Object value = Ognl.getValue("'Ryan'.length()", ognlContext, root);
System.out.println(value);

オブジェクトの静的メソッドを取得します。

Object value1 = Ognl.getValue("@java.lang.Math@random()", ognlContext, root);
System.out.println(value1);

JSPのデフォルトでは、この方法は、静的へのアクセスを許可しない、一定の必要性は、設定するstruts.ognl.allowStaticEmthodAccessオープン

JSPはOGNLを使用しました

<s:property value=""/>

スタックの値とは何ですか

  • ValueStackは実際にはコンテナです。インタフェースは、実装クラスはOgnlValueStackです

  • Actionオブジェクトが含まれているOgnlValueStackオブジェクトを含むビジネス・メソッド・アクションオブジェクトへのユーザーアクセスは、するactionContextオブジェクトを作成しますたびに

  • それは、このような要求を送信し、JSP、現在のページが終了すると、Strutsフレームワークによって作成され、デフォルトのデータStrutsのリクエストインターセプタは、スタックValueStackに組み込まカプセル化します

  • Strutsフレームワークのデータは、ドメインに存在しないValueStackに上に保存されています。ページに保存されているフィールドの中、行われたアクションで、ページ内に撮影したような、任意の場所で除去することができます保存されたデータ値のスタックをそれを取り出すことができ、設定ファイルを削除します。

  • アクションのライフサイクル全体ValueStack

  • アクションを作成したら、それはvaluestackオブジェクトを作成します。

  • StrutsPrepareAndExecuteFilter間でフィルタを実行するための要求が来た、doFilterメソッド。この方法でそれらを作成するactionContext。するactionContext作成プロセスでは、ValueStackオブジェクトを作成します。オブジェクトへのvalueStackするactionContextオブジェクト。するactionContextによってスタックオブジェクトの値を取得します。オブジェクトは、サーブレットAPIするactionContextアクセス可能にする理由(データフィールドオブジェクト)

スタック値の内部構造の分析

  • スタックの値を取得します。 ValueStack valueStack = ActionContext.getContext().getValueStack();

  • ルートゾーン:現在のアクションに関連するデータを格納します

  • 非ルートゾーン:プログラム全体に関連するデータREQセッションアプリケーション

ストアデータに値スタック

// valueStack.getRoot().push(new Object());
// valueStack.getRoot().pop();
valueStack.push(new Object());
valueStack.pop();
// to req
ActionContext.getContext().put("reqName","reqValue");
// to session
ActionContext.getContext().getSession().put("sessionName","sessionValue");
//to application

バリュースタックデバッグ

一定の支柱

<constant name="struts.devMode" value="true" />

JSP

<%@ taglib uri="/struts-tags" prefix="s"%>
<s:debug />

おすすめ

転載: www.cnblogs.com/mdz3201/p/12637511.html