【Struts2の】OGNL与ValueStack

A、OGNL

1.1概要

  • OGNLあるObject-Graph Navigation Language略語、それは強力な表現言語である。式関数よりエルは強力。統合式言語、そのデフォルトの表現言語として、フレームワークを。Struts2ognlsturts2
  • OGNLあるOgnlContextルートおよび非ルート.rootデータ取得は、むしろ、取得時のデータのルートよりも、#を追加する必要はありません、それができるセットは、必要が#を追加します

1.2 OGNLの5つのカテゴリ機能

  • 図1に示すように、支持体のような、メソッド呼び出しオブジェクトxxx.doSomeSpecial();
  • 2、サポートクラスの静的メソッドの呼び出しとアクセス値
  • 図3に示すように、アクセスOGNLコンテキスト(文脈OGNL)とActionContext;(スタック操作ValueStackのキー値)
  • 4、代入と式シリーズをサポート
  • 図5に示すように、操作のオブジェクトセット。

1.3デモ

  • Struts2のにOGNL式を使用します
  • Struts2のタグは `の組み合わせを必要とします

    <s:property value="'abc'.length()"/>  演示对象调用方法
    <s:property value="@java.lang.Math@max(10,20)"/> 演示静态成员访问.
    
  • 注:Struts2のアクセスで使用する静的メンバーが、あなたは定数を設定する必要があります。struts.ognl.allowStaticMethodAccess=false

OGNLオブジェクトのナビゲーション操作
OGNLオブジェクトのナビゲーション操作

二、ValueStack

2.1概要

  • ValueStack、それはインターフェースですcom.opensymphony.xwork2.util.ValueStackそれはページにアクションデータを運ぶための容器であるとして、我々はそれを使用しています。ページ上のデータを取得することによりOGNL式
  • ValueStack主なアクションは、OGNLによって取得したページデータにデータを運ぶためにあります
    • OgnlValueStackというクラスがあり実現し1.ValueStack。
      • 2.各アクションはValueStack。(リクエスト、リクエスト、アクション、valueStack)ValueStackライフサイクルは、要求のライフサイクルで有しています。
      • 3.ValueStack店このアクション・オブジェクトおよび他の一般的なWebオブジェクト(request,session,application.parameters
      • 4.struts2 valueStack「へのフレームワークstruts.valueStackドメイン名は」要求に格納されます。

2.2 ValueStack構造

  • ValueStackプレゼンスroot属性(CompoundRoot)、context属性OgnlContext()
  • CompoundRootつまりArrayListlistコレクションが格納されているaction情報は、
  • OgnlContextつまりMapmapコレクションが含まれている関連するマッピング情報に格納されるparamters,request,session,application attrというように。
  • 私たちは、リストからデータを取得したい、あなたは#記号を使用することはできません。(それはルートOGNLです)
  • あなたがマップからデータを取得する場合、使用位( - 実際ognlContextある文脈実際にStruts2の中にマップします)。

2.3おわりに

  • ValueStackこれは、2つのパーツ一覧地図を持っています
  • 一覧でStruts2のではルート地図ognlContextです。
  • デフォルトでは、取得したデータは、Struts2のにvalueStackからルートから取得しました。

  • 値スタックオブジェクトを作成、ValueStackとするactionContext関係は何ですか?

    ActionContext ctx = ActionContext.getContext();
    if (ctx != null) {
    stack = ctx.getValueStack();
    }
  • ときValueStackは、要求が作成されるたびに。

  • ValueStackはするactionContext内の参照を保持します。

2.3いくつかの問題

  • 値スタックオブジェクトを取得します。
  • ValueStackのために二つの方法で取得します:

    • リクエストにより取得1
    ValueStack vs=(ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
    
    • するactionContextを通じて入手2.。
    ValueStack vs=ActionContext.getContext().getValueStack();
    
  • (主ルートのための)データを保存するスタックの値は、二つの主な方法があります

    • スタックの先頭にプッシュ(オブジェクトobj)------->下地IS root.add(0、OBJ)は、データを格納します。
    • セット(文字列名、オブジェクトobj); ----->基礎データをハッシュマップ、このHashMapを格納することにより、プッシュにカプセル化されます。
      • JSPにより、 スタックの内容の値を確認してください
  • JSPでのスタックからデータ値を取得します。

    • データコンテキストが#を必要とするデータは、ルート#を必要としません。
    1.如果栈顶是一个Map集合,获取时,可以直接通过Map集合的key来获取value.
    <s:property  value="username"/>
    2.如果栈顶数据不是一个Map,没有key值,可以使用序号来获取。
    <s:property value="[0]"> 从0的位置向下查找所有。
    <s:property value="[0].top"> 只查找0位置上数据。
  • データOgnlContextを取得する方法:

    1.request数据    request.setAttribute() 
    2.session数据    session.setAttribute()
    3.application数据 application.setAttribute()
    4.attr 依次从request,session.application中查找
    5.parameters 获取请求参数
  • ValueStackの主流:JSPページを解決するためのアクションデータを運ぶでしょう。

  • 1.テキスト(文字列)

    1.fieldError   校验数据错误信息提示
    2.actionError 关于逻辑操作时错误信息(例如登录失败)
    3.message 就是一个信息.
    this.addFieldError("msg", "字段错误信息");
    this.addActionError("Action全局错误信息");
    this.addActionMessage("Action的消息信息");
    * fieldError 针对某一个字段错误信息 (常用于表单校验)、actionError (普通错误信息,不针对某一个字段 登陆失败)、 actionMessage 通用消息
    在jsp中使用 struts2提供标签 显示消息信息
    <s:fielderror fieldName="msg"/>
    <s:actionerror/>
    <s:actionmessage/>
    • 2.複雑なデータ
    可以使用valueStack存储.
    在action中存储数据:
    List<User> users = new ArrayList<User>();
    users.add(new User("tom", "123", 20, "男"));
    users.add(new User("james", "456", 21, "男"));
    users.add(new User("fox", "789", 26, "男"));
    vs.push(users);
    在页面上获取数据:
    使用了<s:iterator>标签来迭代集合。
    <s:iterator value="[0].top" var="user"> 这是将集合中迭代出来每一个元素起个名称叫user,而user是存储在context中,不在root中.l
    <s:iterator value="[0].top" var="user">
    username:<s:property value="#user.username"/><br>
    password:<s:property value="#user.password"/>
    <hr>
    </s:iterator>
    注意:如果我们在使用<s:iterator>进行迭代时,没有给迭代出的元素起名.
    <s:iterator value="[0].top">
    username:<s:property value="username"/><br>
    password:<s:property value="password"/>
    <hr>
    </s:iterator>
  • デフォルトについてvalueStackは、データにプレス。

    • 1.オブジェクト・アクセス・アクションがvalueStackに押し込まれます。
      • DefaultActionInvocation的INIT方法stack.push(アクション)。
      • アクションあなただけのメンバ変数にデータを保存するために、JSPにデータを渡したい、それがgetメソッドを提供している場合
    • 2.ModelDriveInterceptorは、次の操作を実行します

      ModelDriven modelDriven = (ModelDriven) action;
      ValueStack stack = invocation.getStack();
      Object model = modelDriven.getModel();
      if (model != null) {
      stack.push(model);
      }
      • 戻り値は、モデルのオブジェクトがvalueStackに押し込ま呼んでアクションgetModel方法、でModelDriveインタフェースを実現します。
  • なぜEL式は、データvalueStackにアクセスすることができますか?

    • Struts2の枠組み要求オブジェクトが使用され、リクエストオブジェクトが向上します。
    • ${username}---->request.getAttribute("username");
    • 見つけ、要求、要求する最初のドメイン全体の検索を強化し、そうでない場合は、valueStackに見つかります
    • StrutsPreparedAndExecuteFilterdoFilterコード
    • `リクエスト= prepare.wrapRequest(リクエスト)。
    • 包装Requestオブジェクト、StrutsRequestWrapper
    • 書き換えの要求のgetAttribute

      Object attribute = super.getAttribute(s);
                      if (attribute == null) {
      attribute = stack.findValue(s);
      }
    • データが見つからない場合は、オブジェクトをスタックする能力を評価するために、データ要求スコープにアクセスする場合(データはルートを見つけるために)アクセスに値スタックデータを要求を見つけなければなりません

三、OGNL共通シンボリック式

3.1 #号

  • 使い方まず、#ActionContext.getContextの代わりに()コンテキスト

    
    <s:property value="#request.name" />   ActionContext().getContext().getRequest().get("name");
    #request
    #session
    #application
    #attr
    #parameters
  • 二つの使用法は、値スタック内のルートを見つけるために、#デフォルトを書きません

    <s:property value="name" /> 在root中查找name属性 
    * 查询元素时,从root的栈顶元素 开始查找, 如果访问指定栈中元素   
    <s:property value="[1].name" /> 访问栈中第二个元素name属性
    * 访问第二个元素对象 <s:property value="[1].top" />
  • 使用3、投影マップ(結合複合オブジェクトトラバース)

    1)集合的投影(只输出部分属性
    <h1>遍历集合只要name属性</h1>
    <s:iterator value="products.{name}" var="pname">
    <s:property value="#pname"/>
    </s:iterator>
    2)遍历时,对数据设置条件
    <h1>遍历集合只要price大于1500商品</h1>
    <s:iterator value="products.{?#this.price>1500}" var="product">
    <s:property value="#product.name"/> --- <s:property value="#product.price"/>
    </s:iterator>
    3)综合
    <h1>只显示价格大于1500 商品名称</h1>
    <s:iterator value="products.{?#this.price>1500}.{name}" var="pname">
    <s:property value="#pname"/>
    </s:iterator>
  • 建設マップコレクション#の使用法

经常结合 struts2 标签用来生成 select、checkbox、radio
<h1>使用#构造map集合 遍历</h1>
<s:iterator value="#{'name':'aaa','age':'20', 'hobby':'sport' }" var="entry">
key : <s:property value="#entry.key"/> , value:  <s:property value="#entry.value"/> <br/>
</s:iterator>

3.2 %号

  • いくつかの属性値のラベルは自動的に、OGNL式を解析します
  • そのようなものとして <s:property value="表达式" />
  • しかし、いくつかのラベルが自動的に解析されません
  • 例えば:<s:textfild value="表达式"/>
  • %は処置:現在は、あなたがOGNL式として、それを解決するかどうかを設定するために使用されます。

  • %{表达式} 現在の表現としてOGNLは解決されます。

  • %{'表达式'} 現在の表現としてOGNLは解決されません。

3.3 $号

  • $役割:OGNLデータvalueStackを取得するために、構成ファイル内の式の使用です。
  • 1.struts.xml

    <result type="stream">
    <param name="contentType">${contentType}</param>
    </result>
    (在Action中有一个getContentType() 方法)此处在上传文件的地方有讲解
  • 2.チェックサムファイル

    ${min}  ${max}
    ${minLength} ${maxLength}
    
  • 3.国際化ファイル

    在properties文件中
    username=${#request.username}
    在jsp页面
    <s:text name="username">
  • 概要:#%がOGNL式は設定ファイルに$ OGNLを使用するかどうかを設定するために使用されたデータを取得するために使用されます。

1.valueStack内部構造
1.valueStack内部構造

デフォルトプッシュモデルの分析に関しては2
デフォルトプッシュモデルの分析に関しては2

3.について分析valuestackのモデルにプレス - 強化されました -
3.について分析valuestackのモデルにプレス - 強化されました -

4.関連valueStackの構造解析
4.関連valueStackの構造解析

おすすめ

転載: www.cnblogs.com/haoworld/p/struts2ognl-yuvaluestack.html