JSP2.1と統合式言語


JSP2.1の新しいプロパティ1、新しい統一式言語で、式が評価を延期することを許可し、式は値を取ることも値を与えることもできるし、方法を呼び出すこともできる.2、注釈によって資源注入を実現することができ、資源または外部オブジェクトへのアクセスを簡略化することができる.たとえばJNDIオブジェクトにアクセスします.3、JSFタグとJSPの実現を統一し、統一表現言語に基づいている.統一式言語1、通常のJSPアプリケーションでは、要求処理モデルはページレンダリングという1段階しかないので、式はすぐに応答responseに値を返すことができます.また、式はバックグラウンドオブジェクトから値を取って表示するだけです.JSPの式言語は「$」で始まる.2、JSFでは要求処理モデルが6段階に分解され、各段階で式が使用される可能性があるため、式に延期評価のサポートが求められる.すなわち、異なるフェーズで式言語で特定のオブジェクトにアクセスできます.ユーザはインタフェースにコンテンツを入力しpostback中にサーバ側のオブジェクトに割り当てるため、式に値付与機能が必要です.また、データの検証とイベントの処理には、バックグラウンドでbeanを管理する方法が必要であるため、式はメソッド呼び出しをサポートする必要があります.JSF式言語は「#」で始まる.そのため、JSPとJSFは式言語の使用と要求が異なるため、両者が一緒にうまく協力して使用できないこともあります.例えば、以下の応用:
    <c:forEach var="location" items="${handler.locations}">
      <h:inputText value="#{location}"/>
    </c:forEach>
 
変数「location」は反復フェーズでのみ使用できますが、postback中はアクセスできません.JSPとJSFで式言語が一致しないという問題を解決するために,統一式言語が出現した.上記の問題は、次の方法で解決できます.
<c:forEach var="location" items="#{locations}">
      <h:inputText value="#{location}"/>
    </c:forEach>
 
統一式言語の特性:1、評価を延期します.2、オブジェクトから値を得ることも、オブジェクトに値を与えることもできます.3、メソッド式をサポートし、呼び出しメソッドを使用してJSF UIcompnent検証、イベント処理、その他の機能を実現できる.4、柔軟な拡張メカニズムは新しい式の評価方法の実現を実現する.JSP2.1で式言語を使う1、JSPでテンプレートテキストで${expr}しか使えない、次の使用は不正
……………………………
<body>
   Hellow #{userName}
……………………………

 
2、#{expr}はラベル属性でのみ使用できます.ラベルのtldファイルで指定されているJSPバージョンが2.1以前(JSF 1.1のラベルなど)の場合、すると「#{」は文字列テキストに解析されます.これらのラベルは式を自分で処理するからです.JSPバージョンが2.1の場合、「#{」は延期式に解析されますが、tld属性に延期評価をサポートする値が明記されていない場合(タグを使用)、変換段でエラーが報告されます.3、JSP 2.1の前に「#{」構文は処理されません.だからJSP 2に基づいて.1以前に作成したページはJSP 2をサポートする.1の容器で運転する場合、正常に動作することを保証するために、2つの方法があります.1、「#」の前に「」をつける.2、web.xmlで追加
<jsp-property-group>
  <deferred-syntax-allowed-as-literal>
    true
  </deferred-syntax-allowed-as-literal>
</jsp-property-group>
 
またはJSPに「<%@page...deferredSyntaxAllowedAsLiteral="true"%>例えばtest.jspには次のコードがあります.
……………………………
<body>
   Hellow #{userName}
……………………………
 
jsp 2を実装.1仕様以前のコンテナでは正常に動作しますが、#{username}は文字列のテキスト値として直接表示されます.jsp 2を実装.1仕様のコンテナで、
……………………………
<body>
   Hellow  \#{userName}
……………………………
 
または
<%@  deferredSyntaxAllowedAsLiteral="true"%>
……………………………
<body>
   Hellow  #{userName}
……………………………
 
注意:#{username}は文字のテキスト値表示のみとなり、評価は行われません.