Problem w korzystaniu z Ajaxa Primefaces, setter nie jest wywoływany.

Problem w korzystaniu z Ajaxa Primefaces, setter nie jest wywoływany.
SE
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:9
0

Witam,

Mam mały problem podczas korzystania z JSF - Primefaces pierwszy przykład ze strony primefaces poniżej, sparwił mi wiele kłopotów i do dnia dzisiejszego nie znam sposobu by działał poprawnie. Mianowicie nie jest wywoływany setter i zmienna firstname nie jest ustawiany i nie znam przyczyny tego dziwnego przypadku:

Kopiuj
 
	<h:form id="form" prependId="false">

		<p:panel header="New Person">
			<h:panelGrid columns="3">
				<p:inputText id="firstname" value="#{personBean.firstname}" />
				<p:commandButton value="Start" update="display" />
				<h:outputText id="display" value="#{personBean.firstname}" />
			</h:panelGrid>
		</p:panel>

	</h:form>

Tutaj mam Beana:

Kopiuj
@ManagedBean
@RequestScoped
public class PersonBean implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

    private String firstname;
    
    
  
    public String getFirstname() {
            return firstname;
    }
    public void setFirstname(String firstname) {
            this.firstname = firstname;
    }

}

Z tego co zauważyłem podczas debugowania kodu, wchodzi mi do gettera ale settera ni jak nie wywołuje. stosowałem już różnych sposobów np atrybutu ajaxlistener, znacznika <p:ajax> i wszędzie jest tak samo setter nie jest wywoływany i pole firstname ciągle jest nullem. Próbowałem też ustawić @ViewScoped ale to też nie pomogło. Czy ktoś zna przyczynę tego dziwnego działania?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

A jak zrobisz SessionScoped? Bo przecież RequestScoped oznacza że po przeładowaniu strony dane ci "znikną"


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
SE
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:9
0

To samo się dzieje. Raz mi tylko wszedł w settera i oczywiście dalej pole było nullem gdy napisałem tak jak poniżej:

Kopiuj
 
@ManagedBean
@SessionScoped
public class PersonBean implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value="firstname")
    private String firstname;
    
    
    private String surname;
  
    public String getFirstname() {
            return firstname;
    }
    public void setFirstname(String firstname) {
            this.firstname = firstname;
    }

    
}

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

Trudno mi w to uwierzyć ;] Możesz gdzieś wrzucić fragment projektu tak żeby można było sobie to odpalić lokalnie i zobaczyć?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
SE
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:9
0

Oczywiście na mejla mogę Ci podesłać - nie ma problemu.

MW
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:307
0

nie uzywalem primeface ale przyczyna moze byc bardzo prosta. Przy wykonywaniu ajaxu wybrane komponenty sa wykonywane w JSF Lifecycle. Ty, nie zdefiniowales takich i nie bedzie wykonany zaden setter na komponent typu EditableValueHolder, co w twoim przypadku jest inputText.

Kopiuj
<p:inputText id="firstname" value="#{personBean.firstname}" />
<p:commandButton value="Start" update="display" />
<h:outputText id="display" value="#{personBean.firstname}" />
  1. Zdefiniuj actionListener do commandButton
  2. zmien update="display" process="firstname"
    Nie wiem czy to w 100% zadziala, ale z nazewnictwa atrybutow wynika ze powinno. przeczytaj dokumentacje Primefaces -> commandButton i poprobuj.

W jsf bym to zrobil tak:

Kopiuj
<h:commandButton >
    <f:ajax render="display" execute="@this firstname" />
</h:commandButton>

albo bardziej ogolniej (pewniej, bo w niektorych przypadkach moze niezadzialac. Implementacja Mojarry ma pare BUGs, np. jesli uzywasz commandButton w ui:repeat i to nie jest jedyny mi znany BUG)

Kopiuj
<h:commandButton >
    <f:ajax render="@form" execute="@form" />
</h:commandButton>

Tylko te elementy z id co stoja w execute beda wykonane. Ty id dla input nie zdefiniowales w commanButton. Nic dziwnego wiec ze nie zostal setter wykonany.

Scope nie ma w tym nic najmniejszego do czynienia. ManagedBean ktory jest jako RequestScoped w JSF 2.0 definiowany jest juz po nastepnym wywolaniu ajax tworzony od nowa, a nie po przeladowaniu strony. Zeby temu zapobiedz, trzeba uzyc ViewScope.

edytowany 4x, ostatnio: mwili
SE
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:9
0

Niestety ten poniższy przykład nie działa

Kopiuj
 
	<h:form id="formTest">

		<h:panelGrid columns="4" cellpadding="5">
			<h:outputLabel for="name" value="Name:" style="font-weight:bold" />

			<h:inputText id="firstname" value="#{testBean.firstname}" />

			<h:commandButton value="Submit" process="firstname"  >
 				<f:ajax render="display" execute="@this firstname" />
 			</h:commandButton>
			<h:outputText value="#{testBean.firstname}" id="display" />
		</h:panelGrid>

	</h:form>

Natomiast zmieniając wartości w atrybutach elementu <f:ajax> na poniższe:

Kopiuj
 
<f:ajax render="@form" execute="@form" />

pojawił mi się jeden warning:
2012-03-06 13:41:25 com.sun.faces.renderkit.html_basic.HtmlBasicRenderer getForComponent
WARNING: Unable to find component with ID name in view.

Jedno mnie zastanawia na stronie primefaces jest przykład, który powinien działać, ponieważ symulacja na stronie działa prawidłowo a kod przedstawia się następująco:

Kopiuj
 
<h:form>  
                              
    <h:panelGrid columns="4" cellpadding="5">  
        <h:outputLabel for="name" value="Name:" style="font-weight:bold"/>  
          
        <p:inputText id="name" value="#{pprBean.firstname}" />  
          
        <p:commandButton value="Submit" update="display"/>  
  
        <h:outputText value="#{pprBean.firstname}" id="display" />  
    </h:panelGrid>  
      
</h:form>  

Następnie podane są gettery i settery w Bean i to teoretycznie powinno działać bez zarzutu. Problem może tkwić w mojej konfiguracji, ponieważ używam dispatchera w springu, który ma zdefiniowane kontrolery oraz jak ma renderować jsf

Kopiuj
 
	<bean id="indexController" class="pl.test.controller.IndexController" />
	<bean id="testController" class="pl.test.controller.TestController" />

	<bean id="urlMapping"
		class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/index.xhtml">indexController</prop>
				<prop key="/test.xhtml">testController</prop>
			</props>
		</property>
	</bean>

	<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="cache" value="false" />
		<property name="viewClass" value="org.springframework.faces.mvc.JsfView" />
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".xhtml" />
	</bean>

Może tu tkwi jakiś problem?

MW
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:307
0

<h:outputLabel for="name" value="Name:" style="font-weight:bold" />
w atrybucie for stoi ID elementu do ktorego ten element definiujesz, dlatego pojawia cie sie warning.

nie ma takiego atrybutu process dla h:commandButton

to musi dzialac. Poprawny kod by wygladal tak:

Kopiuj
 <h:panelGrid columns="4" cellpadding="5">
                        <h:outputLabel for="firstname" value="Name:" style="font-weight:bold" />
                        <h:inputText id="firstname" value="#{testBean.firstname}" />
                        <h:commandButton value="Submit" actionListener="#{testBean.executeAction}"  >
                                 <f:ajax render="display" execute="@this firstname" />
                         </h:commandButton>
                        <h:outputText value="#{testBean.firstname}" id="display" />
                </h:panelGrid>

TestBean.java

Kopiuj
@ManagedBean
@ViewScoped
public class TestBean {
        private String firstname;
       public void executeAction(ActionEvent e){
	}

	public String getFirstname() {
		return firstname;
	}

	public void setFirstname(String firstname) {
		this.firstname = firstname;
	}
}

Testowalem to jeszcze dla pewnosci i dziala.

ps. nie musisz uzywac w tym przypadku h:panelGrid komponentu. h:panelGrid buduje tabele i w kazda komorke td wstawia jak leci po kolei zawarte elementy. W twoim przypadku jest to jeden rzad skladajacy sie z inline elementow, wiec bez h:panelGrid beda obok siebie ustawione.

edytowany 2x, ostatnio: mwili
SE
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:9
0

Niestety dalej nie wchodzi do settera i nie ustawia zmiennej, wykonywany jest tylko getter i na tym koniec. Coś musi być w plikach konfiguracyjnych nie tak, w pliku faces-config.xml mam:

Kopiuj
 
	<application>
		<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
	</application>

Urywek logów debug i trace, nie ma żadnych błędów:

Kopiuj
 
2012-03-06 16:55:21,987 DEBUG [org.springframework.faces.support.RequestLoggingPhaseListener] - Entering JSF Phase: RESTORE_VIEW 1
2012-03-06 16:55:21,988 DEBUG [org.springframework.faces.mvc.JsfView] - Asking faces lifecycle to render
2012-03-06 16:55:21,988 DEBUG [org.springframework.faces.support.RequestLoggingPhaseListener] - Entering JSF Phase: RENDER_RESPONSE 6
2012-03-06 16:55:26,192 DEBUG [org.springframework.faces.mvc.JsfView] - View rendering complete
2012-03-06 16:55:26,192 DEBUG [org.springframework.web.servlet.DispatcherServlet] - Successfully completed request

Masz szczęście, że u Ciebie działa nie wiem co jest, że u mnie to nie działa. Mam jsf-api-2.1.7.jar i jsf-impl-2.1.7 próbowałem też z wersją 2.0.8 i to samo.

edytowany 1x, ostatnio: sebekpro
MW
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:307
0

sprobuj zminimalizowac twoja aplikacje. Bez dodatkowych rzeczy. Usun te ustawienie el-resolver w faces-config.xml. Nigdy jeszcze mi sie nie zdazylo zebym musial to ustawiac. W moim testowym projekcie (server - tomcat 7) mam tylko dwie biblioteki JSF (jsf-api, jsf-impl), test.xhtml i pusty faces-config.xml. To wszystko.

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

@mwili el-resolver nic nie psuje, on tylko sprawia że można używać Springowych beanów tak samo jak managed beanów.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
MW
niech sobie integruje springa z jsf. chodzi o to, zeby zaczal od bardzo prostej aplikacji i w trakcie jej rozbudowy (dodajac miedy innymi ten el-resolver) doszedl , w ktorym momencie zaczyna wystepowac ten problem. Troche to heurystycznie, ale czasami pomaga.
SE
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:9
0

<el-resolwer> rzeczywiście niczego nie psuje, czy z nim czy bez niego to nie zmienia faktu, że nie wchodzi w settera i nie potrafię go zmusić, żeby wchodził. Problem może leżeć po stronie dispatchera, bo mam zdefiniowanego i pewnie po wejściu do kontrolera później dopiero do Beana może to powodować jakieś problemy. Nie mam innego pomysłu co może jeszcze powodować tutaj problem.

SE
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 13 lat
  • Postów:9
0

Problemem tego, że nie wchodzi do settera może być renderowanie strony przez klasy springowe:

Kopiuj
 
	<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="cache" value="false" />
		<property name="viewClass" value="org.springframework.faces.mvc.JsfView" />
		<property name="prefix" value="/WEB-INF/views/" />
		<property name="suffix" value=".xhtml" />
	</bean>

Zauważyłem, że w atrybucie action formularza dodawany jest prefix czyli "/WEB-INF/views/" przy kolejnym wywołaniu formularza ponownie dodawany jest prefix i to, że zmapowałem w web.xml ten prefix "/WEB-INF/views/" to już następne dodanie "/WEB-INF/views/WEB-INF/views/" jest błędem, który uniemożliwia poprawne działanie formularza. Czy może wie ktoś co jest tego przyczyną i czy może to mieć wpływ na brak wywołania settera właśnie to renderowanie?

0

Właściwie to chciałem się podzielić pewną refleksją na temat PrimeFaces. Otóż programowaniem zajmuje się od 12 lat i w ciągu tych 12 lat nigdy nie spotkałem softu o takiej ilości krytycznych błędów. Ilość błędów w PrimeFaces jest po prostu niewiarygodna. Wygląda na to, że twórca nawet nie zadaje sobie trudu aby przetestować własne dzieło. Mało tego, chwali się co trochę, że ilość wpisów na forum przekracza kolejne dziesiątki tysięcy wpisów. Ciekawe czy choć przez chwilę zastanowił się nad faktem, że ilość wpisów na forum świadczy o ilości problemów jakie mają programiści z jego dziełem. Na dodatek jest on arogancki i myśli, że stworzył najlepszy projekt świata. Z pewnością jest to produkt z największą ilością błędów na świecie. Totalny brak profesjonalizmu

MW
  • Rejestracja:ponad 16 lat
  • Ostatnio:ponad 9 lat
  • Postów:307
0

W pracy uzywamy IceFaces i za czasow wersji 1.8.2 byl to jeden z najlepszych rozwiazan dopasowanych do naszych zastosowan. Tu wchodzily jeszcze wzgldedy strategiczne i polityczne w gre. IceFaces od wersji 3.0 to doslownie porazka. Placimy duzo kasy na support i do tego IceFaces od wersji 3.0 uzywa kodu od Primefaces. Chcemy przejsc na Primefaces i jak na razie na zadne powazne Bugi sie nie natknelismy (to byly proste testy). Mowie tu o najnowszej wersji Primefaces i nie o wersji 2.x, bo ona byla rzeczywscie z bledami.
Interesowalo by mnie bardzo z jakimi krytycznymi bledami spotkales sie w Primefaces 3.x ??

edytowany 1x, ostatnio: mwili
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)