Jakie są różnice między $ {} a # {}?

80

Programuję w JSF2, a NetBeans tworzy wiele stron z #{} zawierających wyrażenie. Jednak czasami w sieci znalazłem ${}to samo!

Czy są jakieś różnice? Czym oni są?

Filippo1980
źródło

Odpowiedzi:

91
  • #{}są przeznaczone dla odroczonych wyrażeń (są rozwiązywane w zależności od cyklu życia strony) i mogą być używane do odczytu lub zapisu z lub do komponentu bean lub do wywołania metody .
  • ${}są wyrażeniami do natychmiastowego rozwiązania , gdy tylko zostaną napotkane, zostaną rozwiązane. Są tylko do odczytu.

Możesz przeczytać więcej tutaj: http://docs.oracle.com/javaee/6/tutorial/doc/bnahr.html

Fortunato
źródło
12

Wyszukiwanie w Google hasła „Java Server Faces dolar funt” dało następujący wynik na podstawie często zadawanych pytań dotyczących języka wyrażeń JBoss :

Dlaczego niektóre wyrażenia zaczynają się od funta, a inne od znaku dolara?

W samej specyfikacji EL nie ma różnicy. To od technologii używającej EL zależy, co to oznacza. Zarówno w przypadku JSP, jak i JSF wyrażenia rozpoczynające się od znaku funta oznaczają odroczoną ocenę, a znak dolara oznacza ocenę natychmiastową . Wszystko to ma związek z tym, kiedy wyrażenie zostanie faktycznie ocenione podczas przetwarzania żądania. Znak funta jest używany w komponentach JSF, ponieważ chcemy, aby wyrażenie było oceniane przez cykl życia JSF, a nie przez silnik JSP lub Facelets.

Jean Hominal
źródło
1
@ jean hominal: dziękuję za odpowiedź ... tak jak pisałem, próbowałem wyszukiwać za pomocą znaków $ i # i to nie zadziałało ... jakkolwiek nie wiedziałem, że nazywasz # „funt”! Dziękuję również za te informacje!
Filippo1980,
9

To dobre pytanie! Kiedyś się z tym zmierzyłem i podobnie jak Ty miałem duży problem ze znalezieniem odpowiedzi ... dopóki nie natknąłem się na ten fragment dokumentacji :

Jedną z kluczowych cech ujednoliconego EL jest obsługa zarówno natychmiastowej, jak i odroczonej oceny wyrażeń. Natychmiastowa ocena oznacza, że ​​aparat JSP ocenia wyrażenie i zwraca wynik natychmiast po pierwszym renderowaniu strony. Ocena odroczona oznacza, że ​​technologia używająca języka wyrażeń może wykorzystywać własne mechanizmy do oceny wyrażenia później w trakcie cyklu życia strony, jeśli jest to właściwe. Te wyrażenia, które są obliczane natychmiast, używają składni $ {}, która została wprowadzona w języku wyrażeń JSP 2.0. Wyrażenia, których ocena jest odroczona, używają składni # {}, która została wprowadzona w technologii JavaServer Faces.

Óscar López
źródło
5

Dokumentacja Java zawiera następujące wyjaśnienia:

$ {customer.name}
# {customer.name} W przypadku technologii JavaServer Faces, wyrażenie drugiego znacznika jest oceniane natychmiast po pierwszym żądaniu strony. W tym przypadku to wyrażenie działa jako wyrażenie r-wartości. Podczas żądania ogłaszania zwrotnego tego wyrażenia można użyć do ustawienia wartości właściwości name za pomocą danych wejściowych użytkownika. W tym przypadku wyrażenie działa jak wyrażenie lwartości.

Pierwsza z nich używa składni oceny natychmiastowej, podczas gdy druga używa składni oceny odroczonej. Pierwsze wyrażenie uzyskuje dostęp do właściwości name, pobiera jej wartość, dodaje wartość do odpowiedzi i jest renderowane na stronie. To samo może się zdarzyć z drugim wyrażeniem. Jednak program obsługi znacznika może odroczyć ocenę tego wyrażenia na późniejszy czas w cyklu życia strony, jeśli pozwala na to technologia wykorzystująca ten znacznik.

Przeczytaj więcej tutaj: wyrażenia wartości

Chris
źródło