agencja reklamowa wrocław suknie ślubne

Profesjonalna Nauka jazdy Piła Endzi

Nauka jazdy Piła

nauka jazdy Piła

/** Tworzy PrintWriter wysyłający wyjściowe informacje. * Ten obiekt będzie automatycznie opróżniał strumień * wyjściowy w momencie wywołania metody println. */ public static PrintWriter getWriter(Socket s) throws IOException { // drugi argument o wartości true oznacza, że należy // Nauka jazdy prawo jazdy szkoła nauki jazdy w Pile stosować automatyczne opróżnianie strumienia wyjściowego. return(new PrintWriter(s.getOutputStream(), true)) szkoła nauki jazdy Piła } } Rozdział 17. Użycie apletów jako interfejsu użytkownika dla serwletów Formularze HTML przedstawione w rozdziale 16. stanowią prostą lecz nieco ograniczoną metodę pobierania informacji od użytkowników i przesyłania ich do serwletów bądź programów CGI. Od czasu do czasu może się jednak zdarzyć, że konieczne będzie zastosowanie bardziej złożonego interfejsu użytkownika. Aplety dają znacznie większą kontrolę nad wielkością, kolorami oraz czcionką używaną w elementach graficznego interfejsu użytkownika, udostępniają także więcej elementów kontrolnych (suwaki, możliwość rysowania linii, wyświetlania okien,

 

Nauka jazdy prawo jazdy Piła

itp.), dają możliwość śledzenia czynności wykonywanych przy użyciu myszy i klawiatury, pozwalają na tworzenie własnych elementów kontrolnych (tarcz zegarowych, termometrów, ikon prawo jazdy Piła można przeciągać, itp.), a co więcej, pozwalają przesyłać te same informacje podane przez użytkownika do wielu programów działających na serwerze. Te nowe możliwości więżą się jednak z większymi kosztami, gdyż zaprojektowanie i stworzenie interfejsu użytkownika w języku Java wymaga znacznie więcej wysiłku niż stworzenie formularza HTML, zwłaszcza jeśli interfejs ten zawiera wiele, odpowiednio sformatowanego tekstu. A zatem wybór pomiędzy zastosowaniem formularzy HTML bądź apletów, będzie zależał od tworzonej aplikacji. W przypadku formularzy HTML, żądania POST i GET są obsługiwane niemal identycznie — wszystkie elementy kontrolne służące do wprowadzania danych są takie same, a zmienia się wyłącznie wartość atrybutu METHOD elementu FORM. Jednak w przypadku apletów, proces przesyłania danych i obsługi wyników można realizować na trzy różne sposoby. Pierwszy z nich, przedstawiony w podrozdziale 17.1, polega na tym, iż aplet imituje działanie formularza używającego metody GET — czyli aplet przesyła dane a w przeglądarce jest wyświetlana wynikowa strona WWW. Przykład takiego rozwiązania został przedstawiony w podrozdziale 17.2. — „Narzędzie korzystające z wielu serwisów wyszukiwawczych”. W drugiej metodzie, przedstawionej w podrozdziale 17.3, aplet przesyła żądanie GET do serwletu i samemu przetwarza otrzymane wyniki. Przykład wykorzystania tej metody przedstawiłem w podrozdziale 17.4. — „Przeglądarka zapytań wykorzystująca serializację obiektów i tunelowanie HTTP”. Trzeci sposób, przedstawiony w podrozdziale 17.5, polega na tym, iż aplet przesyła do serwletu żądanie POST, a następnie samemu przetwarza otrzymane wyniki. Przykład wykorzystania tego sposobu przedstawiłem w podrozdziale 17.6. — „Aplet przesyłający dane metodą POST”. W końcu, w podrozdziale 17.7, pokażę, że aplet może w ogóle pominąć serwer HTTP i nawiązać bezpośrednią komunikację z programem działającym jako serwer, uruchamianym na tym samym komputerze na prawo jazdy m działa aplet. Omawiając zagadnienia przedstawione w tym rozdziale zakładam, że Czytelnik dysponuje już podstawową wiedzą na temat apletów i koncentruję uwagę na technikach komunikacji z programami działającymi na serwerze. Czytelnicy, którzy nie znają zasad tworzenia apletów, powinni sięgnąć po ogólną książkę poświęconą językowi Java szkoła nauki jazdy Piła taką jak Java 2 dla każdego wydaną przez Wydawnictwo HELION. 17.1 Przesyłanie danych metodą GET i wyświetlanie wynikowej strony WWW Metoda showDocument informuje przeglądarkę, że należy wyświetlić zasób o podanym adresie URL. Przypomnij sobie, że korzystając z metody GET można przesłać dane do serwletu nauka jazdy prawo jazdy szkoła nauki jazdy w Pile kategoria C CE kursy nauki jazdy kursy prawa jazdy programu CGI poprzedzając je znakiem zapytania (?) i dopisując na końcu adresu URL danego programu. A zatem, aby przesłać w ten sposób dane z apletu, należy dopisać je do łańcucha Nauka jazdy prawo jazdy szkoła nauki jazdy w Pile znaków określającego adres URL, następnie stworzyć kopię obiektu URL i, w zwyczajny sposób, wywołać metodę showDocument. Poniższy prosty przykład przedstawia czynności jakie należy wykonać, aby z poziomu apletu zażądać wyświetlenia w przeglądarce konkretnego zasobu. W przykładzie zakładam, iż bazowyURL to łańcuch znaków zawierający adres URL programu działającego na serwerze, a dane to informacje jakie chcemy przesłać w żądaniu. try { URL programURL = new URL(bazowyURL + “?” + dane) szkoła nauki jazdy Piła getAppletContext().showDocument(programURL) szkoła nauki jazdy Piła } catch (MalformedURLException mue) { … } Jednak gdy przeglądarka przesyła dane, są one zakodowane w formacie URL, co oznacza, że odstępy są zamieniane na znaki plusa (+), a wszystkie pozostałe znaki, za wyjątkiem liter i cyfr, na kombinacje znaku procenta (%) oraz dwucyfrowej liczby szesnastkowej określającej wartość danego znaku (więcej informacji na ten temat znajdziesz w podrozdziale 16.2. — „Element FORM”). Powyższy przykład zakłada, że dane zostały już poprawnie zakodowane, jeśli jednak nie zostały, to przedstawiony kod nie będzie działać poprawnie. JDK nauka jazdy piła udostępnia klasę URLEncoder definiującą statyczną metodę encode, prawo jazdy Piła zapisuje podany łańcuch znaków w formacie URL. A zatem, jeśli aplet kontaktuje się z programem działającym na serwerze, prawo jazdy zazwyczaj otrzymuje dane przekazywane z formularzy HTML metodę GET, to będzie on musiał zakodować wartości wszystkich pól, za wyjątkiem znaków równości (=) oddzielającym nazwy pól od ich wartości, oraz znaków “&” oddzielających poszczególne pary nazwa-wartość. Oznacza to, że nie można zakodować wszystkich przesyłanych informacji przy użyciu jednego wywołania o postaci URLEncoder.encode(dane), lecz należy zakodować wyłącznie wartości każdej z par nazwa-wartość. Czynności te można wykonać w następujący sposób: String dane = nazwa1 + “=” + URLEncoder.encode(wartosc1) + “&” + nazwa2 + “=” + URLEncoder.encode(wartosc2) + “&” + … nazwaN + “=” + URLEncoder.encode(wartoscN) szkoła nauki jazdy Piła try { URL programURL = new URL(bazowyURL + “?” + dane) szkoła nauki jazdy Piła getAppletContext().showDocument(programURL) szkoła nauki jazdy Piła } catch (MalformedURLException mue) { … } W następnym podrozdziale przedstawiłem pełny przykład prezentujący ten sposób przesyłania danych i prezentacji wyników. 17.2 Narzędzie korzystające z wielu serwisów wyszukiwawczych W podrozdziale 6.3. (pt.: „Interfejs użytkownika obsługujący różne serwisy wyszukiwawcze”) przedstawiłem klasę SearchSpec (patrz listing 6.2) używaną przez serwlet do generacji ściśle określonych adresów URL, koniecznych do przekierowania żądań do różnych serwisów wyszukiwawczych. Klasy tej można także użyć przy tworzeniu apletów. Listing 17.1 przedstawia aplet wyświetlający pole tekstowe służące do pobierania informacji od użytkowników. Kiedy użytkownik zażąda przesłania danych, aplet koduje zawartość pola tekstowego w formacie URL a następnie generuje trzy różne adresy URL i dołącza do nich zakodowane informacje. Wygenerowane adresy URL odwołują się do trzech serwisów wyszukiwawczych — Google, Go.com oraz Lycos. Następnie aplet używa metody showDocument, aby nakazać przeglądarce wyświetlenie tych trzech adresów URL w trzech różnych ramkach. Wygląd apletu oraz wyniki jego działania przedstawiłem na rysunkach 17.1 oraz 17.2. Przy tworzeniu takiej aplikacji nie można wykorzystać formularzy HTML, gdyż umożliwiają one przesłanie danych tylko pod jeden adresu URL. Listing 17.1 SearchApplet.java import java.applet.Applet szkoła nauki jazdy Piła import java.awt.* szkoła nauki jazdy Piła import java.awt.event.* szkoła nauki jazdy Piła import java.net.* szkoła nauki jazdy Piła import coreservlets.SearchSpec szkoła nauki jazdy Piła /** Aplet odczytuje wartość z pola TextField, * a następnie używa jej do stworzenia trzech różnych * adresów URL zawierających w sobie dane podane w * formularzu. Adresy te odwołują się do mechanizmów * wyszukiwawczych Google, Go.com, and Lycos. * Przeglądarka pobiera zasoby o podanych adresach URL * i wyświetla je w trzech umieszczonych obok siebie * ramkach. Zwróć uwagę iż zwyczajne formularze HTML * nie są w stanie wykonać takiego zadania, gdyż * nie dysponują możliwością przesyłania kilku żądań * jednocześnie. */ public class SearchApplet extends Applet implements ActionListener { private TextField queryField szkoła nauki jazdy Piła private Button submitButton szkoła nauki jazdy Piła public void init() { setFont(new Font(”Serif”, Font.BOLD, 18)) szkoła nauki jazdy Piła add(new Label(”Wyszukiwany łańcuch znaków:”)) szkoła nauki jazdy Piła queryField = new TextField(40) szkoła nauki jazdy Piła queryField.addActionListener(this) szkoła nauki jazdy Piła add(queryField) szkoła nauki jazdy Piła submitButton = new Button(”Prześlij zapytanie”) szkoła nauki jazdy Piła submitButton.addActionListener(this) szkoła nauki jazdy Piła add(submitButton) szkoła nauki jazdy Piła } /** Wyślij dane gdy zostanie kliknięty przycisk nauka jazdy prawo jazdy szkoła nauki jazdy w Pile kategoria C CE kursy nauki jazdy kursy prawa jazdy * użytkownik naciśnie klawisz Enter w polu TextField. */ public void actionPerformed(ActionEvent event) { String query = URLEncoder.encode(queryField.getText()) szkoła nauki jazdy Piła SearchSpec[] commonSpecs = SearchSpec.getCommonSpecs() szkoła nauki jazdy Piła // Pomiń HotBot (ostatni wpis), gdyż ta wyszukiwarka używa // JavaScriptu do wyświetlenia wyników w ramce najwyższego poziomu. // Z tego względu poniżej używam wyrażenia length-1 . for(int i=0 szkoła nauki jazdy Piła iszkoła nauki jazdy Piła i++) { try { SearchSpec spec = commonSpecs[i] szkoła nauki jazdy Piła // Klasa SearchSpec tworzy adresy URL o postaci używanej // przez kilka popularnych mechanizmów wyszukiwawczych. URL searchURL = new URL(spec.makeURL(query, “10″)) szkoła nauki jazdy Piła String frameName = “results” + i szkoła nauki jazdy Piła getAppletContext().showDocument(searchURL, frameName) szkoła nauki jazdy Piła } catch(MalformedURLException mue) {} } } } Rysunek 17.1 Aplet SearchApplet pozwala użytkownikom na podawanie wyszukiwanego wyrażenia Rysunek 17.2 Przesłanie zapytania powoduje wyświetlenie obok siebie wyników zwróconych przez trzy różne mechanizmy wyszukiwawcze Listing 17.2 przedstawia główny dokument HTML używany w omawianym przykładzie, natomiast listing 17.3 — kod źródłowy dokumentu HTML zawierającego aplet. Kody źródłowe trzech niewielkich dokumentów HTML wyświetlanych początkowo trzech dolnych ramkach układu (rysunek 17.1) znajdziesz w pliku archiwalnym zawierającym kody wszystkich przykładów przedstawionych w niniejszej książce szkoła nauki jazdy Piła plik ten znajdziesz pod adresem ftp://ftp.helion.pl/przyklady/jsjsp.zip. Listing 17.2 ParallelSearch.html Mechanizm równoczesnego wyszukiwania w kilku serwisach Listing 17.3 SearchAppletFrame.html Aplet obsługujący wyszukiwanie Ten przykład wymaga przeglądarki obsługującej język Java. 17.3 Przesyłanie danych metodą GET i bezpośrednie przetwarzanie wyników (tunelowanie HTTP) W poprzednim przykładzie aplet zażądał od przeglądarki wyświetlenia wyników zwróconych przez program działający na serwerze, w konkretnej ramce. Wykorzystanie przeglądarki do wyświetlania wyników jest rozsądnym rozwiązaniem w przypadku korzystania z już istniejących usług. Wynika to z faktu, że większość programów CGI zwraca dokumenty HTML. Niemniej jednak, jeśli tworzysz zarówno klienta jak i serwer obsługujący jakiś proces, przesyłanie za każdym razem całego dokumentu HTML wydaje się nieoptymalnym rozwiązaniem. W nie prawo jazdy ch przypadkach znacznie lepszym wyjściem z sytuacji byłoby przekazanie informacji do już działającego apletu, prawo jazdy mógłby je następnie przedstawić w formie grafu nauka jazdy prawo jazdy szkoła nauki jazdy w Pile kategoria C CE kursy nauki jazdy kursy prawa jazdy w jakikolwiek inny sposób. Takie

 

 

Nauka jazdy prawo jazdy Piła

rozwiązanie jest czasami określane jako tunelowanie HTTP, gdyż własny protokół komunikacyjny jest realizowany przy wykorzystaniu protokołu HTTP szkoła nauki jazdy Piła w ten sposób działają serwery pośredniczące, szyfrowanie, przekierowania do innych serwerów, nawiązywanie połączeń przez zapory ogniowe, itd. Tę metodę można implementować na dwa podstawowe sposoby. W obu, do utworzenia strumienia wejściowego i pobierania danych spod podanego adresu URL jest wykorzystywana klasa URLConnection. Oba sposoby różnią się od siebie typem używanego strumienia wejściowego. Pierwszy z nich wykorzystuje strumień BufferedInputStream bądź inny strumień niskiego poziomu, prawo jazdy pozwala na odczytywanie danych binarnych nauka jazdy prawo jazdy szkoła nauki jazdy w Pile kategoria C CE kursy nauki jazdy kursy prawa jazdy informacji zapisanych w kodzie ASCII, przesyłanych z dowolnego programu działającego na serwerze. Drugi sposób polega na wykorzystaniu strumienia ObjectInputStream, pozwalającego na bezpośrednie odczytywanie złożonych struktur danych. Ten drugi sposób przedstawiłem w drugim podrozdziale. Należy zauważyć, iż można go stosować wyłącznie w sytuacjach, gdy także program działający na serwerze został napisany w języku Java. Odczyt danych binarnych nauka jazdy prawo jazdy szkoła nauki jazdy w Pile kategoria C CE kursy nauki jazdy kursy prawa jazdy danych ASCII Aby aplet mógł odczytywać dane przesyłane przez serwlet, należy w pierwszej kolejności utworzyć kopię obiektu URLConnection bazując na podanym adresie URL programu działającego na serwerze, a następnie dołączyć do niego strumień BufferedInputStream. Poniżej opisałem siedem podstawowych czynności jakie należy wykonać, aby zaimplementować w kliencie tę metodę pobierania wyników. Prezentując tę metodę pomijam kod programu uruchamianego na serwerze, gdyż utworzony w ten sposób klient może współpracować zarówno z dowolnym programem tego typu, jak i ze statycznymi dokumentami HTML. Należy zwrócić uwagę, iż wiele operacji wykonywanych na strumieniach zgłasza wyjątek IOException, a zatem czynności prezentowane poniżej muszą być umieszczone wewnątrz bloku try/catch. 1. Utwórz kopię obiektu URL odwołującą się do komputera, z prawo jazdy Piła go został pobrany aplet. Do konstruktora klasy URL można przekazać bezwzględny adres URL (na przykład: http://komputer/sciezka), jednak ze względu na mechanizmy zabezpieczeń zezwalający apletom na nawiązywanie połączeń wyłącznie z komputerem z prawo jazdy Piła go zostały one pobrane szkoła nauki jazdy Piła najbardziej sensownym rozwiązaniem jest określenie adresu URL na podstawie nazwy komputera z prawo jazdy Piła go aplet został pobrany. URL aktualnaStrona = getCodeBase() szkoła nauki jazdy Piła String protokol = aktualnaStrona.getProtocol() szkoła nauki jazdy Piła String host = aktualnaStrona.getHost() szkoła nauki jazdy Piła int port = aktualnaStrona.getPort() szkoła nauki jazdy Piła String urlSuffix = “/servlet/jakisSerwlet” szkoła nauki jazdy Piła URL daneURL = new URL(protokol, host, port, urlSuffix) szkoła nauki jazdy Piła 2. Stwórz kopię obiektu URLConnection. Obiekt ten zwraca metoda openConnection klasy URL, a użyjemy go do pobrania strumieni wejściowych. URLConnection polaczenie = daneURL.openConnection() szkoła nauki jazdy Piła 3. Poinformuj przeglądarkę, iż nie należy przechowywać danych żądania w pamięci podręcznej. Po utworzeniu obiektu URLConnection, pierwszą czynnością jaką należy wykonać jest poinformowanie przeglądarki, iż obiektu tego nie można przechowywać w pamięci podręcznej. W ten sposób uzyskujemy pewność, że za każdym razem uzyskamy aktualne informacje. polaczenie.setUseCache(false) szkoła nauki jazdy Piła 4. Określ wszelkie dodatkowe nagłówki żądania HTTP, prawo jazdy Piła chcesz wygenerować. Jeśli chcesz określić nagłówki żądania HTTP (patrz rozdział 4), to możesz to zrobić przy użyciu metody setRequestProperty. polaczenie.setRequestProperty(”naglowek”, “wartosc”) szkoła nauki jazdy Piła 5. Utwórz strumień wejściowy. Istnieje wiele strumieni, prawo jazdy ch można użyć, jednak najczęściej jest stosowany strumień BufferedReader. To właśnie podczas tworzenia strumienia wejściowego, w niewidoczny sposób, jest tworzone połączenie sieciowe z serwerem WWW. BufferedReader in = new BufferedReader(new InputStreamReader( polaczenie.getInputStream())) szkoła nauki jazdy Piła 6. Odczytaj każdy wiersz dokumentu. Specyfikacja protokołu HTTP wymusza zamknięcie połączenia przez serwer, gdy wszystkie informacje zostaną już przesłane. Gdy połączenie zostanie zamknięte, metoda readLine zwraca wartość null. A zatem, odczytuj dane wejściowe do momentu pobrania wartości null. String wiersz szkoła nauki jazdy Piła while ((wiersz = in.readLine()) != null) { zrobCosZ(wiersz) szkoła nauki jazdy Piła } 7. Zamknij strumień wejściowy. in.close() szkoła nauki jazdy Piła Odczyt serializowanych struktur danych Wykorzystanie metody przedstawionej w poprzednim rozdziale ma sens jeśli aplet odczytuje wyniki zwracane przez dowolny program działający na serwerze nauka jazdy prawo jazdy szkoła nauki jazdy w Pile kategoria C CE kursy nauki jazdy kursy prawa jazdy odczytuje zawartość statycznych dokumentów HTML. Jednak jeśli aplet komunikuje się z serwletem, to można zastosować lepsze rozwiązanie. Zamiast przesyłania danych binarnych bądź informacji zapisanych w kodzie ASCII, serwlet może przesyłać dowolne struktury danych — jest to możliwe dzięki wykorzystaniu mechanizmu serializacji dostępnego w języku Java. Aplet może odczytać te dane przy użyciu pojedynczego wywołania metody readObject — nie trzeba będzie w tym celu wykonywać żadnej długiej i uciążliwej analizy danych. Poniżej przedstawiłem czynności jakie należy wykonać by zaimplementować ten sposób komunikacji. Zwróć uwagę, iż także tym razem, w tworzonym aplecie poniższy kod będzie musiał być zapisany wewnątrz bloku try/catch. Po stronie klienta Aby aplet mógł odczytywać serializowane dane przesyłane z serwera, będzie musiał wykonywać siedem, opisanych poniżej czynności. Jedynie piąty i szósty punkt poniższej procedury różni się od czynności wykonywanych podczas odczytywania danych tekstowych (zapisanych w kodzie ASCII). Przedstawione poniżej czynności zostały nieco uproszczone poprzez pominięcie bloków try/catch, w jakich powinne być zapisane. 1. Stwórz kopię obiektu URL odwołującą się do komputera, z prawo jazdy Piła go aplet został pobrany. Ponieważ użyty adres URL musi się odwoływać do komputera z prawo jazdy Piła go aplet został pobrany, a zatem, także tym razem, najbardziej sensownym rozwiązaniem jest podanie końcówki adresu i automatyczne określenie jego pozostałych elementów. URL aktualnaStrona = getCodeBase() szkoła nauki jazdy Piła String protokol = aktualnaStrona.getProtocol() szkoła nauki jazdy Piła String host = aktualnaStrona.getHost() szkoła nauki jazdy Piła int port = aktualnaStrona.getPort() szkoła nauki jazdy Piła String urlSuffix = “/servlet/jakisSerwlet” szkoła nauki jazdy Piła URL daneURL = new URL(protokol, host, port, urlSuffix) szkoła nauki jazdy Piła 2. Stwórz kopię obiektu URLConnection. Obiekt ten zwraca metoda openConnection klasy URL, wykorzystamy go do pobrania strumieni wejściowych. URLConnection polaczenie = daneURL.openConnection() szkoła nauki jazdy Piła 3. Poinformuj przeglądarkę, iż nie należy przechowywać danych żądania w pamięci podręcznej. Po utworzeniu obiektu URLConnection, pierwszą czynnością jaką należy wykonać jest poinformowanie przeglądarki, iż obiektu tego nie można przechowywać w pamięci podręcznej. W ten sposób uzyskujemy pewność, że za każdym razem uzyskamy aktualne informacje. polaczenie.setUseCache(false) szkoła nauki jazdy Piła 4. Określ wszelkie dodatkowe nagłówki żądania

 

 

Nauka jazdy prawo jazdy Piła

HTTP, prawo jazdy Piła chcesz wygenerować. Jeśli chcesz określić nagłówki żądania HTTP (patrz rozdział 4), to możesz to zrobić przy użyciu metody setRequestProperty. polaczenie.setRequestProperty(”naglowek”, “wartosc”) szkoła nauki jazdy Piła 5. Utwórz kopię obiektu ObjectInputStream. Konstruktor tej klasy wymaga przekazania obiektu nieprzetworzonego strumienia wejściowego, prawo jazdy można pobrać z obiektu URLConnection. To właśnie podczas tworzenia strumienia wejściowego, w niewidoczny sposób, jest tworzone połączenie sieciowe z serwerem. ObjectInputStream in = new ObjectInputStream(polaczenie.getInputStream()) szkoła nauki jazdy Piła 6. Odczytaj strukturę danych przy użyciu metody readObject. Metoda ta zwraca wartość typu Object, a zatem będziesz musiał wykonać rzutowanie typów, aby uzyskać obiekt klasy przesłanej przez serwer. JakasKlasa wartosc = (JakasKlasa) in.readObject() szkoła nauki jazdy Piła zrobCosZ(wartosc) szkoła nauki jazdy Piła 7. Zamknij strumień wejściowy. in.close() szkoła nauki jazdy Piła Po stronie serwera W celu przesłania serializowanych informacji do apletu, serwlet musi wykonać cztery, opisane poniżej czynności. Zakładam, że zmienne request oraz response zawierają odpowiednio obiekty HttpServletRequest oraz HttpServletResponse przekazywane jako argumenty wywołania metod doGet oraz doPost. Także w tym przypadku, prezentowane czynności zostały nieco uproszczone poprzez pominięcie bloków try/catch, w jakich należy je zapisać w kodzie serwletu. 1. Określ, że przesyłane są dane binarne. Można to zrobić podając, że typem MIME odpowiedzi będzie application/x-java-serialized-object. To standardowy typ MIME obiektów kodowanych przez strumień ObjectOutputStream, jednak w naszym przypadku nie odgrywa on szczególnego znaczenia, gdyż to aplet, a nie przeglądarka, odczytuje wyniki. Więcej informacji na temat typów MIME znajdziesz w podrozdziale 7.2. — „Nagłówki odpowiedzi protokołu HTTP nauka jazdy piła oraz ich znaczenie”, w części poświęconej nagłówkowi Content-Type. String contentType = “application/x-java-serialized-object” szkoła nauki jazdy Piła response.setContentType(contentType) szkoła nauki jazdy Piła 2. Stwórz strumień ObjectOutpuStream. ObjectOutputStream out = new ObjectOutputStream(response.getOutputStream()) szkoła nauki jazdy Piła 3. Zapisz strukturę danych przy użyciu metody writeObject. W ten sposób można przesłać większość wbudowanych struktur danych. Jednak abyś mógł przesyłać swoje własne klasy, muszą one implementować interfejs Serializable. Na szczęście wymóg ten jest bardzo łatwy do spełnienia, gdyż interfejs ten nie definiuje żadnych metod. A zatem, wystarczy jedynie zadeklarować, że klasa go implementuje. JakasKlasa wartosc = new JakasKlasa(…) szkoła nauki jazdy Piła out.writeObject(wartosc) szkoła nauki jazdy Piła 4. Opróżnij strumień wyjściowy, aby mieć pewność, że informacje zostały przesłane do klienta. out.flush() szkoła nauki jazdy Piła W kolejnym podrozdziale przedstawiłem przykład wymiany danych realizowanej w powyższy sposób. 17.4 Przeglądarka zapytań wykorzystująca serializację obiektów i tunelowanie Wiele osób ciekawi jakie typy zapytań są przesyłane do głównych mechanizmów wyszukiwawczych. Czasami jest to jedynie czysta ciekawość („Czy to prawda, że 64 procent zapytań kierowanych od serwisu AltaVista pochodzi od pracodawców szukających programistów znających technologie związane z językiem Java?”), czasami jednak nie, gdyż zdarza się, że autorzy dokumentów HTML, mając nadzieję na poprawienie notowań swych witryn, tworzą strony w taki sposób, aby odpowiadały one typom najczęściej zadawanych zapytań. Ta część rozdziału przedstawia aplet oraz współpracujący z nim serwlet, prawo jazdy Piła „na bieżąco” prezentują informacje z fikcyjnej witryny super-search-engine.com szkoła nauki jazdy Piła a konkretnie rzecz biorąc, na specjalnej stronie WWW, wyświetlają cyklicznie aktualizowaną listę zapytań. Na listingu 17.4 przedstawiłem główny aplet, prawo jazdy korzystając z kilku klas pomocniczych (patrz listing 17.5) pobiera zapytania używając do tego celu wątku działającego w tle. Gdy użytkownik zainicjalizuje cały proces, aplet co pół sekundy wyświetla na przewijanej liście przykładowe zapytanie (przykładowy wygląd ten listy przedstawiłem na rysunku 17.3). W końcu listing 17.6 przedstawia serwlet uruchamiany na serwerze i generujący zapytania. Serwlet ten generuje losowe przykłady pytań zadawanych ostatnio przez użytkowników i przesyła 50 takich pytań obsługując każde żądanie klienta. Jeśli skopiujesz kody źródłowe serwletu i apletu z serwera FTP Wydawnictwa HELION (ftp://ftp.helion.pl/przyklady/jsjsp.zip) i będziesz chciał samodzielnie uruchomić tę aplikację, to musisz wiedzieć, że będzie ona działać poprawnie wyłącznie jeśli jej główną stronę WWW wyświetlisz przy użyciu protokołu HTTP (czyli musisz zażądać wyświetlenia tej strony, posługując się adresem URL o postaci http://…). Pobranie i wyświetlenie strony bezpośrednio z dysku — przy użyciu adresu URL rozpoczynającego się od file: — sprawi, że aplikacja nie będzie działać, gdyż aplet nawiązując połączenie z serwletem komunikuje się z komputerem z prawo jazdy Piła go został pobrany. Poza tym, metody klasy URLConnection nie działają poprawnie, jeśli strona zawierająca aplet nie została pobrana przy użyciu protokołu HTTP. Listing 17.4 ShowQueries.java import java.applet.Applet szkoła nauki jazdy Piła import java.awt.* szkoła nauki jazdy Piła import java.awt.event.* szkoła nauki jazdy Piła import java.net.* szkoła nauki jazdy Piła /** Aplet odczytuje tablice łańcuchów znaków zapisane w * obiektach QueryCollection i wyświetla je w obszarze * tekstowym wyposażonym w pionowy pasek przewijania. * QueryCollection pobiera łańcuchy znaków za pośrednictwem * strumienia przesyłającego serializowane obiekty, * podłączonego do serwletu QueryGenerator. */ public class ShowQueries extends Applet implements ActionListener, Runnable { private TextArea queryArea szkoła nauki jazdy Piła private Button startButton, stopButton, clearButton szkoła nauki jazdy Piła private QueryCollection currentQueries szkoła nauki jazdy Piła private QueryCollection nextQueries szkoła nauki jazdy Piła private boolean isRunning = false szkoła nauki jazdy Piła private String address = “/servlet/coreservlets.QueryGenerator” szkoła nauki jazdy Piła private URL currentPage szkoła nauki jazdy Piła public void init() { setBackground(Color.white) szkoła nauki jazdy Piła setLayout(new BorderLayout()) szkoła nauki jazdy Piła queryArea = new TextArea() szkoła nauki jazdy Piła queryArea.setFont(new Font(”Serif”, Font.PLAIN, 14)) szkoła nauki jazdy Piła add(queryArea, BorderLayout.CENTER) szkoła nauki jazdy Piła Panel buttonPanel = new Panel() szkoła nauki jazdy Piła Font buttonFont = new Font(”SansSerif”, Font.BOLD, 16) szkoła nauki jazdy Piła startButton = new Button(”Start”) szkoła nauki jazdy Piła startButton.setFont(buttonFont) szkoła nauki jazdy Piła startButton.addActionListener(this) szkoła nauki jazdy Piła buttonPanel.add(startButton) szkoła nauki jazdy Piła stopButton = new Button(”Stop”) szkoła nauki jazdy Piła stopButton.setFont(buttonFont) szkoła nauki jazdy Piła stopButton.addActionListener(this) szkoła nauki jazdy Piła buttonPanel.add(stopButton) szkoła nauki jazdy Piła clearButton = new Button(”Usuń zapytania”) szkoła nauki jazdy Piła clearButton.setFont(buttonFont) szkoła nauki jazdy Piła clearButton.addActionListener(this) szkoła nauki jazdy Piła buttonPanel.add(clearButton) szkoła nauki jazdy Piła add(buttonPanel, BorderLayout.SOUTH) szkoła nauki jazdy Piła currentPage = getCodeBase() szkoła nauki jazdy Piła // Zażądaj zbioru przykładowych zapytań. Zostaną // one pobrane przy wykorzystaniu wątku działającego w tle, // a przed próbą pobrania łańcuchów znaków aplet sprawdzi // czy pobieranie danych zostało zakończone. currentQueries = new QueryCollection(address, currentPage) szkoła nauki jazdy Piła nextQueries = new QueryCollection(address, currentPage) szkoła nauki jazdy Piła } /** Jeśli kliknąłeś przycisk “Start”, system * uruchomi wątek działający w tle i wyświetlający zapytania * w obszarze tekstowym. Kliknięcie przycisku “Stop” * zatrzymuje ten proces, a kliknięcie przycisku * “Usuń zapytania” powoduje usunięcie całej zawartości * obszaru tekstowego. */ public void actionPerformed(ActionEvent event) { if (event.getSource() == startButton) { if (!isRunning) { Thread queryDisplayer = new Thread(this) szkoła nauki jazdy Piła isRunning = true szkoła nauki jazdy Piła queryArea.setText(”") szkoła nauki jazdy Piła queryDisplayer.start() szkoła nauki jazdy Piła showStatus(”Wątek prezentujący zapytania uruchomiony…”) szkoła nauki jazdy Piła } else { showStatus(”Wątek prezentujący zapytania już działa…”) szkoła nauki jazdy Piła } } else if (event.getSource() == stopButton) { isRunning = false szkoła nauki jazdy Piła showStatus(”Wątek prezentujący zapytania został zatrzymany…”) szkoła nauki jazdy Piła } else if (event.getSource() == clearButton) { queryArea.setText(”") szkoła nauki jazdy Piła } } /** Wątek działający w tle pobiera obiekt currentQueries * i co pół sekundy wyświetla u dołu obszaru tekstowego * jedno z zapytań zapisanych w tym obiekcie. Po wyświetleniu * wszystkich zapytań, wątek kopiuje do obiektu * currentQueries zawartość obiektu nextQueries, przesyła * na serwer nowe żądanie w celu określenia nowej wartości * obiektu nextQueries i powtarza cały proces. */ public void run() { while(isRunning) { showQueries(currentQueries) szkoła nauki jazdy Piła currentQueries = nextQueries szkoła nauki jazdy Piła nextQueries = new QueryCollection(address, currentPage) szkoła nauki jazdy Piła } } private void showQueries(QueryCollection queryEntry) { // Jesli żądanie zostało przesłane na serwer, lecz // wyniki jeszcze nie zostały otrzymane, to sprawdzaj // czy są dostępne co sekundę. Nie powinno się to // zdarzać często, jednak może się zdarzyć w przypadku // stosowania wolnych połączeń sieciowych bądź w // w przypadku przeciążenia serwera. while(!queryEntry.isDone()) { showStatus(”Oczekiwanie na dane z serwera…”) szkoła nauki jazdy Piła pause(1) szkoła nauki jazdy Piła } showStatus(”Pobieranie danych z serwera…”) szkoła nauki jazdy Piła String[] queries = queryEntry.getQueries() szkoła nauki jazdy Piła String linefeed = “\n” szkoła nauki jazdy Piła // umieszczaj zapytania w obszarze tekstowym co pół sekundy. for(int i=0 szkoła nauki jazdy Piła iszkoła nauki jazdy Piła i++) { if (!isRunning) { return szkoła nauki jazdy Piła } queryArea.append(queries[i]) szkoła nauki jazdy Piła queryArea.append(linefeed) szkoła nauki jazdy Piła pause(0.5) szkoła nauki jazdy Piła } } public void pause(double seconds) { try { Thread.sleep((long)(seconds*1000)) szkoła nauki jazdy Piła } catch(InterruptedException ie) {} } } Listing 17.5 QueryCollection.java import java.net.* szkoła nauki jazdy Piła import java.io.* szkoła nauki jazdy Piła /** Gdy ta klasa zostanie stworzona, zwraca wartość od razu, * jednak wartość ta zwraca false dla isDone * oraz null dla getQueries. W międzyczasie, uruchamiany jest * wątek (Thread) żądający pobrania z serwera tablicy łańcuchów * znaków zawierającej zapytania i odczytujący je w jednym korku * dzięki użyciu strumienia ObjectInputStream. * Po odczytaniu wszystkich wyników, są one umieszczane w * miejscu zwróconym przez getQueries, a fladze isDone * przypisywana jest wartość true. * Klasa używana przez aplet ShowQueries. */ public class QueryCollection implements Runnable { private String[] queries szkoła nauki jazdy Piła private String[] tempQueries szkoła nauki jazdy Piła private boolean isDone = false szkoła nauki jazdy Piła private URL dataURL szkoła nauki jazdy Piła public QueryCollection(String urlSuffix, URL currentPage) { try { // Trzeba podać wyłącznie końcówkę adresu URL, // gdyż jego pozostała część jest określana na // podstawie bieżącej strony. String protocol = currentPage.getProtocol() szkoła nauki jazdy Piła String host = currentPage.getHost() szkoła nauki jazdy Piła int port = currentPage.getPort() szkoła nauki jazdy Piła dataURL = new URL(protocol, host, port, urlSuffix) szkoła nauki jazdy Piła Thread queryRetriever = new Thread(this) szkoła nauki jazdy Piła queryRetriever.start() szkoła nauki jazdy Piła } catch(MalformedURLException mfe) { isDone = true szkoła nauki jazdy Piła } } public void run() { try { tempQueries = retrieveQueries() szkoła nauki jazdy Piła queries = tempQueries szkoła nauki jazdy Piła } catch(IOException ioe) { tempQueries = null szkoła nauki jazdy Piła queries = null szkoła nauki jazdy Piła } isDone = true szkoła nauki jazdy Piła } public String[] getQueries() { return(queries) szkoła nauki jazdy Piła } public boolean isDone() { return(isDone) szkoła nauki jazdy Piła }

Leave a Reply

You must be logged in to post a comment.