[ Pobierz całość w formacie PDF ]
6. import java.util.Arrays;
7. import java.util.Collections;
8.
9. import javax.inject.Named;
10. // lub import javax.faces.bean.ManagedBean;
11. import javax.enterprise.context.SessionScoped;
12. // lub import javax.faces.bean.SessionScoped;
13.
14. @Named // lub @ManagedBean
15. @SessionScoped
16. public class QuizBean implements Serializable {
17. private int currentProblem;
18. private int tries;
19. private int score;
20. private String response = "";
21. private String correctAnswer;
22.
23. // Poni ej zakodowano problemy na sta e. W rzeczywistej aplikacji
24. // najprawdopodobniej odczytywaliby my je z bazy danych.
25. private ArrayList problems = new ArrayList(Arrays.asList(
26. new Problem(
27. "Jaki slogan reklamowa programowanie w Javie? Write once, ...",
28. "run anywhere"),
29. new Problem(
30. "Jak wygl daj 4 pierwsze bajty ka dego pliku klasy (szesnastkowo)?",
31. "CAFEBABE"),
32. new Problem(
33. "Co zostanie wy wietlone przez to wyra enie? System.out.println(1+\"2\");",
34. "12"),
35. new Problem(
36. "Które s owo kluczowe Javy s u y do definiowania podklasy?",
37. "extends"),
38. new Problem(
39. "Jak brzmia a oryginalna nazwa j zyka programowania Java?",
40. "Oak"),
88 JavaServer Faces
41. new Problem(
42. "Która klasa pakietu java.util opisuje punkt w czasie?",
43. "Date")));
44.
45. public String getQuestion() { return problems.get(currentProblem).getQuestion(); }
46.
47. public String getAnswer() { return correctAnswer; }
48.
49. public int getScore() { return score; }
50.
51. public String getResponse() { return response; }
52. public void setResponse(String newValue) { response = newValue; }
53.
54. public String answerAction() {
55. tries++;
56. if (problems.get(currentProblem).isCorrect(response)) {
57. score++;
58. nextProblem();
59. if (currentProblem == problems.size()) return "done";
60. else return "success";
61. }
62. else if (tries == 1) return "again";
63. else {
64. nextProblem();
65. if (currentProblem == problems.size()) return "done";
66. else return "failure";
67. }
68. }
69.
70. public String startOverAction() {
71. Collections.shuffle(problems);
72. currentProblem = 0;
73. score = 0;
74. tries = 0;
75. response = "";
76. return "startOver";
77. }
78.
79. private void nextProblem() {
80. correctAnswer = problems.get(currentProblem).getAnswer();
81. currentProblem++;
82. tries = 0;
83. response = "";
84. }
85. }
W analizowanym przyk adzie w a nie klasa QuizBean jest w a ciwym miejscem dla metod
odpowiedzialnych za nawigacj . Wspomniany komponent dysponuje pe n wiedz o dzia a-
niach u ytkownika i mo e bez trudu okre li , która strona powinna by wy wietlona jako
nast pna.
Logik nawigacji zaimplementowano w metodzie answerAction klasy QuizBean. Metoda
answerAction zwraca jeden z kilku mo liwych a cuchów: "success" lub "done" (je li u yt-
kownik prawid owo odpowiedzia na pytanie), "again" (je li u ytkownik po raz pierwszy
udzieli b dnej odpowiedzi) oraz "failure" lub "done" (je li po raz drugi pad a z a odpowied ).
Rozdzia 3. Nawigacja 89
public String answerAction() {
tries++;
if (problems.get(currentProblem).isCorrect(response)) {
score++;
nextProblem();
if (currentProblem == problems.size()) return "done";
else return "success";
}
else if (tries == 1) return "again";
else {
nextProblem();
if (currentProblem == problems.size()) return "done";
else return "failure";
}
}
Z przyciskami na ka dej z tych stron wi emy wyra enie odwo uj ce si do metody answer
Action. Na przyk ad strona index.xhtml zawiera nast puj cy element:
Na rysunku 3.5 przedstawiono struktur katalogów naszej aplikacji. Na listingu 3.3 przed-
stawiono kod strony g ównej aplikacji quizu: index.xhtml. Kodem stron success.xhtml i failure.
xhtml nie b dziemy si zajmowa , poniewa ró ni si od kodu strony index.xhtml tylko
komunikatem wy wietlanym w górnej cz ci.
Rysunek 3.5.
Struktura
katalogów
aplikacji quizu
o Javie
Listing 3.3. Kod strony javaquiz/web/index.xhtml
1.
2.
3. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4.
5. xmlns:h="http://java.sun.com/jsf/html">
6.
7. #{msgs.title}
8.
90 JavaServer Faces
9.
10.
11. #{quizBean.question}
12.
13.
14.
15. action="#{quizBean.answerAction}"/>
16.
17.
18.
19.
Strona done.xhtml, której kod przedstawiono na listingu 3.4, prezentuje u ytkownikowi
ostateczny wynik i zach ca go do ponownej gry. Warto zwróci uwag na jedyny przycisk
[ Pobierz całość w formacie PDF ]