Generalnie nie działa ponieważ:
a) brak jest obsługi parametru lookup w nadpisywanej metodzie doGet w servlecie AutoCompleteServlet.
b) brak jest strony na której miałby być wyświetlony wybrany kompozytor - composer.jsp
Dodatkowo w trakcie tworzenia servleta łatwo pominąć właściwy jego kontekst (trzeba zmienić na /autocomplete) a jeszcze nadto warto zaznaczyć opcję tworzenia "Add information to the deployment descriptor web.xml".
ad a)
if (action.equals("lookup")) {
// put the target composer in the request scope to display
if ((targetId != null) && composers.containsKey(targetId.trim())) {
request.setAttribute("composer", composers.get(targetId));
context.getRequestDispatcher("/composer.jsp").forward(request, response);
}
}
ad b)
<html>
<head>
<title>Composer Information</title>
<link rel="stylesheet" type="text/css" href="stylesheet.css">
</head>
<body>
<table>
<tr>
<th colspan="2">Composer Information</th>
</tr>
<tr>
<td>First Name: </td>
<td>${requestScope.composer.firstName}</td>
</tr>
<tr>
<td>Last Name: </td>
<td>${requestScope.composer.lastName}</td>
</tr>
<tr>
<td>ID: </td>
<td>${requestScope.composer.id}</td>
</tr>
<tr>
<td>Category: </td>
<td>${requestScope.composer.category}</td>
</tr>
</table>
<p>Go back to <a href="index.jsp" class="link">application home</a>.</p>
</body>
</html>
Poza tym kod nie jest najlepszy. Są dwa podejścia - dać w miarę bogaty kod aby uczący mógł "się zapoznać " z możliwościami. Dać kod maksymalnie ubogi, pokazujący jedynie to czego się się uczy, pozwalając później na rozwój. Wydaje się, że przykład ze stron netbeans hołduje tej pierwszej zasadzie, która dobra nie jest bo wydłuża czas asymilacji treści, zupełnie bez potrzeby.
Na początek można sobie skasować zarówno nazwę jak i "akcję" głównego formularza strony index.jsp. I co? I działa ? Hihi - no działa. Więc są to parametry nie wpływające na pracę programu.
Parę słów do treści tutoriala.
index.jsp
Istotne są:
- Dwa elementy "interaktywne".
- Pole wprowadzania danych "complete-field". Pole powiązane jest z funkcją doCompletion() pokazującą tabliczkę z danymi uwzględniającymi wpisany początek.
- Tablica "complete-table". Tablicę tą wypełnia funkcja callback()
- Wywołanie funkcji init() wewnątrz znacznika <body. Funkcja init() wiąże zmienne pliku javascript z polami w dokumencie html.
Podstawowa funkcja wyświetlająca wynik podlisty kompozytorów to powiązana z "complete-field" doCompletion(). Funkcja ta:
a) tworzy "request"
b) tworzy parametry dla niego (są to parametry "action" oraz "id") zapisywane w url podawanym jako parametr otwarcia "requesta". "action" jest tu parametrem stałym, zaś "id" to tekst który użytkownik zdążył wpisać do pola wprowadzania tekstu
c) otwiera "request" podając jako metodę "GET", oraz wcześniej ustalony "url" w którym przekazuje parametry "id" oraz "action".
AutoCompleteServlet
Gdy doComplete wywołuje swój request, jest wywołanie skierowane do pewnego adresu z pewnymi parametrami. Ów adres to "autocomplete", ten sam który wpisany został jako kontekst servletu. Dzięki temu servlet jest wywoływany. Ponieważ przy jego otwarciu wskazano metodę "GET" to wykonywana jest metoda "doGet" servletu. Pobiera ona parametry.
Jeśli akcja jest "complete" to następuje stworzenie stringa w formacie XML z danymi do wyświetlenia jako podpowiedzi kompozytorów. Metoda doGet ma dwa parametry. Jeden to wejście (request), drugi to wyjście (response). W wyniku pracy dla akcji complete następuje ostatecznie zapis na wyjście "response.getWriter().write".
Zapis ten jest odbierany przez funkcję callback() z javascript. gdyż tak był zdefiniowany request otwierany przez doCompletion. callback bierze req.responseXML (odpowiedź z servletu = string sformatowany do XML) i wpisuje go do tabliczki comlete-table. Elementy tej tablicy (imiona i nazwiska kompozytorów) są powiązane z linkami w ten sposób, że ich kliknięcie ponownie kieruje do metody doGet servletu tym razem parametr action jest ustawiony na lookup.
Metoda doGet servletu realizuje drugi z alternatywnych warunków, pierwszy to action.equals.("complete"). W ramach drugiego z warunków servlet tworzy atrybut requestu z danymi kompozytora i przekazuje request stronie composer.jsp
Strona composer.jsp ma możliwość odczytu danych z "requesta" poprzez np. {requestScope.composer.firstName} i te dane publikuje jako wybranego kompozytora.
Brak komentarzy:
Prześlij komentarz