2016-06-25 8 views
1

私は、このサンプルコードがあります。#{flash.keep.message}の式言語でメソッド連鎖はどのように機能しますか?

<h:form> 
    <h:commandButton action="#{fooBar.foo()}" value="Submit"/> 
</h:form> 

と豆で:

@ManagedBean 
@ApplicationScoped 
public class FooBar { 
    public String foo() { 
     final Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); 
     flash.put("message", "Hello World"); 
     return "hello?faces-redirect=true"; 
    } 
} 

し、最終的にhello.xhtml

<h:body> 
    #{flash.keep.message} 
</h:body> 

にだから私はindex.xhtmlに行くが、私はリダイレクトされます、提出ヒット期待どおりhello.xhtmlになります。そして私がページをリフレッシュすると、flash.keepの動作が素晴らしいため、メッセージが表示されます。

今私はdocumentationを開いて何が起こっているのか理解しようとしています。

このクラスにはkeep()メソッドがありますが、戻り値の型はvoidで、Stringパラメータが必要です。したがって#{flash.keep.message}keep()メソッドをメッセージパラメータ?私は本当にそうは思わない、私が知っている限りそれは#{flash.keep(message)}だったはずですね。

ここでは何が起こっていますか?

答えて

1

EL解決はELResolverの実装でカスタマイズできます。 #{flash.keep.message}の評価には2つのELレゾルバが含まれています。最初のJSF組み込みFlashELResolver#{flash}で実行されます。あなたは、そのソースコード(行番号が一致クロサギ科2.2.12)で見ることができるように#{flash.keep}式が評価されたときに

216  // and the property argument is "keep"... 
217  if (property.toString().equals(FLASH_KEEP_VARIABLE_NAME)) 
218  { 
219   elContext.setPropertyResolved(true); 
220   
221   // then this is a request to promote the value 
222   // "property", which is assumed to have been previously 
223   // stored in request scope via the "flash.now" 
224   // expression, to flash scope. 
225   result = base; 
226   // Set a flag so the flash itself can look in the request 
227   // and promote the value to the next request 
228   FlashFactory ff = (FlashFactory) 
229     FactoryFinder.getFactory(FactoryFinder.FLASH_FACTORY); 
230   ff.getFlash(true); 
231   ELFlash.setKeepFlag(facesContext); 
232  } 

FlashELResolverELFlash.setKeepFlag(facesContext)(ライン231)を呼び出します。また、ELコンテキストが次のプロパティで進むことができるように、プロパティを解決済み(219行目)に設定し、(#{flash})を評価結果(225行目)に設定するので、#{flash.keep}は非常に同じ#{flash}オブジェクトを返します。 message性が本質的に依然として#{flash}ある#{flash.keep}の結果、上で評価すべきであるが、「維持」フラグを設定したとき

し、次いで、EL-組み込みMapELResolverが実行されます。これは、#{flash}が本質的にMapであるためです((emphasis mine)も参照してください)。

フラッシュ
はオブジェクト
を地図<文字列、オブジェクト>

これは、(行番号が一致しクロサギ科、以下のようFlashクラスでcustomizedあるMap#get()メソッドを呼び出しを実装して拡張するパブリック抽象クラス2.2.12):

384  public Object get(Object key) { 
385   Object result = null; 
386 
387   FacesContext context = FacesContext.getCurrentInstance(); 
388   if (null != key) { 
389    if (key.equals("keepMessages")) { 
390     result = this.isKeepMessages(); 
391    } else if (key.equals("redirect")) { 
392     result = this.isRedirect(); 
393    } else { 
394     if (isKeepFlagSet(context)) { 
395      result = getPhaseMapForReading().get(key); 
396      keep(key.toString()); 
397      clearKeepFlag(context); 
398      return result; 
399     } 
400 
401    } 
402 
403   } 

396行目にあるように、フラグが設定されている場合はのようにkeep(key)が呼び出されます。

関連する問題