<f:subview vs. <c:if - pytanie
Gabcia85 - 29-03-2007 00:04
<f:subview vs. <c:if - pytanie
Witam,
Zrobilam sobie maly test z warunkiem wyswietlania w JSF, i majac kombinacje <c:if test="${xxx.yyy > 0}"> jakies kolejne warunki </c:if>
<f:subview rendered="#{xxx.zzz == 0}"> jakies kolejne warunki </f:subview>
Czy ktos moze mi wytlumaczyc dlaczego w subview jesli mam warunek rendered to sprawdza mi wewnatrz kolejne podwarunki, a z wykorzystaniem <c:if nie? W aplikacji korzystalamm z myfaces i facelets.
Gabcia85 - 30-03-2007 00:08
Dokładniej chdozi o to ze w c:if jesli warunem pierwszy nie jest spelniony to nie interesuje go to co jest w srodku tylko od razu blokuje wyswietlanie, natomiast <f:subview sprawdza dalej wszystkie warunki... Ano dzieje sie tak bo wywalilo mi blad na stronce z jednym warunkiem w srodku, gdy mialam <f:subview i jakos zaciekawilo mnei to i postanowilam sprawdzic to samo z c:if, ktory nic nie wywalil i skompilowal poprawnie stronke
Jacek Laskowski - 30-03-2007 00:08
Gabcia85 wrote:
> Zrobilam sobie maly test z warunkiem wyswietlania w JSF, > i majac kombinacje > <c:if test="${xxx.yyy > 0}"> > jakies kolejne warunki > </c:if> > > <f:subview rendered="#{xxx.zzz == 0}"> > jakies kolejne warunki > </f:subview> > > Czy ktos moze mi wytlumaczyc dlaczego w subview jesli mam warunek > rendered to sprawdza mi wewnatrz kolejne podwarunki, a z > wykorzystaniem <c:if nie? > W aplikacji korzystalamm z myfaces i facelets.
Za mało danych! Zgaduję, że pracujesz z JSF 1.1 i pewnie mieszasz JSTL z JSF (chociaż z facelets powinno to działać poprawnie?!). Tak, czy owak, zanim padną strzały (prawdopodobnie dużo niecelnych), opisz środowisko - serwer aplikacyjny, biblioteki i wersje, wersje, duuużo wersji ;-)
Jacek
-- Jacek Laskowski http://www.JacekLaskowski.pl
Gabcia85 - 30-03-2007 00:08
JBoss AS 4.0.4, Seam + JSF 1.2 + Facelets
no tak z przyzwyczajenia wstawiłam <c:if'a z JSTL'a, jednak w dalszym ciagu dziwi mnie to ze w <f:subview mimo ze warunek renderowania nie jest spelniony to sprawdza "głębsze" warunki, a c:if nie...moglbys sprobowac u siebie?
=?ISO-8859-2?Q?Marcin_Krzysztof_D=B1browski?= - 05-04-2007 00:05
Mam podobny problem co kolega. A jest on następujący - mam tabelę która może zawierać obiekty kilku różnych typów, raz jest to java bean, a raz jest to tablica. Żeby uniknąć błędów chciałem użyć właściwości rendered komponentów JSF, ale okazuje się, że nie spełnienie tego warunku nie powoduje dalszego wykonywania kodu zawartego w tagu, tylko go próbuje wykonać. Na stronie jsp wygląda to tak:
<h:dataTable value="#{myBean.list}" var="record"> <h:column> <h:panelGroup> <h:outputText value="#{record.rowObject[0]}" rendered="#{not empty record.params['tableRow']}"/> <h:outputText value="#{record.rowObject.name}" rendered="#{empty record.params['tableRow']}"/> <h:panelGroup> </h:column> </h:dataTable>
gdzie *record* jest obiektem mojej klasy, posiadającym dwie właściwości: rowObject (do przechowywania obiekt z wartościami komórek) i mapę params. W mapie params obiektu recordu jest obecny klucz tableRow tylko gdy właściwość rowObject jest tablicą.
No i problem pojawia się podczas przetwarzania elementów listy będących tablicami. Linia <h:outputText value="#{record.rowObject.name}" rendered="#{empty record.params['tableRow']}"/> generuje wyjątek "ReferenceSyntaxException: The "." operator was supplied with an index value of type "java.lang.String" to be applied to a List or array, but that value cannot be converted to an integer.".
No i chyba to dowodzi, że używanie rendered nie zapobiega wykonywaniu tego co jest przypisane do value, a chyba powinno?
Tak mniej więcej wygląda mój problem - a zasadnicze pytanie brzmi jak to obejść? Używam JSF 1.1 implementacja IceFaces, oparta na core od sun. Od razu dodam że muszę używać IceFaces co najwyżej mogę zmienić core na np z MyFaces (ale nie wiem czy to się łatwo robi i czy by to pomogło).
Jakieś propozycje obejścia?
Dąbek
ryszard - 05-04-2007 00:05
> Mam podobny problem co kolega. > A jest on następujący - mam tabelę która może zawierać obiekty kilku > różnych typów, raz jest to java bean, a raz jest to tablica. Żeby > uniknąć błędów chciałem użyć właściwości rendered komponentów JSF, ale > okazuje się, że nie spełnienie tego warunku nie powoduje dalszego > wykonywania kodu zawartego w tagu, tylko go próbuje wykonać. > Na stronie jsp wygląda to tak: > > <h:dataTable value="#{myBean.list}" var="record"> > <h:column> > <h:panelGroup> > <h:outputText value="#{record.rowObject[0]}" rendered="#{not > empty record.params['tableRow']}"/> > <h:outputText value="#{record.rowObject.name}" rendered="#{empty > record.params['tableRow']}"/> > <h:panelGroup> > </h:column> > </h:dataTable> > > gdzie *record* jest obiektem mojej klasy, posiadającym dwie właściwości: > rowObject (do przechowywania obiekt z wartościami komórek) i mapę > params. W mapie params obiektu recordu jest obecny klucz tableRow tylko > gdy właściwość rowObject jest tablicą. > > No i problem pojawia się podczas przetwarzania elementów listy będących > tablicami. Linia <h:outputText value="#{record.rowObject.name}" > rendered="#{empty record.params['tableRow']}"/> generuje wyjątek > "ReferenceSyntaxException: The "." operator was supplied with an index > value of type "java.lang.String" to be applied to a List or array, but > that value cannot be converted to an integer.". > > No i chyba to dowodzi, że używanie rendered nie zapobiega wykonywaniu > tego co jest przypisane do value, a chyba powinno? > > Tak mniej więcej wygląda mój problem - a zasadnicze pytanie brzmi jak to > obejść? > Używam JSF 1.1 implementacja IceFaces, oparta na core od sun. > Od razu dodam że muszę używać IceFaces co najwyżej mogę zmienić core na > np z MyFaces (ale nie wiem czy to się łatwo robi i czy by to pomogło). > > Jakieś propozycje obejścia? > > Dąbek > > chyba troche pokomplikowales, linja #{myBean.list}" var="record" sugeruje ze myBean.getList zwraca liste record-ow z kolej: record.rowObject[0] - mowi ze kazdy rekord ma tablice rowObject-ow (swoja droga nie wiedzialem ze mozna tak wolac tablice) i dalej: record.rowObject.name - znaczy mniej wiecej tyle ze twoj rekord ma (aggregation) rowObject ktory ma name.
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Jacek Laskowski - 06-04-2007 00:03
Marcin Krzysztof Dąbrowski wrote: > Mam podobny problem co kolega.
Tym samym weszliśmy w sezon na problemy ;-)
> A jest on następujący - mam tabelę która może zawierać obiekty kilku > różnych typów, raz jest to java bean, a raz jest to tablica. Żeby > uniknąć błędów chciałem użyć właściwości rendered komponentów JSF, ale > okazuje się, że nie spełnienie tego warunku nie powoduje dalszego > wykonywania kodu zawartego w tagu, tylko go próbuje wykonać.
I dobrze, bo tak powinno być, ponieważ wynika to właściwie z działania samego JSP, na którym oparty jest JSF (to właśnie było siłą JSF, że wykorzystało prostotę i powszechność JSP). Oczywiście poznanie etapów JSF też jest istotne. Sądzę, że temat mógłby być dobrym tematem na 1-godziną prezentację postaram przedstawić go krócej ;-)
Mamy 6 etapów w życiu zlecenia JSF (@see http://java.sun.com/javaee/5/docs/tu...SFIntro8.html). Najpierw odtwarzany jest widok, który był poprzednio (przyjmijmy, że nie istniał, bo jest to pierwsze wejście do aplikacji, chociaż tak na prawdę nie ma to znaczenia). Drugi etap to "Apply Request", czyli przypisywanie parametrów do kontrolek. W naszym przypadku jest to h:outputText. Kontrolka JSF to nic innego jak własny znacznik JSP, który korzysta z infrastuktury JSF. Stąd, więc najpierw tworzony jest egzemplarz kontrolki...znaczy się...znacznika JSP o nazwie outputText z przestrzeni h. Pamiętaj, że to nadal jest JSP - nic z JSF. Teraz przekazywane są parametry do egzemplarza za pomocą metod modyfikujących (ang. setter), tj. wywoływana jest metoda processDecodes(FacesContext context), w której klasa komponentu ustawia odpowiednie właściwości. Zaczynamy schodzić za nisko, aby zmieścić się w wyznaczonym czasie, więc wystarczy pamiętać, że wartości muszą zostać "rozwiązane" (przy pomocy odpowiednich metod UIComponent i podobnych) i są rozwiązywane w tym etapie - etapie 2 o nazwie "Apply Request". Wywoływane są kolejne etapy, aż do upragnionego "Render Response". W nim tworzone jest drzewo JSF i wtedy dopiero kontrolka odpytywana jest, czy się wyświetli czy nie. Należy pamiętać, że to w gestii kontrolki jest decyzja, czy się wyświetli, czy nie - cudów nie ma. Oczywiście "standardem" jest zakładać, że rendered jest zarezerwowane dla umożliwienia włączania/wyłączania kontrolki, ale tak nie musi być. Możesz stworzyć własną kontrolkę, która atrybut rendered wykorzysta do czego innego. Twój wybór jako autora kontrolki (najwyżej mniej osób z niego skorzysta przyzwyczajonych do konwencji).
Podsumowując wartość są rozwiązywane zanim rendered dojdzie do głosu.
> No i chyba to dowodzi, że używanie rendered nie zapobiega wykonywaniu > tego co jest przypisane do value, a chyba powinno?
Tak. Patrz (przydługi) opis wyżej.
> Tak mniej więcej wygląda mój problem - a zasadnicze pytanie brzmi jak to > obejść?
Prosto! ;-) Korzystasz z własnego DataModel. I tu mógłbym się rozpisać, ale proponuję zajrzeć do mojego artykułu Tabele w JavaServer Faces - znacznik <h:dataTable> - http://www.jaceklaskowski.pl/wiki/Ta...h:dataTable%3E
Witaj w świecie JSF! (pamiętaj, że JSF ułatwi Ci pracę, jeśli zrozumiesz jego działanie. Ot taki paradoks).
Jacek
-- Jacek Laskowski http://www.JacekLaskowski.pl
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[OT?] Monitory dla =?ISO-8859-2?Q?grafik=F3w_-_pytanie_o_?==?ISO-8859-2?Q?przej=B6ci=F3wki?=
=?ISO-8859-2?Q?kr=F3tkie_pytanie_-_gdzie_forum_grafik=F3?==?ISO-8859-2?Q?w_=28Corel_Painter=29_=3F?=
Pytanie -Papier Nalepka - =?ISO-8859-2?Q?p=B3ytka_w_kszta=B3?==?ISO-8859-2?Q?cie_wizyt=F3wki?=
[oracle] =?ISO-8859-2?Q?zmia=BFd=BFony_przez_problem=3A_za?==?ISO-8859-2?Q?pytanie_do_hierarchi?=
Pytanie o =?ISO-8859-2?Q?kas=EA=2E=2E=2E?=
pytanie o zapytanie z having count = count z innej kolumny
=?iso-8859-2?q?Kr=F3tkie_pytanie_-_PostgreSQL_8=2E2=2E2_i_CREATE_ASSERTION?=
=?iso-8859-2?q?Pytanie_SQL__spe=B3niaj=B1ce_wiecej_jak_jeden_ warunek_na_jednej_kolumnie=2E?=
CA nr 1/2007 - pytanie do tych co =?ISO-8859-2?Q?maj=B1?= ten numer
Re: MS SQL 2000 - Wadliwy optymalizator? (dlugie pytanie...)
zanotowane.pldoc.pisz.plpdf.pisz.plabsolwenci.keep.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|