Home > Polish > Nawigacja w T5 part II

Nawigacja w T5 part II

Umiemy już przemieszczać się pomiędzy stronami oraz zatrzymywać ich stan. Czas więc pomyśleć o przekazywaniu wartości pomiędzy różnymi stronami. Przykład? W każdej aplikacji się znajdzie, od wypełnienia przelewu po nasz: stronę z wynikiem naszej gry (BTW sam pomysł na guess game wziąłem z oficjalnego tutoriala Tapestry).

No to zdefiniujmy nasze nowe wymaganie. Grający po kliknięciu w link z liczbą ma zostać przeniesiony na stronę z wynikiem. Jeśli poprawnie wytypował liczbę to system ma go o tym powiadomić oraz umożliwić powrót na stronę z grą, by mógł zacząć grać od nowa. Jeśli wytypował niepoprawnie, to ma zostać o tym poinformowany oraz ma być mu wyświetlony link pozwalający grać dalej. Use case prosty. Zaczynamy kodzić :) Na początek stwórzmy stronę z wynikiem (kod tml-owy pomijam, jako że wszystko do javy wsadzę, a  jak linki się tworzy i wypisuje wartości to każdy już wie). Na stronie wyniku wstawiamy trzy property: int playerGuess, boolean correctAnswer; Pierwsza własność będzie nam potrzebna do wyświetlenia na ekranie wyboru osoby grającej, druga oznaczać będzie tylko czy to co user podał jest prawidłowe czy nie. Do tego mam 2 stringi do wyświetlenia graczowi odpowiedniego komunikatu i odpowiedniej wartości linka. Na pierwotnej stornie dodajemy następujące pole: @InjectPage private GuessResult resultPage;
Zacznijmy od tego najmniej użytecznego sposobu ;) GuessGame.java modyfikujemy w następujący sposób.

Object onActionFromGuess(int guess) {
	final boolean isCorrectAnswer = numberToGuess == guess;
	resultPage.setCorrectAnswer(isCorrectAnswer);
	resultPage.setPlayerGuess(guess);
	return resultPage;
}
void reset() {
	numberToGuess = new Random().nextInt(10) + 1; //Przeniesiony z setupRender który teraz wywołuje tą metodę
}

Na stronie wyników umieszczamy poza getterami i setterami następujący fragment:

@InjectPage private GuessGame gamePage;

void onActivate(int playerGuess, boolean correctAnswer) {
	this.playerGuess = playerGuess;
	this.correctAnswer = correctAnswer;
	resultMessage = correctAnswer ? "That is correct answer" : "That is not correct answer";
	linkMessage = correctAnswer ? "Want to play again?" : "Please try again";
}

Object[] onPassivate() {
	return new Object[] { playerGuess, correctAnswer };
}

Object onActionFromBackToGuessGame() {
	if (correctAnswer) {
		gamePage.reset();
	}
	return gamePage;
}

W ten sposób mamy prostą i czystą nawigację, która jednak trzyma wartości w URLu, co nie bardzo mi pasuję do tej strony, jednak znakomicie mogło by się sprawdzić w wszelakiego rodzaju wizardach, które pozwalają bookmarkować kolejne kroki. Modyfikujemy więc stronę rezultatu dodając adnotację @Persist nad poszczególnymi polami, usuwamy metody onActivate i onPassivate i już mamy czysto w URLu. W zasadzie to prawie. Brak nam jeszcze miejsca, w którym będziemy nasze 2 stringi ustalać i proponuję je umieścić w znanym nam już setupRender(); Przy moich zastosowaniach jest to zawsze wygodne miejsce. Przyjrzyjmy się obu przypadkom trochę bliżej.
Pierwszy oznacza pełną transparentność przekazywanych parametrów, pozwala bookmarkować stronę oraz odwoływać się do niej w prosty sposób z zewnętrznych systemów. Poprzez metodę activate można przyjąć wartości, które połączymy z odpowiednimi polami. Pola te mogą być adnotowane poprzez @Persist co pozwoli połączyć oba sposoby. W ten sposób wykonałem kiedyś dla klienta, prostą integrację z zewnętrznym systemem CRM.
Drugi sposób jest bardzo wygody do przekazywania wartości pomiędzy stronami i określił bym go jako ‘obiektowy’. Nie ma możliwości wstrzyknięcia z zewnątrz danych (przynajmniej ja nie kojarzę takiego sposobu) a Tapestry zajmie się za nas zarządzaniem pamięcią i nie pozwoli by dane przeciekały do kolejnych stron.

Advertisements
Categories: Polish Tags:
  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: