r06-05.doc

(1094 KB) Pobierz
Szablon dla tlumaczy

 

W tym rozdziale:             

·         WAP i WML

·         Obrazki

·         Treść skompresowana

·         Serwer cykliczny

Rozdział 6.

Przesyłanie treści multimedialnej

 

Do tej pory wszystkie aplety, które pisaliśmy odsyłały standardową stronę HTML. Sieć WWW nie składa się jednak tylko z HTML-u, dlatego właśnie w niniejszym rozdziale zajmiemy się bardziej ciekawymi aspektami odsyłania apletowego. Rozpoczniemy od omówienia protokołu WAP oraz języka znaczników WML używanego w telefonii komórkowej oraz urządzeniach przenośnych i poznamy jak aplety mogą wykorzystywać tą technologię. Następnie pokażemy jak tworzyć dynamicznie, obrazy z apletów aby wygenerować wykresy i manipulować zdjęciami. Pod koniec rozdziału dowiemy się kiedy i jak przesyła się skompresowane odpowiedzi, ponadto zbadamy użycie odpowiedzi wieloczęściowych w celu wdrażania serwera cyklicznego.

 

WAP i WML

Protokół Aplikacji Bezprzewodowej (WAP) jest de facto standarem dla dostarczania łączności internetowej do telefonów komórkowych, pejdżerów oraz do Osobistych Asystentów Cyfrowych (PDA) w sieciach komunikacji bezprzewodowej na całym świecie. Protokół ten został stworzony przez Ericssona, Nokię, Motorolę oraz Phone.com (wcześniej „Unwired Planet”), które to firmy rozsądnie wyraziły chęć stworzenia protokołu standardowego, a nie własnych, konkurujących między sobą protokołów. Owe cztery firmy stworzyły razem forum WAP (http://www.wapforum.org), demokratycznie zarządzaną organizację, która dzisiaj liczy już 400 członków.

Protokół WAP składa się z szeregu specyfikacji, opisujących projektowanie aplikacji przeznaczonych do uruchamiania w sieciach komunikacji bezprzewodowej. Protokół WAP obejmuje zarówno poziom aplikacji (język znaczników WML oraz język skryptów WMLScript, znane pod wspólną nazwą Środowisko Aplikacji WWW lub WAE) jak i stosowanej sieci transportu poziomów (protokołów: WDP, WTLS, WTP oraz WSP). Kaskada WAP jest odpowiednikiem kaskady protokołu WWW, tak jak to zostało zaprezentowane na rysunku 6.1.

 

Rysunek 6.1.

Kaskady: WWW i WAP

 

Podstawowa różnica pomiędzy WAP-em a WWW polega na tym, że WAP jest zoptymalizowany do nisko-przepustowej komunikacji bezprzewodowej. Dla przykładu WAP używa formatu binarnego dla struktur odpowiedzi i zlecenia, zamiast formatu tekstowego przez WWW.

 

Brama WAP odgrywa rolę pośrednika pomiędzy siecią WAP a siecią WWW. Zadaniem bramy jest konwertowanie zleceń WAP na zlecenia WWW oraz odpowiadające im odpowiedzi WWW na odpowiedzi WAP. O Bramie WAP można powiedzieć, iż jest ona „konwertorem kaskady protokołu”* Bramy WAP udostępniają urządzeniom WAP dostęp do standardowych serwerów WWW. Zostało to zaprezentowane na rysunku 6.2.

Rysunek 6.2.

Rola Bramy WAP

Prostą sprawą jest konstruktor bezprzewodowy — możemy zignorować protokół warstwy transportowej. Brama WAP „dba” o to, aby zlecenie urządzenia wyglądało jak zlecenie HTTP. Warstwą na której musimy się skoncentrować jest warstwa aplikacji, w której zamiast generowania HTML-u, generujemy WML.

 

WML

Urządzenia przenośne są znacznie bardziej ograniczone niż komputery osobiste. Mają one zwykle wolne procesory, małe pojemności pamięci, małe wyświetlacze oraz niezwykle ograniczoną przepustowość. Z powodu podobnych ograniczeń urządzenia WAP nie współdziałają ze zwykłymi treściami HTML i treściami obrazkowymi. Zamiast tego używają one języka znaczników telefonii komórkowej (WML) — dla treści tekstowej, języka WMLScript dla wykonywania skryptów oraz Bezprzewodowej Mapy Bitowej (Wireless Bitmap) WBMP — monochromatycznego formatu obrazu dla grafiki.

 

WML jest aplikacją XML, podobną do HTML lecz z mniejszą ilością znaczników. Można tutaj zastosować porównanie do talii kart, gdzie każda karta odpowiada ekranowi strony, a każda strona zbiorowi kart, które mogą zostać natychmiast przesłane. Przesyłanie zawartości talii za jednym razem, zamiast jednej karty, minimalizuje opóźnienie (okres potrzebny do obejrzenia kolejnej karty) podczas „łączenia się” z treścią.

Przykład 6.2 ukazuje statyczny dokument WML, który spełnia rolę „minibarmana”. Wyświetla listę drinków do wyboru, a następnie składniki wybranego drinka.* Zwróćmy uwagę, iż jest to dokument XML z dobrze znanym DTD.

 

Przykład 6.1.

„Minibarman WML”, drinks.xml

 

<?xml versions"1.0"?>

<!DOCTYPE wml PUBLIC

 

   "-//WAPFORUM//DTD WML 1.1//EN"

   "http: / /www. wapforum.org/DTD/wml_l.1. xml" >

<wml>

   <card id="Barman" title="Wybierz Drinka">

      <p>

      Select a Drink:

 

<anchor>

   Kamikaze <go href="#Kamikaze" />

</anchor><br/>

<anchor>

   Margarita <go href="#Margarita" />

</anchor><br/>

<anchor>

   Boilermaker <go href="#Boilermaker" />

</anchor><br/>

</P>

</card>

 

<card id="Kamikadze" title="Kamikadze">

   <p>

   To make a Kamikaze:<br/>

   1 part Vodka<br/>

   1 part Triple Sec<br/>

   1 part Lime Juice<br/>

   </P>

   </card>

 

   <card id="Margarita" title="Margarita">

   <p>

   To make a Margarita:<br/>

   1 1/2 oz Tequila<br/>

 

   1/2 oz Triple Sec<br/>

   1 oz Lime Juice<br/>

   Salt<br/>

</p>

</card>

 

<card id="Boilermaker" title="Boilermaker">

   <p>

   To make a Boilermaker :<br/>

   2 oz Whiskey<br/>

   10 oz Beer<br/>

   </p>

   </card>

   </wml>

 

Dokument zawiera cztery karty. Pierwsza karta, wyświetlana domyślnie, ukazuje krótką listę drinków. Każda nazwa drinka to hiperłącze do następnej karty dokumentu, z nazwą karty podaną przy użyciu składni #Cardname. Każda późniejsza karta wyświetla składniki dla drinka. Cały dokument może być przesłany do urządzenia podczas jednej operacji, mimo iż w danym momencie będą dostępne tylko jego części.

 

Symulatory urządzeń WAP

Aby umożliwić wywoływanie aplikacji WWW, bez odwoływania się do fal powietrznych, różne firmy tworzą symulatory telefoniczne obsługujące WAP, oprogramowanie do uruchamiania na komputerach osobistych, które działają jak telefon (i nawet tak wyglądają). Na rysunku 6.3 zaprezentowano jak wygląda dokument na symulatorze Phone.com UP.Simulator (dostępnym na http://phone.com). Inne symulatory oraz zestawy projektowania WAP można znaleźć na następujących stronach: http://www.nokia.com, http://www.ericsson.com i, http:/www.motorola.com oraz na wielu innych. Niektóre standardowe przeglądarki WWW, włącznie z przeglądarką „Opera” również obsługują WML.

 

Rycina 6.3. „Drinkowe telefonowanie”

Podawanie treści WAP

Aby treść WAP została podana poprawnie, serwer musi przesłać plik WML z jawnym typem treści text/vnd.wap.wml. Niektóre serwery ustalają ten typ treści automatycznie na pliki .wml. Inne muszą być informowane o nowym typie. Serwer musi być powiadomiony o typie treści odnoszącym się do WAP, z kolejnymi elementami <mime-mapping> w deskryptorze wdrożenia web.xml serwera. Bit informacji web.xml z przykładu 6.2 dodaje właściwy typ WML-u, WMLScript oraz pliki bezprzewodowej Mapy Bitowej.

Przykład 6.2.

Dodawanie typów nośników WAP do web.xml

 

<!- ... ->

<mime-mapping>

   <extension>

      wml

   </extension>

   <mime-type>

      text /vnd. wap. wml

   </mime-type>

</mime-mapping>

<mime-mapping>

   <extension>

      wmls

   </extension>

   <mime-type>

      text /vnd. wap. wmlscript

     </mime-type>

   </mime-mapping>

    <mime-mapping>

        <extension>

            wbmp

   </extension>

     <mime-type>

     image /vnd. wap. wbmp

   </mime-type>

< /mime-mapping>

<!-- ... -->

 

Dodatkowo niektórzy programiści aplikacji WWW uważają, że dobrze jest dodać index.wml do domyślnej listy plików wyszukiwania w katalogu, znanej jako welcome file list. Blok deskryptora wdrożenia w przykładzie 6.3 ustawia welcome file list do index.html, index.htm oraz do index.wml, w takiej właśnie kolejności. Taka kolej rzeczy daje znać serwerowi o zleceniu na http://localhost/wap/index.wml jeżeli index.html oraz index.htm nie istnieją.

 

Przykład 6.3.

Dodawanie plików WAP Welcome Files do web.xml

 

<!-- ... -->

<welcome-file-list>

   <welcome-file>

      index.html

</welcome-file>

<welcome-file>

   index.htm

</welcome-file>

<welcome-file>

   index.wml

  </welcome-file>

</welcome-file-list>

<!-- ... -->

 

Dynamiczna treść WAP

Z technicznego punktu widzenia nie ma prawie żadnej różnicy pomiędzy tym jak aplet podaje dynamiczną treść WAP a sposobem w jaki podawana jest dynamiczna treść WWW. Aby podać treść WAP aplet musi po prostu zmienić typ treści odpowiedzi na text.vnd.wap.wml a treść odpowiedz z HTML-u na WML. Dla apletu, zlecenie jest zwykłym HTTP; zewnętrzna Brama WAP obsługuje WML oraz konwersję kaskady protokołu WWW. Podczas gdy różnica techniczna jest niewielka, przypadków w których lepiej jest posłużyć się apletem dla dynamicznego tworzenia treści może być niewiele.

 

W sieci WWW, nie ma praktycznie żadnych sankcji za kontaktowanie się z serwerem tylko po to aby wykonać mało znaczące zadania czy uaktualnienia strony. Przy zastosowaniu WAP-u, sankcje te mogą zostać ustanowione. W wyniku tego proste zadania takie jak: nawigacja kartowa i kontrola poprawności danych formularzowych, które w sieci WWW mogłyby angażować aplet, są najlepiej przeprowadzane w WAP przy użyciu metafory kartowej WML oraz zdolności wykonywania skryptów po stronie klienta WMLScript. Dla przykładu poprzedni aplet „barman” używa zestawu kart w celu podawania drinków bez kontaktowania się z serwerem.

 

Aplety nie pozostają oczywiście bez użyteczne. Aplet (lub inny skrypt serwera) jest potrzebny do generowania talii kart zawierających informacje dynamiczne pobrane z bazy danych. Aplety są również potrzebne do obsługi zleceń na dane zbyt duże aby zmieścić się na zestawie kart. Urządzenia są często ograniczone do przechowania tylko 1400 bitów skompilowanych danych strony.

 

Na przykładach 6.4 i 6.5 zaprezentowano, formularz WML oraz aplet generujący WML, które razem dostarczają aplikację wyszukania kodu kierunkowego. Klient może wprowadzić do formularz telefoniczny kod kierunkowy, przedłożyć go do apletu oraz dowiedzieć się który stan lub region odpowiada temu kodowi. Osoby posiadające telefony obsługujące WAP mogą wykorzystać tą aplikację do fizycznej lokalizacji jakiegokolwiek numeru identyfikacyjnego rozmówcy.

 

Przykład 6.4.

Wykorzystanie WML-u w celu uzyskania o kodu kierunkowego

 

<?xml version="1.0"?>

 

<!DOCTYPE wml PUBLIC

   "-//WAPFORUM//DTD WML 1.1//EN"

   "http: //www. wapforum. org/DTD/wml_l.1. xml">

 

<wml>

   <card id="AreaCode" title="Wprowadź Kod Kierunkowy">

      <do type="akceptuj" label="Wprowadź">

   <go href="aplet /AreaCode?code=$(code)"/>

   </do>

   <p>

   Enter an Area Code: <input type="tekst" nazwa="kod"/>

</p>

</card>

</wml>

 

Ten dokument WML przechowuje prosty formularz z obszarem wejściowym tekstu. Niezależnie od tego jaki kod kierunkowy zostanie wprowadzony, zostaje przesłany do apletu AreaCode jako parametr code. Aby utworzyć ręcznie ciąg zapytań używamy zmiennej zastąpienia $(code).

 

Przykład 6.5.

Wykorzystywanie WAP do zlokalizowania kodu kierunkowego

 

import java.io.*;

import java.util.*;

import javax.servlet.*;

import javax.servlet.http.*;

 

public class AreaCode extends HttpServlet {

 

   Properties lookup = new Properties() ;

 

public void init() {

// Przenieś poniższe dane nieprzetworzone do a Listy właściwości

   // szybkiego odszukania

   for (int i = 0; i < data.length; i++) {

      Object[] record = data[i];

     String state = (String) record[0] ;

     int[] codes = (int[]) record[1] ;

     for (int j = 0; j < codes.length; j++) {

        lookup.put(String.valueOf(codes[j]),state);

    }

   }

  }

 

public void doGet(HttpServletRequest req, HttpServletResponse res)

                    throws ServletException, IOException {

    res.setContentType("tekst/vnd.wap.wml") ;

    PrintWriter out = res.getWriter();

 

 

   String msg = null;

 

   String code = req.getParameter("kod") ;

   String region = null;

if (code != null) {

   region = lookup.getProperty(code) ;

}

 

out.println("<?xml version=\"1.0\"?>") ;

out.println ("<!DOCTYPE wml PUBLIC " +

      "\"-//WAPFORUM//DTD WML 1.1//EN\" " +

      " \" http: / /www.wapforum. org/DTD/wml_l.1.xml \" >") ;

 

out.println("<wml>") ;

out.println("<card id=\"Code\" title=\"Code\">") ;

out.println(" <p>") ;

out.println (" Numer kierunkowy '" + code + '"<br/>");

if (region != null) {

   out.println(" jest " + region + ",<br/>");

}

else {

   out.println(" jest nie ważny.<br/>");

}

out.println(" </p>") ;

out.println("</card>") ;

out.println("</wml>") ;

}

 

// Nieprzetworzony numer kierunkowy dla każdego regionu

private Object[][] data = new Object[][] {

   { "Toll Free", new int[] { 800, 855, 866, 877, 888 } },

   { "Alabama", new int[] { 205, 256, 334 } },

   { "Alaska", new int[] { 907 } },

   { "Alberta", new int[] { 403, 780 }},

   { "Arizona", new int[] {480, 520, 602, 623 } },

   { "Arkansas", new int[] { 501, 870 } },

...

Zgłoś jeśli naruszono regulamin