(Ebook) Getting Started With WAP and WML by Huw Evans, Paul Ashworth ISBN 9780782128703, 078212870X
(Ebook) Getting Started With WAP and WML by Huw Evans, Paul Ashworth ISBN 9780782128703, 078212870X
https://ebooknice.com/product/biota-grow-2c-gather-2c-cook-6661374
ebooknice.com
https://ebooknice.com/product/sat-ii-success-
math-1c-and-2c-2002-peterson-s-sat-ii-success-1722018
ebooknice.com
https://ebooknice.com/product/matematik-5000-kurs-2c-larobok-23848312
ebooknice.com
https://ebooknice.com/product/getting-started-with-google-apps-1538190
ebooknice.com
(Ebook) 25 Recipes for Getting Started with R by Paul Teetor ISBN
9781449303235, 1449303234
https://ebooknice.com/product/25-recipes-for-getting-started-
with-r-1565116
ebooknice.com
https://ebooknice.com/product/getting-started-with-google-apps-4180354
ebooknice.com
https://ebooknice.com/product/getting-started-with-angular-22526942
ebooknice.com
https://ebooknice.com/product/getting-started-with-python-and-
raspberry-pi-54981210
ebooknice.com
https://ebooknice.com/product/getting-started-with-z-os-data-set-
encryption-50195594
ebooknice.com
Getting Started with WAP and WML
Huw Evans
Paul Ashworth
WEB: WWW.SYBEX.COM
After the 90-day period, you can obtain replacement media of identical format by sending us the
defective disk, proof of purchase, and a check or money order for $10, payable to SYBEX.
Disclaimer
SYBEX makes no warranty or representation, either expressed or implied, with respect to the
Software or its contents, quality, performance, merchantability, or fitness for a particular purpose.
In no event will SYBEX, its distributors, or dealers be liable to you or any other party for direct,
indirect, special, incidental, consequential, or other damages arising out of the use of or inability
to use the Software or its contents even if advised of the possibility of such damage. In the event
that the Software includes an online update feature, SYBEX further disclaims any obligation to
provide this feature for any specific duration other than the initial posting.
The exclusion of implied warranties is not permitted by some states. Therefore, the above
exclusion may not apply to you. This warranty provides you with specific legal rights; there may
be other rights that you may have that vary from state to state. The pricing of the book with the
Software by SYBEX reflects the allocation of risk and limitations on liability contained in this
agreement of Terms and Conditions.
Shareware Distribution
This Software may contain various programs that are distributed as shareware. Copyright laws
apply to both shareware and ordinary commercial software, and the copyright Owner(s) retains all
rights. If you try a shareware program and continue using it, you are expected to register it.
Individual programs differ on details of trial periods, registration, and payment. Please observe
the requirements stated in appropriate files.
Copy Protection
The Software in whole or in part may or may not be copy-protected or encrypted. However, in all
cases, reselling or redistributing these files without authorization is expressly forbidden except as
specifically provided for by the Owner(s) therein.
This book is dedicated to all those brave pioneers in the world of the wireless Internet, who like
ourselves can see the limitless opportunities created by enabling anyone to connect to a server
from wherever they are. We think it will have an even more profound effect on the way we live
and do business than the Internet has already had. By reading this book, you become a pioneer
in the world of the wireless Internet, too, and we invite you to learn about the main wireless
Internet-enabling technology—WAP—and find out just how easily our vision can be turned into
reality.
ACKNOWLEDGMENTS
Writing this book was one of the most difficult tasks we've both ever taken on in our lives. We
both come from a computer consultancy background, and figured that if we can learn and
assimilate new technologies, then use them to resolve our clients' problems, it would be relatively
easy to learn and assimilate a technology and write a book about it. Not at all! First, we wanted to
develop an example WAP application that we could use as an ongoing example throughout the
book, in an attempt to make the learning experience as close to real life as possible. This became
much more difficult than you would ever imagine, as the application developed from a few static
WML cards to a fully functional WAP service with WML cards being served up by Java servlets.
But what fun it was learning how to program using Java servlets, then having the satisfaction of
seeing our own WML pages being generated by a Web server!
We both also went through big personal changes while writing this book. My second son, Hugo,
was born in October 2000, roughly halfway through writing the book. This made the task twice as
hard as it would have been, as suddenly I was holding a colicky baby during the evenings,
instead of writing this book! At the same time, my co-author, Huw Evans, changed jobs and found
himself ramping up in a new role at the same time as writing this book!
And through all this, the team at Sybex did a fantastic job of guiding us through our first book.
Tracy Brown got us up and running, and Kylie Johnston did a great job of coordinating the
project, as well as keeping the schedule on track when we both started getting bogged down with
events in our personal lives. There were also complete editing and production teams involved in
the creation of this book, whose care and diligence will ensure this book meets Sybex's high
quality standards. Finally, just as we were running out of time, Steve Potts of Geoworks came in
and helped us immeasurably by completing the unfinished parts of the book, as well as tying the
loose ends together and generally making sure that the content of the book was coherent.
Thanks to Steve for his enthusiasm and technical contributions in the writing of this book. A big
thank you to you all.
—Paul Ashworth
Introduction
The Wireless Application Protocol (WAP) is a new technology linking the Internet to wireless
portable devices. It marks the dawning of the new age of wireless commerce, a means of
communicating and performing wireless transactions that will represent a major change in the
way we live and do business.
WAP bridges the gap between the Internet and the wireless world, offering the potential for an
unlimited range of value-added services to be delivered to users irrespective of the network or
device they're using. This convergence of the Internet and cellular telephony, two of the fastest
growing technologies of the last decade, will allow the transformation of information on the
Internet to a form that can be displayed on the restricted screen sizes associated with cellular
phones and other portable devices such as personal digital assistants (PDAs).
WAP is the essential link between the Internet viewed through a PC browser and the increasing
capabilities of cellular phones and other wireless devices. It provides a single, industry-standard
mechanism for wireless application interoperability called the Wireless Markup Language (WML),
developed from the earlier Handheld Devices Markup Language (HDML). WML provides a clear
way for application developers and content providers to create a range of services via WAP
browsers installed on the new generation of wireless devices. WML is supported by a scripting
language called WMLScript, which brings procedural logic to client services.
Wireless devices use WML and WMLScript to produce content, and they make optimum use of
small displays and are designed to allow one-handed navigation. This WAP content is scalable
from a two-line text display all the way up to the more sophisticated full-graphics-capability
screens on the next generation of smart wireless devices.
What Is WAP?
Wireless Application Protocol (WAP) is a set of standards designed to extend Internet services to
mobile phones, pagers, and personal digital assistants (PDAs). The development of WAP is
coordinated by an industry-wide group of companies under the banner of the WAP Forum. The
WAP Forum was created to apply the best principles of Internet application development to the
wireless environment. See the sidebar later in this chapter for more on the WAP Forum.
WAP has become the de facto worldwide standard for the presentation and delivery of wireless
information and telephony services on mobile phones and other wireless devices. It is an open
protocol that provides the same development standards to all vendors irrespective of the
underlying network system. It is designed to work under the low bandwidth constraints of wireless
networks. These constraints are currently around 10Kbps compared with the standard 56Kbps on
home computers using domestic telephone lines with standard dial-up modems. As most wireless
computing devices have limited processing power and memory, and are designed with screen
displays and small multifunction keypads, WAP was developed with these limitations in mind.
WAP was created to address three main issues related to data communications across wireless
networks: low bandwidth, high latency, and connection availability.
Because WAP is an open protocol, a number of manufacturers are producing a wide range of
WAP-enabled devices. These manufacturers in turn are able to source from a large range of
WAP-specified components because the server technology is also open. This general openness
and adoption of common standards means that developers, manufacturers, and content providers
are able to adopt WAP with confidence and benefit from the economies of scale.
WAP uses a client/server architecture that employs an unsophisticated wireless-based
microbrowser and requires only limited resources and a WAP gateway to deliver content from the
server where it is stored. It is a standard independent of the air interface, the user interface, and
the underlying data bearer. Therefore, it is entirely interoperable. Because WAP is based on
existing Internet technologies, it leverages the massive investment in similar conventional Web
tools, applications, servers, and their developers while considering the restricted bandwidth,
processing power, and memory currently available on wireless portable devices.
Web content is available over existing wireless communication networks through a WAP
gateway. Figure 1.1 illustrates how an established WWW infrastructure, based on the Hypertext
Transfer Protocol (HTTP), uses a WAP gateway to interface with the wireless network by
translating HTTP requests into wireless device requests.
The 1997 WAP Forum specification is unique in that it is truly global and spans the numerous
airlink standards. WAP specifies guidelines for the implementation of microbrowsers and the
network-resident servers that connect portable wireless devices to the network infrastructure and
the Web. For the carriers, the creation of WAP means minimum risk and investment, new sources
of revenue, and a more attractive, comprehensive suite of value-added services. For users, it
provides easy access via WAP-enabled handheld devices to the Web and secure access to
corporate intranets. Manufacturers also benefit from the provision of a global, open, de facto
standard. They're provided with a complete new range of marketing opportunities and revenue
streams, while the content providers and developers are confronted with the huge untapped
market of wireless customers and the prospect of 100 million WAP-enabled devices by mid-2001.
What Is WML?
Wireless Markup Language (WML) is to WAP and its handheld devices what Hypertext Markup
Language (HTML) is to the Web and browsers such as Netscape and Internet Explorer. It
describes how content is presented to the wireless device, allowing you to display information,
present input options, and tell user agents (programs that interpret WML, WMLScript, and other
forms of code—typically a microbrowser in a mobile phone) how to respond once an option has
been selected using the keypad.
WML is a subset or an application of the eXtensible Markup Language (XML), and because WAP
uses a similar model as the Internet, it allows content developers to quickly become proficient
with this relatively simple tag-based language while allowing a clear development path. WML is
based on the World Wide Web Consortium (W3C) guidelines for wireless access and works
similarly to HTML to deliver Web text using simple markup tags.
WML's user interface is a WAP microbrowser optimized to map onto mobile wireless devices. A
WML document is called a deck, which is comparable to an HTML page. Unlike the flat structure
of HTML content, WML documents—or decks—are divided into separate units of user interaction.
Each unit is called a card, and WAP services are created by letting the user navigate between the
cards of one or more decks in much the same way hyperlinks are used within and between HTML
documents.
WAP gateways provide the interface between the network and Internet or intranet services. From
this gateway, WML content is accessed over the Internet using the standard HTTP mechanism.
WAP developers and content providers can get up to speed quickly with WML, as it follows the
same programming model as the Web development model. It is a tag-based language specified
as an XML document type, so all existing XML tools and some HTML development environments
can be used to develop WAP applications. As standard HTTP is used for communication between
gateway and servers, developers can use off-the-shelf Web servers to deploy their applications.
Standard tools such as ColdFusion and CGI scripting languages such as Perl, PHP, and ASP
generate content for dynamic WML applications.
The WML specification was developed by the WAP Forum and defines the syntax, variables, and
elements to be used in a valid WML file. The WML 1.1 Document Type Definition (DTD) is
available from www.wapforum.org/DTD/wml_1.1.xml, and all WML applications must
correspond to it. The microbrowser that all WAP-compliant wireless devices are loaded with is
able to handle all entities in the WML 1.1 DTD.
The WAP gateway translates wireless device requests into HTTP requests and then redirects the
Web server's HTTP responses to the device. WML files being sent to WAP-enabled handheld
devices are compressed into a binary format by the WAP gateway. It is possible to translate
HTML into WML using a number of available filter tools, but in practice, the differing user
interfaces employed between the desktop and wireless environments make specific WML-tailored
solutions the norm.
A WAP emulator is a program that implements a WAP microbrowser, but is designed to run on a
non-WAP device, such as a Windows PC. Emulators are often used by developers to speed up
the development process, as well as to reduce the costs of using WAP during testing each time a
change is made. They are also useful to see how a real WAP device will look, because many of
these emulators mimic the look and feel of real WAP devices. A list of available emulators is
provided in later chapters. When a WAP emulator is used, a WAP gateway is not required
because WML files are downloaded from a Web server or local file, and the emulator renders it in
the Emulator window. Figure 1.2 shows this process.
Figure 1.2: Displaying WAP content using a gateway and an emulator
Applications and services written in WML become available to all network devices that are WAP
compliant, delivering a write once, use anywhere tool. WML developers can map soft keys
(appropriated to physical keys on the WAP-enabled device by the manufacturer) for easy user
input and take advantage of features designed to maximize the effect of displaying text on a
limited screen. Low-resolution graphics known as WBMPs can be used, and as bandwidth
increases, so too will the resolution of the graphics supported by the WAP specification. As long
as a recipient device is WAP compliant, the size of the device's display is automatically
accounted for by the microbrowser and the use of standard HTTP header mechanisms to learn
about a device's capabilities. These header mechanisms allow the developer to customize
applications to take advantage of different device characteristics. This technique is known as
device sensing and is the same in principle as the HTML of many Web sites that detect which
Web browser and version you are running to provide an optimal display and to allow support for
browser-specific features.
While WML is good at things like event processing, input and output handling, and rendering, it
has no practical processing abilities. It is, therefore, supplemented by the WMLScript scripting
language.
What Is WMLScript?
In addition to WML, the WAP Forum provides a scripting language called WMLScript. WMLScript
is used alongside WML (or independently of it) to provide intelligence in the form of procedural
logic to client services. WMLScript is to WML what JavaScript is to HTML. In fact, WMLScript is
based on ECMAScript, a derivative of JavaScript, and has been designed to support the relatively
low bandwidth restrictions applicable to handheld wireless devices.
WMLScript enhances the capabilities of WML in a number of ways. With it, you can access user
agent facilities, check user input, generate local messages and dialogs, and execute user agent
software.
This functionality allows you to locally program things like error messages and alerts for faster
viewing, add to your wireless address book, and interrogate SIM cards.
WMLScript defines functions containing flow control logic constructs such as while, if, and
for, which can be called from the main body of the WML program. Even so, WMLScript still
lacks basic programming features such as arithmetic functions, string handling, and WML 1.1
program interfacing capabilities. It therefore has to rely on a set of standard libraries to access
functions relating to dialog presentation, floating point numbers, string conversion, and integer
handling.
WMLScript is compiled by a WAP gateway into binary form to reduce the code's size and
therefore minimize transfer time. It defines a byte-code representation and a byte-code interpreter
for optimal utilization of current low bandwidth channels and wireless device memory restrictions.
In brief, WMLScript uses the following syntax rules:
§ The smallest unit of execution in WMLScript is a statement, and each statement must
end with a semicolon (;).
§ WMLScript is case sensitive.
§ Comments can either be single-line (beginning with //) or multi-line (bracketed by /*
and */). This syntax is identical to that of both C++ and Java.
§ A literal character string is defined as any sequence of zero or more characters
enclosed within double ("") or single (') quotes.
§ Boolean literal values correspond to true and false.
§ New variables are declared using the var keyword (i.e., var x;).
§ WMLScript has no type checking done at compile-time or runtime, and no variable
types are explicitly declared. Internally, the following data types are supported:
§ Boolean
§ Integer
§ Floating point
§ String
§ Invalid
You do not need to specify the type of any variable because WMLScript automatically attempts to
convert between the different types as required. It is also worth noting that WMLScript is not
object-oriented, so it is not possible to create your own user-defined data types programmatically.
WMLScript allows a variety of operators that support value assignment operations, arithmetic
operations, logical operations, string operations, comparison operations, and array operations.
WMLScript operators and expressions are nearly identical to those of the JavaScript
programming language.
Although WMLScript does not support the creation of new objects via object-oriented
programming, the six libraries that are provided help in the handling of many common tasks. The
Lang library includes functions for data type manipulation, absolute value calculations, and
random number generation. The optional Float library includes sqrt(), round(), and pow()
functions but is supported only on those wireless devices with floating point capabilities. The
String library contains a set of functions for performing string operations. Some of the functions
included in this library are length(), charAt(), find(), replace(), and trim(). A URL
library is provided for handling both absolute URLs and relative URLs. Extraction functions let you
retrieve individual components from absolute and relative URLs, and include getPath(),
getReferer(), and getHost(). A WMLBrowser provides go(), prev(), next(),
getCurrentCard(), and refresh(), where WMLScript can access the associated WML
context. Finally, a Dialogs library provides a set of typical user-interface functions including
prompt(), confirm(), and alert().
Before the formation of this group, the concerned players were all working independently to
address the issue of developing a schema to increase the capabilities of wireless telephony
platforms. Ericsson had begun work with a protocol called ITTP (Intelligent Terminal Transfer
Protocol) with the aim of making it easy to add services to wireless platforms. Nokia was working
on their Smart Messaging concept, and Unwired Planet on their Handheld Device Markup
Language (HDML), a language similar to HTML but focused on small-screen devices such as
PDAs and mobile phones. The phone companies were also working, in conjunction with the
World Wide Web Consortium (W3C), on specifications to provide wireless transmission of
Internet data.
All this proprietary-based work came to a head in 1997 when a US network operator called
Omnipoint received several different responses from the different phone companies to a tender
request they had issued for the supply of wireless information services. Omnipoint recommended
that the various vendors get together and define a common standard. Thus the WAP Forum was
born with a mission to create a global wireless specification to work across the different wireless
technologies.
WML was formed by utilizing many of the concepts in Phone.com's HDML within the industry-
standard framework of XML, practically guaranteeing its long-term success and ability to evolve
without limitation.
The WAP Forum published the WAP 1.0 specification for product interoperability and
content/application development in 1998, having based their work on Internet standards and
technology. After WAP 1.0 was released, the WAP Forum was then opened up for membership
by all organizations interested in the area.
As of early 2001, there were well over 600 members from the leading wireless device
manufacturers, wireless operators, and software development companies. By 2003, it is predicted
that over 90 percent of all mobile phones dispatched will be equipped with a WAP browser.
The goals of the WAP Forum are to bring Internet content and advanced data services to wireless
portable devices; create a global open protocol that works across all wireless technologies; allow
the creation of applications and content that can be scaled across a wide range of devices and
wireless bearer networks; and use existing standards and technology wherever appropriate.
The World Wide Web standards specify a standard naming model. Under this model, all servers
and content are named with an Internet-standard Uniform Resource Locator (URL). It enables
Web browsers to correctly process content based on a specific content type. Also defined are
standard content formats such as Hypertext Markup Language (HTML) and standard protocols
such as the Hypertext Transport Protocol (HTTP), which allows any Web browser to
communicate with any Web server.
The World Wide Web standards also define three types of servers: an origin server on which
given WAP content sits or is to be dynamically created; a proxy server, which acts both as a
server and a client for the purpose of making requests on behalf of other clients; and a gateway
server, which acts as an intermediary for some other server.
The proxy server normally resides between clients and servers that have no means of direct
communication. Requests are serviced by the proxy program or passed on, with possible
translation, to other servers. The proxy server implements the client and server requirements of
the World Wide Web specifications. Unlike a proxy, a gateway receives requests as if it were the
origin server for the requested resource. The requesting client may not be aware that it is
communicating with a gateway.
The WAP programming model is simply standard Web programming with a WAP gateway in the
middle of the request/response cycle. A cell phone or other wireless terminal requests, in byte
code, a given URL; the WAP gateway server decodes and decompresses this, then sends it on to
the appropriate origin server as an ordinary HTTP request. The process is then repeated, in
reverse, on the response side of the cycle.
This programming model has ensured that application developers have a smaller learning curve
with a proven architecture and the ability to leverage existing tools. The WAP programming model
has had to take into account the more restricted limitations of the wireless environments, but,
wherever possible, existing standards have been used or have been adopted as the starting point
for the WAP technology.
Figure 1.4 illustrates this WAP programming model. A user presses a key on their WAP phone.
The key has a URL request assigned to it, which the client (user agent) passes to the WAP
gateway using the WAP protocol. The WAP gateway then creates a normal HTTP request for the
specified URL and passes it on to the origin server for processing. The URL may refer to a static
file or some form of script application. If a static file has been referenced, the origin server adds
an HTTP header to the file. If a script application has been specified, then the origin server runs
the application. The origin server then returns the WML document (deck) incorporating the HTTP
header or any output resulting from a script application. The WAP gateway then verifies the HTTP
header and the WML content, encodes them into binary format, and creates a WAP response
containing the WML that it sends to the client. Upon receipt of this response, the client processes
it and displays the first card of the WML deck to the user.
Figure 1.4: The WAP programming model
So, WAP applications and content use formats based upon World Wide Web formats, and a set
of standard communication protocols is used to transport content. The WAP microbrowser acts in
the same way as a Web browser, coordinating the user interface.
WAP uses standard World Wide Web URLs to identify WAP content on origin servers and identify
local resources in a device. It uses content typing consistent with World Wide Web typing,
allowing user agents to process the content based on its type, and standard World Wide Web-
based content formats for display, calendar, electronic business-card objects, images, and a
scripting language. It also uses standard communication protocols, allowing the communication of
browser requests from the wireless terminal to the network Web server.
Following are brief descriptions of the main features of the Wireless Application Protocol layers.
Bearers
Below the WDP sit all of the bearer networks. These include Short Message Service (SMS), a
facility for sending short messages; Unstructured Supplementary Service Data (USSD); Code
Division Multiple Access (CDMA), for the reuse of scarce radio resources in adjacent areas; and
Cellular Digital Packet Data (CDPD).
Through the Internet Protocol stack, the WAP client communicates with the WAP gateway, which
sits between the wireless carrier's network on one side and the public Internet or corporate
intranet on the other. Gateways can be located within carrier or corporate firewalls or both. In
addition to taking care of various housekeeping tasks such as keeping track of the WAP client's
bookmarks and managing its cache, the WAP server handles the interface between the two sets
of network protocols, wireless (WAP) and wired (TCP/IP).
WAP Standards
As much as possible, WAP uses existing Internet standards for the basis of its own architecture
and is designed to allow standard Internet servers to provide services to wireless devices.
However, Internet standards such as HTML, HTTP, TLS, and TCP, which require large amounts
of mainly text-based data to be sent, are inefficient over wireless networks. Traditional HTML
content cannot be displayed well on the small-sized displays of mobile phones and pagers, and
navigation around and between screens is not easy in one-handed mode. So Internet standards
such as HTML, HTTP, TCP, and TLS are not appropriate for the restrictions associated with
wireless networks.
WAP does, however, use many other Internet standards such as eXtensible Markup Language
(XML), User Datagram Protocol (UDP), and Internet Protocol (IP) to communicate with wireless
devices. So WAP is based on familiar standards such as HTTP and TLS, but has been optimized
for the constraints of the wireless environment. For example, a WAP gateway is required to
communicate with other Internet nodes using HTTP, and the WAP specification requires devices
to use standard URL addressing to request services.
So WAP has been optimized with the restrictions of the wireless environment in mind. It is
designed for low bandwidth and long latency, and uses binary transmission for greater
compression of data. WAP sessions deal with intermittent coverage and operate using IP over a
large variety of wireless transports whenever possible.
It is important that WAP standards complement existing standards. For example, instead of the
WAP specification designating how data is transmitted over the air interface, it is designed to sit
on top of existing standards so that the bearer's standard is used with the WAP protocol.
The WAP Forum works closely with the World Wide Web Consortium and other bodies such as
the European Telecommunications Standards Institute (ETSI), the Cellular Telecommunications
Industry Association (CTIA), and the Internet Engineering Task Force (IETF) to ensure that the
future versions of HTML, HTTP, and TCP take the special needs of wireless devices into account
and can be supported in the WAP framework. The WAP Forum also works closely with these
bodies and others as they become members of the Forum to address the enhanced capabilities
of third generation (3G) wireless networks expected to emerge around 2003 and 2004. Some
countries, such as Japan and Finland, plan to have 3G services in use as early as 2001.
When the WAP Forum identifies a new area of technology with no existing standards
specification, it works to submit its specification to related standards groups, believing that active
participation leads to the best standards. With this approach, the WAP Forum hopes to produce
open, not proprietary, standards through industry consensus and with no one vendor receiving
favorable treatment. To date, the WAP Forum's membership role of contributing companies
stands at over 100 who subscribe to the notion of the development of open standards as the best
way to produce solutions for wireless Internet access.
WAP Devices
As well as being air-interface independent, the WAP specification is also device independent,
specifying the minimum functionality a device must have, but designed to accommodate any
functionality above that minimum.
A WAP device is a combination of hardware and software capable of running a WAP-compliant
microbrowser such as a WAP-enabled mobile phone or a PDA. The use of proxy technology and
compression in the network interface reduces the processing load so that inexpensive CPUs can
be used in the handset, further reducing power consumption and extending battery life.
A PC can also be used as a WAP device if you download a WAP phone emulator from one of the
developer sites. The emulator allows you to use a virtual phone on your desktop. Some major
suppliers, such as Ericsson, Nokia, and Openwave, have developer sites where you can
download software development kits (SDKs) containing WAP emulators.
A WAP phone can run any WAP application in the same way that a Web browser can run any
HTML application. Once you have a WAP phone, you can access the Internet simply by entering
URLs (or clicking bookmarked ones) and following the links that appear.
Using these devices, easy and secure access to Internet content and services such as banking,
leisure, and unified messaging is made available. Furthermore, access is not restricted to the
Internet; WAP devices will be able to deal with intranet information in the same way as Internet
content because both are based upon HTML. This gives corporations the means of offering their
employees information related to their work at any time, while on the move. This may also be
extended to the corporation's customers and suppliers by making restricted access to company
extranets available, thereby opening up the supply chain to interrogation and analysis. Of course,
such corporate information will need to be reconfigured into a format suitable for small-screen
viewing by reprogramming in WML or passing the pages through special HTML-to-WML filters.
With the wide range of WAP-enabled wireless devices now hitting the market, users will have
significant options available to them when purchasing terminals and the applications they support.
Following is a selection of WAP phones that have been announced recently:
§ Nokia 7110 and Nokia 7610 These two mobile phones are physically identical. The
Nokia 7110 is targeted at the 900/1800MHz GSM market (Europe, Africa, Asia Pacific),
whereas the Nokia 7610 is targeted at the 900/1800MHz TDMA market (USA). The user agent
in both models is Nokia's WAP1.1 microbrowser. Both phones support WTLS.
§ Motorola Timeport P7389 The Timeport is a tri-band 900/1800/1900MHz GSM
mobile phone that can be used in much of the world. It uses the UP.Browser 4.x, supporting
not only WML and WMLScript 1.1, but also HDML 3. The Timeport supports WTLS.
§ Mitsubishi Trium Geo The Trium Geo was the first pre-pay WAP phone available.
It's marketed by the UK carrier BT Cellnet and is notable for allowing the user to optionally
disable WMLScript processing. Like most of the initial WAP phones, it does not support WTLS.
§ Sony CMD-Z5 Sony's Z5 is a dual-band 900/1800MHz GSM mobile phone
containing Microsoft's Mobile Explorer, which is both a WML microbrowser and an HTML
browser. It, too, does not support WTLS.
Device manufacturers can guarantee that their applications were developed to run on equipment
that has the minimum functionality specified by the WAP specification while adding features that
go beyond this minimum.
Because the WAP specification is so open, the services available to these devices will be wide-
ranging in their nature. Information will be available via both push and pull technologies, and
users will be able to interact with services by both voice and data. However, as the screen sizes
and current speed and processing limitations make the types of services offered restrictive, it's
unlikely that we'll see current Web-browsing patterns replicated via WAP-enabled devices until
bandwidth capabilities significantly increase. Short of an increase in bandwidth, the user-interface
consideration is unlikely to change in the short term as manufacturers strive to design devices
that are light and fit comfortably in the palm of the hand. Therefore, the type of information service
that content providers will offer in the short term will be real-time, specific services such as news,
weather, stock prices, and ticketing.
The Future
In the next few years, mobile phones will start to benefit from very high bandwidth capabilities.
Two-and-a-half and third generation communications systems (2.5G/3G) will allow enhanced
services such as full-motion video images, multimedia, high fidelity sound, and fast access to the
Internet. The 2.5G/3G systems will allow much higher capacity and data rates than can be offered
by the restricted bandwidth currently available.
These wireless devices will be supported by a number of emerging technologies, including the
following:
§ GPRS (General Packet Radio System) A packet-switched wireless protocol with
transmission rates from 115Kbps to 171Kbps. It will be the first service available to offer full
instant wireless access to the Web. It will require new handsets to support the higher data
rates. A main benefit is that users are always connected and online, and will be charged only
for the amount of data that is transported. A user can make and receive voice calls while at the
same time downloading data. For GSM providers, this new technology will increase data rates
of both circuit switching (High Speed Circuit Switched Data [HSCSD]) and packet switching
(GPRS) by a factor of 10 to 15 times.
§ EDGE (Enhanced Data Rate for GSM Evolution) A higher bandwidth version of
GPRS with speeds of up to 384Kbps, or twice that available from GPRS alone. It evolved from
GSM, which is the prevailing standard throughout Europe and the Asia Pacific region—some
50 percent of the world's population. For GSM providers, this new technology will increase
data rates of both circuit switching (HSCSD) and packet switching (GPRS) by a factor of 20 to
30 times.
§ HSCSD (High Speed Circuit Switched Data) A new high-speed implementation of
GSM data techniques. It uses four radio channels simultaneously and will enable users to
access the Internet via the GSM network at very much higher data rates than at present. Data
rates can be transmitted at 38.4Kbps or even faster over GSM networks.
§ UMTS (Universal Mobile Telecommunications System) UMTS will allow a future
mass market for high-quality wireless multimedia communications that will approach two billion
users worldwide by the year 2010. Scheduled to launch commercially in 2002, it is set to be
the technology that will allow the emergence of a new wireless Information Society. It will
deliver low-cost, high-capacity wireless communications, offering data rates of 1Mbps to
2Mbps with global roaming and other advanced UMTS services.
§ Bluetooth A specification for short-range radio links between wireless devices (a low-
power radio technology being developed to replace cables and infrared links with wireless
transceivers fitting onto a single chip). Devices such as printers, desktops, mobile phones, and
PDAs will use the technology, and it has the potential to be used for wireless LANs. It is a de
facto standard with a throughput of around 1Mbps, and delivers opportunities for rapid ad hoc
connections and the possibility of automatic connections between devices. For example, a
user could walk into their office and have their mobile phone's address book automatically
synchronize with their PC's address book. Bluetooth is considered complementary to WAP
technology, and when used together, they open up an unlimited variety of applications, such
as long-distance (WAP) remote control of home and office devices.
Note that all of these emerging technologies center around significant increases in the bandwidth
available to wireless devices.
So what is the future for WAP? It has been designed to be independent of the underlying network
technology. The original constraints WAP was designed for—intermittent coverage, small
screens, low power consumption, wide scalability over bearers and devices, and one-handed
operation—are still valid in 2.5G and 3G networks.
The rapid growth of the use of the Internet and the huge growth of the use of wireless
technologies are creating a demand for wireless access to the Internet, intranets, and other data
networks. People want at least the same speed and power as they can currently achieve when
using the Web via a desktop (and more) as they are offered connection technologies such as
ISDN, with bandwidths of around 64/128Kbps, and the potential high-speed connections that will
be available with the introduction of much faster services such as GPRS, EDGE, and eventually
3G systems.
What attracts the network operators is that WAP is a low-cost network upgrade that can be
integrated seamlessly with no downtime on the network infrastructure. And bridging 2.5G
technologies such as GPRS can be upgraded to 3G standards, ensuring that an operator's
investment is protected. In the meantime, we must live with the restrictions, and it is reasonable
to expect WAP to develop into optimized support for multimedia applications and continue to be
relevant over the short and medium term.
In this chapter, you've been introduced to some key features such as WAP, WML, WMLScript,
and the WAP architecture. WAP standards and devices have also been discussed together with a
look at what the future holds in this quickly moving market. The next chapter, "Getting Started,"
will focus on WML and get you going with your first WML applications, showing you the tools
you'll need to develop, implement, view, and test WML applications.
WML Structure
This section introduces you to the main elements you need to understand before you can get
started with WML. It discusses key concepts such as how WML is structured into decks made up
of one or more cards and how each card is composed of components such as tags, elements,
and variables.
As a deck consists of one or more cards, and a single interaction between a user agent and a
user is a card, multiple screens can be downloaded from the server to the client in a single
transaction. Using WMLScript, user selections or entries can be routed to and handled by already
loaded cards, thereby eliminating excessive communication with remote servers and improving
performance.
The task performed by a deck might be, for example, the input of a set of specific requirements
for booking a theater ticket. The deck might contain one card prompting the user to enter their
choice of show, one prompting them to enter the date of the show, another prompting them to
enter the time of the show, and so on. When the collection of card activities making up the deck is
completed, the data would be sent to the server, and the next stage of the process would be
activated. Another deck containing the next set of user interactions would be sent back from the
server to the user's device.
Let's take a look at a sequence of events that might occur in a simple application used for
accessing a user's bank details.
The user of the application enters the service's URL, probably through a bookmark, and the bank
application's server transmits a deck to the user's wireless device. The deck might contain a
Greeting card and two additional cards requesting a username and a password.
The user responds by entering their username and password, and the device's microbrowser
reconnects to the server and passes the input to a program known as a Common Gateway
Interface (CGI). This software verifies the user, gathers their specific account details, and formats
a new deck.
The new deck is then sent back to the user's device with an Account Information card linked to a
Search card and an End Session card. The user can then either end the session by selecting the
End Session card or request a search of their account data by selecting the Search card. If the
user selects the Search card, they need to enter search criteria and make a request. The server
is accessed, the required data is gathered, and a new deck is formatted. A new deck containing a
Search Result card, and additional Search and End Session cards, is transmitted back to the
user's device. The process proceeds until the user ends the session by selecting the End Session
card.
WML defines elements and attributes that let you specify the user-interface components, or the
cards. Elements and attributes will be discussed further in following sections. Wireless device
microbrowsers can navigate from one card to another.
A card can specify multiple user actions by including one or more of the following:
§ Formatted text, including text, images, and links
§ Input elements, which let the user enter a string of text, including numbers
§ Fieldset elements, which act as organizational containers for other elements
§ Select elements, which let the user choose from a list of options
Elements
WML is defined by a set of elements that specify all markup and structural information for a WML
deck. Elements are identified by tags, which are each enclosed in a pair of angle brackets. Unlike
HTML, WML strictly adheres to the XML hierarchical structure, and thus, elements must contain a
start tag; any content such as text and/or other elements; and an end tag. Elements have one of
the following two structures:
§ <tag> content </tag>
This form is identical to HTML.
<tag/>
§ When an element cannot contain visible content or is empty, such as a line break,
this form can be used.
Table 2.1 lists the majority of valid elements. For details on all elements, refer to Appendix A,
"WML Reference."
Table 2.1: Valid WML Elements
Category WML Elements Purpose
Decks and cards card Defines a card
template Defines a template
head Defines head information
access Defines access control information
meta Defines meta information
Events do Defines a do event handler
ontimer Defines an ontimer event handler
onenterforward Defines an onenterforward handler
onenterbackward Defines an onenterbackward handler
onpick Defines an onpick event handler
onevent Defines an onevent event handler
postfield Defines a postfield event handler
User input input Defines an input field
select Defines a select group
option Defines an option
optgroup Defines an option group
fieldset Defines a set of input fields
Text formatting br Defines a line break
p Defines a paragraph
table Defines a table
tr Defines a table row
td Defines a table cell (table data)
Tasks go Defines a go task
prev Defines a prev task
refresh Defines a refresh task
noop Defines a noop task
Variables setvar Defines and sets a variable
timer Defines a timer
Anchors a Defines an anchor
anchor Defines an anchor
Images img Defines an image
Attributes
Attributes describe various aspects of the element. Some attributes are mandatory, while others
are optional and may have default values. You can include attributes in many WML elements.
You always specify attributes in the start tag of an element, using the following syntax:
<tag attribute1="value1" attribute2="value2"
attribute3="value3"...>
You separate each attribute value pair with white space, which may be a tab, new line, carriage
return, or space character, and you must enclose the value in double quotation marks ( ).
Attribute names must be lowercased.
Comments
As with most programming languages, WML provides a means of placing comment text within the
code. Comments are used by developers as a means of documenting programming decisions
within the code to allow for easier code maintenance. WML comments use the same format as
HTML comments and use the following syntax:
<!-- a comment -->
The WML author can use comments anywhere, and they are not displayed to the user by the
user agent.
Some emulators may complain if comments are placed before the XML prologue. The prologue is
the first few lines that define the document type and version. (See "The Deck Structure" later in
this chapter for more on the prologue.) Note that comments are not compiled or sent to the user
agent, and thus have no effect on the size of the compiled deck.
Variables
Because multiple cards can be contained within one deck, some mechanism needs to be in place
to hold data as the user traverses from card to card. This mechanism is provided via WML
variables. Variables can be created and set using several different methods. Following are two
examples:
§ The <setvar> element The <setvar> element is used as a result of the user
executing some task. The <setvar> element can be used to set a variable's state within the
following elements: <go>, <prev>, and <refresh>. The following element would create a
variable named a with a value of 321:
§ <setvar name="a" value="321"/>
§ The input elements Variables are also set through any input element (input,
select, option, etc.). A variable is automatically created that corresponds with the named
attribute of an input element. For instance, the following element would create a variable
named b:
§ <select name="b" title="B Value:">
Using Variables
Variable expansion occurs at runtime, in the microbrowser or emulator. This means it can be
concatenated with or embedded in other text. Variables are referenced with a preceding dollar
sign, and any single dollar sign in your WML deck is interpreted as a variable reference.
<p> total price is $$ $(total) </p>
Note WML is case sensitive. No case folding (the forcing of text to uppercase or lowercase)
is performed when parsing a WML deck. All enumerated attribute values are case sensitive.
For example, the following attribute values are all different: id="Card1", id="card1", and
id="CARD1".
The prologue is followed by the body of the deck, starting with the <wml> element. WML consists
of a set of elements that may contain attributes. Attributes may, themselves, contain further
elements. All elements have a unique code tag. For example, the <card> element has the
following syntax:
<card
id="ID"
newcontext = "true | false"
onenterbackward = "URL"
onenterforward = "URL"
ontimer = "URL"
ordered = "true | false"
title = "string"
>
You write content here.....
</card>
In this case, all attributes are optional and are used to describe things such as a unique identifier
for the card. A card element can contain a mix of processing instructions, formatting information,
and displayable content.
When a WAP user agent receives a deck, it searches the deck-level elements, looking for the first
card in the deck. It then examines the attributes and displays its content.
The program proceeds in response to user input or other events, and a deck is often linked to
other decks. Control of the application is allowed by the definition of different types of tasks that
affect the execution order of the decks. Tables and binary bitmapped images can also be
displayed.
WML handles input and output, content rendering, and event processing but has no serious
processing functionality. Therefore, WMLScript code may be referenced to enhance the
functionality of the application. A WAP browser must therefore contain a WMLScript Virtual
Machine (VM) to run the compiled script. WMLScript lets you define function operations such as
flow control statements (e.g., if, while, for), and it lets you call assignment statements and
comparison operations.
Installing an SDK
To test and develop your WML code, you will need to install a software development kit (SDK) or
microbrowser emulator. You shouldn't expect to write WML code without testing it on some kind
of microbrowser, and the SDKs are very useful for testing your WML pages even if you have your
own WAP-enabled phone or other device. The SDK you choose will depend upon a variety of
factors, such as the wireless devices you want to support, the features you need, and your
personal preferences. Before embarking on a major project, it's a good idea to consult the
product suppliers and other developers before making your choice. However, to ensure your code
will work correctly in as many microbrowsers and WAP-enabled devices as possible, it may be
best to install several of the main SDKs available.
Note It's important to understand that the results displayed by the examples given in the
book may not look exactly the same as the figures and graphics shown. This if often true
even between different versions of the same emulators. What's important is that the general
functionality is the same, meaning that although it may look and feel a little different when
used, it still performs the same. Incidentally, this problem also exists when using WAP-
enabled devices, which is why extensive testing on all supported devices is so important.
There are a number of SDKs available to assist you in the speedy development of WAP-based
services. These SDKs usually contain a microbrowser emulator, although a range of self-standing
emulators are being developed by various WAP-related organizations. Anywhere YouGo.com is
creating a comprehensive list of WAP development tools, and the main ones listed to date are
shown in
Table 2.2.
Table 2.2: WAP Development Tools
Supplier Description
Ericsson The Ericsson WapIDE SDK 2 is an Integrated Development
http://www.ericsson.com/ Environment (IDE) for developing WAP services. It consists
of three main components: a WAP browser, an Application
Designer, and a Server Toolset. Use the following link to
access this kit:
http://www.ericsson.com/developerszone/.
Dynamic Systems Research Wapnet provides an SDK with a set of comprehensive tools
Ltd. (Wapnet) for developing WAP applications. Included are the WAR
http://www.wap.net/ (Wireless Application Reader) browser together with a set of
WML and WMLScript source code examples. Use the
following link to access this SDK: http://www.wap.net/.
Inetis The Inetis DotWAP SDK allows fast and simple WAP site
http://www.inetis.com/ construction without any WAP or WML knowledge. It runs
on Win32 platforms and is freeware. Use the following link
to access this SDK: http://www.inetis.com/.
Note The files in Table 2.2 are sometimes very slow to download because they can be very
large—as much as tens of megabytes! Be careful in selecting your SDK, because not all
versions are free, and some require extra software.
The Nokia WAP Toolkit requires the latest release of Java. Check the Nokia site for more details
and be prepared to register with Nokia as a WAP developer (for free) before entering the Nokia
Forum, where you will find the links to the software.
The Ericsson SDK is also a large download because it includes a copy of the Xitami intranet Web
server, although you do not have to install it if you already have it or a similar Web server
installed. A local host server such as Xitami will help with the creation of your WML pages, should
make loading pages quicker, and will allow the testing of dynamic content.
The Openwave UP.SDK is faster than either the Nokia or the Ericsson SDKs, although it may not
be as suitable for developing and testing dynamic WML pages. There is also a microbrowser
available from Openwave, but again, it is quite a large download. Their microbrowser uses a local
server with a full-screen-height browser display.
WAP Emulators
Instead of installing an entire WAP SDK, you can install a WML emulator. An emulator simply lets
you view the contents of your WML files as they would be seen on the screen of a WAP-enabled
device. In many cases, a WAP SDK will provide little more than a WML emulator together with
some example code. By using just an emulator, you will, therefore, still be able to see the output
of your WML code, and the download time will be much less.
Again, while the emulators do a great job, they are not perfect. Try a few different ones, and you
will quickly decide which you like the most. When the time comes to develop a real (commercial)
WAP site, you will need to do a lot more testing, first with other SDKs/emulators and then with all
the WAP-enabled devices you plan to support.
The following lists some of the WAP emulators that are available at the time of writing this book:
§ Klondike WAP Browser Produced by Apache Software
(www.apachesoftware.com). Klondike looks a lot like a Web browser and is therefore very
easy to use for beginners. You can access local WML files easily. It also supports drag-and-
drop, making local file use very easy.
§ M3Gate Produced by Numeric Algorithm Laboratories (www.numeric.ru). M3Gate
is a fast, stand-alone program that uses the Web browser as its gateway. It has full support for
WML, WMLScript, WBMP images, Unicode, bookmarks, Multiple Character sets, and a choice
of skins (additional handsets). It also supports drag-and-drop, making local file use very easy.
§ Yospace Produced by Yospace (www.yospace.com). WAP developers can use the
desktop edition of the emulator to preview WAP applications from their desktop, safe with the
knowledge that the emulator provides a reasonably faithful reproduction of the actual handset
products. You can plug in support for additional handsets as they become available (skins).
Yospace is bundled with a collection of simple command-line tools (e.g., WML encoder,
WMLScript compiler) for easy integration into your existing development environment.
§ EzWAP Produced by EZOS (www.ezos.com). EZOS provides EzWAP, the first
platform-independent WAP browser, which enables all kinds of computing systems to access
the wireless Internet: wireless devices (e.g., PDA, Pocket PC, PC Companions), wireless
computing and embedded systems, and PCs running Microsoft Windows NT, 2000, or CE.
§ WAPalizer Produced by Gelon (www.gelon.net). The script fetches WML pages
from WAP sites and converts them to HTML on the fly. In reality, it is not technically an
emulator, because it does not interpret WML code, but HTML. This means that you will be able
to view most WAP pages, but some pages, especially those with a lot of input forms, are very
difficult to convert to HTML. Gelon also has a range of other pseudo-emulators that look like
real WAP phones.
§ Ericsson R380 Emulator Produced by Ericsson
(www.ericsson.com/developerszone). The R380 WAP emulator is intended to be used
to test WML applications developed for the WAP browser in the Ericsson R380. The emulator
contains the WAP browser and WAP settings functionality that can be found in the R380.
§ WinWAP Produced by Slob-Trot Software Oy Ab (www.winwap.org). WinWAP is a
WML browser that works on any computer with 32-bit Windows installed (Windows95,
Windows98, and Windows NT). You can browse WML files locally from your hard drive or the
Internet with HTTP (as with your normal Web browser). It also looks and feels a lot like a
normal Web browser.
§ WAPman for Windows95/98/NT Produced by wap.com.sg
(www.wap.com.sg/downloads). The WAPman is a portable browsing device, combining
access to the Internet with the properties of a mobile phone. With its unique WAP gateway
structure, the WAPman has fast downloading capability and is highly compact and portable,
functioning as a wireless commerce and lifestyle portal.
§ WAPsilon Produced by Wappy (wappy.to). WAPsilon converts WAP sites to HTML
that can be viewed on their site or on their device. WAPsilon can be integrated into your Web
site or plugged into your browser. Like WAPalizer, it technically is not an emulator, because it
does not interpret WML code, but HTML.
§ Opera Produced by Opera (www.opera.no). Opera is actually an excellent HTML
Web browser that now also supports WML. An interesting idea, because it's very convenient to
browse both HTML and WML with the same product. This is one to watch.
§ WAPEmulator Produced by Wapmore (www.wapmore.com). Their emulator is
available on the Wapmore site. There is a new Netscape version that is not as functional as
the Internet Explorer version.
§ Wireless Companion Produced by YOURWAP.com (www.yourwap.com). With the
Wireless Companion, you may access any WAP and Web content over the Internet including
the free personal wireless services at YOURWAP.com.
This test will enable you to see how your emulator accesses local files and check that it is
working as it should. When working with local WML files, it's best to select an emulator that
makes it easy to do so. Some emulators assume you only want to enter a remote URL. The best
ones for local file use will either remember the last open file folder or accept dragged-and-
dropped files. Both Klondike and M3Gate accept drag-and-drop files at this time.
Before going any further, decide which text editor you want to use to create your WML files. We
use Wordpad—it comes free with Windows95, 98, and NT, and includes most of the editing
functions you could ever need for editing WML files. Once you have decided which editor you are
going to use, use it to create an empty file named myfirst.wml.
Note If you are using Wordpad or Notepad, the DOC or TXT extensions, respectively, will be
appended to your file unless you specify another extension when saving the file. So, make
sure to add the WML extension when saving. If you forget and the file is saved with the DOC
or TXT extension, just manually change the extension to WML.
Now that you have created your file, type the following text into it:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card id="First">
<p>
This is my first WML Card
</p>
</card>
</wml>
Tip If
you don't want to type this text, the file, myfirst.wml, is provided on the CD that comes
with this book—you can simply copy this file onto your hard drive.
Now, read the instructions provided with your emulator to find out how to open a WML file on your
hard disk and display its contents on your emulator. We recommend that you don't skip this test
and that you spend time getting to know how your emulator accesses local files—you will find this
essential for the early stages of creating and testing WML code as you'll use this mechanism to
test and view the results of your WML programs without having to download it from a Web server.
If you have your own server, then you simply need to add support for the MIME types and
extensions listed in Table 2.3. Instructions follow on how to configure the two leading Web
servers.
Table 2.3: MIME Types for WML Files
MIME Type File Extension
text/vnd.wap.wml WML
text/vnd.wap.wmlscript WMLS
application/vnd.wap.wmlc WMLC
application/vnd.wap.wmlscriptc WMLSC
image/vnd.wap.wbmp WBMP
§ Apache This popular Web server runs predominantly on Unix or Linux systems, so
we're providing instructions for configuring such a server. Locate the file srm.conf, which is
usually in /etc/httpd/conf, and add the following lines to the file:
§ AddType text/vnd.wap.wml .wml
§ AddType text/vnd.wap.wmlscript .wmls
§ AddType application/vnd.wap.wmlc .wmlc
§ AddType application/vnd.wap.wmlscriptc .wmlsc
§ AddType image/vnd.wap.wbmp .wbmp
§ Save the file and restart Apache, for example, by issuing the command
/etc/httpd/bin/apachectl restart. Be aware that the ResourceConfig variable in
the httpd.conf file can override the srm.conf file, meaning you'll have to modify whatever
file that variable indicates instead of srm.conf.
§ If you do not have your own Apache server, but you know that the server you
use—for example, your ISP's Web server—is Apache, then all may not be lost. If your Web
server administrator hasn't disabled this feature for security reasons, you can achieve the
same results by writing a file called .htaccess containing the lines above to each directory
that contains your WML files. In fact, the .htaccess file is hierarchically cumulative—place it
in your root directory for it to apply to all subdirectories.
§ Microsoft IIS To configure a Microsoft IIS server to deliver WAP content, you need to
perform the following:
1. Open the Internet Service Manager console and expand the tree to view
your Web site entry. You can add the WAP MIME types to a whole server or individual
directories.
2. Open the Properties dialog box by right-clicking the appropriate server or
directory, then choose Properties from the menu.
3. From the Properties dialog, choose the HTTP Headers tab, then select the
File Types button at the bottom right.
4. For each MIME type listed earlier in Table 2.3, supply the extension with or
without the dot (it will be automatically added for you), then click OK in the Properties dialog
box to accept your changes.
The Example Application
Through the course of this book, we're going to develop an example application. The aim of this
approach is to demonstrate how you can use all of the various WML and WMLScript features in a
real environment instead of using just abstract examples. We'll build the site as we go through the
book. Each time a concept or feature is explained, it will be integrated into the example
application.
In the example application, you are going to create a WAP service for a cinema that will let users
review the movies currently being shown and book tickets for them via their WAP-enabled mobile
phones. The idea is that once the users have booked the tickets, they can just arrive on the night
of the movie and pick their tickets up without worrying about ticket availability and the
inconvenience of waiting to purchase them.
Figure 2.3 demonstrates how you can present a list of options to users and let them choose one,
so that the appropriate card is displayed. In Figure 2.3, the View Movies option lists the movies
that are currently available. In our example, there are only two. See Figure 2.4.
In Figure 2.5, you see that the card for each movie provides a short critique of the movie with an
option to book tickets for that particular movie.
Figure 2.5: Movie Critique card
§ If the user has not yet logged on to the system in the current session, they are
presented with a logon screen that prompts them to enter their mobile phone number, followed
by a screen that asks for their password. By requiring such information at logon, the logon
screen provides security, which is important since the user is about to perform a financial
transaction (book a ticket).
§ When the user enters their phone number and password, these details are sent to the
server.
Once the validations have all been completed, the total price of the tickets booked is displayed on
the mobile phone, as shown in Figure 2.6.
If the user chooses to book the tickets, a Java servlet is called on the server to check that the
user has enough money in their account to pay for the tickets. If they do, the total cost of the
tickets booked is deducted from their account.
As the Choice card shows back in Figure 2.3, the user has three choices when they first access
the FirstUnwired.com service:
§ View Movies
§ Ticket Prices
§ View Account
We've just looked at what happens when they choose the first option. The second option calls a
Java servlet on the server that retrieves the ticket prices from the server and generates the WML
code required to display these prices. Because the Java servlet generates the WML on the fly,
this is known as a dynamic WML page, as opposed to a fixed or static page that has been coded
by hand. Dynamic WML can be produced by a wide variety of server side technologies, such as
Perl, PHP, ASP, and others.
The third option calls a WMLScript function that tests to see whether the user has already logged
on to the service in the current session. If they have, a Java servlet is called that retrieves their
account information from the server, then generates the WML code required to display their
account details. If they have not, they are prompted to log on to the service before their account
details are displayed.
The example application performs a typical range of functions that a WAP service may perform.
Note that it is by no means complete—error trapping is minimal, and the security is not what you
would want to use in the real world. Furthermore, to keep the server side simple, all the data is
stored by the servlet using plain text files. In a real-world application, it's more likely that you
would be using a database for this type of work, such as MySQL, SQL Server, Oracle, and
others. What this application will do is get you started using WML and WMLScript. You will use all
the typical interactions between WML and WMLScript on the client side and some typical server
side interactions, too.
Once you have completed this book, you will be ready to develop real WAP services—that is, a
complete WAP site that anyone in the world with a WAP-enabled device can access! You will be
comfortable in the knowledge that you have already mastered many of the features that you'll
want to use in your WAP application and have all the information you need to take the next step:
getting your service online. In the next chapter, you will take your first step in that direction by
creating your first WML pages.
Getting Started
So let's go! First, we'll need to create the file in which we'll add the WML. Open whichever tool or
editor you're going to use to develop your WAP site and create a new file named cinema.wml.
Note the WML extension, indicating this is a WML file.
Now that you have created the file, add the following lines (called the XML prologue) to the top of
it:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
If you don't want to type this in, you can copy and paste it from the prologue.wml file on the CD
under the directory /Examples.
Tip
Alternatively, if the editor you are using supports macros or templates, you could define one
and have the editor create the XML prologue for you each time you start a new deck.
The WAP server uses the XML prologue to manage the compilation of WAP programs. As all
WML programs are based on XML, they must always begin with a valid XML prologue, which for
WML 1.1 is as that given above.
Now that you have entered the prologue, you can start using WML. The first thing you'll want to
do is define the beginning and the end of the WML deck, using the <wml> element.
Tip
Remember that a deck is simply a WML file that contains one or more cards that will be
downloaded to the user agent.
As with all elements, the <wml> element has a start and an end tag. It is structured as follows:
<wml>
WML deck contents
</wml>
Note When developing WML files, we find it useful to always put in both the start and the
end tags for each element at the same time. This prevents you from forgetting to put the end
tag of an element in and, subsequently, spending a lot of time trying to work out why your
WML won't work!
So let's put the <wml> element into cinema.wml. It should now look like this:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
</wml>
Now that you have defined the beginning and end of the deck, you can put the first card into it. A
card is defined by the <card> element, including the start and end tags. Before going any
further, we have to give the card a name. To specify a card's name, you use the id attribute. In
this case, the card will be named Splash, so enter <card id="Splash"> in the start tag.
Tip
There is no convention in WML for specifying which card is displayed first in the user
agent—the first card in the deck is always displayed first.
Your text should now look like this:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card id="Splash">
</card>
</wml>
Formatting Text
We can now start entering the card contents. We are going to display the text "FirstUnwired.com"
together with a company logo.
Let's first look at how to enter the text "FirstUnwired.com." Any text in a card has to be within a
<p> element. Go ahead and add the <p> element containing "FirstUnwired.com."
<wml>
<card id="Splash">
<p>
FirstUnwired.com
</p>
</card>
</wml>
Let's now look at this in your SDK. Start your SDK and open the file cinema.wml. It should look
something like Figure 3.1.
As far as splash pages go, even if we are limited by bandwidth, ours could use a bit of spicing up!
Let's add some formatting. The <p> element includes two attributes: align and mode. They
have the following syntax:
<p align="alignment" mode="wrapmode">
content
</p>
In this syntax, align is the alignment of the paragraph. This can be left, center, or right.
And mode is the wrap mode. By default, word wrapping is used. You can prevent word wrapping
by defining mode as nowrap.
Let's use the align attribute in the <p> element to define the alignment of the text as center
and also display "FirstUnwired.com" in bolded big typeface. To display text in bold, you use the
<b> element. To display text in a big font, you use the <big> element. You can nest elements
within other elements, so there is no problem in having the same text within several elements.
Note Not all user agents support the <big> element.
Now try adding the align="center" attribute to the <p> element and the <b> and <big>
elements to cinema.wml. You should end up with something like this:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card id="Splash">
<p align="center">
<b><big>FirstUnwired.com</big></b>
</p>
</card>
</wml>
The code should look like Figure 3.2 when displayed in your user agent.
The alt attribute specifies the text to display if the user agent does not support images or cannot
find the specified image—rather than displaying an error message.
The src attribute specifies the URL of the image to display. The localsrc attribute specifies an
image that is stored in the user agent ROM (read-only memory) or the Web server. If you specify
a valid image in the localsrc attribute, the user agent ignores the src attribute.
WAP has its own graphic format, WBMP (Wireless BitMap). Some user agents may accept the
other Internet graphics formats, such as JPEG and GIF, but as WBMP is the de facto WAP image
format and is likely to be supported by the widest range of user agents, we recommend that you
use this.
We have included a file named funwired.wbmp on the CD under the directory /Examples.
Now add the <img> element to your WML file to include an image above the text
"FirstUnwired.com." You should end up with something like this:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card id="Splash">
<p align="center">
<b><big>FirstUnwired.com</big></b>
<img src="cinema.wbmp" alt="FirstUnwired.com"/>
</p>
</card>
</wml>
Moving Around
So far, we have only one card in our example. We now want to be able to go from the Splash
card to an Index card, letting users choose what they want to do. There are two basic ways in
which you can let users move from one card to another: by pressing a button on their mobile
phone or by choosing an option from a list.
In our example application, we are going to define a button on the user agent to display the next
card when it is pressed.
This <do> element defines the Accept button so that it is labelled "Next" on-screen, and when it is
pressed, the card NextCard is displayed using the <go> element with the href attribute. Instead
of displaying the NextCard (which, in this case, is in the same deck), we could display a card in
another deck, execute a WMLScript, or execute a program such as a Java servlet or Perl script.
Defining Buttons
Let's now create a new card in cinema.wml and define the Accept button in the Splash card so
that it displays the new card. We'll name the new card Index. Remember, to define a new card,
we use the <card> element. In the meantime, we'll leave the card empty. By adding the new
card, the deck cinema.wml will look like this:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card id="Splash">
<p align="center">
<b><big>FirstUnwired.com</big></b>
</p>
</card>
<card id="Index">
</card>
</wml>
Now, let's use a <do> element to display the new card, Index, when the Accept button is pressed
and give it the label "Enter." cinema.wml will now look like this:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card id="Splash">
<do type="accept" label="Enter">
<go href="#Index"/>
</do>
<p align="center">
<b><big>FirstUnwired.com</big></b>
</p>
</card>
<card id="Index">
</card>
</wml>
Now, open cinema.wml. The first screen that is displayed should now look something like Figure
3.3.
<wml>
<card>
<p>
<select name="choice">
<option onpick="#Movies"> View Movies </option>
<option onpick="#Prices"> Ticket Prices </option>
<option onpick="#Directions"> Directions </option>
</select>
</p>
</card>
</wml>
The list will look something like Figure 3.4 when displayed on-screen.
The WML code for the second type of list, using the <go> element nested within the <anchor>
element, looks like this:
<anchor title="Movies">
<go href="#Movies"/>View Movies
</anchor>
<br/>
<anchor title="Prices">
<go href="#Prices"/>Ticket Prices
</anchor>
<br/>
<anchor title="Directions">
<go href="#Directions"/>Directions
</anchor>
So, the minimum code required to implement this example of the <anchor> element would be as
follows:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card>
<p>
<anchor title="Movies">
<go href="#Movies"/>View Movies
</anchor>
<br/>
<anchor title="Prices">
<go href="#Prices"/>Ticket Prices
</anchor>
<br/>
<anchor title="Directions">
<go href="#Directions"/>Directions
</anchor>
<br/>
</p>
</card>
</wml>
The list will look something like Figure 3.5 when displayed on-screen.
The only real difference between the two types of lists is their presentation. Right now, let's look
more closely at the first type of list—using the <select> element.
Navigating with Selection Lists
What we want to do here is let users choose what they want to do next: choose a movie they
want to read more about and perhaps book tickets for it, or just view ticket prices.
First, we'll create two new cards, which we'll leave empty for the moment. They'll serve as cards
to which we can create links. We'll give them the card IDs Movies and Prices.
Go ahead, create the two new cards. Once you have created them, the file cinema.wml should
look like this:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card id="Splash">
<do type="accept" label="Enter">
<go href="#Index"/>
</do>
<p align="center">
<b><big>FirstUnwired.com</big></b>
</p>
</card>
<card id="Index">
</card>
<card id="Movies">
</card>
<card id="Prices">
</card>
</wml>
Now, we want to create a selection list using the <option> element within a <select> element
in the Index card. This will enable users to choose whether they want to view the list of movies
currently being screened or view the ticket prices, sending them to the appropriate card when
they make their choice. The <option> element has the following syntax:
<option title="label" value="value" onpick="url">
content
</option>
In this syntax, title defines the label that is displayed for the Accept key, value defines the
unique value that will be assigned to the surrounding <select> name when the user chooses
the option, and onpick specifies the URL to open when the user chooses the option.
Let's now add two <option> elements nested within a <select> element in the Index card. The
first <option> element will have the title Movies, the card ID Movies for the onpick attribute,
and the text "View Movies."
Note WAP supports relative URLs. This means that since we are jumping to a card from
within the same deck, we have to enter only the card ID and not the URL in the onpick
attribute.
The second <option> element will have the title Prices, the card ID Prices for the onpick
attribute, and the text "Ticket Prices."
Tip
Before editing the cinema.wml file, note that the <select> element within which the
<onpick> element is nested must itself be nested within a <p> element.
Now you have all the information you need to create the selection list in the Index card, so give it
a go!
Once you have added the list to the Index card, the cinema.wml file should look something like
this:
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
"http://www.wapforum.org/DTD/wml_1.1.xml" >
<wml>
<card id="Splash">
<do type="accept" label="Enter">
<go href="#Index"/>
</do>
<p align="center">
<b><big>FirstUnwired.com</big></b>
</p>
</card>
<card id="Index">
<p>
<select>
<option title="Movies" onpick="#Movies">
View Movies</option>
<option title="Prices" onpick="#Prices">
Ticket Prices</option>
</select>
</p>
</card>
<card id="Movies">
</card>
<card id="Prices">
</card>
</wml>
Now try viewing cinema.wml in your user agent. Navigate to the Index card, which should now
look something like Figure 3.6.
Now that you know how to use selection lists, using the <onpick> element nested within the
<select> element, let's try using an anchored list to navigate.
<card id="Splash">
<do type="accept" label="Enter">
<go href="#Index"/>
</do>
<p align="center">
<b><big>FirstUnwired.com</big></b>
</p>
</card>
<card id="Index">
<p>
<select>
<option title="Movies" onpick="#Movies">
View Movies</option>
<option title="Prices" onpick="#Prices">
Ticket Prices</option>
</select>
</p>
</card>
<card id="Movies">
</card>
<card id="Movie1">
<p>
Hello, Mary Lou
Adventure, comedy. Cert. 13. Star rating 3.
</p>
</card>
<card id="Movie2">
<p>
The Long Goodbye
Classic, romance. Cert. 13. Star rating 2.
</p>
</card>
<card id="Prices">
Random documents with unrelated
content Scribd suggests to you:
constant, but a peculiar feature about them is that some may be very
bad for louping-ill one year, and others bad another year. Of two
adjoining farms, one may be badly attacked and the other mildly,
while in the following year the conditions may be reversed. Districts
may present the same peculiarities. Thus, though the disease is
essentially endemic, it is not absolutely constant in its recurrence.
There seem to be certain circumstances capable of favouring or
retarding it.
Lesio
ns. The
chief
lesions
are
localised
in the
membra
nes of
the
brain
and
spinal
cord,
which
are
congeste
d or
inflame
d, and
contain
an
Fig. 198.—Larva of the grass tick. increase
d
Length, ¹⁄₄₀th of 1 inch. amount
of
cerebro-
spinal fluid or a jelly-like, sometimes blood-stained exudation.
Softening and hardening of the spinal cord have both been observed.
Inflammation of the pleura and pericardium, with fluid or jelly-like
exudation, are common; lobar congestion of the lungs, endocarditis,
gastritis, and
enteritis have all
been described;
some observers
have mentioned
congestion of the
kidneys and liver
and swelling of
the spleen.
Lesions of the
nerve-centres are
the most
constant and
reliable.
Etiology.
Depressing and
weakening
influences of all
kinds have been
blamed for
producing the
disease, but the Fig. 199.—Pupa of the grass tick.
general
consensus of Length, ¹⁄₁₈th of 1 inch.
opinion points in
the direction of
infection with microorganisms carried and introduced into the
sheep’s system by the common sheep tick or “grass tick” (Ixodes
redurius). The following remarks on, and illustrations of, this
parasite are from an article by Mr. Wheeler, of Alnwick
(Veterinarian, Vol. LXXIII., No. 867, p. 141).
Life History of the Grass Tick. Sheep ticks (which must not be
confused with the sheep-ked, or keb, a wingless six-legged fly,
universal on sheep everywhere) are allied to the spiders. They pass
through four stages of existence: the egg—the six-legged larva—the
eight-legged pupa—and, finally, the eight-legged adult male or
female.
In each of
the three
stages of
larva, pupa,
and adult
female, all
species of
ticks attack
some “host”
or animal,
either beast,
bird, or
reptile, to
which they
attach
themselves
by the
“rostrum” or
beak, and
become
greatly
distended by
Fig. 200.—Adult male of the grass tick. Length, ⅑th suction of
of 1 inch. the host’s
blood. When
replete they
fall to the ground—if a larva or pupa, in order to undergo its
metamorphosis to the next stage of its existence, and afterwards seek
a fresh host; if an adult female, to lay its eggs amongst herbage. The
adult male is not capable of distension by suction, though it equally
attaches itself to a host.
After undergoing metamorphoses, grass ticks, with the exception
of males, are light in colour, soft and lethargic, and remain concealed
for some time while recovering strength before seeking a fresh host.
Professor Neumann alludes to the fact that a fresh host is sought
by ticks three several times during their existence.
The Larva. When first hatched out from the eggs, which are
supposed to be laid at the roots of coarse herbage, the young ticks are
white and soft, but
soon gain strength.
Provided the
weather is
favourable, they
climb up the stems,
and, holding by their
two posterior pairs
of legs, await the
passing of a host,
employing their two
front legs as insects
use their antennæ.
In this, as in other
“free living” stages of
their existence, the
young larvæ show
great activity,
attaching themselves
and clinging
tenaciously to any
moving object. They
appear to be more Fig. 201.—Adult female. Length, ⅐th of 1
numerous on the inch.
rank rushes growing
in damp, undrained
places.
On finding a host, larvæ attach themselves by the rostrum, and
remain there for about two days, by which time they are distended,
black and globular. At this time they are easily detached from the
host, and have lost their activity and clinging habits.
The Pupa. The possession of eight legs distinguishes the pupa
easily from the larva. The extra pair are placed behind the others.
After the metamorphosis, the pupa takes up its position on the stalks
of herbage, just as the larva had done, for another chance of
attachment to a host. But whereas adult grass ticks seem to confine
themselves mostly to sheep, cattle, and deer, the larvæ and pupæ
attach themselves very readily to various hosts, such as horses, dogs,
and even
human
beings. After
about four
days the
pupa is again
replete with
blood, black
and opaque,
and again
drops to the
ground to
undergo its
second and
final change.
Adults.
On reaching
the adult age,
both males
and females
again wait on
herbage for a
passing host. Fig. 202.—Partially distended female. The dotted
At this time, white line represents the size of the tick before
as well as distension.
after
distension of the female on the host, an action which appears to be
sexual intercourse freely takes place, even in confinement. On the
host the females gradually distend (Fig. 202), and in the course of so
doing vary much in colour and appearance. When fully replete, the
female Ixodes reduvius becomes globular and black. One taken in
this condition on April 15th commenced to lay on May 12th, and a
few others taken at the same time commenced shortly afterwards.
Grass ticks never remain on the host to undergo metamorphosis or
to lay eggs. They must therefore during their cycle of existence
contrive to find a fresh host no fewer than three times.
In an article published in the Transactions of the Highland and Ag.
Soc. for 1902 Mr. Wheeler draws attention to the close points of
resemblance between louping-ill, Texas fever, tsetse fly disease,
surra, heart-water, yellow fever, and malaria.
In the article previously referred to he summarises his conclusions
as follows:—
One species only of tick, Ixodes reduvius, commonly known as the
grass tick, has been found to carry the louping-ill bacillus to the
sheep. It is easily recognised by the red body of the young females,
the legs, shield, etc., being dark brown.
It lays its eggs, and undergoes its metamorphoses, in coarse
herbage, and after each change seeks a fresh “host” on which to
distend itself to a large size by suction of blood.
In all stages
grass ticks
abstain from all
food except
when on a host,
and they are
endowed with
extraordinary
powers of fasting
until a host is
found.
Ticks soon die
of drought
where there is
no good
harbourage
among rank
vegetation.
Judging from
analogy, it is
probable—
Fig. 203.—Female, under size. That the
bacillus can only
be obtained
from a diseased sheep, and inserted by the tick into another sheep.
That
ticks
convey
the
bacillus
through
their
eggs to
their
offspring
, as well
as retain
it
through
their
metamor
phoses.
That
there is
no
danger
in
removin Fig. 204.—Headless female.
g sheep
from foul ground to cultivated lowlands, but that the disease is easily
imported from one hill farm to another.
Strong and fat animals are nearly as susceptible to attack as weakly
ones.
If the land is once free of disease, it can only be re-imported by
diseased sheep, or ticks taken from them.
BRAXY.
HEAT STROKE—OVER-EXERTION.
In oxen and sheep heat stroke is rare as a primary accident, but it
is frequently produced by over-exertion resulting from the combined
action of the sun’s rays, heat, and fatigue due to work or travelling.
It is commonest during the hottest months of the year in oxen
doing hard work or in flocks which have been travelled considerable
distances. It may also be seen during cooler seasons as the result of
exceptional fatigue.
The disease results from a general intoxication which reacts most
markedly on the cerebro-spinal centres. It is in fact a complex
intoxication resulting from failure of the natural excretory organs to
perform their function completely, and from excessive central heat
acting on the nervous centres.
Fat animals out of condition are more readily attacked than
working animals or sheep reared in the open air.
The symptoms are very characteristic. Oxen when attacked first
of all show extremely rapid respiration and dyspnœa, announcing
progressive asphyxia. They move with the nostrils dilated, the eyes
prominent and injected, the mouth open and the tongue lolling out.
Then all of a sudden they come to a stop beside a wall, or, if at
liberty, in a ditch, and refuse to move. They may die rapidly with
symptoms of asphyxia if they are forced to move until completely
exhausted. In others, after a rest of several hours, the breathing
becomes slower, the anxiety less and normal conditions return.
In sheep the same general signs may be seen: panting respiration,
cyanosed mucous membranes and extreme anxiety, while death
follows rapidly in the same way, with symptoms of asphyxia.
The diagnosis is extremely easy. The prognosis is grave.
Treatment consists in prompt and free bleeding to prevent
pulmonary congestion. The animals should be rested in a shady,
sheltered spot. They should have cool drinks and be sprinkled over
the head, neck, or entire surface of the body with cold water.
To prevent such attacks, fat animals should not be moved for long
distances, or during the hottest hours of the day, while difficult and
prolonged exertion should be avoided.
CHAPTER VI.
DISEASES OF THE LYMPHATIC SYSTEM.
Fig. 209.—Superficial lymphatic glands of the head and neck. P, parotid gland;
Gl.SM, submaxillary gland; GaSG, subglossal gland; GaPPA, preparotid gland;
GaSA, subatloid gland; GaPS, prescapular gland; GaPPE, prepectoral gland; J,
jugular; 1re C, first rib.
Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.
ebooknice.com