Вы находитесь на странице: 1из 83

Instructor's Resource Manual

to

Programming the World Wide Web

Third Edition

R.W. Sebesta
Preface

Table of Contents

Preface

OVERVIEW

It is difficult to overestimate the effect the World Wide Web has had on the day­to­day lives of people, at
least those in the developed countries. In just a few years, we have learned to use the Web for a myriad of
disparate tasks, ranging from the mundane task of shopping for airline tickets to the crucial early­ morning
gathering of business news for a high­stakes day trader.
The speed at which millions of Web sites have appeared would seem to indicate that the technologies
used to build them were sitting on the shelf, fully developed and ready to use, even before the Web was
developed. Also, one might guess that the tens of thousands of people who built those sites were sitting
around   unemployed,   waiting   for   an   opportunity   and   already   possessing   the   knowledge   and   abilities
required to carry out this mammoth construction task when it appeared. Neither of these was true. The need
for new technologies was quickly filled by a large number of entrepreneurs, some at existing companies
and some who started new companies. A large part of the programmer need was filled, at least to the extent
to which it has been filled, by new programmers, some straight from high school. Many, however, were
previously employed by other sectors of the software development industry. All of them had to learn to use
new languages and new software systems.
Until recently, programmers learned Web software technologies through company in­house training, a
scattering of courses focused on one specific Web technology at colleges and universities, or on their own.
A visit  to a local  bookstore  will  turn up a large  supply of books on those  technologies aimed  at  the
practicing professional. In the last few years college courses have begun to appear that attempt to cover a
broad spectrum of Web programming technologies. One difficulty encountered by those teaching these
courses  is the lack  of a  textbook that  is targeted  to their needs.  Most  of the books that  discuss Web
programming were written for professionals, rather than college students. Such books are typically written
to fulfill the needs of professionals, which are quite different from those of college students. One major
difference between an academic book and a professional book lies in the assumptions made by the author
about the prior knowledge and experience of the audience. The backgrounds of professionals vary widely,
making it difficult to assume much of anything. On the other hand, a book written for junior computer
science  majors can make some definite assumptions about the background of the reader. This book is
written for those students.
The goal of this book is to provide the reader with a comprehensive introduction to the programming
tools and skills required to build and maintain server sites on the Web. A wide variety of technologies are
used in the construction of a Web site. There are now many books available, for professionals that focus on
these technologies. For example, there are dozens of books that specifically address only XHTML. The
same is true for a half­dozen other technologies. This book provides an overview of how the Web works, as
well as descriptions of many of the most widely used Web technologies.
The first and second editions of this book were used to teach a junior­level Web programming course
at the University of Colorado at Colorado Springs. The challenge for students in the course is to learn to
use   several   different   programming   languages   and   technologies   in   one   semester.   A   heavy   load   of
programming exercises is essential to the success of the course. Students build a basic, static Web site
using only XHTML as the first assignment. Throughout the remainder of the semester they add features to
their site as the new technologies are discussed in the course. Our students’ prior course work in Java, data
structures, and assembly language are helpful, as is the fact that many of them know some XHTML before
taking the course.
The most important prerequisite to the material of this book is a solid background in programming in
some language  that  supports object­oriented  programming. It  is helpful  to have some knowledge of a
second programming language and a bit of UNIX, which helps with the Perl part of the course. Also, UNIX
is still a popular platform choice for Web servers. Familiarity with a second language makes learning the
new languages easier. 

TABLE OF CONTENTS

The book is organized into three sections, introduction (Chapter 1), client­side technologies (Chapters 2–8),
and server­side technologies (Chapters 9–14). 
Chapter 1 lays the groundwork for the rest of the book. A few fundamentals are introduced, including
the history and nature of the Internet, the World Wide Web, browsers, servers, URLs, MIME types, and
HTTP. Also included in Chapter 1 are brief overviews of the most important topics of the rest of the book. 
Chapter  2  provides  an  introduction to  XHTML,  including images,  links, lists,  tables,  frames,   and
forms. Small examples are used to illustrate the many XHTML elements that are discussed in this chapter. 
The topic of Chapter 3 is Cascading Style Sheets, which have quickly become the standard way of
imposing style on the content specified in XHTML tags. Because of the size and complexity of the topic,
the chapter does not cover all of the aspects of style sheets. The topics discussed are levels of style sheets,
style specification formats, selector formats, property values, and color. Among the properties covered are
those for fonts, lists, and margins. Small examples are used to illustrate the subjects being discussed.
Chapter 4 introduces the core of JavaScript, a powerful language that could be used for a variety of
different applications. Our interest, of course, is its use in Web programming. Although JavaScript has
become a large and complex language, we use the student’s knowledge of programming in some other
language   to   leverage   our   discussion,   thereby   providing   a   useful   introduction   to   the   language   in   a
manageably   small   number   of   pages.   Topics   covered   are   the   object   model   of   JavaScript,   its   control
statements, objects, arrays, functions, constructors, and pattern matching.
In Chapter 5 we discuss some of the features of JavaScript that are related to XHTML documents.
Included  is  the  use   of  the  basic   and  DOM  2  event  and   event­handling  model,   which  can   be  used   in
conjunction with some of the elements of XHTML documents. 
Perhaps the most exciting and interesting application of JavaScript is for building dynamic XHTML
documents using the Document Object Model (DOM). Chapter 6 provides descriptions of a collection of
some of the document changes that can be made using JavaScript and the DOM. Included are element
positioning, moving elements, changing the visibility of elements, changing the color, style, and size of
text, changing the content of tags, changing the stacking order of overlapped elements, slow movement of
elements, and dragging and dropping elements. 
Java   applets   are   described   in   Chapter   7.   First,   the   fundamentals   of   applet   activities   and   the
paintComponent method are introduced. Then, the <object> tag and applet parameters are discussed. Next,
the chapter introduces the graphics that can be created by applets. Applets that can interact with the user
through Swing widgets are then covered.
Java is now being used in the introductory programming sequence at many colleges and universities.
This allows us to discuss Java applets without first introducing Java. For those institutions that do not use
Java as the language vehicle for their introductory programming courses, we provide a quick introduction
to Java in an appendix. 
 Chapter 8 presents an introduction to XML, which provides the means to design topic­specific markup
languages that can be shared among users with common interests. Included are the syntax and document
structure used by XML, data type definitions, namespaces, schemas, and the display of XML documents
with both Cascading Style Sheets and XML Transformations. Also included is an introduction to Web
services and XML processors.
Chapter 9 introduces the characteristics and capabilities of Perl as a general­purpose programming
language. Both before and since the arrival of the Web, the power and flexibility of Perl have been used on
a variety of non­ Web applications, including UNIX system administration and as the language for many of
the small to medium size programming tasks formally done in C. For the most part, we limit our focus on
Perl  to those parts of the language that  are needed  for CGI programming. Control statements, arrays,
hashes, references, functions, pattern matching, and file input and output are discussed.
Chapter 10 introduces the use of Perl for Common Gateway Interface (CGI) programming. Although
there are now alternatives to CGI, it is still widely used, and when it is, it is most often done in Perl. CGI
and CGI linkage are introduced first. Then the form of query strings for form data is described. Finally, the
CGI.pm  module is introduced, which greatly simplifies CGI programming in Perl. Several examples are
used to show how common CGI tasks are designed and programmed in Perl using CGI.pm.
Java servlets and JSP are discussed in Chapter 11. The chapter introduces the mechanisms for building
Java   servlets   and   presents   several   examples   of   how   servlets   can   be   used   to   present   interactive   Web
documents. Then, two approaches to storing information on clients using servlets, cookies and session
tracking,   are   introduced   and   illustrated   with   examples.   Finally,   JSP   is   introduced   through   a   series   of
examples.
Chapter   12   introduces   PHP,   a   server­side   scripting   language   that   is   currently   gaining   popularity,
especially as a database access language. The basics of the language are discussed, as well as the use of
cookies and session tracking. The use of PHP as a Web database access language is covered in Chapter 14. 
Chapter 13 is an introduction to ASP.NET, though it begins with a brief introduction to C#. ASP.NET
controls are among the topics discussed in this chapter. Constructing Web services with ASP.NET is also
introduced.
Chapter 14 provides an introduction to database access through the Web. This chapter includes an
introduction to the nature of relational databases, architectures for database access, the structured query
language, SQL, and the free database system, MySQL. Then, three approaches to Web access to databases
are discussed: using Perl, using PHP, and using Java JDBC. The JDBC section is lengthy, including a
complete Java database application program, as well as metadata and the use of JDBC in servlets. All of the
program examples in the chapter use MySQL.
This book includes an appendix that introduces Java to those who have experience with C++ and
object­oriented programming. Students who do not know Java can learn enough of the language from this
appendix to allow them to understand the Java applets, servlets, JSP, and JDBC that appear in this book.

SUPPORT MATERIALS

The   supplements   for   the   book   are   available   at   Addison­Wesley’s   Web   site   www.aw.com/cssupport.
Support materials available to all readers of this book include

 A set of lecture notes in the form of PowerPoint files. The notes were developed to be the basis for class 
lectures on the book material.
 Code for example programs
 PowerPoint slides of all the figures

Additional support material including solutions to selected exercises are available only to instructors
adopting this textbook for classroom use. Please contact your school’s Addison­Wesley representative for
information on obtaining access to this material.

SOFTWARE AVAILABILITY

Most of the software systems described in this book are available free to students. These include browsers,
which   provide  an   interpreter  for  JavaScript   and  the   Java  Virtual   Machine.   Also,  Perl,  PHP,  and   Java
language processors, as well as Java class libraries to support servlets and Java JDBC, are available and
free. ASP.NET is supported by the .NET software available from Microsoft.

DIFFERENCES BETWEEN THE SECOND EDITION AND THE 
THIRD EDITION 

The third edition differs significantly from the second. Chapter 13, on ASP.NET, is entirely new. Chapter
11 was dramatically changed: the material on Web servers was moved to Chapter 1 and a lengthy section
on JSP was added. Chapter 3 was reorganized to a more rational order. Also, sections were added on
borders and selector formats. Chapter 5 was also reorganized. A section on Web services was added to
Chapter 8. (The new Chapter 13 also includes a section on Web services.) Finally, the section on running
applets in Java threads in Chapter 7 was eliminated.
Throughout the book, the XHTML was updated to conform to the XHTML 1.1 recommendation, and
all documents were validated under the 1.1 standard. Also, numerous small changes were made to improve
the correctness and clarity of the material.
ACKNOWLEDGEMENTS 

The quality of this book was significantly improved as a result of the extensive suggestions, corrections,
and comments provided by its reviewers. It was reviewed by: 

Dunren Che
Southern Illinois University

Richard C. Deter
Middle Tennessee State University

George Holmes
University of Arkansas

Kadathur Lakshmanan
State University of New York at Brockport

Tim Margush
University of Akron

Robert Noonan
College of William and Mary

Jeff Offutt
George Mason University

Marius C. Silaghi
Florida Institute of Technology

Chen­chi Shing
Radford University

Donald S. Szarkowicz
Indiana University Northwest

Michael Weiss
Carleton University

Jonwook Woo
California State University, Los Angeles

Tom Wulf
University of Cincinnati
Mir Farook Ali

Elizabeth Leboffee

Matt Goldstein, Editor, Katherine Harutunian, Project Editor, Patty Mahtani, Managing Editor, and
Sarah   Bartlett,   Production   Assistant,   all   deserve   my   gratitude   for   their   encouragement   and   help   in
completing the manuscript. Also, thanks to Tarida Anantachai at Argosy Publishing for quickly converting
the collection of files I provided into a bound book. 
Finally, I thank my children, Jake and Darcie, for their patience in enduring my absence from them
throughout the many hours I invested in writing this book.

Contents

Preface  xix
1 Fundamentals 1
1.1 A Brief Introduction to the Internet  2
1.1.1 Origins  2
1.1.2 What the Internet Is  3
1.1.3 Internet Protocol Addresses  3
1.1.4 Domain Names  4
1.2 The World Wide Web  6
1.2.1 Origins  6
1.2.2 Web or Internet?  7
1.3 Web Browsers  7
1.4 Web Servers  8
1.4.1 Web Server Operation  8
1.4.2 General Server Characteristics  9
1.4.3 Apache  10
1.4.4 IIS  11
1.5 Uniform Resource Locators  12
1.5.1 URL Formats  12
1.5.2 URL Paths  13
1.6 Multipurpose Internet Mail Extensions  14
1.6.1 Type Specifications  14
1.6.2 Experimental Document Types  15
1.7 The Hypertext Transfer Protocol  16
1.7.1 The Request Phase  16
1.7.2 The Response Phase  18
1.8 The Web Programmer’s Toolbox  19
1.8.1 Overview of XHTML  20
1.8.2 Tools for Creating XHTML Documents  20
1.8.3 Plug­ins and Filters  21
1.8.4 Overview of XML  22
1.8.5 Overview of JavaScript  22
1.8.6 Overview of Java  23
1.8.7 Overview of Perl  24
1.8.8 Overview of PHP  24
1.9 Summary  25
Review Questions   26
Exercises   28

2 Introduction to XHTML 29
2.1 Origins and Evolution of HTML and XHTML  30
2.1.1 Versions of HTML and XHTML  30
2.1.2 HTML versus XHTML  31
2.2 Basic Syntax  32
2.3 Standard XHTML Document Structure  33
2.4 Basic Text Markup  35
2.4.1 Paragraphs  35
2.4.2 XHTML Document Validation  37
2.4.3 Line Breaks  38
2.4.4 Headings  39
2.4.5 Block Quotations  40
2.4.6 Font Styles and Sizes  42
2.4.7 Character Entities  44
2.4.8 Horizontal Rules  45
2.4.9 The meta Element  45
2.5 Images  45
2.5.1 Image Formats  45
2.5.2 The <img /> Tag  46
2.6 Hypertext Links  49
2.6.1 Links  49
2.6.2 Targets within Documents  52
2.6.3 Using Links  52
2.7 Lists  53
2.7.1 Unordered Lists  53
2.7.2 Ordered Lists  54
2.7.3 Definition Lists  57
2.8 Tables  58
2.8.1 Basic Table Tags  58
2.8.2 The rowspan and colspan Attributes  60
2.8.3 The align and valign Attributes  63
2.8.4 The cellpadding and cellspacing Attributes  64
2.8.5 Table Sections  66
2.9 Forms  66
2.9.1 The <form> Tag  67
2.9.2 The <input> Tag  67
2.9.3 The <select> Tag  71
2.9.4 The <textarea> Tag  73
2.9.5 The Submit and Reset Buttons  74
2.9.6 A Complete Form Example  75
2.10 Frames  79
2.10.1 Framesets  79
2.10.2 Frames  80
2.11 Syntactic Differences between HTML and XHTML  85
2.12 Summary  87
Review Questions   88
Exercises   90

3 Cascading Style Sheets 93
3.1 Introduction  94
3.2 Levels of Style Sheets  95
3.3 Style Specification Formats  96
3.4 Selector Forms  97
3.4.1 Simple Selector Forms  97
3.4.2 Class Selectors  98
3.4.3 Generic Selectors  99
3.4.4 id Selectors  99
3.4.5 Pseudo Classes  99
3.5 Property Value Forms  100
3.6 Font Properties  102
3.6.1 Font Families  102
3.6.2 Font Sizes  103
3.6.3 Font Styles  103
3.6.4 Font Weights  104
3.6.5 Font Shorthands  104
3.6.6 Text Decoration  106
3.7 List Properties  108
3.8 Color  111
3.8.1 Color Groups  112
3.8.2 Color Properties  112
3.9 Alignment of Text  113
3.10 The Box Model  116
3.10.1 Borders  116
3.10.2 Margins and Padding  119
3.11 Background Images  121
3.12 The <span> and <div> Tags  123
3.13 Summary  124
Review Questions   126
Exercises   127

4 The Basics of JavaScript 129
4.1 Overview of JavaScript  130
4.1.1 Origins  130
4.1.2 JavaScript and Java  130
4.1.3 Uses of JavaScript  131
4.1.4 Event­Driven Computation  132
4.1.5 Browsers and XHTML/JavaScript Documents  132
4.2 Object Orientation and JavaScript  133
4.2.1 JavaScript Objects  133
4.3 General Syntactic Characteristics  134
4.4 Primitives, Operations, and Expressions  136
4.4.1 Primitive Types  136
4.4.2 Numeric and String Literals  137
4.4.3 Other Primitive Types  138
4.4.4  Declaring Variables  138
4.4.5 Numeric Operators  139
4.4.6 The Math Object  140
4.4.7 The Number Object  140
4.4.8 The String Catenation Operator  141
4.4.9 Implicit Type Conversions  141
4.4.10 Explicit Type Conversions  142
4.4.11 String Properties and Methods  143
4.4.12 The typeof Operator  144
4.4.13 Assignment Statements  145
4.4.14 The Date Object  145
4.5 Screen Output and Keyboard Input  146
4.6 Control Statements  150
4.6.1 Control Expressions  150
4.6.2 Selection Statements  151
4.6.3 The switch Statement  152
4.6.4 Loop Statements  155
4.7 Object Creation and Modification  158
4.8 Arrays  160
4.8.1 Array Object Creation  160
4.8.2 Characteristics of Array Objects  160
4.8.3 Array Methods  163
4.9 Functions  165
4.9.1 Fundamentals  166
4.9.2 Local Variables  167
4.9.3 Parameters  167
4.9.4 The sort Method, Revisited  170
4.10 An Example  171
4.11 Constructors  172
4.12 Pattern Matching Using Regular Expressions  174
4.12.1 Character and Character­Class Patterns  174
4.12.2 Anchors  177
4.12.3 Pattern Modifiers  177
4.12.4 Other Pattern­Matching Methods of String  178
4.13 Another Example  179
4.14 Errors in Scripts  181
4.15 Summary  183
Review Questions   185
Exercises   187

5 JavaScript and HTML Documents 189
5.1 The JavaScript Execution Environment  190
5.2 The Document Object Model  191
5.3 Element Access in JavaScript  193
5.4 Events and Event Handling  196
5.4.1 Basic Concepts of Event Handling  196
5.4.2 Events, Attributes, and Tags  197
5.5 Handling Events from Body Elements  200
5.6 Handling Events from Button Elements  201
5.6.1 Plain Buttons  201
5.6.2 Checkboxes and Radio Buttons  202
5.7 Handling Events from Text Box and Password Elements  207
5.7.1 The Focus Event  207
5.7.2 Validating Form Input  209
5.8 The DOM 2 Event Model  217
5.8.1 Event Propagation  217
5.8.2 Event Handler Registration  218
5.8.3 An Example of the DOM 2 Event Model  220
5.9 The navigator Object  222
5.10 Summary  224
Review Questions   225
Exercises   226

6 Dynamic Documents with JavaScript 229
6.1 Introduction  230
6.2 Element Positioning  230
6.2.1 Absolute Positioning  231
6.2.2 Relative Positioning  235
6.2.3 Static Positioning  236
6.3 Moving Elements  236
6.4 Element Visibility  239
6.5 Changing Colors and Fonts  241
6.5.1 Changing Colors  241
6.5.2 Changing Fonts  242
6.6 Dynamic Content  244
6.7 Stacking Elements  246
6.8 Locating the Mouse Cursor  250
6.9 Reacting to a Mouse Click  253
6.10 Slow Movement of Elements  254
6.11 Dragging and Dropping Elements  258
6.12 Summary  262
Review Questions   263
Exercises   264

7 Java Applets 267
7.1 Introduction  268
7.2 The Primary Applet Activities  270
7.3 The paintComponent Method  271
7.4 The <object> Tag  274
7.5 Applet Parameters  275
7.6 Simple Graphics  278
7.6.1 The Coordinate System  278
7.6.2 Lines  278
7.6.3 Rectangles  279
7.6.4 Polygons  280
7.6.5 Ovals  282
7.7 Color  282
7.8 Interactive Applets  283
7.8.1 Java Swing GUI Components  284
7.8.2 The Java Event Model  288
7.9 Summary  293
Review Questions   293
Exercises   294

8 Introduction to XML 297
8.1 Introduction  298
8.2 The Syntax of XML  300
8.3 XML Document Structure  303
8.4 Document Type Definitions  304
8.4.1 Declaring Elements  305
8.4.2 Declaring Attributes  307
8.4.3 Declaring Entities  308
8.4.4 A Sample DTD  309
8.4.5 Internal and External DTDs  310
8.5 Namespaces  312
8.6 XML Schemas  314
8.6.1 Schema Fundamentals  314
8.6.2 Defining a Schema  315
8.6.3 Defining a Schema Instance  316
8.6.4 An Overview of Data Types  317
8.6.5 Simple Types  318
8.6.6 Complex Types  319
8.6.7 Validating Instances of Schemas  321
8.7 Displaying Raw XML Documents  322
8.8 Displaying XML Documents with CSS  324
8.9 XSLT Style Sheets  326
8.9.1 Overview of XSLT  327
8.9.2 XSL Transformations for Presentation  328
8.10 XML Processors  335
8.10.1 The Purposes of XML Processors  336
8.10.2 The SAX Approach  337
8.10.3 The DOM Approach  337
8.11 Web Services  338
8.12 Summary  339
Review Questions   341
Exercises   342

9 The Basics of Perl 345
9.1 Origins and Uses of Perl  346
9.2 Scalars and Their Operations  346
9.2.1 Numeric and String Literals  347
9.2.2 Scalar Variables  348
9.2.3 Numeric Operators  349
9.2.4 String Operators  350
9.2.5 String Functions  351
9.3 Assignment Statements and Simple Input and Output  352
9.3.1 Assignment Statements  352
9.3.2 Keyboard Input  352
9.3.3 Screen Output  353
9.4 Control Statements  354
9.4.1 Control Expressions  355
9.4.2 Selection and Loop Statements  357
9.5 Fundamentals of Arrays  359
9.5.1 List Literals  359
9.5.2 Arrays  360
9.5.3 The foreach Statement  361
9.5.4 Built­In Functions for Arrays and Lists  362
9.5.5 An Example  364
9.6 Hashes  365
9.7 References  367
9.8 Functions  368
9.8.1 Fundamentals  368
9.8.2 Local Variables  369
9.8.3 Parameters  369
9.8.4 The sort Function, Revisited  370
9.8.5 An Example  371
9.9 Pattern Matching  373
9.9.1 The Basics of Patterns and Pattern Matching  373
9.9.2 Remembering Matches  377
9.9.3 Substitutions  377
9.9.4 The Transliterate Operator  378
9.10 File Input and Output  378
9.11 An Example  381
9.12 Summary  383
Review Questions   385
Exercises   386

10 Using Perl for CGI Programming 389
10.1 The Common Gateway Interface  390
10.2 CGI Linkage  392
10.3 Query String Format  395
10.4 The CGI.pm Module  397
10.4.1 Common CGI.pm Functions  397
10.4.2 A Complete Form Example  401
10.5 A Survey Example  407
10.6 Cookies  419
10.7 Summary  424
Review Questions   425
Exercises   426

11 Servlets and Java Server Pages 429
11.1 Overview of Servlets  430
11.2 Servlet Details  431
11.3 A Survey Example  435
11.4 Storing Information on Clients  442
11.4.1 Cookies  442
11.4.2 Session Tracking  451
11.5 Java Server Pages  456
11.5.1 Motivations for JSP  456
11.5.2 JSP Documents  457
11.5.3 Scriptlets  459
11.5.4 Expression Language  463
11.5.5 JSTL Control Action Elements  465
11.6 Summary  470
Review Questions   471
Exercises   472
12 Introduction to PHP 475
12.1 Origins and Uses of PHP  476
12.2 Overview of PHP  476
12.3 General Syntactic Characteristics  477
12.4 Primitives, Operations, and Expressions  479
12.4.1 Variables  479
12.4.2 Integer Type  479
12.4.3 Double Type  480
12.4.4 String Type  480
12.4.5 Boolean Type  480
12.4.6 Arithmetic Operators and Expressions  481
12.4.7 String Operations  482
12.4.8 Scalar Type Conversions  483
12.4.9 Assignment Operators  484
12.5 Output  484
12.6 Control Statements  486
12.6.1 Relational Operators  486
12.6.2 Boolean Operators  486
12.6.3 Selection Statements  486
12.6.4 Loop Statements  487
12.6.5 Alternative Compound Delimiters  487
12.6.6 An Example  488
12.7 Arrays  489
12.7.1 Array Creation  489
12.7.2 Accessing Array Elements  491
12.7.3 Dealing with Arrays  492
12.7.4 Sequential Access to Array Elements  493
12.7.5 Sorting Arrays  495
12.8 Functions  498
12.8.1 General Characteristics of Functions  498
12.8.2 Parameters  498
12.8.3 The Scope of Variables  500
12.8.4 The Lifetime of Variables  501
12.9 Pattern Matching  502
12.10 Form Handling  505
12.11 Files  511
12.11.1 Opening and Closing Files  511
12.11.2 Reading from a File  513
12.11.3 Writing to a File  514
12.11.4 Locking Files  514
12.12 Cookies  514
12.13 Session Tracking  515
12.14 Summary  516
Review Questions   517
Exercises   519

13 Introduction to ASP.NET 523
13.1 Overview of the .NET Framework  523
13.1.1 Background  523
13.1.2 The Common Language Runtime  524
13.1.3 .NET Languages  524
13.1.4 The Common Language Infrastructure  525
13.2 Introduction to C#  526
13.2.1 Origins  526
13.2.2 Primitive Types and Expressions  527
13.2.3 Data Structures  527
13.2.4 Control Statements  528
13.2.5 Classes, Methods, and Structures  529
13.2.6 Properties  530
13.2.7 Delegates  531
13.2.8 Program Structure  531
13.2.9 File Storage for Programs  532
13.3 Introduction to ASP.NET  533
13.3.1 The Basics  533
13.3.2 ASP.NET Documents  535
13.3.3 Code­Behind Files  537
13.4 ASP.NET Controls  539
13.4.1 HTML Controls  539
13.4.2 Life Cycle of a Simple ASP.NET Document  541
13.4.3 Page­Level Events  544
13.4.4 Control Events  545
13.4.5 Web Controls  547
13.4.6 Creating Control Elements with Code  548
13.4.7 Response Output for Controls  549
13.4.8 An Example  550
13.4.9 Validation Controls  552
13.5 Web Services  555
13.5.1 Constructing Web Services  555
13.5.2 Advertising Web Services  559
13.6 Summary  560
Review Questions   561
Exercises   563

14 Database Access through the Web 565
14.1 Relational Databases  566
14.2 An Introduction to the Structured  Query Language  570
14.2.1 The CREATE TABLE SQL Command  570
14.2.2 The INSERT SQL Command  571
14.2.3 The SELECT SQL Command  571
14.2.4 The UPDATE SQL Command  572
14.2.5 The DELETE SQL Command  572
14.2.6 The DROP SQL Command  573
14.2.7 Joins  573
14.3 Architectures for Database Access  575
14.3.1 Client/Server Architectures  575
14.3.2 Database Access with Embedded SQL  576
14.3.3 The Microsoft Access Architecture  576
14.3.4 The Perl DBI/DBD Architecture  577
14.3.5 PHP and Database Access  577
14.3.6 The Java JDBC Architecture  577
14.4 The MySQL Database System  578
14.5 Database Access with Perl and MySQL  581
14.5.1 The DBI Module  581
14.5.2 An Example  583
14.6 Database Access with PHP and MySQL  586
14.6.1 Potential Problems with Special Characters  586
14.6.2 Connecting to MySQL and Selecting a Database  587
14.6.3 Requesting MySQL Operations  588
14.6.4 A PHP/MySQL Example  589
14.7 Database Access with JDBC and MySQL  596
14.7.1 Approaches to Using JDBC Outside the Web  596
14.7.2 JDBC and MySQL  597
14.7.3 A Complete JDBC/MySQL Example  601
14.7.4 Metadata  604
14.7.5 JDBC and Servlets  606
14.8 Summary  610
Review Questions   612
Exercises   613

APPENDIX Introduction to Java  615

Index  633
Solutions to Selected Exercises

Chapter 2

Exercise 2.1

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e2_1.html
This is a solution to Exercise 2.1
-->

<html xmlns = "http://www.w3.org/1999/xhtml">


<head>
<title> Exercise 2.1 </title>
</head>
<body>
<h2> Ruper B. Baggins </h2>
<p>
1321 Causeway Circle <br />
Middle, Earth <br />
rbaggins@miderth.net<br />
</p>
<hr />
<h3> Bush Watcher </h3>
<p>
<big> Forest Keepers, Limited </big> <br />
14 Cranberry Way <br />
Middle, Earth <br />
<small> (no web site yet) </small>
</p>
</body>
</html>

Exercise 2.3

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e2_3.html
This is a solution to Exercise 2.3
-->

<html xmlns = "http://www.w3.org/1999/xhtml">


<head>
<title> Exercise 2.3 </title>
</head>
<body>
<h2> Ruper B. Baggins </h2>
<p>
1321 Causeway Circle <br />
Middle, Earth <br />
rbaggins@miderth.net<br /><br />
<a href = "e2_31.html"> Mr. Baggins' Background </a>
</p>
<hr />
<h3> Bush Watcher </h3>
<p>
<big> Forest Keepers, Limited </big> <br />
14 Cranberry Way <br />
Middle, Earth <br />
<small> (no web site yet) </small>
</p>
</body>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e2_31.html
This is part of the solution to Exercise 2.3
(The second document for the background info)
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 2.3 (background) </title>
</head>
<body>
<p>
Although we share the same family name, I am not in any way
related to the famous (or is it infamous) adventurer, Bilbo.
I have a lovely wife, Elvira, and two grown children, Max
and Miriam. Max has chosen to follow me in my profession,
which is described below. Miriam is a beekeeper for the town
bookkeeper, who keeps bees as a second job.
</p>
<p>
I am employed by Forest Keepers, Limited. My job, as I understand
it, is to keep an eye on the 4 acres of wild cranberries that
grow in the swamp at the edge of the village forest. I am required
to file a daily report, in triplicate, on the condition of the
cranberry bushes. To accomplish my task, I walk by and inspect
every cranberry bush in the swamp every workday. My employer provides
me with wading boots for my job. I pick up the boots at the office
every weekday morning and turn them back in, after a thorough
cleaning, after each workday.
</p>
</body>
</html>

Exercise 2.4
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e2_4.html
A solution to Exercise 2.4 - an unordered list
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Unordered List </title>
</head>
<body>
<h3> Grocery List </h3>
<ul>
<li> milk - 2%, 2 gallons </li>
<li> bread - butter top wheat </li>
<li> cheddar cheese - sharp, 1 lb. </li>
<li> soup - vegetable beef, 3 cans </li>
<li> hamburger - 80% fat free, 2 lbs. </li>
<li> orange juice - not from concentrate, 1/2 gallon </li>
<li> eggs - large, 1 dozen </li>
</ul>
</body>
</html>

Exercise 2.8

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e2_8.html
A solution to Exercise 2.8 - a nested, ordered list
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> An Ordered List </title>
</head>
<body>
<h3> My Uncles, Aunts, and Cousins </h3>
<ol>
<li> Violet Vinelli (my mother) </li>
<li> Frederick Vinelli
<ol>
<li> Mary Vinelli </li>
<li> Betty Ann Boop </li>
<li> Bob Vinelli </li>
<li> Roger Vinelli </li>
</ol>
</li>
<li> Maxine Robinson
<ol>
<li> John Robinson </li>
<li> Patty Robinson </li>
<li> Lucille Robinson </li>
</ol>
</li>
<li> Thomas Vinelli
<ol>
<li> Albert Vinelli </li>
<li> Alison MacKinsey </li>
<li> Alton Vinelli </li>
</ol>
</li>
</ol>

<ol>
<li> Albert Alphonso (my father) </li>
<li> Herbert Alphonso
<ol>
<li> Louise Alphonso </li>
<li> Pam Alphonso </li>
<li> Fred Alphonso </li>
</ol>
</li>
<li> Ann Marie Predicate
<ol>
<li> George Predicate </li>
<li> Michael Predicate </li>
<li> Darcie Predicate </li>
</ol>
</li>
<li> Ferdinand Alphonso
<ol>
<li> Noah Alphonso </li>
<li> Leah Alphonso </li>
<li> Jo Alphonso </li>
</ol>
</li>
</ol>
</body>
</html>

Exercise 2.9

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e2_9.html
A solution to Exercise 2.9 - a simple table
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> A simple table </title>
</head>
<body>
<table border = "border">
<caption> Trees </caption>
<tr>
<th> </th>
<th> Pine </th>
<th> Maple </th>
<th> Oak </th>
<th> Fir </th>
</tr>
<tr>
<th> Average Height (feet) </th>
<td> 55 </td>
<td> 50 </td>
<td> 50 </td>
<td> 65 </td>
</tr>
<tr>
<th> Average Width (inches) </th>
<td> 18 </td>
<td> 26 </td>
<td> 24 </td>
<td> 28 </td>
</tr>
<tr>
<th> Typical Lifespan (years) </th>
<td> 150 </td>
<td> 230 </td>
<td> 310 </td>
<td> 135 </td>
</tr>
<tr>
<th> Leaf Type </th>
<td> Long needles </td>
<td> Broadleaf </td>
<td> Split leaf </td>
<td> Short needles </td>
</tr>
</table>
</body>
</html>

Exercise 2.10

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e2_10.html
A solution to Exercise 2.10 - a simple table
-->
<html xmlns = "http://www.w3.org/1999/xhtml">

<head>
<title> A simple table </title>
</head>
<body>
<table border = "border">
<caption> Tree Characteristics </caption>
<tr>
<td rowspan = "2" colspan = "2"> </td>
<th colspan = "4"> Tree </th>
</tr>
<tr>
<th> Pine </th>
<th> Maple </th>
<th> Oak </th>
<th> Fir </th>
</tr>
<tr>
<th rowspan = "4"> Characteristic </th>
<th> Average Height (feet) </th>
<td> 55 </td>
<td> 50 </td>
<td> 50 </td>
<td> 65 </td>
</tr>
<tr>
<th> Average Width (inches) </th>
<td> 18 </td>
<td> 26 </td>
<td> 24 </td>
<td> 28 </td>
</tr>
<tr>
<th> Typical Lifespan (years) </th>
<td> 150 </td>
<td> 230 </td>
<td> 310 </td>
<td> 135 </td>
</tr>
<tr>
<th> Leaf Type </th>
<td> Long needles </td>
<td> Broadleaf </td>
<td> Split leaf </td>
<td> Short needles </td>
</tr>
</table>
</body>
</html>

Exercise 2.14

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.0 Frameset//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

<!-- e2_14.html
A solution to Exercise 2.14 - frames
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Family Frames </title>
</head>
<frameset rows = "60%, 40%" cols = "25%, *">
<frame src = "mothers_side.html" />
<frame src = "blank.html" name = "mothers_descr" />
<frame src = "fathers_side.html" />
<frame src = "blank.html" name = "fathers_descr" />
</frameset>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!-- mothers_side.html
Part of a solution to Exercise 2.14 - frames
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Mother's Side </title>
</head>
<body>
<h3> My Mother's Side: </h3>
<ul>
<li> <a href = "georgia_descr.html" target = "mothers_descr">
Georgia (my mother) </a> </li>
<li> <a href = "max_descr.html" target = "mothers_descr"> Max </a>
</li>
<li> <a href = "fred_descr.html" target = "mothers_descr"> Fred </a>
</li>
</ul>
</body>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<!-- fathers_side.html
Part of a solution to Exercise 2.14 - frames
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Father's Side </title>
</head>
<body>
<h3> My Father's Side: </h3>
<ul>
<li> <a href = "mike_descr.html" target = "fathers_descr"> Mike (my
father) </a> </li>
<li> <a href = "mary_descr.html" target = "fathers_descr"> Mary </a>
</li>
<li> <a href = "dennis_descr.html" target = "fathers_descr"> Dennis
</a> </li>
</ul>
</body>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- georgia_descr.html
Part of a solution to Exercise 2.14 - frames
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Georgia </title>
</head>
<body>
<p>
Georgia was born in 1918 in Championville, North Dakota. She attended
Championville High
School, where she was on the varsity tennis team.
</p>
</body>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- max_descr.html
Part of a solution to Exercise 2.14 - frames
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Max </title>
</head>
<body>
<p>
Max was born in 1921 in Championville, North Dakota. He attended
Championville High
School, where he was on the varsity football and baseball teams.
</p>
</body>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- fred_descr.html

Part of a solution to Exercise 2.14 - frames


-->
<html>
<head>
<title> Fred </title>
</head>
<body>
<p>
Fred was born in 1924 in Championville, North Dakota. He attended
Championville High
School, where he was captain of the chess team.
</p>
</body>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- mike_descr.html
Part of a solution to Exercise 2.14 - frames
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Mike </title>
</head>
<body>
<p>
Mike was born in 1914 in Losertown, South Dakota. He attended Loosertown
High
School, but was unable to finish for a variety of reasons.
</p>
</body>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- mary_descr.html
Part of a solution to Exercise 2.14 - frames
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Mary </title>
</head>
<body>
<p>
Mary was born in 1917 in Losertown, South Dakota. She attended
Loosertown High
School, but after six years of serious effort, she gave it up.
</p>
</body>
</html>

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<!-- dennis_descr.html
Part of a solution to Exercise 2.14 - frames
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Dennis </title>
</head>
<body>
<p>
Dennis was born in 1915 in Losertown, South Dakota. He attended
Loosertown High
School, but flunked more than half of the courses he took, so he did not
graduate.
</p>
</body>
</html>

Chapter 3

Exercise 3.1

/* Book Layout Style Sheet */


h1 {font: bold 24pt Helvetica 'Times New Roman'}
h2 {font: bold 20pt Helvetica 'Times New Roman'}
h3 {font: bold 16pt Helvetica 'Times New Roman'}
p {font: 12pt 'Times New Roman'}

Exercise 3.2

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e3_2.html
A solution to Exercise 3.2 - a styled table
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> A Styled Table </title>
<style type = "text/css">
<!--
td.win {font-size: 16pt; color: red;}
td.lose {font-size: 14pt; color: blue;}
-->
</style>
</head>
<body>
<table border = "border">
<caption style = "font-size: 18pt"> Football Scores </caption>
<tr>
<th> Team </th>
<th> Score </th>
</tr>
<tr>
<th style = "font-family: 'Century Gothic';
font-style: italic;
color: gold;"> Colorado </th>
<td class = "win"> 30 </td>
</tr>
<tr>
<th style = "font-family: 'Century Gothic';
font-style: italic;
color: red;"> Nebraska </th>
<td class = "lose"> 29 </td>
</tr>
<tr>
<th style = "font-family: 'Century Gothic';
font-style: italic;
color: grey;"> Iowa State </th>
<td class = "win"> 17 </td>
</tr>
<tr>
<th style = "font-family: 'Century Gothic';
font-style: italic;
color: blue;"> Kansas </th>
<td class = "lose"> 10 </td>
</tr>
<tr>
<th style = "font-family: 'Century Gothic';
font-style: italic;
color: purple;"> Kansas State </th>
<td class = "win"> 48 </td>
</tr>
<tr>
<th style = "font-family: 'Century Gothic';
font-style: italic;
color: green;"> Missouri </th>
<td class = "lose"> 13 </td>
</tr>
</table>
</body>
</html>

Exercise 3.4

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e3_4.html
A solution for Exercise 3.4 - floating a text element
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head> <title> Floating a text element </title>
</head>
<body>
<p style = "float: left; width: 1.5in; margin-right: 10px;
margin-bottom: 10px;" >
My airplane soars like an eagle and handles like
a hummingbird.
</p>

<p>
The 210 is the flagship
single-engine Cessna aircraft. Although the 210 began as a
four-place aircraft, it soon acquired a third row of seats,
stretching it to a six-place plane. The 210 is classified
as a high-performance airplane, which means its landing
gear is retractable and its engine has more than 200
horsepower. In its first model year, which was 1960,
the 210 was powered by a 260-horsepower fuel-injected
six-cylinder engine that displaced 471 cubic inches.
The 210 is the fastest single-engine airplane ever
built by Cessna.
</p>
</body>
</html>

Chapter 4

Exercise 4.1

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e4_1.html - A solution to Exercise 4.1


-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 4.1 </title>
</head>

<body>
<script type = "text/javascript">
<!--
var number, square, cube;

document.write("Number, Square, Cube <br /><br />");

for (number = 5; number < 16; number++) {


square = number * number;
cube = number * square;
document.write(number + ", " + square + ", " + cube + "<br />");
}
// -->
</script>
</body>
</html>
Exercise 4.2

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e4_2.html - A solution to Exercise 4.2


-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 4.2 </title>
</head>

<body>
<script type = "text/javascript">
<!--
var first = 1, second = 1, next, count;

document.write("First 20 Fibonacci Numbers <br/><br/>");


document.write("1 - 1 <br/> 2 - 1 <br/>");

for (count = 3; count <= 20; count++) {


next = first + second;
document.write(count + " - " + next + "<br/>");
first = second;
second = next;
}
// -->
</script>
</body>
</html>

Exercise 4.4

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e4_4.html - A solution to Exercise 4.4


-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 4.4 </title>
</head>

<body>
<script type = "text/javascript">
<!--
var first = 1, second = 1, next, count;

number = prompt("How many Fibonacci numbers do you want? (3-50)", "");

if (number >= 3 && number <= 50) {


document.write("First " + number + " Fibonacci Numbers <br /><br
/>");
document.write("1 - 1 <br/> 2 - 1 <br />");

for (count = 3; count <= number; count++) {


next = first + second;
document.write(count + " - " + next + "<br />");
first = second;
second = next;
}
}
else
document.write("Error - number not in the range 3-50");
// -->
</script>
</body>
</html>

Exercise 4.6

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e4_6.html - A solution to Exercise 4.6


-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 4.6 </title>
</head>

<body>
<script type = "text/javascript">
<!--
var first = 1, second = 1, next, count;

str = prompt("Please input your sentence", "");

var words = str.split(" ");

words = words.sort();

words_len = words.length;

for (count = 0; count < words_len; count++)


document.write(words[count] + "<br/>");
// -->
</script>
</body>
</html>

Exercise 4.7

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e4_7.html - A solution to Exercise 4.7


-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 4.7 </title>
<script type = "text/javascript">
<!--
// A function to compare strings for reverse alphabetic order

function dec_order(a, b) {
if (a > b)
return -1;
else if (a < b)
return 1;
else return 0;
}
// -->
</script>
</head>

<body>
<script type = "text/javascript">
<!--
var order, str, words, word_len, count;

// Get the input

str = prompt("Please input your sentence", "");


order = prompt("What order? (ascending or descending)", "");

// If the order is recognized, issue an error message

if (order != "descending" && order != "ascending")


document.write("Error - order is incorrectly specified <br/>");

// Otherwise, do the sort, depending on the requested order

else {
var words = str.split(" ");

if (order == "ascending")
words = words.sort();
else
words = words.sort(dec_order);

// Write out the results

words_len = words.length;

for (count = 0; count < words_len; count++)


document.write(words[count] + "<br/>");

}
// -->
</script>
</body>
</html>

Exercise 4.9

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e4_9.html - A solution to Exercise 4.9


-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 4.9 </title>
<script type = "text/javascript">
<!--
// Function e_names
// Parameter: an array of strings
// Returns: the number of given strings that end
// in either "ie" or "y"

function e_names(names) {
var len, index, count = 0;
len = names.length;

// Loop to use pattern matching to produce the count

for (index = 0; index < len; index++) {


position1 = names[index].search(/ie$/);
position2 = names[index].search(/y$/);
if (position1 + position2 > -2)
count++;
}
return count;
}
// -->
</script>
</head>

<body>
<script type = "text/javascript">
<!--
// Function e_names tester

var new_names = new Array ("freddie", "bob", "mieke", "yahoo2",


"georgey");
result = e_names(new_names);
document.write("The number of special names is: " + result + "<br/>");
// -->
</script>
</body>
</html>
Exercise 4.14

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e4_14.html - A solution to Exercise 4.14


-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 4.14 </title>
<script type = "text/javascript">
<!--
var result;

// Function reverser
// Parameter: a number
// Returns: the number with its digits in reverse order
// Note: Math.floor must be used to get the integer part
// of the division operations

function reverser(num) {
var digit, position = 0;

// If the number has just one digit, that's it

if (num < 10)


return num;

// Get the first digit

result = num % 10;


num = Math.floor(num / 10);

// Loop to produce the result for the rest

do {
digit = num % 10;
result = 10 * result + digit;
num = Math.floor(num / 10);
} while (num >= 1);

return result;
}
// -->
</script>
</head>

<body>
<script type = "text/javascript">
<!--
// Function reverser tester

var num1 = 2468, num2 = 7;


result = reverser(num1);
document.write("The reverse of 2468 is: " + result + "<br />");
result = reverser(num2);
document.write("The reverse of 7 is: " + result + "<br />");
// -->
</script>
</body>
</html>

Chapter 5

Exercise 5.1

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e5_1.hmtl
A solution to Exercise 5.1 - events with radio buttons
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 5.1 </title>
<script language = "JavaScript">

// The event handler function to produce an alert message


// about the chosen color

function colorChoice (color) {

switch (color) {
case "red":
alert("Your favorite color is red");
break;
case "blue":
alert("Your favorite color is blue");
break;
case "green":
alert("Your favorite color is green");
break;
case "yellow":
alert("Your favorite color is yellow");
break;
case "orange":
alert("Your favorite color is orange");
break;
default:
alert("Error in JavaScript function colorChoice");
break;
}
}

</script>
</head>
<body>
<h4> Choose your favorite color </h4>
<form>
<input type = "radio" name = "colorButton" value = "red"
onClick = "colorChoice('red')" />
Red
<br />
<input type = "radio" name = "colorButton" value = "blue"
onClick = "colorChoice('blue')" />
Blue
<br />
<input type = "radio" name = "colorButton" value = "green"
onClick = "colorChoice('green')" />
Green
<br />
<input type = "radio" name = "colorButton" value = "yellow"
onClick = "colorChoice('yellow')" />
Yellow
<br />
<input type = "radio" name = "colorButton" value = "orange"
onClick = "colorChoice('orange')" />
Orange
</form>
</body>
</html>

Exercise 5.2
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e5_2.hmtl
A solution to Exercise 5.2 - events with radio buttons
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 5.2 </title>
<script language = "JavaScript">

// The event handler function to produce an alert message


// about the chosen color

function colorChoice () {
var color;

// Put the DOM address of the elements array in a local variable

var radioElement = document.colorsForm.elements;

// Determine which button was pressed

for (var index = 0; index < radioElement.length; index++) {

if (radioElement[index].checked) {
color = radioElement[index].value;
break;
}
}

// Produce an alert message about the chosen color

switch (color) {
case "red":
alert("Your favorite color is red");
break;
case "blue":
alert("Your favorite color is blue");
break;
case "green":
alert("Your favorite color is green");
break;
case "yellow":
alert("Your favorite color is yellow");
break;
case "orange":
alert("Your favorite color is orange");
break;
default:
alert("Error in JavaScript function colorChoice");
break;
}
}

</script>
</head>
<body>
<h4> Choose your favorite color </h4>

<form name = "colorsForm">


<p>
<input type = "radio" name = "colorButton" value = "red" />
Red
</p> <p>
<input type = "radio" name = "colorButton" value = "blue" />
Blue
</p><p>
<input type = "radio" name = "colorButton" value = "green" />
Green
</p><p>
<input type = "radio" name = "colorButton" value = "yellow" />
Yellow
</p><p>
<input type = "radio" name = "colorButton" value = "orange" />
Orange
</p>
</form>

<script language = "JavaScript">

document.colorsForm.elements[0].onclick = colorChoice;
document.colorsForm.elements[1].onclick = colorChoice;
document.colorsForm.elements[2].onclick = colorChoice;
document.colorsForm.elements[3].onclick = colorChoice;
document.colorsForm.elements[4].onclick = colorChoice;
</script>
</body>
</html>

Exercise 5.4
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e5_4.html
A solution to Exercise 5.4
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 5.4 </title>

<script language = "JavaScript">

var total = 0;

// The event handler functions for the text boxes

function appleHandler() {
var number = document.orderForm.apples.value;
total = total + number * 0.59;
}

function orangeHandler() {
var number = document.orderForm.oranges.value;
total = total + number * 0.49;
}

function bananaHandler() {
var number = document.orderForm.bananas.value;
total = total + number * 0.39;
}

// The event handler function to produce the total cost message


// when "submit" is clicked

function finish() {
total = total * 1.05;
alert("Thank you for your order \n" +
"Your total cost is: $" + total + "\n");
}

</script>
</head>

<body>
<h3> Order Form </h3>

<form name = "orderForm" onSubmit = "finish()">


<p>
<input type = "text" name = "apples" size = "3"
onChange = "appleHandler()" />
Apples
</p><p>
<input type = "text" name = "oranges" size = "3"
onChange = "orangeHandler()" />
Oranges
</p><p>
<input type = "text" name = "bananas" size = "3"
onChange = "bananaHandler()" />
Bananas
</p><p>
<input type = "reset" name = "reset" />
<input type = "submit" name = "submit" />
</p>
</form>

</body>
</html>

Exercise 5.5
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e5_5.html
A solution to Exercise 5.5
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 5.5 </title>

<script type = "text/javascript">

var total = 0;

// The event handler functions for the text boxes

function appleHandler() {
var myApple = document.getElementById("apples");
var number = myApple.value;
if (number < 0 || number > 99) {
alert("Error - the quantity you entered in not valid" +
"\n [It is not in the range of 0 - 99] \n" +
"Please enter a valid quantity");
myApple.focus();
myApple.select();
return false;
}
else {
total = total + number * 0.59;
return true;
}
}

function orangeHandler() {
var myOrange = document.getElementById("oranges");
var number = myOrange.value;
if (number < 0 || number > 99) {
alert("Error - the quantity you entered in not valid" +
"\n [It is not in the range of 0 - 99] \n" +
"Please enter a valid quantity");
myOrange.focus();
myOrange.select();
return false;
}
else {
total = total + number * 0.39;
return true;
}
}

function bananaHandler() {
var myBanana = document.getElementById("bananas");
var number = myBanana.value;
if (number < 0 || number > 99) {
alert("Error - the quantity you entered in not valid" +
"\n [It is not in the range of 0 - 99] \n" +
"Please enter a valid quantity");
myBanana.focus();
myBanana.select();
return false;
}
else {
total = total + number * 0.49;
return true;
}
}

// The event handler function to produce the total cost message


// when "submit" is clicked

function finish() {
total = total * 1.05;
alert("Thank you for your order \n" +
"Your total cost is: $" + total + "\n");
}

</script>
</head>

<body>
<h3> Order Form </h3>

<form name = "" onSubmit = "finish()">


<p>
<input type = "text" id = "apples" size = "3" />
Apples
</p><p>
<input type = "text" id = "oranges" size = "3" />
Oranges
</p><p>
<input type = "text" id = "bananas" size = "3" />
Bananas
</p><p>
<input type = "reset" name = "reset" />
<input type = "submit" name = "submit" />
</p>
</form>

<script type = "text/javascript">


<!--
// Set form element object properties to their
// corresponding event handler functions

document.getElementById("apples").onchange = appleHandler;
document.getElementById("oranges").onchange = orangeHandler;
document.getElementById("bananas").onchange = bananaHandler;
// -->
</script>
</body>
</html>

Exercise 5.6
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e5_6.html
A solution to Exercise 5.6
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 5.6 </title>

<script language = "JavaScript">

var total = 0;

// The event handler functions for the text boxes

function appleHandler() {
var dom = document.getElementById("apples");
var number = dom.value;
if (number < dom.min || number > dom.max) {
alert("Error - the quantity you entered in not valid" +
"\n [It is not in the range of " + dom.min +
" to " + dom.max + "] \n" +
"Please enter a valid quantity");
dom.focus();
dom.select();
return false;
}
else {
total = total + number * 0.59;
return true;
}

function orangeHandler() {
var dom = document.getElementById("oranges");
var number = dom.value;
if (number < dom.min || number > dom.max) {
alert("Error - the quantity you entered in not valid" +
"\n [It is not in the range of " + dom.min +
" to " + dom.max + "] \n" +
"Please enter a valid quantity");
dom.focus();
dom.select();
return false;
}
else {
total = total + number * 0.39;
return true;
}

function bananaHandler() {
var dom = document.getElementById("bananas");
var number = dom.value;
if (number < dom.min || number > dom.max) {
alert("Error - the quantity you entered in not valid" +
"\n [It is not in the range of " + dom.min +
" to " + dom.max + "] \n" +
"Please enter a valid quantity");
dom.focus();
dom.select();
return false;
}
else {
total = total + number * 0.49;
return true;
}

// The event handler function to produce the total cost message


// when "submit" is clicked

function finish() {
total = total * 1.05;
alert("Thank you for your order \n" +
"Your total cost is: $" + total + "\n");
}

</script>
</head>

<body>
<h3> Order Form </h3>

<form name = "orderForm" onSubmit = "finish()">


<p>
<input type = "text" id = "apples" size = "3" />
Apples
</p><p>
<input type = "text" id = "oranges" size = "3" />
Oranges
</p><p>
<input type = "text" id = "bananas" size = "3" />
Bananas
</p><p>
<input type = "reset" name = "reset" />
<input type = "submit" name = "submit" />
</p>
</form>

<script language = "JavaScript">


// Get DOM addresses of the text boxes

var appleDom = document.getElementById("apples");


var orangeDom = document.getElementById("oranges");
var bananaDom = document.getElementById("bananas");

// Set the onchange properties for the event handlers

appleDom.onchange = appleHandler;
orangeDom.onchange = orangeHandler;
bananaDom.onchange = bananaHandler;

// Add properties for minimum and maximum values for the text boxes

appleDom.max = 99;
appleDom.min = 0;
orangeDom.max = 99;
orangeDom.min = 0;
bananaDom.max = 99;
bananaDom.min = 0;
// -->

</script>
</body>
</html>

Chapter 6
Exercise 6.1
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<!-- e6_1.html
A solution to Exercise 6.1
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 6.1 </title>

<style type = "text/css">

/* A style for the paragraph of text */

.regtext {position: absolute; top: 100px; left: 100px;


font-family: Times; font-size: 14pt; width: 330px}

/* A style for the image */

.img {background-image: url(c172.gif); position: absolute;


left: 190px; top: 180px; width: 100px}

</style>

</head>
<body>

<p class = "img">


<br/><br/><br/><br/><br/>
</p>

<p class = "regtext">


I was born on July 4th,
1976, in Huckabee, Alaska.
I have three brothers and
a sister, all older than I.
My sister, Mary, is 26 years old.
She lives in Kalkan, Montana.
My oldest brother, Ron, is 32
years old. He lives in Huckabee.
My youngest brother, Max, is
28 years old. He lives in Pinkee,
Wyoming. My middle brother, Fred,
is 30 years old. He lives in
Kinkyhollow, Nebraska.
My parents, who are both still
living, still live in Huckabee.

</p>

</body>
</html>

Exercise 6.2

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<!-- e6_2.html
A solution to Exercise 6.2
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 6.2 </title>

<style type = "text/css">

/* A style for the paragraph of text */

.regtext {position: absolute; top: 150px; left: 100px;


font-family: Times; font-size: 14pt; width: 330px}

/* A style for the image */

.img {background-image: url(c172.gif); position: absolute;


left: 100px; top: 150px; width: 100px}

</style>

<script language = "JavaScript">

/* A function to move an element */

function moveIt(movee, newTop, newLeft) {

dom = document.getElementById(movee).style;

/* Change the top and left properties to perform the move */

dom.top = newTop;
dom.left = newLeft;
}

</script>
</head>
<body>

<h2> Background Image Position Control Buttons </h2>


<p>
<form name = "moveControl">
<input type = "radio" name = "choser" checked = "checked"
onclick = "moveIt('picture', 150, 100)" />
Northwest
<p/><p>
<input type = "radio" name = "choser"
onclick = "moveIt('picture', 150, 300)" />
Northeast
</p><p>
<input type = "radio" name = "choser"
onclick = "moveIt('picture', 300, 300)" />
Southeast
<p/><p>
<input type = "radio" name = "choser"
onclick = "moveIt('picture', 300, 100)" />
Southwest
</p>
</form>
<p class = "img" id = "picture">
<br/><br/><br/><br/><br/>
</p>

<p class = "regtext">


I was born on July 4th,
1976, in Huckabee, Alaska.
I have three brothers and
a sister, all older than I.
My sister, Mary, is 26 years old.
She lives in Kalkan, Montana.
My oldest brother, Ron, is 32
years old. He lives in Huckabee.
My youngest brother, Max, is
28 years old. He lives in Pinkee,
Wyoming. My middle brother, Fred,
is 30 years old. He lives in
Kinkyhollow, Nebraska.
My parents, who are both still
living, still live in Huckabee.

</p>

</body>
</html>

Exercise 6.3

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e6_3.html
A solution to Exercise 6.3
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 6.3 </title>

<style type = "text/css">

/* A style for the paragraph of text */

.regtext {position: absolute; top: 150px; left: 100px;


font-family: Times; font-size: 14pt; width: 330px}

</style>

<script language = "JavaScript">

/* A function to change the visibility of an element */

function flipImage(img) {
dom = document.getElementById(img).style;

/* Change the visibility property */

if (dom.visibility == "visible" || dom.visibility == "show")


dom.visibility = "hidden";
else
dom.visibility = "visible";
}

</script>
</head>

<body>

<h2> Background Image Visibility Control Buttons </h2>

<form name = "visibilityControl">


<p>
<input type = "checkbox" name = "choser"
onclick = "flipImage('northwest')" />
Northwest
<p/><p>
<input type = "checkbox" name = "choser"
onclick = "flipImage('northeast')" />
Northeast
</p><p>
<input type = "checkbox" name = "choser"
onclick = "flipImage('southeast')" />
Southeast
</p><p>
<input type = "checkbox" name = "choser"
onclick = "flipImage('southwest')" />
Southwest
</p>
</form>

<p id = "northwest" style = "background-image: url(c172.gif);


visibility: hidden; position: absolute;
left: 100px; top: 150px; width: 100px">
<br/><br/><br/><br/><br/>
</p>

<p id = "northeast" style = "background-image: url(c172.gif);


visibility: hidden; position: absolute;
left: 300px; top: 150px; width: 100px">
<br/><br/><br/><br/><br/>
</p>

<p id = "southeast" style = "background-image: url(c172.gif);


visibility: hidden; position: absolute;
left: 300px; top: 300px; width: 100px">
<br/><br/><br/><br/><br/>
</p>

<p id = "southwest" style = "background-image: url(c172.gif);


visibility: hidden; position: absolute;
left: 100px; top: 300px; width: 100px">
<br/><br/><br/><br/><br/>
</p>

<p class = "regtext">


I was born on July 4th,
1976, in Huckabee, Alaska.
I have three brothers and
a sister, all older than I.
My sister, Mary, is 26 years old.
She lives in Kalkan, Montana.
My oldest brother, Ron, is 32
years old. He lives in Huckabee.
My youngest brother, Max, is
28 years old. He lives in Pinkee,
Wyoming. My middle brother, Fred,
is 30 years old. He lives in
Kinkyhollow, Nebraska.
My parents, who are both still
living, still live in Huckabee.

</p>

</body>
</html>

Exercise 6.5

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- 6_5.html
A solution to Exercise 6.5
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Exercise 6.5 </title>
<script language = "JavaScript">
var top = "C172";

function toTop(newTop) {

// Get DOM addresses for the new top and the old top elements

domTop = document.getElementById(top).style;
domNew = document.getElementById(newTop).style;

// Set the zIndex properties of the two elements

domTop.zIndex = "0";
domNew.zIndex = "10";
top = newTop;
}

</script>

</head>

<body>
<p>
<a href = "JAVASCRIPT:toTop('C172')">
1
</a>
</p><p>
<a href = "JAVASCRIPT:toTop('cix')">
2
</a>
</p><p>
<a href = "JAVASCRIPT:toTop('C182')">
3
</a>
</p><p>
<img id = "C172" src = "c172.gif"
style = "position: absolute; top: 100; left: 0; z-index:
0;" />

<img id = "cix" src = "cix.gif"


style = "position: absolute; top: 100; left: 0; z-index:
0;" />

<img id = "C182" src = "c182.gif"


style = "position: absolute; top: 100; left: 0; z-index:
0;" />

</p><p></p>

</body>
</html>

Chapter 7
Exercise 7.1
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e7_1.html
To test the applet, e7_1.java
Solution to Exercise 7.1
Legal styles are BOLD, PLAIN, and ITALIC
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Test e7_1.java </title>
</head>
<body>
<p>
<object codetype = "application/java"
code = "e7_1.class"
width = "600"
height = "100">
<param name = "size"
value = "35" />
<param name = "font"
value = "Courier" />
<param name = "style"
value = "ITALIC" />
</object>
</p>
</body>
</html>

/* e7_1.java
An applet to illustrate parameters
*/
import java.applet.*;
import javax.swing.*;
import java.awt.*;

// The panel class on which the message will be painted

class MessagePanel2 extends JPanel {


Font myFont = new Font(e7_1.myFont, e7_1.myStyle,
e7_1.mySize);

public void paintComponent(Graphics grafObj) {


super.paintComponent(grafObj);
grafObj.setFont(myFont);
grafObj.drawString("Welcome to my home page!", 50, 50);
}
}

// The e7_1 applet

public class e7_1 extends JApplet {


static int mySize, myStyle;
static String myFont;

public void init() {


Container messageArea = getContentPane();
String pString;

// Get the fontsize parameter

pString = getParameter("size");

// If it's null, set the size to 30, otherwise


// use the parameter value

if (pString == null)
mySize = 30;
else mySize = Integer.parseInt(pString);
// Get the font parameter

pString = getParameter("font");

// If it's null, set the font to 'Times Roman',


// otherwise, use the parameter value

if (pString == null)

else myFont = pString;

// Get the font style parameter

pString = getParameter("style");

// If it's null, set the font to PLAIN, otherwise


// use the parameter value

if (pString == null)
myStyle = Font.PLAIN;
else if (pString.equals("BOLD"))
myStyle = Font.BOLD;
else if (pString.equals("ITALIC"))
myStyle = Font.ITALIC;

// Instantiate the panel with the message and add it to


// the content pane

MessagePanel2 myMessagePanel = new MessagePanel2();


messageArea.add(myMessagePanel);
}
}

Exercise 7.3

<?xml version = "1.0" encoding = "utf-8"?>


<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e7_3.html
To test the applet, Olympic
A solution to Exercise 7.3
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Test Olympic </title>
</head>
<body>
<p>
<object codetype = "application/java"
code = "Olympic.class"
width = "460"
height = "180">
</object>
</p>
</body>
</html>

/* Olympic.java
A solution to Exercise 7.3 - the applet
*/
import java.applet.*;
import java.awt.*;
import javax.swing.*;

// The panel class for drawing

class MyPanel extends JPanel {

public void paint(Graphics grafObj) {


Font myFont = new Font("TimesRoman", Font.ITALIC, 24);
super.paintComponent(grafObj);
grafObj.setColor(Color.green);
grafObj.drawRect(10, 10, 440, 120);
grafObj.setColor(Color.blue);
grafObj.drawOval(20, 20, 100, 100);
grafObj.drawOval(100, 20, 100, 100);
grafObj.drawOval(180, 20, 100, 100);
grafObj.drawOval(260, 20, 100, 100);
grafObj.drawOval(340, 20, 100, 100);
grafObj.setColor(Color.red);
grafObj.setFont(myFont);
grafObj.drawString("United States Olympic Committee", 60, 160);
}
}

// The Olympic applet

public class Olympic extends JApplet {


Container olympicArea = getContentPane();
MyPanel newPanel = new MyPanel();

// The init method for the applet - adds the panel


// to the content area of the applet

public void init() {


olympicArea.add(newPanel);
}

Exercise 7.4

/* Mexfood.java
A solution to Exercise 7.4
*/
import java.awt.*;
import java.applet.*;
import javax.swing.*;
public class Mexfood extends JApplet {

// Create a content pane

Container contentPane = getContentPane();

// The init method, which does everything in this applet

public void init() {

// Create a panel object and set its layout manager to put


// the components in a column

JPanel myPanel = new JPanel();


myPanel.setLayout(new GridLayout(4, 3, 10, 10));
myPanel.setBackground(Color.cyan);

// Create checkboxes and textboxes for the different food items


// and add them to the panel

TextField t1 = new TextField(2);


TextField t2 = new TextField(2);
TextField t3 = new TextField(2);
TextField t4 = new TextField(2);
JLabel l1 = new JLabel("Tacos Quantity:");
JLabel l2 = new JLabel("Chalupas Quantity:");
JLabel l3 = new JLabel("Burritos Quantity:");
JLabel l4 = new JLabel("Nachos Quantity:");
myPanel.add(l1);
myPanel.add(t1);
myPanel.add(l2);
myPanel.add(t2);
myPanel.add(l3);
myPanel.add(t3);
myPanel.add(l4);
myPanel.add(t4);

// Now add the panel

contentPane.add(myPanel);

} // End of init()
} // End of Mexfood applet

Exercise 7.5

/* FoodCost.java
A solution to Exercise 7.5
*/

import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
// The applet

public class FoodCost extends JApplet implements ActionListener {

private JPanel myPanel = new JPanel();


private JTextField t1, t2, t3, t4, t5;
private JLabel l1, l2, l3, l4, l5;
private double totalCost = 0.0;
Container contentPane = getContentPane();

public void init() {

// Create a panel object and set its layout manager to put


// the components in a column

myPanel.setLayout(new GridLayout(5, 2, 10, 10));


myPanel.setBackground(Color.cyan);

// Create checkboxes and textboxes for the different food items


// and add them to the panel

l1 = new JLabel("Tacos Quantity:");


l2 = new JLabel("Chalupas Quantity:");
l3 = new JLabel("Burritos Quantity:");
l4 = new JLabel("Nachos Quantity:");
l5 = new JLabel("Total Cost:");
t1 = new JTextField(2);
t2 = new JTextField(2);
t3 = new JTextField(2);
t4 = new JTextField(2);
t5 = new JTextField(6);

myPanel.add(l1);
myPanel.add(t1);
myPanel.add(l2);
myPanel.add(t2);
myPanel.add(l3);
myPanel.add(t3);
myPanel.add(l4);
myPanel.add(t4);
myPanel.add(l5);
myPanel.add(t5);

// Register the event handler

t1.addActionListener(this);
t2.addActionListener(this);
t3.addActionListener(this);
t4.addActionListener(this);

// Now add the panel

contentPane.add(myPanel);

} // End of init()
// The event handler

public void actionPerformed(ActionEvent e) {

// Determine which textbox has been changed and add the cost

int quantity;
Object source = e.getSource();

if (source == t1) {
quantity = Integer.parseInt(t1.getText());
totalCost = totalCost + quantity * 0.79;
} else if (source == t2) {
quantity = Integer.parseInt(t2.getText());
totalCost = totalCost + quantity * 1.19;
} else if (source == t3) {
quantity = Integer.parseInt(t3.getText());
totalCost = totalCost + quantity * 1.39;
} else if (source == t4) {
quantity = Integer.parseInt(t4.getText());
totalCost = totalCost + quantity * 1.29;
}
String cost = Double.toString(totalCost);
t5.setText("$" + cost);
repaint();

} //* end of method ActionEvent

} // End of Mexfood applet

Chapter 8

Exercise 8.1
<?xml version = "1.0" encoding = "utf-8"?>

<!-- cars.dtd - a document type definition for


the cars.xml document
A solution to Exercise 8.1
-->

<!ELEMENT car_catalog (car+)>


<!ELEMENT car (make, model, year, color, engine,
number_of_doors, transmission_type, accessories)>
<!ELEMENT make (#PCDATA)>
<!ELEMENT model (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ELEMENT color (#PCDATA)>
<!ELEMENT engine (number_of_cylinders, fuel_system)>
<!ELEMENT number_of_doors (#PCDATA)>
<!ELEMENT transmission_type (#PCDATA)>
<!ELEMENT accessories (#PCDATA)>
<!ATTLIST accessories radio CDATA #REQUIRED>
<!ATTLIST accessories air_conditioning CDATA #REQUIRED>
<!ATTLIST accessories power_windows CDATA #REQUIRED>
<!ATTLIST accessories power_steering CDATA #REQUIRED>
<!ATTLIST accessories power_brakes CDATA #REQUIRED>

<!ENTITY c "Chevrolet">
<!ENTITY f "Ford">
<!ENTITY d "Dodge">
<!ENTITY h "Honda">
<!ENTITY n "Nisson">
<!ENTITY t "Toyota">

Exercise 8.2

<?xml version = "1.0" encoding = "utf-8"?>

<!-- cars.xml - A solution to Exercise 8.2


-->

<!DOCTYPE car_catalog SYSTEM "cars.dtd">


<?xml-stylesheet type = "text/css" href = "cars.css"?>
<car_catalog>
<car>
<year> 1997 </year>
<make> &c; </make>
<model> Impala </model>
<color> Light blue </color>
<engine>
<number_of_cylinders> 8 cylinder
</number_of_cylinders>
<fuel_system> multi-port fuel injected </fuel_system>
</engine>
<number_of_doors> 4 door </number_of_doors>
<transmission_type> 4 speed automatic
</transmission_type>
<accessories radio = "yes" air_conditioning = "yes"
power_windows = "yes"
power_steering = "yes"
power_brakes = "yes" />
</car>
<car>
<year> 1965 </year>
<make> &f; </make>
<model> Mustang </model>
<color> White </color>
<engine>
<number_of_cylinders> 8 cylinder
</number_of_cylinders>
<fuel_system> 4BBL carburetor </fuel_system>
</engine>
<number_of_doors> 2 door </number_of_doors>
<transmission_type> 3 speed manual </transmission_type>
<accessories radio = "yes" air_conditioning = "no"
power_windows = "no" power_steering = "yes"
power_brakes = "yes" />
</car>
<car>
<year> 1985 </year>
<make> &t; </make>
<model> Camry </model>
<color> Blue </color>
<engine>
<number_of_cylinders> 4 cylinder
</number_of_cylinders>
<fuel_system> fuel injected </fuel_system>
</engine>
<number_of_doors> 4 door </number_of_doors>
<transmission_type> 4 speed manual </transmission_type>
<accessories radio = "yes" air_conditioning = "yes"
power_windows = "no" power_steering = "yes"
power_brakes = "yes" />
</car>
</car_catalog>

Exercise 8.4

<!-- cars.css - a style sheet for the cars.xml document


A solution to Exercise 8.4
-->

car {display: block; margin-top: 15px; color: blue;}


year, make, model {color: red; font-size: 16pt;}
color {display: block; margin-left: 20px; font-size: 12pt;}
engine {display: block; margin-left: 20px;}
number_of_cylinders {font-size: 12pt;}
fuel_system {font-size: 12pt;}
number_of_doors {display: block; margin-left: 20px; font-size: 12pt;}
transmission_type {display: block; margin-left: 20px; font-size: 12pt;}

Exercise 8.5
<?xml version = "1.0" encoding = "utf-8"?>
<!-- xslcar.xsl
A solution to Exercise 8.3
-->

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/TR/WD-xsl"


xmlns = "http://www.w3.org/TR/REC-html40">

<xsl:template match = "/">


<h2> Car Description </h2>
<span style = "font-style: italic"> Year: </span>
<xsl:value-of select = "car_catalog/car/year" /> <br />
<span style = "font-style: italic"> Make: </span>
<xsl:value-of select = "car_catalog/car/make" /> <br />
<span style = "font-style: italic"> Model: </span>
<xsl:value-of select = "car_catalog/car/model" /> <br />
<span style = "font-style: italic"> Color: </span>
<xsl:value-of select = "car_catalog/car/color" /> <br />
<span style = "font-style: italic"> Cylinders: </span>
<xsl:value-of select =
"car_catalog/car/engine/number_of_cylinders" /> <br />
<span style = "font-style: italic"> Fuel system: </span>
<xsl:value-of select = "car_catalog/car/engine/fuel_system" />
<br />
<span style = "font-style: italic"> Doors: </span>
<xsl:value-of select = "car_catalog/car/number_of_doors" />
<br />
</xsl:template>

</xsl:stylesheet>

Exercise 8.6
<?xml version = "1.0" encoding = "utf-8"?>
<!-- xslcars.xsl
A solution to Exercise 8.6
-->

<xsl:stylesheet xmlns:xsl = "http://www.w3.org/TR/WD-xsl"


xmlns = "http://www.w3.org/TR/REC-html40">

<xsl:template match = "/">


<h2> Car Description </h2>

<xsl:for-each select = "car_catalog/car">


<span style = "font-style: italic"> Year: </span>
<xsl:value-of select = "year" /> <br />
<span style = "font-style: italic"> Make: </span>
<xsl:value-of select = "make" /> <br />
<span style = "font-style: italic"> Model: </span>
<xsl:value-of select = "model" /> <br />
<span style = "font-style: italic"> Color: </span>
<xsl:value-of select = "color" /> <br />
<span style = "font-style: italic"> Cylinders: </span>
<xsl:value-of select = "engine/number_of_cylinders" />
<br />
<span style = "font-style: italic"> Fuel system: </span>
<xsl:value-of select = "engine/fuel_system" /> <br />
<span style = "font-style: italic"> Doors: </span>
<xsl:value-of select = "number_of_doors" />
<br /><br />
</xsl:for-each>

</xsl:template>

</xsl:stylesheet>

Chapter 9
Exercise 9.1

# e9_1.pl - A solution to Exercise 9.1


#
# Input: Three numbers, a, b, and c, each on its own line,
# from the keyboard.
# Output: The value of the expression 10ab-((c-1)/17.44)

# Get input

print "Please input the value of a ";


$a = <STDIN>;
print "Please input the value of b ";
$b = <STDIN>;
print "Please input the value of c ";
$c = <STDIN>;

# Compute the value of the expression

$value = 10 * $a * $b -(($c - 1) / 17.44);


print "The value of the expression is: $value \n";

Exercise 9.3
# e9_3.pl - A solution to Exercise 9.3
#
# Input: Three names, on separate lines, from the keyboard
# Output: The input names in alphabetical order, without
# using an array

# Get input

print "Please input the value of name1: ";


chomp($name1 = <STDIN>);
print "Please input the value of name2: ";
chomp($name2 = <STDIN>);
print "Please input the value of name3: ";
chomp($name3 = <STDIN>);

# Pass one - compare/interchange both pairs

if ($name2 lt $name1) {
$temp = $name1;
$name1 = $name2;
$name2 = $temp;
}

if ($name3 lt $name2) {
$temp = $name2;
$name2 = $name3;
$name3 = $temp;
}
# Pass two - compare/interchange the first two

if ($name2 lt $name1) {
$temp = $name1;
$name1 = $name2;
$name2 = $temp;
}

print "The input numbers in order are: $name1, $name2, ",


"$name3 \n";

Exercise 9.5
# e9_5.pl - A solution to Exercise 9.5
#
# Input: A list of numbers in a file specified on
# the command line
# Output: Two lists of numbers, one with the input
# numbers that are greater than zero, and one
# with those that are less than zero (ignore
# the zero-valued numbers)
# Method: You must first build two arrays with the
# required output numbers, before you
# display any of them

# Loop to read input and build the two new arrays

while ($next = <>) {

if ($next > 0) {
push @pos_list, $next;
}
else {
if ($next < 0) {
push @neg_list, $next;
}
}
}

# Output the results

print "The array of positive numbers: \n @pos_list \n";


print "\nThe array of negative numbers: \n @neg_list \n";

Exercise 9.7
# e9_7.pl - A solution to Exercise 9.7
#
# Input: A file in which each line contains a string of
# the form: name+sales
# where in some cases the sales will be absent
# (but not the plus sign), specified on the command
# line
# Output: A list of the names and sales numbers that remain
# after the following processing:
# a) names with sales numbers are added to a hash
# when they are first found, along with their
# sales numbers
# b) names with absent sales numbers are deleted
# from the hash if they are already there
# c) when a name appears that is already in the hash,
# the new sales number is added to the old sales
# number (the one already in the hash)

# Loop to read input and build the two new arrays

while ($next = <>) {

# Split the next line into a name and sales

($name, $sales) = split /\+/, $next;

# If the sales part is empty, delete the element

if ($sales == 0) {
delete $totals{$name};
}
else {

# Otherwise, if the name already exists, add sales to the element

if (exists $totals{$name}) {
$totals{$name} += $sales;
}
else {

# Or else, create the element

$totals{$name} = $sales;
}
}
}

# Output the results

foreach $name (keys %totals) {


print "For $name, total sales are: $totals{$name} \n";
}

Exercise 9.9
# e9_9.pl - A solution to Exercise 9.9
#
# Input: A file specified on the command line that contains
# a C program
# Output: For each line of the input:
# 1. The number of words (variables and reserved
# words) on the line
# 2. The number of numeric literals without decimal
# points on the line (we assume the decimal points
# are embedded in digits)
# 3. The number of numeric literals with decimal points
# on the line
# 4. The number of braces and parentheses on the line

# Loop to read input and compute the results

while (<>) {
print "The next line is: $_ \n";

# Find the variables and reserved words

$words = s/[A-Za-z]+//g;

# Find and erase the numeric literals with decimal points

$decimals = s/[0-9]+\.[0-9]+//g;

# Find the numeric literals without decimal points

$ints = s/[0-9]+//g;

# Find the braces and parentheses

$bra_parens = s/[\{\}\)\(]//g;

# Change the null strings to zeros for output

$words += 0;
$decimals += 0;
$ints += 0;
$bra_parens += 0;

# Output the results

print "For this line, \n",


" The number of words is: $words \n",
" The number of numeric literals with decimal points is: $decimals
\n",
" The number of numeric literals without decimal points is:
$ints \n",
" The number of braces and parentheses is: $bra_parens \n";

Exercise 9.10
# e9_10.pl - A solution to Exercise 9.10
# A function:
# Parameter: An array of strings, passed by value
# Return value: A list of the unique strings in
# the parameter array
sub unique {
my @strgs = @_;
my %uniq;

# Loop to build a hash of the unique words

foreach $word (@strgs) {


$uniq{$word} = 0;
}

return keys %uniq;


}

Exercise 9.12
# e9_12.pl - A solution to Exercise 9.12
# A function:
# Parameter: A reference to an array of strings
# Return value: A list of the unique strings in
# the parameter array

sub unique {
my $ref_strgs = @_[0];
my %uniq;

# Loop to build a hash of the unique words

foreach $word (@$ref_strgs) {


$uniq{$word} = 0;
}

return keys %uniq;


}

Chapter 10
Exercise 10.1
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e10_1.html - calls a CGI program, e10_1.pl, that


produces one of five different greetings
A solution to Exercise 10.1
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Call e10_1.pl </title>
</head>
<body>
<p>
<a href = "http://cs.uccs.edu/cgi-bin/sebesta/e10_1.pl" >
Click here for a greeting </a>
</p>
</body>
</html>

#!/usr/local/bin/perl

# e10_1.pl - a CGI program to produce one of five


# five different greetings when called
# A solution to Exercise 10.1

@greetings = ("Hi there, Web surfer!\n",


"Are you lost??? \n",
"This must be your lucky day, you're here! \n",
"Top of the day to you! \n",
"Thanks for thinking of me! \n");

$rand;
$number = int(rand 5);

print "Content-type: text/html\n\n";


print "<html><html>\n";
print "<title> CGI - greeting </title></head> \n";
print "<body>\n";

$greeting = $greetings[$number];
print "$greeting";
print "</body> </html> \n";

Exercise 10.3
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e10_3.html - This describes lightbulb sales form page


A solution to Exercise 10.3
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Lightbulb Sales (Exercise 10.2) </title>
</head>
<body>

<!-- The next line gives the address of the CGI program -->

<form action = "http://www.cs.uccs.edu/cgi-bin/sebesta/e10_5.pl"


method = "post">

<h2> Welcome to the Lightbulb Sales Order Form </h2>

<!-- Text widget for customer's name -->


<p>
Buyer's Name:
<input type = "text" name = "name" size = "30" />
</p>

<!-- Table for bulb items -->

<table border = "border">

<!-- First, the column headings -->

<tr>
<th> Product Name </th>
<th> Price </th>
<th> Quantity </th>
</tr>

<!-- Now, the table data entries -->

<tr>
<td> Four 100-watt regular bulbs </td>
<td> $2.39 </td>
<td> <input type = "text" name = "four100" size ="2" /> </td>
</tr>
<tr>
<td> Eight 100-watt regular bulbs </td>
<td> $4.29 </td>
<td> <input type = "text" name = "eight100" size = "2" />
</td>
</tr>
<tr>
<td> Four 100-watt long-life bulbs </td>
<td> $3.95 </td>
<td> <input type = "text" name = "fourll" size = "2" /> </td>
</tr>
<tr>
<td> Eight 100-watt long-life bulbs </td>
<td> $7.49 </td>
<td> <input type = "text" name = "eightll" size = "2" /> </td>
</tr>

</table>

<!-- The radio buttons for the payment method -->

<h3> Payment Method: </h3>


<p>
<input type = "radio" name = "payment" value = "visa"
checked = "checked" /> Visa <br />
<input type = "radio" name = "payment" value = "mc" /> Master Card <br
/>
<input type = "radio" name = "payment" value = "discover" /> Discover
<br />

<!-- The submit and reset buttons -->

<input type = "submit" value = "Submit Order" />


<input type = "reset" value = "Clear Order Form" />
</p>
</form>
</body>
</html>

Exercise 10.4
#!/usr/local/bin/perl

# This is e10_4.pl
# It is a CGI program to process the light bulb sales form
# This is a solution to Exercise 10.4

# Initialize total price and total number of purchased items

$total_price = 0;
$total_items = 0;

# Produce the header part of the HTML return value

print "Content-type: text/html\n\n";


print "<html><head>\n";
print "<title> CGI-Perl Lightbulb Sales Form </title></head> \n";
print "<body>\n";

# Determine the request method and get the query string

$request_method = $ENV{'REQUEST_METHOD'};
if ($request_method eq "GET") {
$query_string = $ENV{'QUERY_STRING'};
}
elsif ($request_method eq "POST") {
read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
}

# Split the query string into the name/value pairs

@name_value_pairs = split(/&/, $query_string);

# Loop to process the array of item names and quantities

foreach $name_value (@name_value_pairs) {

# Split the pairs into names and values and translate the values
# into text by decoding the hex characters

($name, $value) = split (/=/, $name_value);


$value =~ tr/+/ /;
$value =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack("C", hex($1))/eg;

# Add the number of these items to the total items ordered,


# compute the cost of the item, and add its cost to the total price,

# Get the customer number into local variables

if ($name eq "name") {
$cust_name = $value;
} elsif ($name eq "payment") {
$payment = $value;
} elsif ($name eq "four100") {
$four100 = $value;
$cost = 2.39 * $value;
$total_price += $cost;
$total_items += $value;
} elsif ($name eq "eight100") {
$eight100 = $value;
$cost = 4.29 * $value;
$total_price += $cost;
$total_items += $value;
} elsif ($name eq "fourll") {
$fourll = $value;
$cost = 3.95 * $value;
$total_price += $cost;
$total_items += $value;
} elsif ($name eq "eightll") {
$eightll = $value;
$cost = 7.49 * $value;
$total_price += $cost;
$total_items += $value;
} ##- end of if
} ##- end of foreach

# Compute the sales tax and the total

$tax = 0.062 * $total_price;


$total_cost = $total_price + $tax;

# Produce the result information to the browser and finish the page

print "Customer: $cust_name<br/>\n";


print "Payment method: $payment <br /><br />\n";
print "<table border = 'border'><caption>Items ordered</caption>\n";
print
"<tr><th>Item</th><th>Price</th><th>Quantity</th></tr>\n";
print
"<tr><th>4 100-watt reg.</th><td> \$2.39</td><td>$four100</td><tr>\n";
print
"<tr><th>8 100-wat reg.</th><td> \
$4.29</td><td>$eight100</td></tr>\n";
print
"<tr><th>4 long life</th><td> \$3.95</td><td>$fourll</td></tr>\n";
print
"<tr><th>8 long life</th><td> \$7.49</td><td>$eightll</td></tr>\n";
print "</table> <h4> Thankyou for your order </h4>\n";
print "The total cost of the items you ordered is: \$ $total_price
<br /> \n";
print "The tax on this order is: \$ $tax <br />\n";
print "The total bill is: \$ $total_cost <br />\n";
print "</body> </html> \n";

<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.0 Strict//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>

Exercise 10.7
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e10_7.html
A document to present the user with a consumer electronics
purchasing survey form
This is a solution to Exercise 10.7
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head>
<title> Consumer Electronics Purchasing Survey </title>
</head>
<body>
<form action = "http://www.cs.uccs.edu/cgi-bin/sebesta/e10_71.pl"
method = "post">
<h2> Welcome to the Consumer Electronics Purchasing Survey </h2>

<h4> Your Age Category: </h4>


<p>
<input type = "radio" name = "age" value = "b1025"
checked = "checked" /> 10-25 <br />
<input type = "radio" name = "age" value = "b2640" />
26-40 <br />
<input type = "radio" name = "age" value = "b4160" />
41-60 <br />
<input type = "radio" name = "age" value = "o60" />
Over 60 <br /> <br />
</p>
<h4> Your Gender: </h4>
<p>
<input type = "radio" name = "gender" value = "female"
checked = "checked" /> Female <br />
<input type = "radio" name = "gender" value = "male" />
Male <br /> <br />
</p>
<h4> Your Next Consumer Electronics Purchase will be: </h4>
<p>
<input type = "radio" name = "vote" value = "0" />
Conventional TV <br />
<input type = "radio" name = "vote" value = "1" />
HDTV <br />
<input type = "radio" name = "vote" value = "2" />
VCR <br />
<input type = "radio" name = "vote" value = "3" />
D player <br />
<input type = "radio" name = "vote" value = "4" />
Mini CD player/recorder <br />
<input type = "radio" name = "vote" value = "5" />
DIVD player <br />
<input type = "radio" name = "vote" value ="6"
checked = "checked" /> Other <br /> <br />

<input type = "submit" value = "Submit Order" />


<input type = "reset" value = "Clear Order Form" />
</p>
</form>

<hr/>
<p>
To see the results of the survey so far, click
<a href = "http://www.cs.uccs.edu/cgi-bin/sebesta/e10_72.pl">
here </a>;
</p>
</body>
</html>

Exercise 10.8
#!/usr/local/bin/perl

# e10_8.pl

# error - a function to produce an error message for the client


# and exit in case of open errors

sub error {
print "Error - file could not be opened in conelec1.pl <br/>";
print end_html();
exit(1);
}

# This CGI program processes the consumer electronics survey form


# and updates the file that stores the survey data, survdat.dat
# This is a solution to Exercise 10.8

use CGI qw(:standard);

# Get the form values

my($age, $gender, $vote) = (param("age"), param("gender"),


param("vote"));

# Produce the header for the reply page - do it here so error


# messages appear on the page

print header();

# Set names for file locking and unlocking

$LOCK = 2;
$UNLOCK = 8;

# Set $index to the line index of the current vote


$index = 0;
if ($gender eq "male") {
$index = 4;
}
if ($age eq "b2640") { $index += 1 }
elsif ($age eq "b4160") { $index += 2 }
elsif ($age eq "o60") { $index += 3 }

# Open and lock the survey data file

open(SURVDAT, "<survdat.dat") or error();

flock(SURVDAT, $LOCK);

# Read the survey data file, unlock it, and close it

$total_votes = <SURVDAT>;
$total_votes++;
for ($count = 0; $count <= 7; $count++) {
chomp($file_lines[$count] = <SURVDAT>);
}

flock(SURVDAT, $UNLOCK);
close(SURVDAT);

# Split the line into its parts, increment the chosen device, and
# put it back together again

@file_votes = split / /, $file_lines[$index];


$file_votes[$vote]++;
$file_lines[$index] = join(" ", @file_votes);

# Reopen the survey data file for writing and lock it

open(SURVDAT, ">survdat.dat") or error();


flock(SURVEY, $LOCK);

# Write out the file data, unlock the file, and close it

print SURVDAT "$total_votes\n";


for ($count = 0; $count <= 7; $count++) {
$line = $file_lines[$count];
print SURVDAT "$line\n";
}

flock(SURVDAT, $UNLOCK);
close(SURVDAT);

# Build the web page to thank the survey participant

print start_html("Thankyou");
print "Thank you for participating in our survey <br /> \n";
print "The total number of votes so far is: $total_votes<br /> \n";
print end_html();

#!/usr/local/bin/perl
# error - a function to produce an error message for the client
# and exit in case of open errors

sub error {
print "Error - file could not be opened in conelec2.pl <br/>";
print end_html();
exit(1);
}

Exercise 10.9
# e10_9.pl - display the survey results
# A solution to the second part of Exercise 10.9

use CGI qw(:standard);

# Initialize file locking/unlocking parameter

$LOCK = 2;
$UNLOCK = 8;

print header();

# Open, lock, read, and unlock the survey data file

open(SURVDAT, "<survdat.dat") or error();


flock(SURVDAT, $LOCK);
$total_votes = <SURVDAT>;
@vote_data = <SURVDAT>;
flock(SURVDAT, $UNLOCK);

# Create the beginning of the result web page

print start_html("Survey Results");


print "<H2> Results of the Consumer Electronics Purchasing Survey
</H2><BR> \n";

# Split the input lines for females into age arrays

@age1 = split(/ /, $vote_data[0]);


@age2 = split(/ /, $vote_data[1]);
@age3 = split(/ /, $vote_data[2]);
@age4 = split(/ /, $vote_data[3]);

# Compute percentages for the data

for ($index = 0; $index < 7; $index++) {


$age1[$index] = 100 * $age1[$index] / $total_votes;
$age2[$index] = 100 * $age2[$index] / $total_votes;
$age3[$index] = 100 * $age3[$index] / $total_votes;
$age4[$index] = 100 * $age4[$index] / $total_votes;
}

# Add the row titles to the age arrays


unshift(@age1, "10-25");
unshift(@age2, "26-40");
unshift(@age3, "41-60");
unshift(@age4, "Over 60");

# Make the column titles array

@col_titles = ("Age Group", "Conventional TV", "HDTV", "VCR",


"CD player", "MiniCD player/recorder", "DIVD player",
"Other");

# Create the column titles in HTML by giving their address to the th


# function and storing the return value in the @rows array

@rows = th(\@col_titles);

# Now create the data rows with the td function


# and add them to the row addresses array

push(@rows, td(\@age1), td(\@age2), td(\@age3), td(\@age4));

# Create the table for the female survey results


# The address of the array of row addresses is passed to Tr

print table({-border => "border"},


caption("<h3>Survey Data for Females (%) </h3>"),
Tr(\@rows)
);

# Split the input lines for the males into age arrays

@age1 = split(/ /, $vote_data[4]);


@age2 = split(/ /, $vote_data[5]);
@age3 = split(/ /, $vote_data[6]);
@age4 = split(/ /, $vote_data[7]);

# Compute the percentages of votes

for ($index = 0; $index < 7; $index++) {


$age1[$index] = 100 * $age1[$index] / $total_votes;
$age2[$index] = 100 * $age2[$index] / $total_votes;
$age3[$index] = 100 * $age3[$index] / $total_votes;
$age4[$index] = 100 * $age4[$index] / $total_votes;
}

# Add the first column titles to the rows of color votes

unshift(@age1, "10-25");
unshift(@age2, "26-40");
unshift(@age3, "41-60");
unshift(@age4, "Over 60");

# Create the column titles in HTML by giving their address to the th


# function and storing the return value in the @rows array

@rows = th(\@col_titles);
# Now create the data rows with the td function
# and add them to the row addresses array

push(@rows, td(\@age1), td(\@age2), td(\@age3), td(\@age4));

# Create the table for the female survey results


# The address of the array of row addresses is passed to Trsults

print "<BR><BR>";
print table({-border=>undef},
caption("<h3>Survey Data for Males (%) </h3>"),
Tr(\@rows)
);
print
"<br /><br />The total number of votes so far is $total_votes <br
/>\n";
print end_html();

Chapter 12
Exercise 12.1
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e12_1.php
A solution to Exercise 12.1
-->
<html>
<head> <title> e12_1.php </title>
<?php

function unique($strings) {
$uniqueStrings = array();
foreach ($strings as $string) {
foreach ($uniqueStrings as $uString) {
if ($string == $uString) break;
}
if ($string != $uString)
$uniqueStrings[] = $string;
}
return $uniqueStrings;
}
?>
</head>
<body>
<?php
$str = array(42, 24, 2, 4, 42, 24, 2, 4, 24, 42, 42, 24);
$uStr = unique($str);
foreach ($uStr as $st)
print ("$st <br />");
?>
</body>
</html>

Exercise 12.3
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1 //EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e12_3.php
Uses a function to determine the three most frequently
occurring strings in a given array of strings and returns
them in an array.
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head> <title> e12_3.php </title>
</head>
<body>
<?php

// Function the_three
// Parameter: an array of string
// Returns: an array of the three strings that occur most often
// in the given array

function the_three($in_array) {

// Create the empty word frequency array

$freq = array();

// Loop to count the words (either increment or initialize to 1)

foreach ($in_array as $word) {


$keys = array_keys($freq);
if(in_array($word, $keys))
$freq[$word]++;
else
$freq[$word] = 1;
}

arsort($freq);
$new_keys = array_keys($freq);
return array($new_keys[0], $new_keys[1], $new_keys[2]);
} #** End of the_three

// Main test driver

$test_array = array("apples", "are", "good", "for", "you", "or",


"don't", "you", "like", "apples", "or", "maybe", "you", "like",
"oranges", "better", "than", "apples");

// Call the function

$tbl = the_three($test_array);

// Display the words and their frequencies


print "<br /> The Three Most Frequently Occurring Words<br /><br />";
$sorted_keys = array_keys($tbl);
sort($sorted_keys);
foreach ($sorted_keys as $word)
print "$tbl[$word] <br />";
?>
</body>
</html>

Exercise 12.5
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1 //EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e12_5.php
Use a function to find the first four-digit number
in a given string.
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head> <title> e12_5.php </title>
</head>
<body>
<?php

// Function first_four
// Parameter: a string containing numbers separated by spaces
// Returns: the first four-digit number found in the string;
// returns zero if the string has no four-digit
// number

function first_four($str) {

// Split the given string into its numbers

$numbers = preg_split("/ +/", $str);

foreach ($numbers as $numb)


if (strlen($numb) == 4)
return $numb;

// If there was no four-digit number, return 0

return 0;

} #** End of first_four

// Main test driver

$test_str = "22 1 444 66 333 4444 55555 66666 2 1 9 555";

// Call the function

$result = first_four($test_str);
// If the returned value has four digits, display it

if ($result != 0)
print("The first four-digit number is: $result <br />");
else
print("There was no four-digit number in the string <br />");
?>
</body>
</html>

Exercise 12.7
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.1 //EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<!-- e12_7.php
Uses a function to determine the three most frequently
occurring words in the given string, where the words
are delimited on the left by spaces and on the right
by commas, periods, or question marks
-->
<html xmlns = "http://www.w3.org/1999/xhtml">
<head> <title> e12_7.php </title>
</head>
<body>
<?php

// Function the_three
// Parameter: a string containing words that are delimited
// on the left by spaces and on the right by
// commas, periods, or question marks
// Returns: an array of the three words that occur most often
// in the given array

function the_three($in_str) {

// Split the string into its words


preg_match_all("/ +[A-Za-z]+[,.?]/u", $in_str, $word_list);
foreach ($word_list[0] as $word)
print("The words are: $word <br />");
// Create the empty word frequency array

$freq = array();

// Loop to count the words (either increment or initialize to 1)

foreach ($word_list[0] as $word) {

// First, get rid of the delimiters

preg_match("/[A-Za-z]+/", $word, $match);


$word = $match[0];

// Now, get an array of the keys


$keys = array_keys($freq);

// Set the frequency for the work

if(in_array($word, $keys))
$freq[$word]++;
else
$freq[$word] = 1;
}

// Sort the frequency array in reverse order of values

arsort($freq);

// Get the keys and return the first three

$new_keys = array_keys($freq);
return array($new_keys[0], $new_keys[1], $new_keys[2]);

} #** End of the_three

// Main test driver

$test_str = " apples. are, good? for, you, or,


don't? you, like? apples, or. maybe. you, like,
oranges, better. than. apples?";

// Call the function

$tbl = the_three($test_str);

// Display the words and their frequencies

print "<br /> The Three Most Frequently Occurring Words<br /><br />";
$sorted_keys = array_keys($tbl);
sort($sorted_keys);
foreach ($sorted_keys as $word)
print "$tbl[$word] <br />";
?>
</body>
</html>

Chapter 13

Exercise 13.1

<!-- e13_1.aspx
A solution to Exercise 13.1
Uses Int32.Parse to convert the string version of the
input number to an integer for use in the C# code
-->
<%@ Page language="c#" %>

<html>
<head> <title> e13_1 </title>

<script runat = "server">

// Build a pseudorandom number method

Random randomGen = new Random();


string msg;
private int [] myArray = new int[100];

// A method to fill the array with pseudorandom numbers

public void fillArray() {


for (int index = 0; index < Int32.Parse(number.Value) ;
index++)

// Generate a pseudorandom number in the range of 0 to 100

myArray[index] = randomGen.Next(0, 100);


}
</script>
</head>
<body>
<form runat = "server">
<p>
Please input a number between 10 and 100:
<input type = "text" id = "number" runat = "server" />
<br />
<input type = "submit" value = "Submit" />
<br />
<% if (IsPostBack) { %>

<!-- Code to call the fillArray method and display the array -->

<% fillArray();
Response.Write(
"<br /> <b>The array's contents are: </b><br /><br />");
for (int index = 0; index < Int32.Parse(number.Value); index++) {
msg = string.Format("The element at {0} is: {1} <br />",
index, myArray[index]);
Response.Write(msg);
}

%>
<% } %>

</p>
</form>
</body>
</html>

Chapter 14
Exercise 14.2
No changes to access_cars.pl to handle UPDATE and INSERT SQL commands.

Exercise 14.3

No changes to access_cars.php are required to handle UPDATE and INSERT SQL


commands. The mysql_query function takes SQL commands as its parameter, whether
they are queries, updates, or inserts. For example, we could have:

$query =
"INSERT INTO Corvettes VALUES (38, ′convertible′, 17.1, 1993, 15)";
$result = mysql_query($query);

To determine the number of rows that were affected by the INSERT command, the
mysql_affected_rows function is used (with the result as its parameter).

Exercise 14.5
// e14_5.java
// This servlet receives an SQL command from its HTML document,
// connects to the cars database, and performs the command on
// the database. If the command was a query, it returns an HTML
// table of the results of the query
// This is a solution to Exercise 14.5

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;

public class e14_5 extends HttpServlet {


private Connection myCon;
private Statement myStmt;

// The init method - instantiate the db driver, connect to the


// db, and create a statement for an SQL command

public void init() {

// Instantiate the driver for MySQL

try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
}
catch (Exception e) {
e.printStackTrace();
}

// Create the connection to the cars db


try {
myCon = DriverManager.getConnection (
"jdbc:mysql://localhost/cars?user=root");
}
catch (SQLException e) {
e.printStackTrace();
}

// Create the statement for SQL queries

try {
myStmt = myCon.createStatement();
}
catch (Exception e) {
e.printStackTrace();
}
} //** end of the init method

// The doPost method - get the query, perform it, and produce
// an HTML table of the results

public void doPost(HttpServletRequest request,


HttpServletResponse response)
throws ServletException, IOException {
ResultSet result;
String command, colName, dat;
int numCols, index;
ResultSetMetaData resultMd;

// Get the SQL command

command = request.getParameter("Command");

// Set the MIME type and get a writer

response.setContentType("text/html");
PrintWriter out = response.getWriter();

// Create the initial html and display the request

out.println("<html>");
out.println("<head><title>JDBCServlet</title></head>");
out.println("<body>");
out.print("<p><b>The command is: </b>" + command + "</p>");

// If the command is a query, use executeQuery on it

if (command.substring(0, 5).equalsIgnoreCase("SELECT")) {

try {
result = myStmt.executeQuery(command);

// Get the result's metadata and the number of result rows

resultMd = result.getMetaData();
numCols = resultMd.getColumnCount();
// Produce the table header and caption

out.println("<table border>");
out.println("<caption> <b> Query Results </b> </caption>");
out.println("<tr>");

// Loop to produce the column headings

for (index = 1; index <= numCols; index++) {


colName = resultMd.getColumnLabel(index);
out.print("<th>" + colName + "</th>");
}

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

// Loop to produce the rows of the result

while (result.next()) {
out.println("<tr>");

// Loop to produce the data of a row of the result

for (index = 1; index <= numCols; index++) {


dat = result.getString(index);
out.println("<td>" + dat + "</td>");
} //** end of for (index = 0; ...

out.println("</tr>");
} //** end of while (result.next()) ...

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

} //** end of try

catch (Exception e) {
e.printStackTrace();
} //** end of catch
} //** end of the then clause of if (command.substring...

else { //** It is a non-query command


try {
myStmt.executeUpdate(command);
}
catch (Exception e) {
e.printStackTrace();
}
} //** end of else clause of if (command.substring...

out.println("</body></html>");
} //** end of doPost method
} //** end of class e14_5