Web Design & Development Using Java
Web Design & Development Using Java
Lesson 1
JAVA FEATURES
This handout is a traditional introduction to any language features. You might not be able to comprehend
some of the features fully at this stage but don’t worry, you’ll get to know about these as we move on with
the course
The core language is simpler than C++ -- no operator overloading, no pointers, and no multiple inheritance
The way a java program deals with memory is much simpler than C or C++.
Object-Oriented
Java is fundamentally based on the OOP notions of classes and objects.
Java uses a formal OOP type system that must be obeyed at compile-time and run-time.
This is helpful for larger projects, where the structure helps keep the various parts consistent. Contrast to
Perl, which has a more anything-goes feel.
© Copyright Virtual University of Pakistan
1
Web Design & Development – CS506 VU
Java is network friendly -- both in its portable, threaded nature, and because common networking
operations are built-in to the Java libraries.
o Both, vs. unintentional errors and vs. malicious code such as viruses.
o Java has slightly worse performance since it does all this checking. (Or put the other way, C
can be faster since it doesn't check anything.)
• The JVM "verifier" checks the code when it is loaded to verify that it has the correct structure --
that it does not use an uninitialized pointer, or mix int and pointer types. This is one-time "static"
analysis -- checking that the code has the correct structure without running it.
• The JVM also does "dynamic" checking at runtime for certain operations, such as pointer and array
access, to make sure they are touching only the memory they should. You will write code that runs
into
• As a result, many common bugs and security problems (e.g. "buffer overflow") are not possible in
java. The checks also make it easier to find many common bugs easy, since they are caught by the
runtime checker.
• You will generally never write code that fails the verifier, since your compiler is smart enough to
only generate correct code. You will write code that runs into the runtime checks all the time as
you debug -- array out of bounds, null pointer.
• Java also has a runtime Security Manager can check which operations a particular piece of code is
allowed to do. As a result, java can run un-trusted code in a "sandbox" where, for example, it can
draw to the screen but cannot access the local file system.
Portable
"Write Once Run Anywhere", and for the most part this works.
Not even a recompile is required -- a Java executable can work, without change, on any Java enabled
platform.
Java provides an extensive support for the development of web and enterprise applications
Servlets, JSP, Applets, JDBC, RMI, EJBs and JSF etc. are some of the Java technologies that
can be used for the above mentioned purposes.
High-performance
Java performance has gotten a lot better with aggressive just-in-time-compiler (JIT) techniques.
Java performance is now similar to C -- a little slower in some cases, faster in a few cases. However
memory use and startup time are both worse than C.
Java performance gets better each year as the JVM gets smarter. This works, because making the
JVM smarter does not require any great change to the java language, source code, etc.
Multi-Threaded
This works out more cleanly than languages where concurrency is bolted on after the fact.
Dynamic
Class and type information is kept around at runtime. This enables runtime loading and inspection
of code in a very flexible way.
The source code for each class is in a .java file. Compile each class to produce “.class” file.
Sometimes, multiple .class files are packaged together into a .zip or .jar "archive" file.
On unix or windows, the java compiler is called "javac". To compile all the .java files in a directory use
"javac *.java".
Faster Development
Building an application in Java takes about 50% less time than in C or C++. So, faster time to market
Java is said to be “Programmer Efficient”.
OOP
Java is thoroughly OOP language with robust memory system
Memory errors largely disappear because of the safe pointers and garbage collector. The lack of memory
errors accounts for much of the increased programmer productivity.
Libraries
Code re-use at last -- String, ArrayList, Date, ... available and documented in a standard way
Microsoft hates Java, since a Java program (portable) is not tied to any particular operating system.
If Java is popular, then programs written in Java might promote non-Microsoft operating systems. For
basically the same reason, all the non- Microsoft vendors think Java is a great idea.
Microsoft's C# is very similar to Java, but with some improvements, and some questionable
features added in, and it is not portable in the way Java is. Generally it is considered that C# will be
successful in the way that Visual Basic is: a nice tool to build Microsoft only software.
Microsoft has used its power to try to derail Java somewhat, but Java remains very popular on its
merits.
Java has a lot of hype, but much of it is deserved. Java is very well matched for many modern
problems
Using more memory and CPU time but less programmer time is an increasingly appealing tradeoff.
A general belief is that Java is going to stay here for the next 10-20 years
References
Majority of the material in this handout is taken from the first handout of course cs193j at Stanford.
The Java™ Language Environment, White Paper, by James Gosling & Henry McGilton
Java’s Sun site: http://java.sun.com
Java World: www.javaworld.com
Lesson 2
Java Virtual Machine & Runtime Environment
Basic Concept
When you write a program in C++ it is known as source code. The C++ compiler converts this source code
into the machine code of underlying system (e.g. Windows) If you want to run that code on Linux you need
to recompile it with a Linux based compiler. Due to the difference in compilers, sometimes you need to
modify your code.
Java has introduced the concept of WORA (write once run anywhere). When you write a java program it is
known as the source code of java. The java compiler does not compile this source code for any underlying
hardware system; rather it compiles it for a software system known as JVM (This compiled code is known
as byte code). We have different JVMs for different systems (such as JVM for Windows, JVM for Linux
etc). When we run our program the JVM interprets (translates) the compiled program into the language
understood by the underlying system. So we write our code once and the JVM runs it everywhere
according to the underlying system.
JAVA
Source
Code
Java Byte
Code
Java Interpreter
Machine
Code
Bytecode
Java programs (Source code) are compiled into a form called Java bytecodes.
The Java compiler reads Java language source (.java) files, translates the source into
Java bytecodes, and places the bytecodes into class (.class) files.
The compiler generates one class file for each class contained in java source file.
Most programming languages compile source code directly into machine code, suitable for execution
The difference with Java is that it uses bytecode - a special type of machine code.
The JVM executes Java bytecodes, so Java bytecodes can be thought of as the machine language of
the JVM.
• Java bytecode is executed by using any operating system’s JVM. Thus achieve portability.
The Java Virtual Machine is a part of a large system i.e. Java Runtime
Environment (JRE).
References
1. Edit,
2. Compile,
3. Load,
4. Verify and
5. Execute
We look over all the above mentioned phases in a bit detail. First consider the following figure that
summarizes the all phases of a java program.
Phase 1: Edit
Phase 1 consists of editing a file. This is accomplished with an editor program. The programmer
types a java program using the editor like notepad, and make corrections if necessary.
When the programmer specifies that the file in the editor should be saved, the program is stored on a
secondary storage device such as a disk. Java program file name ends with a
© Copyright Virtual University of Pakistan
7
Web Design & Development – CS506 VU
.java extension.
On Windows platform, notepad is a simple and commonly used editor for the beginners. However java
integrated development environments (IDEs) such as NetBeans, Borland JBuilder, JCreator and
IBM’s Ecllipse have built-in editors that are smoothly integrated into the programming environment.
Phase 2: Compile
In Phase 2, the programmer gives the command javac to compile the program. The java compiler
translates the java program into bytecodes, which is the language understood by the java interpreter.
javac Welcome.java
at the command window of your system. If the program compiles correctly, a file called
Welcome.class is produced. This is the file containing the bytecodes that will be interpreted
during the execution phase.
Phase 3: Loading
In phase 3, the program must first be placed in memory before it can be executed. This is done by the
class loader, which takes the .class file (or files) containing the bytecodes and transfers it to memory.
The .class file can be loaded from a disk on your system or over a network (such as your local
university or company network or even the internet).
Applications (Programs) are loaded into memory and executed using the java interpreter
via the command java. When executing a Java application called Welcome, the command
Java Welcome
Invokes the interpreter for the Welcome application and causes the class loader to load information
used in the Welcome program.
Phase 4: Verify
Before the bytecodes in an application are executed by the java interpreter, they are verified by the
bytecode verifier in Phase 4. This ensures that the bytecodes for class that are loaded form the internet
(referred to as downloaded classes) are valid and that they do not violate Java’s security restrictions.
Java enforces strong security because java programs arriving over the network should not be able to
cause damage to your files and your system (as computer viruses might).
Phase 5: Execute
Finally in phase 5, the computer, under the control of its CPU, interprets the program one bytecode at a
time. Thus performing the actions specified by the program.
Programs may not work on the first try. Each of the preceding phases can fail because of various errors.
This would cause the java program to print an error message. The programmer would return to
the edit phase, make the necessary corrections and proceed through the remaining phases again to
determine id the corrections work properly.
References:
• Download the latest version j2se5.0 (java 2 standard edition) from http://java.sun.com
or get it from any other source like CD.
Note: j2se also called jdk (java development kit). You can also use the previous versions like
jdk 1.4 or 1.3 etc. but it is recommended that you use either jdk1.4 or jdk5.0
Note: For the rest of this handout, assume that j2se is installed in C:\Program
Files\Java\jdk1.5.0
Environment Setting
Once you successfully installed the j2se, the next step is environment or path setting. You
can accomplish this in either of two ways.
Write the command on the command prompt according to the following format
To Test whether path has been set or not, write javac and press ENTER. If the list ofn b
options displayed as shown in the below figure means that you have successfully
completed the steps of path setting.
Note: The issue with the temporary path setting is you have to repeat the above explained
procedure again and again each time you open a new command prompt window. To avoid this
overhead, it is better to set your path permanently
In Windows NT (XP, 2000), you can set the permanent environment variable.
Right click on my computer icon click on properties as shown below
Select the advanced tab followed by clicking the Environment Variable button. The
Environment variables frame would be displayed in front of you
Locate the Path variable in the System or user variables, if it is present there, select it by
single click. Press Edit button. The following dialog box would be appeared.
• If Path variable does not exist, click the New button. Write variable name
“PATH”, variable value C:\Program Files\Java\jdk1.5.0\bin and press OK button.
• Now open the command prompt and write javac, press enter button. You see the list of
options would be displayed.
• After setting the path permanently, you have no need to set the path for each new opened
command prompt.
References
Entire material for this handout is taken from the book JAVA A Lab Course by Umair Javed. This
material is available just for the use of VU students of the course Web Design and Development and
not for any other commercial purpose without the consent of author.
Like any other programming language, the java programming language is used to create applications.
So, we start from building a classical “Hello World” application, which is generally used as the first
program for learning any new language.
HelloWorldApp
Note: Don’t copy paste the given below code. Probably it gives errors and you can’t able to remove them
at the beginning stage.
7. System.out.println(“Hello World”);
8. }
9. }
3. To save your program, move to File menu and choose save as option.
4. Save your program as “HelloWorldApp.java” in some directory. Make sure to add double quotes
around class name while saving your program. For this example create a folder known as
“examples” in D: drive
Note: Name of file must match the name of the public class in the file (at line 4). Moreover, it
is case sensitive. For example, if your class name is MyClass, than file name must be MyClass.
Otherwise the Java compiler will refuse to compile the program.
For the rest of this handout, we assume that program is saved in D:\examples directory.
HelloWorldApp Described
Lines 1-3
Like in C++, You can add multiple line comments that are ignored by the compiler.
Lines 4
Line 4 declares the class name as HelloWorldApp. In java, every line of code must reside inside
class. This is also the name of our program (HelloWorldApp.java). The compiler creates the
© Copyright Virtual University of Pakistan
12
Web Design & Development – CS506 VU
Lines 5
Line 5 is where the program execution starts. The java interpreter must find this defined
exactly as given or it will refuse to run the program. (However you can change the name of
parameter that is passed to main. i.e. you can write String[] argv or String[] some Param instead of
String[] args)
Other programming languages, notably C++ also use the main( ) declaration as the starting point for
execution. However the main function in C++ is global and reside outside of all classes where as
in Java the main function must reside inside a class. In java there are no global variables or
functions. The various parts of this main function declaration will be covered at the end of this
handout.
Lines 6
Again like C++, you can also add single line comment
Lines 7
Line 7 illustrates the method call. The println( ) method is used to print something on the
console. In this example println( ) method takes a string argument and writes it to the standard
output i.e. console.
Lines 8-9
Line 8-9 of the program, the two braces, close the method main( ) and the class
HelloWorldApp respectively.
5. If program gets successfully compiled, it will create a new file in the same directory named
HelloWorldApp.class that contains the byte-code.
6. Use “java” on the command line to run the compiled .class file. Note “.class” would be added with
the file name.
D:\examples> java HelloWorld
7. You can see the Hello World would be printed on the console. Hurrah! You are successful in
writing, compiling and executing your first program in java ☺
Points to Remember
An Idiom Explained
• About main()
Why public?
Since main method is called by the JVM that is why it is kept public so that it is
accessible from outside. Remember private methods are only accessible from within the
class
Why static?
Every Java program starts when the JRE (Java Run Time Environment) calls the
main method of that program. If main is not static then the JRE have to create an object
of the class in which main method is present and call the main method on that object (In
OOP based languages method are called using the name of object if they are not static).
It is made static so that the JRE can call it without creating an object.
Also to ensure that there is only one copy of the main method per class
Why void?
© Copyright Virtual University of Pakistan
14
Web Design & Development – CS506 VU
References
Entire material for this handout is taken from the book JAVA A Lab Course by Umair Javed. This
material is available just for the use of VU students of the course Web Design and Development and not
for any other commercial purpose with out the consent of author.
Lesson 3
Learning Basics
Strings
String Concatenation
String concatenated with any other data type such as int will also convert that datatype to
String and the result will be a concatenated String displayed on console. For example,
– int i = 4;
– int j = 5;
System.out.println (“Hello” + i)
will print Hello 4 on screen
– However
System,.out..println( i+j) ;
will print 9 on the console because both i and j are of type int.
Comparing Strings
For comparing Strings never use == operator, use equals method of String class.
– == operator compares addresses (shallow comparison) while equals compares values (deep
comparison)
E.g string1.equals(string2)
int i = 4;
int j = 5;
if (s1 == s2) {
© Copyright Virtual University of Pakistan
16
Web Design & Development – CS506 VU
if (s1.equals( s2) ) {
System.out.println(“comparing string using equal method”);
}
}
}
}//end main
}//End class.
array. You can see that the type of “args” array is String.
In java, array knows their size by using the length property. By using, length property we can determine
how many arguments were passed. The following code example can accept any number of arguments
}//end main
}//End class.
Output
Primitives vs Objects
• Primitive data types are generally used for local variables, parameters and instance
variables (properties of an object)
• Primitive datatypes are located on the stack and we can only access their value, while objects
are located on heap and we have a reference to these objects
• Also primitive data types are always passed by value while objects are always passed by
reference in java. There is no C++ like methods
© Copyright Virtual University of Pakistan
18
Web Design & Development – CS506 VU
Stack and heap are two important memory areas. Primitives are created on the stack while objects
are created on heap. This will be further clarified by looking at the following diagram that is
taken from Java Lab Course.
int num = 5;
Stack Heap
num
5
0F59
name ali
0F59
Wrapper Classes
Each primitive data type has a corresponding object (wrapper class). These wrapper classes
provides additional functionality (conversion, size checking etc.), which a primitive data type cannot
provide.
Wrapper Use
You can create an object of Wrapper class using a String or a primitive data type
You can get a primitive data type from a Wrapper using the corresponding value function
To convert a string containing digits to a primitive data type, wrapper classes can help. parseXxx
method can be used to convert a String to the corresponding primitive data type.
The following table summarizes the parser methods available to a java programmer.
So far, we learned how to print something on console. Now the time has come to learn how to print
on the GUI. Taking input from console is not as straightforward as in C++. Initially we’ll study how to
take input through GUI (by using JOPtionPane class).
The following program will take input (a number) through GUI and prints its square on the console as
well on GUI.
1. import javax.swing.*;
12. System.exit(0);
13. }
14. }
On line 1, swing package was imported because it contains the JOptionPane class that will be used
for taking input from GUI and displaying output to GUI. It is similar to header classes of C++.
On line 5, showInputDialog method is called of JOptionPane class by passing string argument that
will be displayed on GUI (dialog box). This method always returns back a String regardless of whatever
you entered (int, float, double, char) in the input filed.
Our task is to print square of a number on console, so we first convert a string into a number by
calling parseInt method of Integer wrapper class. This is what we done on line number 6.
Line 11 will display square on GUI (dialog box) by using showMessageDialog method of JOptionPane
class. The first argument passed to this method is null and the second argument must be a String.
Here we use string concatenation.
Line 12 is needed to return the control back to command prompt whenever we use
JoptionPane class.
The if-else and switch selection structures are exactly similar to we have in C++. All relational
operators that we use in C++ to perform comparisons are also available in java with same behavior.
Likewise for, while and do-while control structures are alike to C++.
Reference:
2- Example code, their explanations and corresponding figures for this handout are taken from the book
JAVA A Lab Course by Umair Javed. This material is available just for the use of VU students of the
course Web Design and Development and not for any other commercial purpose without the consent of
author.
Lesson 4
Object Oriented Programming
Java is fundamentally object oriented. Every line of code you write in java must be inside a class (not
counting import directives). OOP fundamental stones Encapsulation, Inheritance and Polymorphism
etc. are all fully supported by java.
• Classes
• Objects
• Constructor
– A special method that is implicitly invoked. Used to create an Object (that is, an Instance of
the Class) and to initialize it.
• Attributes
– Properties an object has
• Methods
– Actions that an object can do
Defining a Class
class Point {
Some important points to consider when defining a class in java as you probably noticed from the
above given skeleton are
– There are no global variables or functions. Everything resides inside a class. Remember
we wrote our main method inside a class. (For example, in HelloWorldApp program)
© Copyright Virtual University of Pakistan
23
Web Design & Development – CS506 VU
– Specify access modifiers (public, private or protected) for each member method or data
members at every line.
– All methods (functions) are written inline. There are no separate header and
implementation files.
– Automatic initialization of class level data members if you do not initialize them
Primitives
o Numeric (int, float etc) with zero
o Char with null
o Boolean with false
Object References
– With null
Note: Remember, the same rule is not applied to local variables (defined inside method
body). Using a local variable without initialization is a compile time error
– Destructors
– Are not required in java class because memory management is the responsibility
of JVM.
Task – Defining a Student class
The following example will illustrate how to write a class. We want to write a
“Student” class that
Getters / Setters
The attributes of a class are generally taken as private or protected. So to access them outside of a
class, a convention is followed knows as getters & setters. These are generally public methods.
The words set and get are used prior to the name of an attribute. Another important purpose for
writing getter & setters to control the values assigned to an attribute.
// File Student.java
name = s.name;
rollNo = s.rollNo;
}
Using a Class
Objects of a class are always created on heap using the “new” operator followed by constructor
Note: Objects are always passed by reference and primitives are always passed by value in java.
Create objects of student class by calling default, parameterize and copy constructor
Call student class various methods on these objects
// File Test.java
s2.setName("usman");
s2.setRollNo(20);
s2.print();
s3.print();
s3.print();
} //end of main
} //end of class
Compile both classes using javac commad. Run Test class using java command.
More on Classes
Static
A class can have static variables and methods. Static variables and methods are associated
with the class itself and are not tied to any particular object. Therefore statics can be accessed
without instantiating an object. Static methods and variables are generally accessed by class name.
The most important aspect of statics is that they occur as a single copy in the class regardless of
the number of objects. Statics are shared by all objects of a class. Non static methods and instance
variables are not accessible inside a static method because no this reference is available inside a static
method.
We have already used some static variables and methods. Examples are
Before an object is
destroyed, it might be
necessary for the
object to perform some action. For example: to close an opened file. In such a case, define a
finalize() method with the actions to be performed before the object is destroyed.
finalize
When a finalize method is defined in a class, Java run time calls finalize() whenever it is about to
recycle an object of that class. It is noteworthy that a garbage collector reclaims objects in any order or
never reclaims them. We cannot predict and assure when garbage collector will get back the memory of
unreferenced objects.
The garbage collector can be requested to run by calling System.gc() method. It is not necessary that it
accepts the request and run.
We want to count exact number of objects in memory of a Student class the one defined earlier. For
this purpose, we’ll modify Student class.
Add a static variable countStudents that helps in maintaining the count of student objects.
Write a getter for this static variable. (Remember, the getter also must be static one. Hoping
so, you know the grounds).
In all constructors, write a code that will increment the countStudents by one.
Class Object is a superclass (base or parent) class of all the classes in java by default. This class has
already finalize() and toString() method (used to convert an object state into string). Therefore we are
actually overriding these methods over here. (We’ll talk more about these in the handout on
inheritance).
// File Student.java
// Standard Setters
public void setName (String name) {
this.name = name;
}
} // end of class
Next, we’ll write driver class. After creating two objects of student class, we deliberately loose object’s
reference and requests the JVM to run garbage collector to reclaim the memory. By printing
countStudents value, we can confirm that. Coming up code is of the Test class.
// File Test.java
int numObjs;
} //end of main
} //end of class
The compilation and execution of the above program is given below. Note that output may be
different one given here because it all depends whether garbage collector reclaims the memory or
not. Luckily, in my case it does.
Reference:
Lesson 5
Inheritance
In general, inheritance is used to implement a “is-a” relationship. Inheritance saves code rewriting for a
client thus promotes reusability.
In java parent or base class is referred as super class while child or derived class is known as sub
class.
Java only supports single inheritance. As a result a class can only inherit from one class at one
time.
To explicitly call the super class constructor, use super keyword. It’s important to remember that
call to super class constructor must be first line.
We’ll use three classes to get familiar you with inheritance. First one is Employee class. This will act
as super class. Teacher class will inherit from Employee class and Test class is driver class that contains
main method. Let’s look at them one by one
class Employee{
//parameterized constructor
public Employee(int id, String name){
this.id = id;
this.name = name;
}
//default constructor
public Employee(){
}
public void setName (String name) {
this.name = name;
}
//getters
public int getId () {
return id;
}
}//end class
The Teacher class extends from Employee class. Therefore Teacher class is a subclass of
Employee. The teacher class has an additional attribute i.e. qualification.
//default constructor
public Teacher () {
//implicit call to superclass default construct
qual = "";
}
//parameterized constructor
public Teacher(int i, String n, String q){
//setter
public void setQual (String qual){
this.qual = qual;
}
//getter
public String getQual(){
© Copyright Virtual University of Pakistan
33
Web Design & Development – CS506 VU
return qual;
}
}//end class
Objects of Employee & Teacher class are created inside main method in Test class. Later calls are made
to display and toString method using these objects.
class Test{
} //end of main
}//end class
Output
The Od Java classes. For user defined classes, its not necessary to mention the Object class as a
super class, java doesbject class in Java is a superclass for all other classes defined in Java's class
libraries, as well as for user-define it automatically for you.
The class Hierarchy of Employee class is shown below. Object is the super class of Employee
class and Teacher is a subclass of Employee class. We can make another class Manager that can also
extends from Employee class.
Object
Employe
Teacher Manager
Polymorphism
“Polymorphic” literally means “of multiple shapes” and in the context of OOP, polymorphic
means “having multiple behavior”.
A parent class reference can point to the subclass objects because of is-a relationship. For example a
Employee reference can point to:
o Employee Object
o Teacher Object
o Manager Object
A polymorphic method results in different actions depending on the object being referenced
This Test class is the modification of last example code. Same Employee & Teacher classes are
used. Objects of Employee & Teacher class are created inside main methods and calls are made to
display and toString method using these objects.
class Test{
} //end of main
}//end class
Output
Type Casting
In computer science, type conversion or typecasting refers to changing an entity of one datatype into
another. Type casting can be categorized into two types
1. Up-casting
No loss of information
Examples of
— Primitives
int a = 10;
double b = a;
— Classes
2. Down-casting
Examples of
— Primitives
double a = 7.65;
int b = (int) a;
— Classes
References:
Lesson 6
Collections
A collection represents group of objects know as its elements. Java has a built-in support for collections.
Collection classes are similar to STL in C++. An advantage of a collection over an array is that you
don’t need to know the eventual size of the collection in order to add objects to it. The java.util package
provides a set of collection classes that helps a programmer in number of ways.
Collections Design
All classes almost provides same methods like get(), size(), isEmpty() etc. These methods will return
the object stored in it, number of objects stored and whether collection contains an object or not
respectively.
Java collections are capable of storing any kind of objects. Collections store references to objects. This is
similar to using a void* in C. therefore down casting is required to get the actual type. For example, if
string in stored in a collection then to get it back, we write
Collection messages
Constructor
— creates a collection with no elements
int size()
— returns the number of elements in a collection
boolean add(Object)
— adds a new element in the collection
— returns true if the element is added successfully false otherwise
boolean isEmpty()
— returns true if this collection contains no element false otherwise
boolean contains(Object)
— returns true if this collection contains the specified element by using iterative search
boolean remove(Object)
— removes a single instance of the specified element from this collection, if it is present
ArrayList
It’s like a resizable array. ArrayList actually comes as a replacement the old “Vector” collection. As
we add or remove elements into or from it, it grows or shrinks over time.
Useful Methods
add (Object)
— With the help of this method, any object can be added into ArrayList because
Object is the super class of all classes.
— Objects going to add will implicitly up-cast.
int size( )
We’ll store Student objects in the ArrayList. We are using the same student class which we built in
previous lectures/handouts.
We’ll add three student objects and later prints all the student objects after retrieving them from
ArrayList. Let’s look at the code
iport java.util.*;
if (b = = true) {
System.out.println(“arraylist is empty”);
} else {
int size = al.size();
System.out.println(“arraylist size: ” + size);
}
s.print();
} // end main
} // end class
Output
HashMap
Store elements in the form of key- value pair form. A key is associated with each object that is stored.
This allows fast retrieval of that object. Keys are unique.
Useful Methods
int size( )
In this example code, we’ll store Student objects as values and their rollnos in the form of strings as keys.
Same Student class is used. The code is;
iport java.util.*;
if (b == true) {
System.out.println(“hashmap is empty”);
} else {
} // end main
} // end class
Output
References:
consent of author.
Address Book
Warning: It is strongly advised that you type the code given in this example yourself. Do not copy/paste
it; most probably you will get unexpected errors that you have never seen. Some bugs are
deliberately introduced as well to avoid copy- pasting. TAs will not cooperate with you in
debugging such errors☺.
Problem
We want to build an address book that is capable of storing name, address & phone number of a
person.
Address book provides functionality in the form of a JOptionPane based menu. The feature list
includes
The Address book should also support persistence for person records
Building a small address book generally involves 3 steps. Let us briefly discuss each step and write a
solution code for each step
First of all you need to store your desired information for each person. For this you can create a
user-defined data type (i.e. a class). Make a class PersonInfo with name, address and phone
number as its attributes.
import javax.swing.*;
class PersonInfo {
String name;
String address;
String phoneNum;
//parameterized constructor
public PresonInfo(String n, String a, String p) {
name = n;
© Copyright Virtual University of Pakistan
43
Web Design & Development – CS506 VU
address = a;
phoneNm = p;
}
}
Note: Not declaring attributes as private is a bad approach but we have done it to keep things
simple here.
Take the example of daily life; generally address book is used to store more than one person
records and we don’t know in advance how many records are going to be added into it.
So, we need some data structure that can help us in storing more than one
PersonInfo objects without concerning about its size.
Create a class Address Book with an ArrayList as its attribute. This arraylist will be used to store
the information of different persons in the form of PersonInfo Objects. This class will also
provide addPerson, deletePerson & searchPerson methods. These methods are used for adding
new person records, deleting an existing person record by name and searching among existing
person records by name respectively.
import javax.swing.*;
import java.util.*;
class AddressBook {
ArrayList persons;
//constructor
public AddressBook ( ) {
PersonInfo p = (PersonInfo)persons.get(i);
if ( n.equals(p.name) ) {
p.print();
}
} // end for
} // end searchPerson
PersonInfo p = (PersonInfo)persons.get(i);
if ( n.equals(p.name) ) {
persons.remove(i);
}
}
}
} // end class
The addperson method first takes input for name, address and phone number and than construct a
PersonInfo object by using the recently taken input values. Then the newly constructed object is
added to the arraylist – persons.
The searchPerson & deletePerson methods are using the same methodology i.e. first they search the
required record by name and than prints his/her detail or delete the record permanently from the
ArrayList.
Both the methods are taking string argument, by using this they can perform their search or delete
operation. We used for loop for iterating the whole ArrayList. By using the size method of ArrayList,
we can control our loop as ArrayList indexes range starts from 0 to one less than size.
© Copyright Virtual University of Pakistan
45
Web Design & Development – CS506 VU
Notice that, inside loop we retrieve each PersonInfo object by using down casting operation. After
that we compare each PersonInfo object’s name by the one passed to these methods using equal method
since Strings are always being compared using equal method.
Inside if block of searchPerson, print method is called using PersonInfo object that will display person
information on GUI. On the other hand, inside if block of deletePerson method, remove method of
ArrayList class is called that is used to delete record from persons i.e. ArrayList.
This class will contain a main method and an object of AddressBook class.
import javax.swing.*;
class Test {
String input, s;
int ch;
while (true) {
switch (ch) {
case 1:
ab.addPerson();
break;
case 2:
s = JOptionPane.showInputDialog(
“Enter name to search ”);
ab.searchPerson(s);
break;
case 3:
s = JOptionPane.showInputDialog(
“Enter name to delete ”);
ab.deletePerson(s);
break;
case 4:
System.exit(0);
}
© Copyright Virtual University of Pakistan
46
Web Design & Development – CS506 VU
}//end while
}//end main
}
Note that we use infinite while loop that would never end or stop given that our program should only exit
when user enters 4 i.e. exit option.
Compile all three classes and run Test class. Bravo, you successfully completed the all basic three
steps. Enjoy! ☺.
Reference
Entire content for this handout are taken from the book JAVA A Lab Course by Umair Javed. This
material is available just for the use of VU students of the course Web Design and Development and not
for any other commercial purpose.
Lesson 7
Intro to Exceptions
Types of Errors
Generally, you can come across three types of errors while developing software. These are Syntax,
Logic & Runtime errors.
1. Syntax Errors
2. Logic Errors
Indicates that logic used for coding doesn’t produce expected output.
3. Runtime Errors
Occur because the program tries to perform an operation that is impossible to complete.
Cause exceptions and may be handled at runtime (while you are running the program)
What is an Exception?
o ignore it
Helps to separate error handling code from main logic (the normal code you write) of the program.
Exceptions in Java
The exception object stores information about the nature of the problem. For example,
due to network problem or class not found etc.
Exception Hierarchy
Types of Exceptions
Exceptions can be broadly categorized into two types, Unchecked & Checked Exceptions.
Unchecked Exceptions
Checked Exceptions
Java handles exceptions via 5 keywords. try, catch, finally, throw & throws.
try block
catch block
• When the exception is raised from try block, only than catch block would execute.
finally block
• Write clean up code here, like resources (connection with file or database) that are
opened may need to be closed.
The basic structure of using try – catch – finally block is shown in the picture below:
throw
throws
• If method is not interested in handling the exception than it can throw back the exception
to the caller method using throws keyword.
© Copyright Virtual University of Pakistan
50
Web Design & Development – CS506 VU
References:
Unchecked Exceptions
The following program takes one command line argument and prints it on the console
// File UcException.java
System.out.println(args[0]);
If we compile & execute the above program without passing any command line argument, an
ArrayIndexOutOfBoundsException would be thrown. This is shown in the following picture
Why?
Since we have passed no argument, therefore the size of String args[ ] is zero, and we have tried to access
the first element (first element has index zero) of this array.
From the output window, you can find out, which code line causes the exception to be raised. In the
above example, it is
© Copyright Virtual University of Pakistan
51
Web Design & Development – CS506 VU
System.out.println(args[0]);
Modify UcException.java
// File UcException.java
try {
System.out.println(args[0]);
Checked Exceptions
The following program reads a line (hello world) from a file and prints it on the console. The File
reading code is probably new for you. We’ll explain it in the coming handouts
(Streams). For now, assumed that the code written inside the main read one line from a file and
prints that to console.
// File CException.java
import java.io.* ;
System.out.println(line);
If you try to compile this program, the program will not compile successfully and displays the
message of unreported exception. This happens when there is code that can generate a checked
exception but you have not handled that exception. Remember checked exceptions are detected
by compiler. As we early discussed, without handling Checked exception, out program won’t compile.
Modify CException.java
As we have discussed earlier, it is mandatory to handle checked exceptions. In order to compile the
code above, we modify the above program so that file reading code is placed inside a try block. The
expected exception (IOException) that can be raised is caught in catch block.
// File CException.java
© Copyright Virtual University of Pakistan
53
Web Design & Development – CS506 VU
import java.io.* ;
try{
System.out.println(line);
System.out.println(ex);
The code line written inside the catch block will print the exception name on the console if exception
occurs
After making changes to your program, it would compile successfully. On executing this program, hello
world would be displayed on the console
Note: Before executing, make sure that a text file named input.txt must be placed in the same
directory where the program is saved. Also write hello world in that file before saving it.
The finally block always executes regardless of exception is raised or not while as you remembered
the catch block only executes when an exception is raised.
© Copyright Virtual University of Pakistan
54
Web Design & Development – CS506 VU
// File FBlockDemo.java
import java.io.* ;
try{
System.out.println(line);
System.out.println(ex);
finally {
The program above, will read one line from string.txt file. If string.tx is not present in the same directory
the FileNotFoundException would be raised and catch block would execute as well as the finally block.
If string.txt is present there, no such exception would be raised but still finally block executes. This
is shown in the following output diagram
– Bear in mind the Exception hierarchy when writing multiple catch clauses!
– If you catch Exception first and then IOException, the IOException will never be caught!
The following program would read a number form a file numbers.txt and than prints its square on the
console
// File MCatchDemo.java
import java.io.* ;
try{
String s = br.readLine();
System.out.println(number * number);
System.out.println(nfEx);
}
System.out.println(fnfEx);
System.out.println(ioEx);
We read everything from a file (numbers, floating values or text) as a String. That’s why we first
convert it to number and than print its square on console.
If numbers.txt present in the same directory and contains a number, than hopefully no exception
would be thrown.
The following code examples will introduce you with writing & using throws clause.
// File ThrowsDemo.java
import java.io.* ;
try{
System.out.println(s);
ioEx.printStackTrace();
ThrowsDemo.method1();
}
printStackTrace method
Shows you the full method calling history with line numbers.
Modify: ThrowsDemo.java
Let method2 doesn’t want to handle exception by itself, so it throws the exception to the caller of
method2 i.e. method1
So method1 either have to handle the incoming exception or it can re-throw it to its caller i.e. main.
Let method1 is handling the exception, so method1& method2 would be modified as:
// File ThrowsDemo.java
import java.io.* ;
System.out.println(s);
method2();
ioEx.printStackTrace();
ThrowsDemo.method1();
}
}
© Copyright Virtual University of Pakistan
59
Web Design & Development – CS506 VU
If file strings.txt is not present in the same directory, method2 will throw an exception that would be
caught by method1 and the printStackTrace method will print the full calling history on console. The
above scenario is shown in the output below:
If file strings.txt exist there, than hopefully line would be displayed on the console.
Reference
Example code, their explanations and corresponding figures for this handout are taken from the book
JAVA A Lab Course by Umair Javed. This material is available just for the use of VU students of the
course Web Design and Development and not for any other commercial purpose without the consent of
author.
Lesson 8
Streams
I/O libraries often use the abstraction of a stream, which represents any data source or sink as an
object capable of producing or receiving pieces of data.
The Java library classes for I/O are divided by input and output. You need to import java.io package to
use streams. There is no need to learn all the streams just do it on the need basis.
• We need abstraction because there are lots of different devices (files, consoles, network,
memory, etc.). We need to talk to the devices in different ways
(sequential, random access, by lines, etc.) Streams make the task easy by acting in the same
way for every device. Though inside handling of devices may be quite different, yet on the
surface everything is similar. You might read from a file, the keyboard, memory or network
connection, different devices may require specialization of the basic stream, but you can
treat them all as just "streams". When you read from a network, you do nothing different
than when you read from a local file or from user's typing
• So you can consider stream as a data path. Data can flow through this path in one direction
between specified terminal points (your program and file, console, socket etc.)
Based on functionality streams can be categorized as Node Stream and Filter Stream. Node
Streams are those which connect directly with the data source/sick and provide basic
functionality to read/write data from that source/sink
You can see that FileReader is taking a data/source “input.txt” as its argument and hence it is a
node stream.
FilterStreams sit on top of a node stream or chain with other filter stream and provide some
additional functionality e.g. compression, security etc. FilterStreams take other stream as their
input.
BufferedReader makes the IO efficient (enhances the functionality) by buffering the input before
delivering. And as you can see that BufferedReader is sitting on top of a node stream which is
FileReader.
Classes which contain the word stream in their name are byte oriented and are here since JDK1.0. These
streams can be used to read/write data in the form of bytes. Hence classes with the word stream in their
name are byte-oriented in nature. Examples of byte oriented streams are FileInputStream,
ObjectOutputStream etc.
Classes which contain the word Reader/Writer are character oriented and read and write data in the form of
characters. Readers and Writers came with JDK1.1. Examples of Reader/Writers are FileReader,
PrintWriter etc
The ReadFileEx.java reads text file line by line and prints them on console. Before we move on to the
code, first create a text file (input.txt) using notepad and write following text lines inside it.
Hello World
Pakistan is our homeland
Web Design and Development
// File ReadFileEx.java
import java.io.*;
FileReader fr = null;
BufferedReader br = null;
try {
// closing streams
br.close();
fr.close();
}catch(IOException ioex){
System.out.println(ioex);
}
} // end main
} // end class
The WriteFileEx.java writes the strings into the text file named “output.txt”. If
“output.txt” file does not exist, the java will create it for you.
// File WriteFileEx.java
import java.io.*;
© Copyright Virtual University of Pakistan
63
Web Design & Development – CS506 VU
FileWriter fw = null;
PrintWriter pw = null;
try {
// flushing stream
pw.flush();
// closing streams
pw.close();
fw.close();
}catch(IOException ioex){
System.out.println(ioex);
}
} // end main
} // end class
After executing the program, check the output.txt file. Two lines will be written there.
Reference
Example code, their explanations and corresponding figures for this handout are taken from the book
JAVA A Lab Course by Umair Javed. This material is available just for the use of VU students of the
course Web Design and Development and not for any other commercial purpose without the consent of
author.
Lesson 9
Modification of Address Book Code
Hopefully, your address book you built previously is giving you the required results except one i.e.
persistence. You might have noticed that after adding some person records in the address book; if you
exit form the program next time on re-executing address book all the previous records are no more
available.
To overcome the above problem, we will modify our program so that on exiting/starting of address
book, all the previously added records are available each time. To achieve this, we have to provide the
persistence functionality. Currently, we will accomplish this task by saving person records in some text
file.
Supporting simple persistence by any application requires handling of two scenarios. These are
Scenario 1 – Start Up
We will read records from a text file named persons.txt. The person records will be present in the file in
the following format.
Ali,defence,9201211
Usman,gulberg,5173940
Salman,LUMS,5272670
persons.txt
As you have seen, each person record is on a separate line. Person’s name, address &
phone number is separated using comma (,).
We will modify our AddressBook.java by adding a new method loadPersons into it. This method
will provide the implementation of all the steps. The method is shown below:
try {
tokens = line.split(",");
name = tokens[0];
add = tokens[1];
ph = tokens[2];
line = br.readLine();
}
br.close();
fr.close();
}catch(IOException ioEx){
System.out.println(ioEx);
}
}
First, we have to connect with the text file in order to read line by line person records from it. This
task is accomplished with the following lines of code
FileReader is a character based (node) stream that helps us in reading data in the form of
characters. As we are using streams, so we have to import the java.io package in the
AddressBook class.
Next we add BufferedReader (filter stream) on top of the FileReader because BufferedReader
facilitates reading data line by line. (As you can recall from the lecture that filter streams are
attached on top of node streams). That’s why the constructor of BufferedReader is receiving the
fr – the FileReader object.
The next line of code will read line from file by using readLine( ) method of
BufferedReader and save it in a string variable called line.
After that while loop starts. The condition of while loop is used to check whether the file is reached
to end (returns null) or not. This loop is used to read whole file till the end. When end comes (null),
this loop will finish.
© Copyright Virtual University of Pakistan
66
Web Design & Development – CS506 VU
Inside loop, the first step we performed is tokenizing the string. For this purpose, we have used
split method of String class. This method returns substrings (tokens) according to the regular
expression or delimiter passed to it.
tokens = line.split(“,”);
The return type of this method is array of strings that’s why we have declared tokens as a String
array in the beginning of this method as
String tokens[];
Ali,defence,9201211
Now by calling split(“,”) method on this string, this method will return back three substrings ali
defence and 9201211 because the delimiter we have passed to it is comma. The delimiter itself
is not included in the substrings or tokens.
The next three lines of code are simple assignments statements. The tokens[0] contains the name
of the person because the name is always in the beginning of the line, tokens[1] contains address
of the person and tokens[2] contains the phone number of the person.
name = tokens[0];
add = tokens[1];
ph = tokens[2];
The name, add and ph are of type String and are declared in the beginning of this method.
After that we have constructed the object of PersonInfo class by using parameterized constructor
and passed all these strings to it.
Afterward the PersonInfo object’s p is added to the arraylist i.e. persons. persons.add(p);
The last step we have done inside loop is that we have again read a line form the file by using the
readLine() method.
By summarizing the task of while loop we can conclude that it reads the line from a file,
tokenizethat line into three substrings followed by constructing the PersonInfo object by
using these tokens. And adding these objects to the arraylist. This process continues till the file
reaches its end.
The last step for reading information from the file is ordinary one – closing the streams,
because files are external resources, so it’s better to close them as soon as possible.
Also observe that we used try/catch block because using streams can result in raising exceptions
that falls under the checked exceptions category – that needs mandatory handling.
The last important step you have to perform is to call this method while loading up. The most
© Copyright Virtual University of Pakistan
67
Web Design & Development – CS506 VU
appropriate place to call this method is from inside the constructor of AddressBook.java. So
the constructor will now look like similar to the one given below:
………………
public AddressBook () {
Persons = new ArrayList();
loadPersons();
}
………………
AddressBook.java
Scenario 2 – End/Finish Up
Build a string for each PersonInfo object by inserting commas (,) between name
& address and address & phone number.
Add another method savePersons into AddressBook.java. This method will provide the
implementation of all the above mentioned steps. The method is shown below:
Public void savePersons ( ){
try {
PersonInfo p;
String line;
pw.flush();
pw.close();
© Copyright Virtual University of Pakistan
68
Web Design & Development – CS506 VU
fw.close();
}catch(IOException ioEx){
System.out.println(ioEx);
}
}
As you can see, that we have opened the same file (persons.txt) again by using a set of streams.
After that we have started for loop to iterate over arraylist as we did in
searchPerson and deletePerson methods.
Inside for loop body, we have taken out PersonInfo object and after type casting it we have assigned its
reference to a PersonInfo type local variable p. This is achieved by the help of following line of code
p = (PersonInfo)persons.get(i);
Next we build a string and insert commas between the PersonInfo attributes and assign the newly
constructed string to string’s local variable line as shown in the following line of code.
Note: Since, we haven’t declare PersonInfo attributes private, therefore we are able to directly access
them inside AddressBook.java.
The next step is to write the line representing one PersonInfo object’s information, to the file. This
is done by using println method of PrintWriter as shown below
pw.println(line);
After writing line to the file, the println method will move the cursor/control to the next line.
That’s why each line is going to be written on separate line.
The last step for saving information to the file is ordinary one – closing the streams but before
that notice the code line that you have not seen/performed while loading persons records from file.
That is
pw.flush( );
The above line immediately flushes data by writing any buffered output/data to file. This step is
necessary to perform or otherwise you will most probably lose some data for the reason that
PrintWriter is a Buffered Stream and they have their own internal memory/storage capacity for
efficiency reasons. Buffered Streams do not send the data until their memory is full.
The last important step you have to perform is to call this method before exiting from the address
book. The most appropriate place to call this method is under case 4
(exit scenario) in Test.java. So the case 4 will now look like similar to the one given below:
case 4:
ab.savePersons();
System.exit(0);
Test.java
Now again after compiling all the classes, run the Test class. Initially we are assuming that out
persons.txt file is empty, so our arraylist persons will be empty on the first start up of address book.
Now add some records into it, perform search or delete operations. Exit from the address book
by choosing option 4. Check out the persons.txt file. Don’t get surprised by seeing that it
contains all the person records in the format exactly we have seen above.
Next time you will run the address book; all the records will be available to you. Perform the search or
delete operation to verify that.
References
Example code, their explanations and corresponding figures for this handout are taken from the book
JAVA A Lab Course by Umair Javed. This material is available just for the use of VU students of the
course Web Design and Development and not for any other commercial purpose without the consent of
author.
Abstract Classes and Interfaces
Before moving on to abstract classes, first examine the following class hierarchy shown below:
Circle Square
• Suppose that in order to exploit polymorphism, we specify that 2-D objects must be able to
compute their area.
– All 2-D classes must respond to area() message.
Abstract Classes
Abstract classes are used to define only part of an implementation. Because, information is not
complete therefore an abstract class cannot be instantiate. However, like regular classes, they can
also contain instance variables and methods that are full implemented. The class that inherits from
abstract class is responsible to provide details.
Any class with an abstract method (a method has no implementation similar to pure virtual
function in C++) must be declared abstract, yet you can declare a class abstract that has no abstract
method.
If subclass overrides all abstract methods of the super class, than it becomes a concrete (a class whose
object can be instantiate) class otherwise we have to declare it as abstract or we can not compile it.
The most important aspect of abstract class is that reference of an abstract class can point to the object of
concrete classes.
Class Circle extends from abstract Shape class, therefore to become concrete class it must provides
the definition of calculateArea() method.
private int x, y;
private int radius;
public Circle() {
x = 5;
y = 5;
radius = 10;
}
}//end of class
The Test class contains main method. Inside main, a reference s of abstract Shape class is created. This
reference can point to Circle (subclass of abstract class Shape) class object as it is a concrete class.
With the help of reference, method calculateArea() can be invoked of Circle class. This is all shown
in the form of code below
s.calculateArea();
}//end of class
Interfaces
As we seen one possible java’s solution to problem discussed in start of the tutorial. The second possible
java’s solution is Interfaces.
Interfaces are special java type which contains only a set of method prototypes, but doest not provide
the implementation for these prototypes. All the methods inside an interface are abstract by default thus
an interface is tantamount to a pure abstract class – a class with zero implementation. Interface can
also contains static final constants
Defining an Interface
Classes implement interfaces. Implementing an interface is like signing a contract. A class that
implements an interface will have to provide the definition of all the methods that are present inside
© Copyright Virtual University of Pakistan
72
Web Design & Development – CS506 VU
an interface. If the class does not provide definitions of all methods, the class would not compile.
We have to declare it as an abstract class in order to get it compiled.
Relationship between a class and interface is equivalent to “responds to” while “is a”
relationship exists in inheritance.
Class Student is implementing the interface Printable. Note the use of keyword implements after the
class name. Student class has to provide the definition of print method or we are unable to compile.
}//end of class
Interface Characteristics
Similar to abstract class, interfaces imposes a design structure on any class that uses the interface.
Contrary to inheritance, a class can implement more than one interfaces. To do this separate the
interface names with comma. This is java’s way of multiple inheritance.
However, a reference of interface can be created to point any of its implementation class. This is
interface based polymorphism.
Interface Speaker is implemented by three classes Politician, Coach and Lecturer. Code snippets of all
these three classes are show below:
© Copyright Virtual University of Pakistan
73
Web Design & Development – CS506 VU
As usual, Test class contains main method. Inside main, a reference sp is created of Speaker class.
Later, this reference is used to point to the objects of Politician, Coach and Lecturer class. On calling
speak method with the help of sp, will invoke the method of a class to which sp is pointing.
Speaker sp = null;
References
Example code, their explanations and corresponding figures for this handout are taken from the book
JAVA A Lab Course by Umair Javed. This material is available just for the use of VU students of the
course Web Design and Development and not for any other commercial purpose without the
consent of author.
Lesson 10
Graphical User Interfaces
A graphical user interface is a visual interface to a program. GUIs are built from GUI components
(buttons, menus, labels etc). A GUI component is an object with which the user interacts via the mouse
or keyboard.
Together, the appearance and how user interacts with the program are known as the program look
and feel.
The classes that are used to create GUI components are part of the “java.awt” or
“javax.swing” package. Both these packages provide rich set of user interface components.
The classes present in the awt and swing packages can be classified into two broad categories.
GUI classes & Non-GUI Support classes.
The GUI classes as the name indicates are visible and user can interact with them. Examples of
these are JButton, JFrame & JRadioButton etc
The Non-GUI support classes provide services and perform necessary functions for GUI classes. They
do not produce any visual output. Examples of these classes are Layout managers (discussed latter)
& Event handling (see handout on it) classes etc.
java.awt package
AWT stands for “Abstract Windowing Toolkit “contains original GUI components that came with the
first release of JDK. These components are tied directly to the local platform’s (Windows, Linux,
MAC etc) graphical user interface capabilities. Thus results in a java program executing on different java
platforms (windows, Linux, Solaris etc) has a different appearance and sometimes even different user
interaction on each platform.
AWT components are often called Heavy Weight Components (HWC) as they rely on the local
platform’s windowing system to determine their functionality and their look and feel. Every time you
create an AWT component it creates a corresponding process on the operating system. As compared to
this SWING components are managed through threads and are known as Light Weight Components.
This package also provides the classes for robust event handling (see handout on it) and layout
managers.
javax.swing package
These are the newest GUI components. Swing components are written, manipulated and displayed
completely in java, therefore also called pure java components. The swing components allow the
programmer to specify a uniform look and feel across all platforms.
Swing components are often referred to as Light Weight Components as they are completely
written in java. Several swing components are still HWC. e.g. JFrame etc.
Two important methods the container class has add and setLayout.
The add method is used for adding components to the content pane while setLayout
method is used to specify the layout manager.
Container are classified into two broad categories that are Top Level containers
and General Purpose Containers
Top level containers can contain (add) other containers as well as basic components
(buttons, labels etc) while general purpose containers are typically used to collect
basic components and are added to top level containers.
General purpose containers cannot exist alone they must be added to top level containers
Examples of top level container are JFrame, Dialog and Applet etc. Our application
uses one of these.
Examples of general purpose container are JPanel, Toolbar and ScrollPane etc.
So, take a top level container and create its instance. Consider the following code of line if
JFrame is selected as a top level container
Review the hierarchy given above, and observe that JFrame is a frame is a
window. So, it can be interpreted as JFrame is a window.
Every window has two areas. System Area & Component Area
The Component Area often known as Client area is a workable place for the programmer.
Components can be added/removed in this area.
So, to add components, as you guessed right component area of the JFrame is required. It
can be accomplished by the following code of line
frame is an instance of JFrame and by calling getContentPane() method on it, it returns the
component area. This component area is of type container and that is why it is stored in a
variable of a Container class. As already discussed, container allows other components to be
added / removed.
The layout (size & position etc. How they appear) of components in a container is
usually governed by Layout Managers.
The layout manager is responsible for deciding the layout policy and size of its
components added to the container.
Layout managers are represented in java as classes. (Layout Managers are going to be
discussed in detail later in this handout)
To set the layout, as already discussed use setLayout method and pass object of layout
manager as an argument.
We can also use the following lines of code instead of above. FlowLayout layout
= new FlowLayout(); con.setLayout(layout);
After creating all components your are interested in, the next task is to add these
components into the component area of your JFrame (i.e ContentPane, the reference to
which is in variable con of type Container)
Use add method of the Container to accomplish this and pass it the component to be added.
con.add(button);
A frame must be made visible via a call to setVisible(true) and its size defined via a call
setSize(rows in pixel, columns in pixel) to be displayed on the screen.
frame.setSize(200, 300) ;
frame.setVisible(true) ;
Note: By default, all JFrame’s are invisible. To make visible frame visible we have passed
true to the setVisible method.
frame.setVisible(false) ;
Making a Simple GUI
The above figured GUI contains one text field and a button. Let’s code it by following the six GUI
creation steps we discussed.
// File GUITest.java
JFrame myFrame ;
JTextField tf;
JButton b;
c.add(tf);
c.add(b1);
} // end of class
main method (from where program execution starts) is written in the same class. The main method
can be in a separate class instead of writing in the same class its your choice.
Inside main, an object of GUI test class is created that results in calling of constructor of the class
and from the constructor, initGUI method is called that is responsible for setting up the GUI.
The following line of code is used to exit the program when you close the window
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
If you delete this line and run your program, the desired GUI would be displayed. However if
you close the window by using (X) button on top left corner of your window, you’ll notice that
the control doesn’t return back to command prompt. The reason for this is that the java process is
still running. How ever if you put this line in your code, when you exit your prompt will return.
References:
Layout Managers
Layout Managers are used to form the appearance of your GUI. They are concerned with the
arrangement of components of GUI. A general question is “why we can not place components at our
desired location (may be using the x,y coordinate position?”
The answer is that you can create your GUI without using Layout Managers and you can also do VB
style positioning of components at some x,y co-ordinate in Java, but that is generally not advisable if
you desire to run the same program on different platforms
The appearance of the GUI also depends on the underlying platform and to keep that same the
responsibility of arranging layout is given to the LayoutManagers so they can provide the same look
and feel across different platforms
1. Flow Layout
2. Grid Layout
3. Border Layout
4. Box Layout
5. Card Layout
6. GridBag Layout and so on
Let us discuss the top three in detail one by one with code examples. These top three will meet most of
your basic needs
1. Flow Layout
Position components on line by line basis. Each time a line is filled, a new line is started.
The size of the line depends upon the size of your frame. If you stretch your frame while your
program is running, your GUI will be disturbed.
Example Code
// File FlowLayoutTest.java
import java.awt.*;
import javax.swing.*;
JFrame myFrame ;
JButton b1, b2, b3, b4, b5;
Container c = myFrame.getContentPane();
c.add(b1);
c.add(b2);
c.add(b3);
c.add(b4);
c.add(b5);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(300,150);
myFrame.setVisible(true);
} // end of class
Output
2. Grid Layout
Example Code
// File GridLayoutTest.java
import java.awt.*;
import javax.swing.*;
JFrame myFrame ;
JButton b1, b2, b3, b4, b5;
Container c = myFrame.getContentPane();
// rows , cols
c.setLayout( new GridLayout( 3 , 2 ) );
c.add(b1);
c.add(b2);
c.add(b3);
c.add(b4);
c.add(b5);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(300,150);
myFrame.setVisible(true);
} // end of class
output
Modification
The grid layout also allows the spacing between cells. To achieve
spacing between cells, modify the above program.
Pass additional parameters to the constructor of GridLayout, spaces between rows &
© Copyright Virtual University of Pakistan
83
Web Design & Development – CS506 VU
3. Border Layout
Divides the area into five regions. North, South, East, West and Center
If any region not filled, the filled regions will occupy the space but the center region will
still appear as background if it
contains no component.
Example Code
// File BorderLayoutTest.java
import java.awt.*;
import javax.swing.*;
JFrame myFrame ;
JButton b1, b2, b3, b4, b5;
Container c = myFrame.getContentPane();
c.add( b1 , BorderLayout.NORTH );
c.add( b2 , BorderLayout.SOUTH );
c.add( b3 , BorderLayout.EAST );
c.add( b4 , BorderLayout.WEST );
c.add( b5 , BorderLayout.CENTER);
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(300,150);
myFrame.setVisible(true);
} // end of class
Points to Remember
Revisit the code of adding components, we specify the region in which we want to add
component or otherwise they will not be visible.
Output
From the discussion above it seems that the basic Layout Managers may not help us in constructing
complex GUIs, but generally a combination of these basic layouts can do the job. So lets try to create the
calculator GUI given below
This GUI has 16 different buttons each of same size and text field on the top and a label
‘my calculator’ on the bottom.
So, how we can make this GUI? If Border Layout is selected, it has five regions (each region can
have at most one component) but here we have more than five components to add. Lets try Grid
Layout, but all the components in a Grid have same size and the text field at the top and label at the
bottom has different size. Flow Layout cannot be selected because if we stretch our GUI it will destroy
its shape.
Can we make this GUI? Yes, we can. Making of such GUI is a bit tricky business but
General Purpose Containers are there to provide the solution.
JPanel
It is general purpose container (can’t exist alone, it has to be in some toplevel container) in
which we can put in different components (JButton , JTextField etc even other JPanels)
JPanel has its own layout that can be set while creating JPanel instance
myPanel.add (button );
Must be added to a top level container (like JFrame etc) in order to be visible as they (general
purpose containers) can’t exist alone.
Solution
To make the calculator GUI shown above, take JFrame (top level container) and set its layout to
border. Than take JPanel (general purpose container) and set its layout to Grid with 4 rows and 4
columns.
Add buttons to JPanel as they all have equal size and JPanel layout has been set to GridLayout.
Afterthat, add text field to the north region, label to the south region and panel to the center region
of the JFrame’s container. The east and west regions are left blank and the center region will be
stretched to cover up these. So, that’s how we can build our calculator GUI.
// File CalculatorGUI.java
import java.awt.*;
import javax.swing.*;
JFrame fCalc;
JButton b1, b2, b3, b4, b5, b6, b7, b8, b9, b0;
JButton bPlus, bMinus, bMul, bPoint, bEqual, bClear;
JPanel pButtons;
JTextField tfAnswer;
JLabel lMyCalc;
b0 = new JButton("0");
b1 = new JButton("1");
b2 = new JButton("2");
b3 = new JButton("3");
b4 = new JButton("4");
b5 = new JButton("5");
b6 = new JButton("6");
b7 = new JButton("7");
b8 = new JButton("8");
b9 = new JButton("9");
//creating panel object and setting its layout pButtons = new JPanel
(new GridLayout(4,4));
pButtons.add(b4);
pButtons.add(b5);
pButtons.add(b6);
pButtons.add(bMul);
pButtons.add(b7);
pButtons.add(b8);
pButtons.add(b9);
pButtons.add(bMinus);
pButtons.add(b0);
pButtons.add(bPoint);
pButtons.add(bPlus);
pButtons.add(bEqual);
fcalc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fCalc.setSize(300, 300);
fCalc.setVisible(true);
initGUI ();
} // end of class
Reference:
Lesson 11
Event Handling
One of the most important aspects of most non-trivial applications (especially UI type- apps) is the
ability to respond to events that are generated by the various components of the application, both in
response to user interactions and other system components such as client-server processing. In this
handout we will look at how Java supports event generation and handling and how to create (and
process) custom events.
GUIs generate events when the user interacts with GUI. For example,
— Clicking a button
— Moving the mouse
— Closing Window etc
These objects tells us about event and its source. Examples are:
— ActionEvent (Clicking a button)
— WindowEvent (Doing something with window e.g. closing , minimizing)
In Java both AWT and Swing components use Event Delegation Model.
– It’s a Publish-Subscribe model. That is, event generating component publish an event and
event handling components subscribe for that event. The publisher sends these events to
subscribers. Similar to the way that you subscribe for newspaper and you get the newspaper at
© Copyright Virtual University of Pakistan
90
Web Design & Development – CS506 VU
– This model separates UI code from program logic, it means that we can create separate
classes for UI components and event handlers and hence business/program logic is
separated from GUI components.
For a programmer the event Handling is a three step process in terms of code
– Step 2: Build component (objects) that can handle events (Event Handlers)
The first step is that you create an event generator. You have already seen a lot of event generators
like:
– Buttons
– Mouse
– Key
– Window etc
Most of GUI components can be created by calling their constructors. For example
The second step is that you build components that can handle events
– Package java.awt.event contains different event Listener Interfaces which are shown in the
following figure
© Copyright Virtual University of Pakistan
91
Web Design & Development – CS506 VU
– Some Example Listeners, the way they are defined in JDK by Sun
– Inside the method the class can do what ever it wants to do with that event
– Event Generator and Event Handler can be the same or different classes
// do something
}
}
The event generator is told about the object which can handle its events
Clicking the “Hello” button will open up a message dialog shown below.
We will take the simplest approach of creating handler and generator in a single class. Button is our
event generator and to handle that event our class needs to implement ActionListener Interface and
to override its actionPerformed method and in last to do the registration
1. import java.awt.*;
2. import javax.swing.*;
3. import java.awt.event.*;
/* Implementing the interface according to the type of the event, i.e. creating event
handler (first part of step 2 of our process) */
5. JFrame frame;
6. JButton hello;
13. cont.add(hello);
14. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
15. frame.setSize(150, 150);
16. frame.setVisible(true);
17. }
//constructor
18. public ActionEventTest ( ) {
19. initGUI();
20. }
We have already seen that what a programmer needs to do handle events. Let’s see what takes place
behind the scenes, i.e How JVM handles event. Before doing that lets revisit different participants of
Event Handling Process and briefly what they do.
2. Event Object
– Encapsulate information about event that occurred and the source of that event
– For example, if you click a button, ActionEvent object is created
3. Event Listener/handler
4. JVM
When button generates an ActionEvent it is sent to JVM which puts it in an event queue. After that
when JVM find it appropriate it de-queue the event object and send it to all the listeners that are
registered with that button. This is all what we shown in the pictorial form below:
1. import java.awt.*;
2. import javax.swing.*;
3. import java.awt.event.*;
5. JFrame frame;
6. JLabel firstOperand, secondOperand, answer;
7. JTextField op1, op2, ans;
8. JButton plus, mul;
9. // setting layout
10. public void initGUI ( ) {
24. cont.add(firstOperand);
25. cont.add(op1);
26. cont.add(secondOperand);
27. cont.add(op2);
28. cont.add(plus);
29. cont.add(mul);
30. cont.add(answer);
31. cont.add(ans);
32. plus.addActionListener(this);
33. mul.addActionListener(this);
34. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
35. frame.setSize(200, 220);
36. frame.setVisible(true);
37. }
38. //constructor
39. public SmallCalcApp ( ) {
40. initGUI();
41. }
65. }
66. }// end class
Lesson 12
More Examples of Handling Events
Mouse events can be trapped for any GUI component that inherits from Component class. For example,
JPanel, JFrame & JButton etc.
– MouseMotionListener
– MouseListener
The class that wants to handle mouse event needs to implement the corresponding interface and
needs to provide the definition of all the methods in that interface.
MouseMotionListener interface
MouseListener interface
– Used for processing “interesting” mouse events like when mouse is:
Pressed
Released
Clicked (pressed & released without moving the cursor)
Enter (mouse cursor enters the bounds of component)
Exit (mouse cursor leaves the bounds of component)
Example to show Mouse Event Handling .Every time mouse is moved, the coordinates for a new
place is shown in a label.
1. import java.awt.*;
2. import javax.swing.*;
3. import java.awt.event.*;
5. JFrame frame;
6. JLabel coordinates;
7. // setting layout
8. public void initGUI ( ) {
17. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
29. }
34. }
37. }
Task
Why?
But we have already achieved this functionality through following line of code
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
But, what if we want to display some message (Good Bye) before exiting?
But, We have to provide definitions of all methods to make our class a concrete class
This example code is modification of the last code example i.e. EventsEx.java
1. import java.awt.*;
2. import javax.swing.*;
3. import java.awt.event.*;
WindowListener {
5. JFrame frame;
6. JLabel coordinates;
// setting layout
7. public void initGUI ( ) {
//default constructor
18. public EventsEx ( ) {
19. initGUI();
20. }
© Copyright Virtual University of Pakistan
102
Web Design & Development – CS506 VU
25. }
31. }
37. }
44. }
Lesson 13
Problem in Last Code Example
Problem
Solution
– To avoid giving implementations of all methods of an interface when we are not using these
methods we use Event Adapter classes
Adapter Classes
• For listener interfaces containing more than one event handling methods, jdk defines adapter
classes. Examples are
• Adapter classes provide definitions for all the methods (empty bodies) of their corresponding
Listener interface
• It means that WindowAdapter class implements WindowListener interface and provide the
definition of all methods inside that Listener interface
Therefore it has to provide definitions of all the methods inside that interface
Due to inheritance, all the methods of the adapter class will be available inside our handler class
Since adapter classes has already provided definitions with empty bodies.
Here we are modifying the window event code in the last example to show the use of
WindowAdapter instead of WindowListener. Code related to MouseMotionListener is deleted to
avoid cluttering of code.
1. import java.awt.*;
2. import javax.swing.*;
3. import java.awt.event.*;
5. JFrame frame;
6. JLabel coordinates;
// setting layout
7. public void initGUI ( ) {
© Copyright Virtual University of Pakistan
105
Web Design & Development – CS506 VU
18. initGUI();
19. }
23. }
What if we want to use MouseMotionAdpater as well ? or what if our class already inherited form
some other class ?
Problem
Solution
Inner Classes
Inner class can access the instance variables and members of outer class
It can have constructors, instance variables and methods, just like a regular class
Generally used as a private utility class which does not need to be seen by others classes
Here we are modifying the window event code in the last example to show the use of
WindowAdapter as an inner class.
1. import java.awt.*;
2. import javax.swing.*;
3. import java.awt.event.*;
5. JFrame frame;
6. JLabel coordinates;
7. // setting layout
8. public void initGUI ( ) {
//default constructor
19. public EventEx ( ) {
20. initGUI();
21. }
Example Code 13.3: Handling Window and Mouse Events with Inner Class
Here we are modifying the window event code of the last example to handle window and mouse events
using inner classes. The diagram given below summarizes the approach.
Inner class
Handling
Window
1. import java.awt.*;
2. import javax.swing.*;
3. import java.awt.event.*;
5. JFrame frame;
6. JLabel coordinates;
7. // setting layout
8. public void initGUI ( ) {
//default constructor
21. public EventEx ( ) {
22. initGUI();
23. }
28. }
1. import java.awt.*;
2. import javax.swing.*;
3. import java.awt.event.*;
5. JFrame frame;
6. JLabel firstOperand, secondOperand, answer;
7. JTextField op1, op2, ans;
8. JButton plus, mul;
9. // setting layout
10. public void initGUI ( ) {
24. cont.add(firstOperand);
25. cont.add(op1);
26. cont.add(secondOperand);
27. cont.add(op2);
28. cont.add(plus);
29. cont.add(mul);
30. cont.add(answer);
31. cont.add(ans);
33. plus.addActionListener(bHandler);
34. mul.addActionListener(bHandler);
35. frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
36. frame.setSize(200, 220);
37. frame.setVisible(true);
38. }
© Copyright Virtual University of Pakistan
111
Web Design & Development – CS506 VU
39. //constructor
40. public SmallCalcApp ( ) {
41. initGUI();
42. }
55 }
64 }
65. } // end actionPerformed method
Has no name
much shorter
difficult to understand
Named
Anonymous
– System.out.println(“hello”);
We generally use anonymous object when there is just a one time use of a particular object but in
case of a repeated use we generally used named objects and use that named reference to use that objects
again and again.
Example Code 13.4 Handling Window Event with Anonymous Inner Class
Here we are modifying the window event code of 13.3 to show the use of anonymous inner class.
// setting layout
34. public void initGUI ( ) {
40. frame.addWindowListener (
41. new WindowAdapter ( ) {
//default constructor
51. public EventsEx ( ) {
52. initGUI();
53. }
1. By implementing Interfaces
Same class
Separate class
1. Outer class
3. Inner classes
References
Lesson 14
Java Database Connectivity
Introduction
Java Database Connectivity (JDBC) provides a standard library for accessing databases. The JDBC API
contains number of interfaces and classes that are extensively helpful while communicating with a
database.
The java.sql package
The java.sql package contains basic & most of the interfaces and classes. You automatically get this
package when you download the J2SE™. You have to import this package whenever you want to interact
with a relational database.
Connecting With Microsoft Access
In this handout, we will learn how to connect & communicate with Microsoft Access Database. We
chooses Access because most of you are familiar with it and if not than it is very easy to learn.
Create Database
In start create a database “PersonInfo” using Microsoft Access. Create one table named “Person”. The
schema of the table is shown in the picture.
Save the data base in some folder. (Your database will be saved as an .mdb file)
Setup System DSN
After creating database, you have to setup a system Data Source Name (DSN). DSN is a name
through which your system recognizes the underlying data source.
Select Start Settings Control Panel Administrative Tools Data Sources (ODBC).
The ODBC Data Source Administrator window would be opened as shown below. Select System
DSN tab. (If you are unable to use System DSN tab due to security restrictions on your machine,
© Copyright Virtual University of Pakistan
115
Web Design & Development – CS506 VU
Press Add… button and choose Microsoft Access Driver (*.mdb) from Create New Data Source
window and press Finish button as shown in diagram.
After that, ODBC Microsoft Access Setup window would be opened as shown in following
diagram
Enter the Data Source Name personDSN and select the database by pressing Select button. The
browsing window would be opened, select the desired folder that contains the database (The
database .mdb file you have created in the first step) Press Ok button.
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
For Oracle, load the following driver. You have to download it explicitly.
Class.forName(“oracle.jdbc.driver.OracleDriver”);
3. Define Connection URL
To get a connection, we need to specify the URL of a database (Actually we need to specify
the address of the database which is in the form of URL)
As we are using Microsoft Access database and we have loaded a JDBC-ODBC driver. Using
JDBC-ODBC driver requires a DSN which we have created earlier and named it personDSN.
So the URL of the database will be
Once you have a statement, you can use it for various kinds of SQL queries.
6. Execute a Query
The next step is to pass the SQL statements & to execute them.
Two methods are generally used for executing SQL queries. These are:
executeQuery(sql) method
Used for SQL SELECT queries.
Returns the ResultSET object that contains the results of the query and can be used to access the
query results.
while ( rs.next() ){
//by using column name
String name = rs.getString(“columnName”);
// or by using column indexString name = rs.getString(1);
}
8. Close the Connection
An opening connection is expensive, postpone this step if additional database operations are
expected
con.close();
ResultSet rs = st.executeQuery(sql);
//Step 7: process the results
while(rs.next()){
// The row name is “name” in database “PersonInfo,// hence specified in the getString()
method.
String name = rs.getString(“name”);String add = rs.getString(“address”);String
pNum = rs.getString(“phoneNum”);
System.out.println(name + “ ” + add + ” ” + pNum);}
//Step 8: close the connection
con.close();
}catch(Exception sqlEx){
System.out.println(sqlEx);
}
References:
. Java – A Lab Course by Umair Javed
. Java tutorial by Sun: http://java.sun.com/docs/books/turorial
. Beginning Java2 by Ivor Hortan
Lesson 15
More on JDBC
In the previous handout, we have discussed how to execute SQL statements. In this handout, we’ll learn
how to execute DML (insert, update, delete) statements as well some useful methods provided by the JDBC
API.
Before jumping on to example, lets take a brief overview of executeUpdate()method that is used for
executing DML statements.
Useful Statement Methods:
o executeUpdate( )
. Used to execute for INSERT, UPDATE, or DELETE SQL statements.
. This method returns the number of rows that were affected in the database.
Also supports DDL (Data Definition Language) statements CREATE TABLE, DROP
..
TABLE, and ALERT TABLE etc. For example,
}catch(Exception sqlEx){
System.out.println(sqlEx);
}
The next diagram shows how we have executed our program. We passed it two arguments. The first one is
the address (defence) and later one is the name (ali) of the person against whom we want to update the
address value.
The Person table is shown in the following diagram after the execution of the program. Notice that address
of the ali is now changed to defence.
Note
When we execute DML statements (insert, update, delete) we have to commit it in the database explicitly to
make the changes permanent or otherwise we can rollback the previously executed statements.
But in the above code, you have never seen such a statement. This is due to the fact that java will implicitly
commit the changes. However, we can change this java behavior to manual commit. We will cover these in
some later handout.
Useful Statement Methods (cont.):
o getMaxRows / setMaxRows(int)
. Used for determines the number of rows a ResultSet may contain
. By default, the number of rows are unlimited (return value is 0), or by using
© Copyright Virtual University of Pakistan
121
Web Design & Development – CS506 VU
1. Statement
-The Statement objects are used for executing simple SQL statements. -We have already
seen its usage in the code examples.
2. PreparedStatement
-The PrepaeredStatement are used for executing precompiled SQL statements and passing in
different parameters to it.
- We will talk about it in detail shortly.
3. CallableStatement
- Theses are used for executing stored procedures.
-We are not covering this topic; See the Java tutorial on it if you are interested in learning it.
Prepared Statements
What if we want to execute same query multiple times by only changing parameters.
PreparedStatement object differs from Statement object as that it is used to create a statement in
standard form that is sent to database for compilation, before actually being used.
Each time you use it, you simply replace some of the marked parameters (?) using some setter
methods.
We can create PreparedStatement object by using prepareStatementmethod of the connection class.
The SQL query is passed to this method as an argument as shown below.
pStmt.setString (1 , stringValue);
pStmt.setInt (2 , intValue)
Note: The first market parameter has index 1.
. Next, we can call executeUpdate (for INSERT, UPDATE or DELETE queries) or executeQuery (for
simple SELECT query) method.
pStmt.executeUpdate();
Modify Example Code 15.1: Executing SQL DML using Prepared Statements
This example code is modification to the last example code (JdbcDmlEx.java).The modifications are
highlighted as bold face.
// File JdbcDmlEx.java
//step 1: import packageimport java.sql.*;
public class JdbcDmlEx {public static void main (String
args[ ]) { try {
//Step 2: load driverClass.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
//Step 3: define the connection URL
}catch(Exception sqlEx){
System.out.println(sqlEx);
}
References:
Entire material for this handout is taken from the book JAVA A Lab Course by Umair Javed. This
material is available just for the use of VU students of the course Web Design and Development and not for
any other commercial purpose without the consent of author.
Lesson 16
Result Set
This handout will familiarize you with another technique of inserting, updating & deleting rows. Before
moving on, first we look at ResultSet.
ResultSet
– A ResultSet contains the results of the SQL query
Represented by a table with rows and columns
Maintains a cursor pointing to its current row of data.
Initially the cursor positioned before the row (0).
First row has index 1
Default ResultSet
. A default ResultSet object is not updatable and has a cursor that moves forward only.
. You can iterate over through it only once and only from the first row to last row.
. Until now, we have worked & used it in various examples.
. For a quick overview, here how we create a default ResultSet object.
String sql = “SELECT * FROM Person”; PreparedStatement pStmt =
con.prepareStatement(sql); ResultSet rs = pStmt.executeQuery( );
-The ResultSet is implicitly closed when the associated Statement object executes a new query or
closed by method call.
then uses the method updateRow to update the Person table in database.
This code is the modification of the last one. Changes made are shown in bold face.
1 // File ResultSetEx.java
2 import java.sql.*;
3 public class ResultSetEx {
4 public static void main (String args[ ]) {
5 try {
6 //Step 2: load driver
7 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
8 //Step 3: define the connection URL
9 String url = “jdbc:odbc:personDSN”;
10 //Step 4: establish the connection
11 Connection con = DriverManager.getConnection(url);
12 //Step 5: create PrepareStatement by passing sql and
13 // ResultSet appropriate fields
14 String sql = “SELECT * FROM Person”;
15 PreparedStatement pStmt = con.prepateStatement(sql,
16 ResultSet.TYPE_SCROLL_INSENSITIVE,
17 ResultSet.CONCUR_UPDATABLE);
18 //Step 6: execute the query
19 ResultSet rs = pStmt.executeQuery();
20 // moving cursor to second row
21 rs.absolute(2);
nd
22 // update address column of 2 row in rs
23 rs.updateString(“Address”, “model town”);
24 // update the row in database
25 rs.updateRow( );
26 //Step 8: close the connection
27 con.close();
28 }catch(Exception sqlEx){
29 System.out.println(sqlEx);
30 }
31 } // end main
32 } // end class
-By calling moveToInsertRow( ), the cursor is moved to insert row as shown below.
Now by calling various updates, we can insert values into the columns of insert row as shown
below.
. insertRow( )
-Inserts the contents of the current row into this ResultSet object and into the database too.
-Moves the cursor back to the position where it was before calling moveToInsertRow()
-This is shown in the given below diagram
Note: The cursor must be on the insert row before calling this method or exception would be raised.
19 ResultSet rs = pStmt.executeQuery();
20 // moving cursor to insert row
21 rs.moveToInsertRow();
22 // updating values in insert row
23 rs.updateString( “Name” , “imitiaz” );
24 rs.updateString( “Address” , “cantt” );
25 rs.updateString( “phoneNum” , “9201211” );
26 // inserting row in resultset & into database
27 rs.insertRow( );
28 //Step 8: close the connection
29 con.close();
30 }catch(Exception sqlEx){
31 System.out.println(sqlEx);
32 }
33 } // end main
34 } // end class
Execution program from command prompt will result in displaying current row number on console. This
can be confirmed from following diagram.
After execution, the last row (4) is deleted from ResultSet as well as from database. The Person table is
shown after execution
Person table: After execution
References:
Entire material for this handout is taken from the book JAVA A Lab Course by Umair Javed. This
material is available just for the use of VU students of the course Web Design and Development and not for
any other commercial purpose without the consent of author.
Lesson 17
Meta Data
In simple terms, Meta Data is data (information) about data. The actual data has no meaning without
existence of Meta data. To clarify this, let’s look at an example. Given below are listed some numeric
values
What this information about? We cannot state accurately. These values might be representing some one’s
salaries, price, tax payable & utility bill etc. But if we specify Meta data about this data like shown below:
Now, just casting a glance on these values, you can conclude that it’s all about some ones salaries.
ResultSet Meta data
ResultSet Meta Data will help you in answering such questions
-How many columns are in the ResultSet?
-What is the name of given column?
-Are the column name case sensitive?
-What is the data type of a specific column?
-What is the maximum character size of a column?
-Can you search on a given column?
– Returns the SQL type for the column to compare against types in java.sql.Types
5 try {
6 //Step 2: load driver
7 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);
8 //Step 3: define the connection URL
9 String url = “jdbc:odbc:personDSN”;
10 //Step 4: establish the connection
11 Connection con = null;
12 con = DriverManager.getConnection(url, “”, “”);
13 //Step 5: create PrepareStatement by passing sql and
14 // ResultSet appropriate fields
15 String sql = “SELECT * FROM Person”;
16 PreparedStatement pStmt = con.prepateStatement(sql,
17 ResultSet.TYPE_SCROLL_INSENSITIVE,
18 ResultSet.CONCUR_UPDATABLE);
19 //Step 6: execute the query
20 ResultSet rs = pStmt.executeQuery();
21 // get ResultSetMetaData object from rs
22 ResultSetMetaData rsmd = rs.getMetaData( );
23 // printing no. of column contained by rs
24 int numColumns = rsmd.getColumnCount();
25 System.out.println(“Number of Columns:” + numColumns);
26 // printing all column names by using for loop
27 String cName;
28 for(int i=1; i<= numColumns; i++) {
29 cName = rsmd.getColumnName(i);
30 System.out.println(cName);
31 System.out.println(“\t”);
32 }
33 // changing line or printing an empty string
34 System.out.println(“ ”);
35 // printing all values of ResultSet by iterating over it
36 String id, name, add, ph;
37 while( rs.next() )
38 {
39 id = rs.getString(1);
40 name = rs.getString(2);
41 add = rs.getString(3);
42 ph = rs.getString(4);
43 System.out.println(id);
44 System.out.println(“\t”);
45 System.out.println(name);
46 System.out.println(“\t”);
47 System.out.println(add);
48 System.out.println(“\t”);
49 System.out.println(ph);
50 System.out.println(“ ”);
51 }
52 //Step 8: close the connection
53 con.close();
54 }catch(Exception sqlEx){
55 System.out.println(sqlEx);
56 }
57 } // end main101.} // end class
DataBaseMetaData
DataBase Meta Data will help you in answering such questions
What SQL types are supported by DBMS to create table?
What is the name of a database product?
What is the version number of this database product?
What is the name of the JDBC driver that is used?
Is the database in a read-only mode?
Each type defines a JDBC driver implementation with increasingly higher level of platform
independence, performance, deployment and administration.
The four types are:
On – Line Resources
• Sun’s JDBC Site
http://java.sun.com/products/jdbc/
• JDBC Tutorial
http://java.sun.com/docs/books/tutorial/jdbc/
• List of available JDBC Drivers
http://industry.java.sun.com/products/jdbc/drivers/
• RowSet Tutorial
http://java.sun.com/developer/Books/JDBCTutorial/chapter5.html
• JDBC RowSets Implementation Tutorial
http://java.sun.com/developer/onlineTraining/ Database/jdbcrowsets.pdf
References:
• Java API documentation 5.0
• Java – A Lab Course by Umair Javed
• JDBC drivers in the wild
http://www.javaworld.com/javaworld/jw-07-2000/jw-0707-jdbc_p.html
Lesson 18
Java Graphics
Painting
Window is like a painter’s canvas. All window paints on the same surface. More importantly, windows
don’t remember what is under them. There is a need to repaint when portions are newly exposed.
Java components are also able to paint themselves. Most of time, painting is done automatically. However
sometimes you need to do drawing by yourself. Anything else is programmer responsibility
After opening notepad and windows explorer window, diagram will look like this:
Lets shuts off the windows explorer, the repaint event is sent to desktop first and then to myApp. The figure
shown below describes the situation after desktop repaint event get executed. Here you can clearly see that
only desktop repaints itself and window explorer remaining part is still opened in front of myApp.
The following figure shows the situation when myApp’s JPanel calls its repaint method. Notice that some
portion of window explorer is still remains in front of JButton because yet not repaint event is sent to it.
Next, JPanel forwards repaint event to JButton that causes the button to be displayed in its original form.
This is all done automatically and we cannot feel this process cause of stunning speed of modern computers
that performs all these steps in flash of eye.
Painting a Swing Component
Three methods are at the heart of painting a swing component like JPanel etc. For instance, paint() gets
called when it's time to render -- then Swing further factors the paint() call into three separate methods,
which are invoked in the following order:
— protected void paintComponent(Graphics g)
— protected void paintBorder(Graphics g)
— protected void paintChildren(Graphics g)
The figure above illustrates the order in which each component that inherits from
JComponent paint itself. Figure 1 to 2 --painting the background and performing custom painting is
performed by the paintComponent method
In Figure 3 – paintBorder is get called And finally in figure 4 – paintChildern is called that causes the
JButton to render itself. Note: The important thing to note here is for JButton (since it is a JComponent), all
these
methods are also called in the same order.
Your Painting Strategy
You must follow the three steps in order to perform painting.
Subclass JPanel
– class MyPanel extends JPanel
– Doing so MyPanel also becomes a JPanle due to inheritance
Override the paintComponent(Graphics g) method
– Inside method using graphics object, do whatever drawing you want to do
Install that JPanel inside a JFrame
– When frame becomes visible through the paintChildren() method your panel become visible
– To become visible your panel will call paintComponent() method which will do your custom
drawing
Example Code 18.1:
Suppose, we want to draw one circle & rectangle and a string “Hello World”.
The first step is building a class that inherits from JPanel. The following class MyPanel is fulfilling this
requirement. paintComponent( ) method is also override in this class. The sample code is given below
The Test class that contains the main method as well uses MyPainel (previously built) class is given below
c.setLayout(new BorderLayout());
// instantiating reference
p = new MyPanel();
// adding MyPanel into container
c.add(p);
f.setSize(400,400);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} // end constructor
// main method
public static void main(String args[ ]){
Test t = new Test();
}
Note: Here we have used only some methods (drawRect( ) & fillOval( ) etc. ) of Graphics class. For a
complete list, see the Java API documentation
Lesson 19
How to Animate?
If we want to animate something like ball, moving from one place to another, we constantly need to call
paintComponent( ) method and to draw the shape (ball etc.) at new place means at new coordinates.
Painting is managed by system, so calling paintComponent() directly is not recommended at all. Similarly
calling paint( ) method is also not recommended. Why? Because such code may be invoked at times when
it is not appropriate to paint -- for instance, before the component is visible or has access to a valid
Graphics object.
Java gives us a solution in the from of repaint( ) method. Whenever we need to repaint, we call this method
that in fact makes a call to paint( ) method at appropriate time.
Problem & Solution
What to do to move the shapes present in example code 18.1 (last example) when a mouse is
dragged
First time painting is what we already have done
When a mouse is clicked find the co-ordinates of that place and paint Rectangle at that place by
requesting, using repaint() call
Here instead of Hard-coding the position of co-ordinates uses some variables. For example mx, my
– In the last example code, we draw a rectangle by passing hard-coded values like 20
g.drawRect(20,20,20,20);
– Now, we’ll use variables so that change in a variable value causes to display a rectangle at a
new location
g.drawRect(mx,my,20,20;
Similarly, you have seen a tennis game (during lecture). Now, what to do code the paddle
movement.
In the coming up example. We are doing it using mouse, try it using mouse.
// erasing behaviour – this will clear all the// previous painting super.paintComponent(g);
// Down casting Graphics object to Graphics2D
Graphics2D g2 = (Graphics2D)g;
// changing the color to blue
g2.setColor(Color.blue);
// drawing filled oval with color i.e. blue// using instance variablesg2.fillRect(mX,mY,20,20);
}// end paintComponent
The Test class is given below. Additionally this class also contains the code for handling mouse events.
f = new JFrame();
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
// instantiating reference
p = new MyPanel();
// adding MyPanel into container
c.add(p);
f.setSize(400,400);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
The Test class is given below. Additionally this class also contains the code for handling mouse events.
// importing required packagesimport javax.swing.*;import
java.awt.*;Import java.awt.event.*;
public class AnimTest implements ActionListener {
JFrame f;
MyPanel p;
p = new MyPanel();
c.add(p);
f.setSize(400,400);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
if (f.getHeight()-40 == p.mY)
y = -3;
// if ball reached to min. of width of frame,
// change the X-direction of ball
if (p.mX == 0 )
x = 5;
// if ball reached to min. of height of frame,
// change the Y-direction of ball
© Copyright Virtual University of Pakistan
147
Web Design & Development – CS506 VU
if (p.mY == 0 )
y = 3;
// Assign x,y direction to MyPanel’s mX & mY
p.mX += x;
p.mY += y;
// call to repaint() method so that ball is drawn on// new locations
p.repaint();
} // end actionPerformed() method
// main method
public static void main(String args[ ]){
References:
Java, A Lab Course by Umair Javed
Painting in AWT & Swing
http://java.sun.com/products/jfc/tsc/articles/painting/index.html
Lesson 20
Applets
A small program written in Java and included in a HTML page.
It is independent of the operating system on which it runs
An applet is a Panel that allows interaction with a Java program
A applet is typically embedded in a Web page and can be run from a browser
You need special HTML in the Web page to tell the browser about the applet
For security reasons, applets run in a sandbox: they have no access to the client’s file system
Applets Support
Most modern browsers support Java 1.4 if they have the appropriate plugin
Sun provides an application appletviewerto view applets without using browser.
In general you should try to write applets that can be run with any browser
|
+----java.awt.Container|+----java.awt.Panel
|
+----java.applet.Applet|+----javax.swing.JApplet
// write code here u want to display & draw by using// Graphics objectg.drawString(“Hello
World”, 30 , 30);
} } // end class
After defining the HelloApplet.java, the next step is to write .html file. Below is the source code of
Test.html file. The Test.html contains the ordinary html code except one.
<html>
<head>
<title> Simple Applet
</title>
</head>
<body>
<!-- providing the class name of applet with
width &height--!>
<applet code="HelloApplet.class”
width=150 height=100>
</applet>
</body>
</html>
The applet’s life cycle methods are called in the specific order shown below. Not every applet needs to
override every one of these methods.
Let’s take a look on each method in detail and find out what they do
init( )
Is called only once.
The purpose of init( ) is to initialize the applet each time it's loaded (or reloaded).
You can think of it as a constructor
start( )
To start the applet's execution
For example, when the applet's loaded or when the user revisits a page that contains the applet
start( ) is also called whenever the browser is maximized
paint( )
paint( ) is called for the first time when the applet becomes visible
Whenever applet needs to be repainted, paint( ) is called again
Do all your painting in paint( ), or in a method that is called from paint( )
stop( )
To stop the applet's execution, such as when the user leaves the applet's page or quits the browser.
stop( ) is also called whenever the browser is minimized
destroy( )
Is called only once.
To perform a final cleanup in preparation for unloading
Design Process
The Program in a single call of paint method
Draws string “java” on 40 random locations
For every drawing, it selects random font out of 4 different fonts
© Copyright Virtual University of Pakistan
152
Web Design & Development – CS506 VU
For every drawing, it selects random color out of 256 * 256 * 256 RGB colors
Repaint is called after every 1000 ms.
After 10 calls to repaint, screen is cleared
int i = (int)( Math.random() * 5 );// will generate random numbers between 0 & 4.
Program’s Modules
The program is build using many custom methods. Let’s discuss each of them one by one that will help in
understanding the overall logic of the program.
. drawJava( )
As name indicates, this method will be used to write String “java” on random locations. The code is
given below:
// method drawJava
public void drawJava(Graphics2D g2) {
// generate first number randomly. The panel width is 1000int x = (int) (Math.random() * 1000); //
generate second number randomly. The panel height is 700
int y = (int) (Math.random() * 700); // draw String on these randomly
selected numebrsg2.drawString("java", x, y); }
. chooseColor( )
This method will choose color randomly out of 256 * 256 * 256 possible colors. The code snippet is given
below:
// method chooseColor
public Color chooseColor() {
// choosing red color value randomly
// printing 40 “java” strings on different locations by// selcting random font & colorfor (int i = 1; i
<= 40; i++) {
// choosing random color by calling chooseColor() method
Color c = chooseColor();
// setting color
g2.setColor(c);
Merging Pieces
By inserting all method inside JavaAnim.java class, the program will look like one given below. Notice that
it contains methods discussed above with some extra code with which you are already familiar.
// File JavaAnim.java
//step 1: importing required packages
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JavaAnim extends JApplet implements ActionListener {
// used to count how many times paint is called
int clearCounter;
// declaring Timer reference
Timer t;
© Copyright Virtual University of Pakistan
154
Web Design & Development – CS506 VU
}
for (int i = 1; i <= 40; i++) {
Color c = chooseColor();
g2.setColor(c);
Font f = chooseFont();
g2.setFont(f);
drawJava(g2); }
}
// overriding actionPerformed()of ActionListener interface// called by Timer object
public void actionPerformed(ActionEvent ae) {
repaint();
}
// chooseColor method – discussed above
public Color chooseColor() {
int r = (int) (Math.random() * 255);
int g = (int) (Math.random() * 255);
int b = (int) (Math.random() * 255);
g2.drawString("java", x, y);
© Copyright Virtual University of Pakistan
155
Web Design & Development – CS506 VU
}
} // end class
The AnimTest.html file is using this applet. The code snippet of it given below:
<html>
<head>
<title> Animated Java Word </title>
</head>
<body>
<applet code="JavaAnim.class" width=1000 height=700> </applet>
</body> </html>
Compile & Execute
You can execute it directly using browser or by using appletviewer application. For having fun, you can use
“your name” instead of “java” and watch it in different colors ☺
References:
. Java, A Lab Course by Umair Javed
. Writing Applets
. http://java.sun.com/docs/books/tutorial/applet/
Lesson 21
Socket Programming
Socket
A socket is one endpoint of a two-way communication link between two programs running
generally on a network.
A socket is a bi-directional communication channel between hosts. A computer on a network often
termed as host.
Socket Dynamics
As you have already worked with files, you know that file is an abstraction of your hard drive.
Similarly you can think of a socket as an abstraction of the network.
Each end has input stream (to send data) and output stream (to receive data) wired up to the other
host.
You store and retrieve data through files from hard drive, without knowing the actual dynamics of
the hard drive. Similarly you send and receive data to and from network through socket, without
actually going into underlying mechanics.
You read and write data from/to a file using streams. To read and write data to socket, you will also
use streams.
What is Port?
It is a transport address to which processes can listen for connections request.
There are different protocols available to communicate such as TCP and UDP. We will use TCP
for programming in this handout.
There are 64k ports available for TCP sockets and 64k ports available for UDP, so at least
theoretically we can open 128k simultaneous connections.
There are well-known ports which are
o below 1024
o provides standard services
o Some well-known ports are:
-FTP works on port 21
-HTTP works on port 80 -TELNET works on port 23 etc.
. As soon as client creates a socket that socket attempts to connect to the specified server.
. The server listens through a special kind of socket, which is named as server socket.
. The sole purpose of the server socket is to listen for incoming request; it is not used for
communication.
. If every thing goes well, the server accepts the connection. Upon acceptance, the server gets a new
socket, a communication socket, bound to a different port number.
. The server needs a new socket (and consequently a different port number) so that it can continue to
listen through the original server socket for connection requests while tending to the needs of the
connected client. This scheme is helpful when two or more clients try to connect to a server
simultaneously (a very common scenario).
The scheme is very similar to our home address and then phone number.
3. Get I/O Streams of Socket
Get input & output streams connected to your socket
. For reading data from socket As stated above, a socket has input stream attached to it.
InputStream is = s.getInputStream();
// now to convert byte oriented stream into character oriented buffered reader // we use intermediary
stream that helps in achieving above stated purpose
InputStreamReader isr= new InputStreamReader(is); BufferedReader br = new BufferedReader(isr);
. For writing data to socket
A socket has also output stream attached to it. Therefore,
OutputStream os = s.getOutputStream();
// now to convert byte oriented stream into character oriented print writer
// here we will not use any intermediary stream because PrintWriter constructor // directly accepts
an object of OutputStream
PrintWriter pw = new PrintWriter(os, true);
© Copyright Virtual University of Pakistan
158
Web Design & Development – CS506 VU
Here notice that true is also passed to so that output buffer will flush.
4. Send / Receive Message
Once you have the streams, sending or receiving messages isn’t a big task. It’s very much similar to the
way you did with files
. To send messages
pw.println(“hello world”);
. To read messages
String recMsg = br.readLine();
5. Close Socket
Don’t forget to close the socket, when you finished your work
s.close();
Steps – To Make a Simple Server
To make a server, process can be split into 7 steps. Most of these are similar to steps used in making a
client. These are:
1. Import required package
You need the similar set of packages you have used in making of client
. java.net.*;
. java.io.*;
EchoClient.java
The code of the client is given below
PrintWriter(os,true);
// step 4: Send / Receive message
// asking use to enter his/her name
String msg = JOptionPane.showInputDialog("Enter your name");
// sending name to server
pw.println(msg);
// reading message (name appended with hello) from// servermsg = br.readLine();
// displaying received messageJOptionPane.showMessageDialog(null , msg);
// closing communication sockets.close();
}catch(Exception ex){ System.out.println(ex); } } }
// end class
Now, open another command prompt window and run EchoClient.java from it. Look at EchoServer
window; you’ll see the message of “request received”. Sooner, the EchoClient program will ask you to
enter name in input dialog box. After entering name press ok button, with in no time, a message dialog box
will pop up containing your name with appended “hello” from server. This whole process is illustrated
below in pictorial form:
Notice that server is still running, you can run again EchoClient.java as many times untill server is running.
To have more fun, run the server on a different computer and client on a different. But before doing that
find the IP of the computer machine on which your EchoServer will eventually run. Replace “localhost”
with the new IP and start conversion over network ☺
References
Entire material for this handout is taken from the book JAVA A Lab Course by Umair Javed. This
material is available just for the use of VU students of the course Web Design and Development and not for
any other commercial purpose without the consent of author.
Lesson 22
Serialization
What?
. You want to send an object to a stream.
Motivation
A lot of code involves boring conversion from a file to memory
As you might recall that AddressBook program reads data from file and then parses it
This is a common problem
Revisiting AddressBook
We read record from a text file named persons.txt. The person record was present in the file in the
following format.
persons.txt
The code that was used to construct Person objects after reading information from the file is given below.
Here only the part of code is shown, for complete listing, see AddressBook code in your earlier handout.
FileReader fr = new FileReader("persons.txt");BufferedReader br = new
BufferedReader(fr);
String line = br.readLine();
while ( line != null ) {
tokens = line.split(",");
name = tokens[0];
add = tokens[1];
ph = tokens[2];
PersonInfo p = new PersonInfo(name, add, ph); // you can add p into arraylist, if
needed line = br.readLine();
}
As you have seen a lot of parsing code is required for converting a line into PersonInfo objects.
Serialization mechanism eases developer’s life by achieving all above in a very simple way.
Serialization in Java
Java provides an extensive support for serialization
Object knows how to read or write themselves to streams
Problem:
As you know, objects get created on heap and have some values therefore Objects have some state
in memory
You need to save and restore that state.
The good news is that java serialization takes care of it automatically
Serializable Interface
By implementing this interface a class declares that it is willing to be read/written by automatic
serialization machinery
Found in java.iopackage
Tagging interface – has no methods and serves only to identify the semantics of being serializable
Automatic Writing
System knows how to recursively write out the state of an object to stream
If an object has the reference of another object, the java serialization mechanism takes care of it
and writes it too.
Automatic Reading
System knows how to read the data from Stream and re-create object in memory
The recreated object is of type “Object” therefore Down-casting is required to convert it into actual
type.
PersonInfo.java
import javax.swing.*;
import java.io.*
class PersonInfo implements Serializable{
String name;
String address;
String phoneNum;
}
//method for displaying person record on GUIpublic void printPersonInfo( ) {
JOptionPane.showMessageDialog(null ,
“name: ” + name + “address:” +address +
“phone no:” + phoneNum);
}
} // end class
WriteEx.java
The following class will serialize PersonInfo object to a file
import java.io*;
public class WriteEx{
public static void main(String args[ ]){
PersonInfo pWrite =new PersonInfo("ali", "defence", "9201211");
try {
// attaching FileOutput stream with “ali.dat”
FileOutputStream fos =new FileOutputStream("ali.dat");
// attaching ObjectOutput stream over FileOutput// stream
ObjectOutputStream out =new ObjectOutputStream(fos);
//serialization
ReadEx.java
The following class will read serialized object of PersonInfo from file i.e “ali.data”
import java.io*; public class ReadEx{ public
static void main(String args[ ]){ try { //
attaching FileInput stream with “ali.dat”
FileInputStream fin = new FileInputStream("ali.dat");
// attaching FileInput stream over ObjectInput stream
ObjectInputStream in = new ObjectInputStream(fis);
//de-serialization
// reading object from ‘ali.dat’
communication socket
Socket s = new Socket(“localhost”, 2222);
// Get I/O streams
OutputStream is = s.getOutputStream();
// attaching ObjectOutput stream over Input stream
ObjectOutputStream oos= new ObjectOutputStream(is);
// writing object to network
oos.write(p);
// closing communication socket
s.close();
}catch(Exception ex){
System.out.println(ex);
}
} }// end class
Reading Objects over Network
The following class ServerReadNetEx.java will read an object of PersonInfo sent by client.
import java.net.*;import java.io.*;import
javax.swing.*;
public class ServerReadNetEx{
public static void main(String rgs[])
{
try
{
// create a server socket
ServerSocket ss = new ServerSocket(2222);
System.out.println("Server started...");
/* Loop back to the accept method of the serversocket and wait for a new connection request.
Soserver will continuously listen for requests
*/
while(true) {
// wait for incoming connection
Socket s = ss.accept();
System.out.println("connection request recieved");
// Get I/O streams
InputStream is = s.getInputStream();
// attaching ObjectOutput stream over Input stream
ObjectInputStream ois = new ObjectInputStream(is);
// read PersonInfo object from network
PersonInfo p = (PersonInfo)ois.read( );
p.printPersonInfo();
// closing communication socket
s.close();
} // end while
}catch(Exception ex){ System.out.println(ex); } } } // end class
Preventing Serialization
Often there is no need to serialize sockets, streams & DB connections etc because they do no
represent the state of object, rather connections to external resources
© Copyright Virtual University of Pakistan
166
Web Design & Development – CS506 VU
To do so, transient keyword is used to mark a field that should not be serialized
So we can mark them as,
o transient Socket s;
o transient OutputStream os;
o transient Connecction con;
Transient fields are returned as nullon reading
References
Entire material for this handout is taken from the book JAVA A Lab Course by Umair Javed. This
material is available just for the use of VU students of the course Web Design and Development and not for
any other commercial purpose without the consent of author.
Lesson 23
Multithreading
Introduction
Multithreading is the ability to do multiple things at once with in the same application. It provides finer
granularity of concurrency. A thread — sometimes called an execution context or a lightweight process —
is a single sequential flow of control within a program.
Threads are light weight as compared to processes because they take fewer resources then a process. A
thread is easy to create and destroy. Threads share the same address space
i.e. multiple threads can share the memory variables directly, and therefore may require more complex
synchronization logic to avoid deadlocks and starvation.
// File ThreeLoopTest.java
public class ThreeLoopTest {
public static void main (String args[ ]) {
//first loop
for (int i=1; i<= 5; i++)System.out.println(“first ” +i);
// second loop
for (int j=1; j<= 5; j++)System.out.println(“second ” + j);
// third loop
for (int k=1; k<= 5; k++)System.out.println(“third ” + k);
} // end main} // end class
Note: Each loop has 10 iterations in the ThreadTest program. Your output can be different from
the one given above.
Notice the difference between the outputs of the two programs. In ThreeLoopTest each loop generated a
sequential output while in ThreadTest the output of the loops got intermingled i.e. concurrency took place
and loops executed simultaneously
Let us code our first multithreaded program and try to learn how Java supports multithreading.
Java includes built-in support for threading. While other languages have threads bolted-on to an existing
structure. i.e. threads were not the part of the original language but latter came into existence as the need
arose.
All well known operating systems these days support multithreading. JVM transparently maps Java
Threads to their counter-parts in the operating system i.e. OS Threads. JVM allows threads in Java to take
advantage of hardware and operating system level advancements. It keeps track of threads and schedules
them to get CPU time. Scheduling may be pre-emptive or cooperative. So it is the job of JVM to manage
different tasks of thread. Let’s see how we can create threads?
}
} // end class
// File ThreadTest.java
public class ThreadTest{
public static void main (String args[ ]){
//instantiate three objects
Worker first = new Worker (“first job”);
Worker second = new Worker (“second job”);
Worker third = new Worker (“third job”);
Then the second thread is given a chance to run, and so on, until the interpreter exits. Consider the
following figure in which threads of various priorities are represented by capital alphabets A, B, …, K. A
and B have same priority (highest in this case). J and K have same priority (lowest in this case). JVM start
executing with A and B, and divides CPU time between these two threads arbitrarily. When both A and B
comes to an end, it chooses the next thread C to execute.
(Thread.MIN_PRIORITY);
t2.setPriority (Thread.MAX_PRIORITY);
Output
References:
Lesson 24
More on Multithreading
In this handout, we’ll cover different aspects of multithreading. Some examples are given to make you
understand the topic of multithreading. First we will start with an example that reads data from two text
files simultaneously.
Example Code: Reading Two Files Simultaneously
The task is to read data from file “first.txt” & “second.txt” simultaneously. Suppose that files contains the
following data as shown below
first.txt
second.txt
Following is the code for ReadFile.java that implements Runable interface. The file reading code will be
written inside the run( ) method.
// File ReadFile.java
import java.io.*;
public class ReadFile implements Runnable{
//attribute used for name of file
String fileName;
// param constructor
public ReadFile(String fn){
fileName = fn;
}
// overriding run method// this method contains the code for file reading
public void run ( ){
try
{ // connecting FileReader with attribute fileNameFileReader fr = new
FileReader(fileName);BufferedReader br = new BufferedReader(fr);
String line = "";
// reading line by line data from file// and displaying it on console
line = br.readLine();
while(line != null) {
System.out.println(line);
line = br.readLine();
}
fr.close();
br.close();
}
}
Output
On executing Test class, following kind output would be generated:
job = j;
}
// starting thread
t1.start();
t2.start();
}
} // end class
Output
On executing SleepEx.java, the output will be produced with exact alternations between first thread &
second thread. On starting threads, first thread will go to sleep for 100 ms. It gives a chance to second
thread to execute. Later this thread will also go to sleep for 100 ms. In the mean time the first thread will
come out of sleep and got a chance on processor. It will print job on console and again enters into sleep
state and this cycle goes on until both threads finished the run() method
Before jumping on to example code, lets reveal another aspect about main() method. When you run a Java
program, the VM creates a new thread and then sends the main(String[] args) message to the class to be
run! Therefore, there is always at least one running thread in existence. However, we can create more
© Copyright Virtual University of Pakistan
177
Web Design & Development – CS506 VU
threads which can run concurrently with the existing default thread.
sleep() method can be used for delay purpose. This is demonstrated in the DelayEx.java given below
// File DelayEx.java public class DelayEx { public static void
main (String args[ ]){ System.out.println(“main thread going
to sleep”);
try {
// the main thread will go to sleep causing delay
Thread.sleep(100);
}catch (Exception ex){
System.out.println(ex);
}
. yield( ) method
-Allows any other threads of the same priority to execute (moves itself to the end of the priority queue)
-If all waiting threads have a lower priority, then the yielding thread resumes execution on the
CPU
-Generally used in cooperative scheduling schemes
Example Code: Demonstrating yield ( ) usage
Below the modified code of Worker.javais given
// File Worker.javapublic class Worker implements
Runnable { private String job ;
//Constructor of Worker class
public Worker (String j ){
job = j;
}
Thread.yield( );
System.out.println(job + " = " + i);
} // end for
} // end run
} // end class // File YieldEx.java
public class YieldEx {
public static void main (String args[ ]){
// Creating Worker objects
Worker first = new Worker (“first job”);
Worker second = new Worker (“second job”);
// starting thread
t1.start();
t2.start();
}
} // end class
Output
Since both threads have the same priority (until we change the priority of some thread explicitly). Therefore
both threads will execute on alternate basis. This can be confirmed from the output given below:
A thread can be in different states during its lifecycle as shown in the figure.
Thread’s Joining
-Used when a thread wants to wait for another thread to complete its run( ) method
-For example, if thread2 sent the thread2.join() message, it causes the currently executing thread to block
efficiently until thread2 finishes its run() method
-Calling join method can throw InterruptedException, so you must use try-catch block to handle it
Example Code: Demonstrating join( ) usage
Below the modified code of Worker.java is given. It only prints the job of the worker
// File Worker.java
public class Worker implements Runnable { private String job ; public Worker (String j ){
job = j;} public void run ( ) {for(int i=1; i<= 10; i++) {
System.out.println(job + " = " + i); } // end for} // end run} // end
class
The class JoinEx will demonstrate how current running (main) blocks until the remaining threads finished
their run( )
// File JoinEx.java
public class JoinEx { public static void main (String args[ ]){
Worker first = new Worker ("first job");Worker second = new Worker ("second
job");
Thread t1 = new Thread (first );
© Copyright Virtual University of Pakistan
180
Web Design & Development – CS506 VU
System.out.println("Starting...");
// starting threads
t1.start();
t2.start();
// The current running thread (main) blocks until both //workers have finished
try {
t1.join();
t2.join();
Output
On executing JoinEx, notice that “Starting” is printed first followed by printing workers jobs. Since main
thread do not finish until both threads have finished their run( ). Therefore “All done” will be print on last.
References:
Lesson 25
Web Application Development
Introduction
Because of the wide spread use of internet, web based applications are becoming vital part of IT
infrastructure of large organizations. For example web based employee performance management systems
are used by organizations for weekly or monthly reviews of employees. On the other hand online course
registration and examination systems can allow students to study while staying at their homes.
Web Applications
In general a web application is a piece of code running at the server which facilitates a remote user
connected to web server through HTTP protocol. HTTP protocol follows stateless Request-Response
communication model. Client (usually a web-browser) sends
-Request Method: It tells the server the type of action that a client wants to perform
-URI: Uniform Resource Indictor specifies the address of required document or resource
-Header Fields: Optional headers can be used by client to tell server extra
Request Parameters
• 200-299
Values in the 200s signify that the request was successful.
200: Means every thing is fine.
• 300-399
Values in the 300s are used for files that have moved and usually include a Location header
indicating the new address.
300: Document requested can be found several places; they'll be listed in the returned
document.
• 400-499
Values in the 400s indicate an error by the client.
404: Indicates that the requested resource is not available.
401: Indicates that the request requires HTTP authentication.
403: Indicates that access to the requested resource has been denied.
• 500-599
Codes in the 500s signify an error by the server.
503: Indicates that the HTTP server is temporarily overloaded and unable to handle the
request.
Figure
5:
Static
web
page
request
and
response
The Web page is derived from data that changes frequently. e.g. a weather report or news headlines page.
The Web page uses information from databases or other server-side resources.
e.g. an e-commerce site could use a servlet to build a Web page that lists the current price and
availability of each item that is for sale.
-Using technologies for developing web pages that include dynamic content.
-Developing web based applications which can produce web pages that contain information that is
connection-dependent or time-dependent.
Dynamic web content development technologies have evolved through time in speed, security, ease of use
and complexity. Initially C based CGI programs were on the server Then template based technologies like
ASP and PHP were then introduced which allowed ease of use for designing complex web pages. Sun Java
introduced Servlets and JSP that provided more speed and security as well as better tools for web page
creation.
Normally web applications are partitioned into logical layers. Each layer performs a specific functionality
which should not be mixed with other layers. Layers are isolated from each other to reduce coupling
between them but they provide interfaces to communicate with each other.
-Presentation Layer:
Provides a user interface for client to interact with application. This is the only part of application
visible to client.
-Business Layer
The business or service layer implements the actual business logic or functionality of the application.
For example in case of online shopping systems this layer handles transaction management.
-Data Layer
This layer consists of objects that represent real-world business objects such as an Order,
OrderLineItem, Product, and so on.
There are several Java technologies available for web application development which includes Java
Servlets, JavaServer Pages, JavaServer Faces etc.
References:
Java, A Practical Guide by Umair Javed
Java tutorial by Sun: http://java.sun.com/docs/books/tutorial/
Lesson 26
Java Servlets
Servlets are java technology’s answer to CGI programming. CGI was widely used for generating dynamic
content before Servlets arrived. They were programs written mostly in C,C++ that run on a web server and
used to build web pages.
As you can see in the figure below, a client sends a request to web server, server forwards that request to a
servlet, servlet generates dynamic content, mostly in the form of HTML pages, and returns it back to the
server, which sends it back to the client. Hence we can say that servlet is extending the functionality of the
webserver (The job of the earlier servers was to respond only to request, by may be sending the required
html file back to the client, and generally no processing was performed on the server)
Convenient
Servlets can use the whole java API e.g. JDBC. So if you already know java, why learn Perl or C.
Servlets have an extensive infrastructure for automatically parsing and decoding HTML form data,
reading and sending HTTP headers, handling cookies and tracking session etc and many more utilities
Efficient
With traditional CGI, a new process is started for each request while with servlets each request is handled
by a lightweight java thread, not a heavy weight operating system process. (more on this later)
Powerful
Java servlets let you easily do several things that are difficult or impossible with regular CGI. For example,
servlets can also share data among each other
Portable
Since java is portable and servlets is a java based technology therefore they are generally portable across
web servers
Inexpensive
There are numbers of free or inexpensive web servers available that are good for personal use or low
volume web sites. For example Apache is a commercial grade webserver that is absolutely free. However
© Copyright Virtual University of Pakistan
189
Web Design & Development – CS506 VU
some very high end web and application servers are quite expensive e.g BEA weblogic. We’ll also use
Apache in this course
Software Requirements
To use java servlets will be needed
J2SE
Additional J2EE based libraries for servlets such as servlet-api.jar and jsp-api.jar. Since these
libraries are not part of J2SE, you can download these APIs separately. However these APIs are
also available with the web server you’ll be using.
A capable servlet web engine (webserver)
Jakarta is an Apache project and tomcat is one of its subprojects. Apache Tomcat is an open source web
server, which is used as an official reference implementation of Java Servlets and Java Server Pages
technologies.
Tomcat is developed in an open and participatory environment and released under the Apache software
license
Environment Setup
To work with servlets and JSP technologies, you first need to set up the environment. Tomcat installation
can be performed in two different ways (a) using .zip file (b) using .exe file. This setup process is broken
down into the following steps:
Note: J2SE 5.0 must be installed prior to use the 5.5.9 version of tomcat.
2. Installing Tomcat using .zip file
-Unzip the file into a location (e.g. C:\). (Rightclick on the zip file and select unziphere option )
-When the zip file will unzipped a directory structure will be created on your computer such as:
JAVA_HOME indicates the root directory of your jdk. Set the JAVA_HOME environment
variable to tell Tomcat, where to find java
This variable should list the base JDK installation directory, not the bin subdirectory
To set it, right click on My Computer icon. Select the advanced tab, a System Properties window
will appear in front of you like shown below. Select the Environment Variables button to proceed.
On clicking Environment Variable button, the Environment Variables window will open as shown
next
Create a new User variable by clicking New button as shown above, the New User Variable
window will appear
Set name of variable JAVA_HOME
The value is the installation directory of JDK (for example C:\ProgramFiles\j2sdk_nb\j2sdk1.4.2).
This is shown below in the picture. Please note that bin folder is not included in the path.
Press Ok button to finish
Note: To run Tomcat (web server) you need to set only the two environment variables and
these are JAVA_HOME & CATALINA_HOME
• C:\jakarta-tomcat-5.5.9\common\lib\servlet-api.jar
• C:\jakarta-tomcat-5.5.9\common\lib\jsp-api.jar
• Both these api’s are specified as values with semicolon between them. Remember to add
semicolon dot semicolon (;.;) at the end too. For example
Classpath = C:\jakarta-tomcat-5.5.9\common\lib\servlet-api.jar;C:\jakarta-tomcat
5.5.9\common\lib\jsp-api.jar;.;
This is also shown in the figure below
There is another easier way to carry out the environment setup using .exe file. However, it is strongly
recommended that you must complete the environment setup using .zip file to know the essential
fundamentals.
From the http://tomcat.apache.org, download the .exe file for the current release (e.g. jakarta-tomcat-
5.5.9.zip) on your C:\ drive. There are different releases available on site. Select to download Windows
executable (.exe) file from Binary Distributions Core section.
Note: J2SE 5.0 must be installed to use the 5.5.9 version of tomcat.
-Choose the folder in which you want to install Apache Tomcat and press Next to proceed.
-The configuration window will be opened. Leave the port unchanged (since by default web servers run on
port 8080, you can change it if you really want to). Specify the user name & password in the specified
fields and press Next button to move forward. This is also shown in the diagram coming next:
-The setup will automatically select the Java Virtual Machine path. Click Install button to move ahead.
-Finish the setup with the Run Apache Tomcat option selected. It will cause the tomcat server to run in
quick launch bar as shown in diagram below. The Apache Tomcat shortcuts will also added to
Programs menu.
-Double clicking on this button will open up Apache Tomcat Properties window. From here you can start
or stop your web server. You can also configure many options if you want to. This properties window
is shown below:
Note: If default page doesn’t displayed, open up an internet explorer window, move on to Tools Æ
Internet Options Æ Connections LAN Settings. Make sure that option of “Bypass proxy server for
local addresses” is unchecked.
References:
. Java, A Lab Course by Umair Javed
. Java Servlet & JSP tutotrial http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/
Lesson 27
Creating a Simple
Web Application in Tomcat
In this handout, we’ll discuss the standard tomcat directory structure, a pre-requisite for building any web
application. Different nuts and bolts of Servlets will also be discussed. In the later part of this handout,
we’ll also learn how to make a simple web application using servlet.
Pack
o Known as Web Archive (WAR) file
o Mostly used to deploy web applications
The webapps folder is the top-level Tomcat directory that contains all the web applications deployed on the
server. Each application is deployed in a separate folder often referred as “context”.
To make a new application e.g myapp in tomcat you need a specific folder hierarchy.
-Create a folder named myapp in C:\jakarta-tomcat-5.5.9\webapps folder. This name will also appear
in the URL for your application. For example
http://localhost:8080/myapp/index.html
-All JSP and html files will be kept in main application folder (C:\jakartatomcat-5.5.9\webapps\myapp)
-Create another folder inside myapp folder and change its name to WEB-INF. Remember WEB-INF is
case sensitive and it is not WEB_INF
-Create another folder inside WEB-INF folder and change its name to classes. Remember classes name
is also case sensitive.
-To test application hierarchy, make a simple html file e.g. index.html file. Write some basic HTML code
into it and save it in main application directory i.e.
C:\jakarta-tomcat-5.5.9\webapps\myapp\
-A more detailed view of the Tomcat standard directory structure is given below.
-Here you can see some other folders like lib& tags under the WEB-INF.
-The lib folder is required if you want to use some achieve files (.jar). For example an API in jar format
that can help generating .pdf files.
-Similarly tags folder is helpful for building custom tags or for using .tagfiles.
Note: Restart Tomcat every time you create a new directory structure, a servlet or a java bean so that it
can recognize it. For JSP and html files you don’t have to restart the server.
Writing Servlets
Servlet Types
-Servlet related classes are included in two main packages javax.servletand javax.servlet.http.
-Every servlet must implement the javax.servlet.Servlet interface, it contains the servlet’s life cycle
methods etc. (Life cycle methods will be discussed in next handout)
-In order to write your own servlet, you can subclass from GernericServlet or HttpServlet
GenericServlet class
HttpServlet class
javax.servlet.http
HttpServletRequest & HttpServletRespose are used for processing HTTP protocol specific requests and
generating HTTP specific response. Obviously these classes will be used in conjunction with HttpServet
class, which means you are making a HTTP protocol specific servlet.
HTTP supports different types of request to be sent over to server. Each request has some specific purpose.
The most important ones are get & post. Given below a brief overview of each request type is given. You
can refer to RFC of HTTP for further details.
-GET: Requests a page from the server. This is the normal request used when browsing web pages.
-POST: This request is used to pass information to the server. Its most common use is with HTML forms.
-PUT: Used to put a new web page on a server.
-DELETE: Used to delete a web page from the server.
-OPTIONS: Intended for use with the web server, listing the supported options.
-TRACE: Used to trace servers
Some details on GET and POST HTTP request types are given below.
. GET
-Attribute-Value pair is attached with requested URL after ‘?’.
-For example if attribute is ‘name’ and value is ‘ali’ then the request will be
http://www.gmail.com/register?name=ali
-For HTTP based servlet, override doGet() methods of HttpServlet class to handle these type of
requests.
. POST
-Attribute-Value pair attached within the request body. For your reference HTTP request diagram is
given below again:
To get started we will make a customary “HelloWorldServlet”. Let’s see what are the steps involved in
writing a servlet that will produce “Hello World”
1. Create a directory structure for your application (i.e. helloapp). This is a one time process for any
application
2. Create a HelloWorldServlet source file by extending this class from HttpServlet and overriding
your desired method. For example doGet() or doPost().
3. Compile it (If get error of not having required packages, check your class path)
4. Place the class file of HelloWorldServlet in the classes folder of your web application (i.e. myapp).
Note: If you are using packages then create a complete structure under classes folder
/* overriding doGet() method because writing a URL in the browserby default generate request of
GET type
As you can see, HttpServletRequest andHttpServletResponse are passed to this
method. Theseobjects will help in processing of HTTP request andgenerating
response for HTTP
This method can throw ServletException or IOException, so wemention these exception
types after method signature
*/
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException
{
/* getting output stream i.e PrintWriter from responseobject by calling getWriter
method on it
As mentioned, for generating response, we will
useHttpServletResponse object*/
PrintWriter out = response.getWriter();
/* printing Hello World in the browser using PrintWriter
object. You can also write HTML like
out.println(“<h1> Hello World </h1>”) */
out.println(“Hello World! ”);
} // end doGet()
} // end HelloWorldServlet
Note: It is important to note here that you can specify any name for a servlet inside <servlet-name> tag.
This name is used for referring to servlet in later part of web.xml. You can think of it as your id assigned to
you by your university while you have actually different name (like <servlet-class>).
Next we will define the servlet mapping. By defining servlet mapping we are specifying URL to access a
servlet. <servlet-mapping> tag is used for this purpose.
Inside <servlet-mapping> tag, first you will write the name of the servlet for which you want to specify
the URL mapping using <servlet-name> tag and then you will define the URL pattern using <url-
pattern> tag. Notice the forward slash (/ ) is used before specifying the url. You can specify any name of
URL. The forward slash indicates the root of your application.
<url-pattern> /myfirstservlet </url-pattern>
Now you can access HelloWorldServelt (if it is placed in myapp application) by giving the following url in
the browser
http://localhost:8080/myapp/myfirstservlet
Note: Save this web.xml file by placing double quotes(“web.xml”) around it as you did to save .java files.
Note: By using IDEs like netBeans® 4.1, you don’t have to write web.xml by yourself or even to worry
about creating directory structure and to copy files in appropriate locations. However manually
undergoing this process will strengthen your concepts and will help you to understand the
underlying mechanics☺.
References:
Entire material for this handout is taken from the book JAVA A Lab Course by Umair Javed. This
material is available just for the use of VU students of the course Web Design and Development and not for
any other commercial purpose without the consent of author.
Lesson 28
Servlets Lifecycle
In the last handout, we have seen how to write a simple servlet. In this handout we will look more
specifically on how servlets get created and destroyed. What different set of method are invoked during the
lifecycle of a typical servlet.
The second part consists on reading HTML form data through servlet technology. This will be explored in
detail using code example
As you can conclude from the diagram below, that with the passage of time a servlet passes through these
stages one after another.
1. Initialize
When the servlet is first created, it is in the initialization stage. The webserver invokes he init() method of
the servlet in this stage. It should be noted here that init() is only called once and is not called for each
request. Since there is no constructor available in Servlet so this urges its use for one time initialization
(loading of resources, setting of parameters etc) just as the init() method of applet.
Initialize stage has the following characteristics and usage
Executed once, when the servlet gets loaded for the first time
Not called for each client request
The above two points make it an ideal place to perform the startup tasks which are done in
constructor in a normal class.
2. Service
The service() method is the engine of the servlet, which actually processes the client’s request. On every
request from the client, the server spawns a new thread and calls the service() method as shown in the
figure below. This makes it more efficient as compared to the technologies that use single thread to respond
to requests.
The figure below show both versions of the implementation of service cycle. In the upper part of diagram,
we assume that servlet is made by sub-classing from GenericServlet. (Remember, GenericServlet is used
for constructing protocol independent servlets.). To provide the desired functionality, service() method is
overridden. The client sends a request to the web server; a new thread is created to serve this request
followed by calling the service() method. Finally a response is prepared and sent back to the user according
to the request.
The second part of the figure illustrates a situation in which servlet is made using HttpServlet class. Now,
this servlet can only serves the HTTP type requests. In these servlets doGet() and doPost() are overridden
to provide desired behaviors. When a request is sent to the web server, the web server after creating a
thread, passes on this request to service() method. The service() method checks the HTTP requests type
(GET, POST etc) and calls the doGet() or doPost() method depending on how the request is originally sent.
After forming the response by doGet() or doPost() method, the response is sent back to the service()
method that is finally sent to the user by the web server.
3. Destroy
The web server may decide to remove a previously loaded servlet instance, perhaps because it is explicitly
asked to do so by the server administrator, or perhaps servlet container shuts down or the servlet is idle for
a long time, or may be the server is overloaded. Before it does, however it calls the servlets destroy()
method. This makes it a perfect spot for releasing the acquired resources.
Summary
A Servlet is constructed and initialized. The initialization can be performed inside of init() method.
Servlet services zero or more requests by calling service() method that may decide to call further
methods depending upon the Servlet type (Generic or HTTP specific)
Server shuts down, Servlet is destroyed and garbage is collected
The following figure can help to summarize the life cycle of the Servlet
The web sever creates a servlet instance. After successful creation, the servlet enters into initialization
phase. Here, init() method is invoked for once. In case web server fails in previous two stages, the servlet
instance is unloaded from the server.
After initialization stage, the Servlet becomes available to serve the clients requests and to generate
response accordingly. Finally, the servlet is destroyed and unloaded from web server.
. Form Data
Data, that the user explicitly type into an HTML form. For example: registration information provided
for creating a new email account.
. getParameter(String name)
-Used to retrieve a single form parameter and returns String corresponding to name specified.
-Empty String is returned in the case when user does not enter any thing in the specified form field.
-If the name specified to retrieve the value does not exist, it returns null.
Note: You should only use this method when you are sure that the parameter has only one value. If
the parameter might have more than one value, use getParamterValues().
. getParameterValues(String name)
-Returns an array of Strings objects containing all of the given values of the given request parameter.
-If the name specified does not exist, null is returned
. getParameterNames()
-If you are unsure about the parameter names, this method will be helpful
-It returns Enumeration of String objects containing the names of the parameters that come with the
request.
-If the request has no parameters, the method returns an empty Enumeration.
Note: All these methods discussed above work the same way regardless of the request type(GET or POST).
Also remember that form elements are case sensitive for example, “userName” is not the same as the
“username.”
© Copyright Virtual University of Pakistan
207
Web Design & Development – CS506 VU
Let’s have a look on the HTML code used to construct the above page.
<html>
<head>
<title> Reading Two Parameters </title>
</head>
<body>
<H2> Please fill out this form: </H2>
<FORM METHOD="GET"
ACTION="http://localhost:8084/paramapp/formservlet"NAME="myform" >
<BR> Firstname:
<INPUT TYPE = “text” NAME="firstName">
<BR> Surname:
<INPUT TYPE = “text” NAME="surName">
<BR> <INPUT TYPE="submit" value="Submit Form"> <INPUT TYPE="reset"
value="Reset">
</FORM>
</body>
</html>
Let’s discuss the code of above HTML form. As you can see in the <FORM> tag, the attribute METHODis
set to “GET”. The possible values for this attribute can be GET and POST. Now what do these values
© Copyright Virtual University of Pakistan
208
Web Design & Development – CS506 VU
mean?
Setting the method attribite to “GET” means that we want to send the HTTP request using the GET
method which will evantually activate the doGet() method of the servlet. In the GET method the
information in the input fields entered by the user, merges with the URL as the query string and are
visible to the user.
Setting METHOD value to “POST” hides the entered information from the user as this information
becomes the part of request body and activates doPost() method of the servlet.
Each text field is distinguished on the basis of name assigned to them. Later these names also help in
extracting the values entered into these text fields.
MyServlet.java
Now lets take a look at the servlet code to which HTML form data is submitted.
import java.io.*;import javax.servlet.*;import
javax.servlet.http.*;
public class MyServlet extends HttpServlet{
public void doGet(HttpServletRequest req,
HttpServletResponse res)throws ServletException,
IOException{
// reading first name parameter/textfield
String fName = req.getParameter(“firstName”);
// reading surname parameter/textfield
String sName = req.getParameter(“surName”);
// gettting stream from HttpServletResponse objectPrintWriter out = res.getWriter();
out.println("Hello: " + fName + “ “ +sName ");
out.close();
}
}// end FormServlet
import java.io.*,
import javax.servlet.*;
import javax.servlet.http.*;
These packages are imported to have the access on PrintWriter, HttpServlet, HttpServletRequest,
HttpServletResponse, ServletException and IOException classes.
The class MySevlet extends from HttpServlet to inherit the HTTP specific functionality. If you recall
HTML code (index.html) discussed above, the value of mehtod attribute was set to “GET”. So in this case,
we only need to override doGet()Method.
Entering inside doGet() method brings the crux of the code. These are:
Two String variables fName and sName are declared that receive String values returned by getParameter()
method. As discussed earlier, this method returns Stringcorresponds to the form parameter. Note that the
values of name attributes of input tags used in index.html have same case with the ones passed to
getParameter() methods as parameters. The part of HTML code is reproduced over here again:
In the last part of the code, we get the object of PrintWriter stream from the object of
HttpServletResponse. This object will be used to send data back the response. Using PrintWriter object
(out), the names are printed with appended “Hello” that becomes visible in the browser.
web.xml
<servlet-mapping>
<servlet-name> FormServlet </servlet-name>
<url-pattern> /formservlet </url-pattern>
</servlet-mapping>
</web-app>
The <servlet-mapping> tag contains two tags <servlet-name> and <urlpatteren> containing name and
pattern of the URL respectively. Recall the value of action attribute of the <form> element in the HTML
page. You can see it is exactly the same as mentioned in <url-pattern> tag.
http://localhost:8084/paramapp/formservlet
References:
JAVA a Lab Course by Umair Javed
Java API documentation
Core Servlets and JSP by Marty Hall
Lesson 29
More on Servlets
The objective of this handout is to learn about the use and implementation of initialization parameters for a
Servlet. Moreover different ways of redirecting response and forwarding or including requests also
discussed in detail.
Initialization Parameters
Some times at the time of starting up the application we need to provide some initial information e,g, name
of the file where server can store logging information, DSN for database etc. Initial configuration can be
defined for a Servlet by defining some string parameters in web.xml. This allows a Servlet to have initial
parameters from outside. This is similar to providing command line parameters to a standard console based
application.
Example: setting init parameters in web.xml
Let’s have a look on the way of defining these parameters in web.xml
<init-param> //defining param 1
<param-name> param1 </param-name>
<param-value> value1 </param-value>
</init-param>
<init-param> //defining param 2
<param-name> param2 </param-name>
<param-value> value2 </param-value>
In the above code, it is shown that for each parameter we need to define separate <initparam> tag that have
two sub tags <param-name> and <param-value>, which contain the name and values of the parameter
respectively.
ServletConfig
Every Servlet has an object called ServletConfig associated with it as shown in the fig. below. It contains
relevant information about the Servlet like initialization parameters defined in web.xml
Another way to read initialization parameters out side the init () method is
Call getServletConfig() to obtain the ServletConfig object
Use getInitParameter() of ServletConfig to read initialization parameters
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
super.init(config);
// reading init-parameter “logfilename” stored in web.xmlfileName =
config.getInitParameter("logfilename");
}
/* Both doGet() & doPost() methods are override over here.processRequest() is called from both these
methods. This makespossible for a servlet to handle both POST and GET requestsidentically.
*/
// Handles the HTTP GET request type
protected void doGet(HttpServletRequest request,
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app>
<servlet> <servlet-name> MyServlet </servlet-name> <servlet-class> MyServlet </servlet-class>
<init-param> <param-name> logfilename </param-name> <param-value> logoutput.txt
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name> MyServlet </servlet-name>
</web-app>
Response Redirection
We can redirect the response of the Servlet to another application resource (another Servlet, an HTML
page or a JSP) but the resource (URL) must be available to the calling Servlet, in the same Servlet
context (discussed later).
There are two forms of response redirection that can be possible:
Sending a standard redirect
Sending a redirect to an error page
-SC_NOT_FOUND (404)
-SC_NO_CONTENT (204)
-SC_REQUEST_TIMEOUT (408)
The example given below demonstrates a typical sign on example in which a user is asked to provide
login/password, providing correct information leads to welcome page or otherwise to a registration page.
This example consists of login.html, welcome.html, register.html and MyServlet.java files. Let’s examine
these one after another.
login.html
This page contains two text fields; one for entering username and another for password. The data from this
page is submitted to MyServlet.java.
<html>
<body>
<h2> Please provide login details</h2>
<FROM METHOD="POST"
ACTION="http://localhost:8084/redirectionex/myservlet"NAME="myForm" >
<BR> User Id:
<INPUT TYPE="text" name="userid"/>
<BR> Password:
<INPUT TYPE="password" name="pwd"/>
<BR> <BR>
<input type="submit" value="Submit Form"/>
</form>
</body>
</html>
welcome.html
The user is directed to this page only if user provides correct login / password. This page only displays a
successfully logged-in message to the user.
<html>
<body>
<h2> You have successfully logged in </h2> </body>
</body>
</html>
register.html
The user is redirected to this page in case of providing incorrect login/password information. The user can
enter user id, address and phone number here to register.
Note: The code given below will only show fields to the user. It does not register user as no such
functionality is added into this small example.
<html>
<body>
<h2>Your login is incorrect. Please register yourself</h2>
<FORM METHOD="POST" ACTION="" NAME="myForm">
<BR> Name:
<INPUT TYPE="text" NAME="userid"/>
<BR> Address:
<INPUT TYPE="text" NAME="address"/>
<BR> Phone No:
<INPUT TYPE="text" NAME="phoneno"/>
<BR> <BR>
<input type="submit" value="Register"/>
</form>
</body>
</html>
MyServle.java
MyServlet.java accepts requests from login.html and redirects the user to welcome.html or register.html
based on the verification of username & password provided. Username & password are compared with fix
values in this example, however you can verify these from database or from a text file etc.
import java.io.*;
import java.net.*;
import javax.servlet.*;
© Copyright Virtual University of Pakistan
214
Web Design & Development – CS506 VU
import javax.servlet.http.*;
public class MyServlet extends HttpServlet {
// Handles the HTTP GET request type
protected void doGet(HttpServletRequest request, HttpServletResponse response)throws
ServletException, IOException{
processRequest(request, response);
}
// Handles the HTTP POST request type
protected void doPost(HttpServletRequest request, HttpServletResponse response)throws
ServletException, IOException{
processRequest(request, response);
}
protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws
ServletException, IOException{
String id = request.getParameter("userid");String pwd = request.getParameter("pwd");
// comparing id & password with fix values
if(id.equals("ali") && pwd.equals("vu")) {
// redirectign user to welcome.html
response.sendRedirect("welcome.html");
Note:
There is a single ServletContextper web application
Different Sevlets will get the same ServletContext object, when calling getServletContext()during
different sessions
Request Dispatcher
RequestDispatcher provides a way to forward or include data from another source. The method
© Copyright Virtual University of Pakistan
215
Web Design & Development – CS506 VU
RequestDispatcher: forward
Characteristics of forward methods are:
It allows a Servlet to forward the request to another resource (Servlet, JSP or HTML file) in the
same Servlet context.
Forwarding remains transparent to the client unlike res.sendRedirect(String location). You can not
see the changes in the URL.
Request Object is available to the called resource. In other words, it remains in scope.
Before forwarding request to another source, headers or status codes can be set, but
output content cannot be added.
To clarify the concepts, lets take the help from following figure. User initates the request to servlet1.
servlet1 forwards the request to servlet2 by calling forward(request,response). Finally a response is
returned back to the user by servlet2.
RequestDispatcher: include
It allows a Servlet to include the results of another resource in its response. The two major differences from
forward are:
Data can be written to the response before an include
The first Servlet which receive the request, is the one which finishes the response
It will be more cleared from the following figure. User sends a HTTPRequest to Servlet1. Serlet2 is called
by Servlet1 by using include(request, response) method. The response generated by Servlet2 sends back to
Servlet1. Servlet1 can also add its own response content and finally send it back to user.
References:
Java A Lab Course by Umair Javed
Core Servlets and JSP by Marty Hall
Java API documentation
Lesson 30
Dispatching Requests
In this handout we will start with request dispatching techniques and give some examples related to that.
Further more some methods of HttpResponse and HttpRequestwill also be discussed. Finally, this handout
will be concluded by discussing the importance of session tracking. Before starting, let’s take a look at the
summery of the previous lecture.
Recap
In the previous lecture we had some discussion about Response Redirection and Request Dispatcher. We
said that Response Redirection was used to redirect response of the Servlet to another application resource.
This resource might be another Servlet or any JSP page.
Two forms of Response redirection were discussed. These were:
. Sending a standard request:
Using response.sendRedirect(“path of resource”) method, a new request is generated which
redirects the user to the given URL. If the URL is of another servlet, that second servlet will not be
able to access the original request object.
. Redirection to an error page:
An error code is passed as a parameter along with message to response.sendError(int, msg)
method. This method redirects the user to the particular error page in case of occurrence of
specified error.
Similarly request dispatching provides us the facility to forward the request processing to another servlet,
or to include the output of another resource (servlet, JSP or HTML etc) in the response. Unlike Response
Redirection, request object of calling resource is available to called resource. The two ways of Request
Dispatching are:
. Forward:
Forwards the responsibility of request processing to another resource.
. Include:
Allows a servlet to include the results of another resource in its response. So unlike forward, the
first servlet to receive the request is the one which finishes the response.
Lets start with the example of include. We will see how a Servlet includes the output of another resource in
its response. The following example includes a calling Servlet MyServlet and Servlet IncludeServlet,
who’s output will be included in the calling Servlet.
The code of MyServlet.java servlet is given below.
MyServlet.java
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
Include Servlet
Now lets take a look at the code of IncludeServlet.java
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class IncludeServlet extends HttpServlet {
// this method is being called by both doGet() and doPost()
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
© Copyright Virtual University of Pakistan
219
Web Design & Development – CS506 VU
<h2> Salary</h2>
<INPUT TYPE="text" name="salary"/>
<BR/><BR/>
<INPUT type="submit" value="Submit"/>
</form>
</html>
FirstServlet.java
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class FirstServlet extends HttpServlet {
// this method is being called by both doGet() and doPost()
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
sthrows ServletException, IOException {
// getting value of salary text filed of the HTML form
String salary = request.getParameter("salary");
// converting it to the integer.
int sal = Integer.parseInt(salary);
// calculating 15% tax
int tax = (int)(sal * 0.15);
// converting tax into string
String taxValue = tax + "";
// request object can store values in key-value form, later it
// can be retrieved by using getAttribute() method
request.setAttribute("tax", taxValue);
// getting object of servletContext
ServletContext sContext = getServletContext();
// getting object of request dispatcher
RequestDispatcher rd = sContext.getRequestDispatcher("/secondservlet");
// calling forward method of request dispatcher
rd.forward(request, response);
}
SecondServlet.java
import java.io.*;
import java.net.*;
import javax.servlet.*;
© Copyright Virtual University of Pakistan
221
Web Design & Development – CS506 VU
import javax.servlet.http.*;
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>FirstServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>SecondServlet</servlet-class>
</servlet>
© Copyright Virtual University of Pakistan
222
Web Design & Development – CS506 VU
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/firstservlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/secondservlet</url-pattern>
</servlet-mapping>
</web-app>
HttpServletRequest Methods
Let’s discuss some methods of HttpServletRequestclass
setAttribute(String, Object)
We can put any object to the context using setAttribute() method in the key-value pair form.. These
attributes are also set or reset between requests. These are often used in conjunction with Request
Dispatcher. This has also been illustrated in the above example. These attributes are available every where
in the same web application so that any other Servlet or JSP resource can access them by using
getAttribute() method.
getAttribute(String)
The objects set by the setAttribute() method can be accessed using getAttribute() method. Passing the key
in the form of string as a parameter to this method will return the object associated with that particular key
in the context. Cast the object into its appropriate type.
getMethod()
This method returns the name of HTTP method which was used to send the request. The two possible
returning values could be, get or post.
getRequestURL()
It can be used to track the source of Request. It returns the part of the request’s URL with out query string.
getProtocol()
getHeaderNames()
It returns the enumeration of all available header names that are contained in the request.
getHearderName()
It takes a String parameter that represents the header name and returns that appropriate header. Null value
is returned if there is no header exists with the specified name.
HttpServletResponse Methods
Let’s discuss some methods of HttpServletResponse class
setContentType()
Almost every Servlet uses this header. It is used before getting the PrintWriter Stream. It is used to set the
© Copyright Virtual University of Pakistan
223
Web Design & Development – CS506 VU
Content Type that the PrintWriter is going to use. Usually we set “text/html”, when we want to send text
output or generate HTML tags on the client’s browser.
setContentLength(
)
This method is used to set the content length. It takes length as an integer parameter.
addCookie()
This method is used to add a value to the Set-Cookie header. It takes a Cookie object as a parameter and
adds it to the Cookie-header. We will talk more about Cookies in the session tracking part.
sendRedirect()
This method redirects the user to the specific URL. This method also accepts the relative URL. It takes
URL string as parameter and redirects the user to that resource.
SESSION TRACKING
Many applications require a series of requests from the same client to be associated with one another. For
example, any online shopping application saves the state of a user's shopping cart across multiple requests.
Web-based applications are responsible for maintaining such state, because HTTP protocol is stateless. To
support applications that need to maintain state, Java Servlet technology provides an API for managing
sessions and allows several mechanisms for implementing sessions.
Before looking inside the session tracking mechanism lets see the limitation of HTTP protocol to get the
real picture of problems that can happen with out maintaining the session.
Continuity problem- user’s point of view
Suppose a user logs on to the online bookshop, selects some books and adds them to his cart. He enters his
billing address and finally submits the order. HTTP cannot track session as it is stateless in nature and user
thinks that the choices made on page1 are remembered on page3
The server has a very different point of view. It considers each request independent from other even if the
requests are made by the same client.
References
Lesson 31
Session Tracking
We have discussed the importance of session tracking in the previous handout. Now, we’ll discover the
basic techniques used for session tracking. Cookies are one of these techniques and remain our focus in this
handout. Cookies can be used to put small information on the client’s machine and can be used for various
other purposes besides session tracking. An example of simple “Online Book Store”, using cookies, will
also be surveyed.
As mentioned elsewhere, HTTP is a stateless protocol. Every request is considered independent of every
other request. But many applications need to maintain a conversational state with the client. A shopping
cart is a classical example of such conversational state.
Post–Notes
In order to maintain the conversational state, server puts little notes (some text, values etc) on the client
slide. When client submits the next form, it also unknowingly submits these little notes. Server reads these
notes and able to recall who the client is.
o If browser finds one or more cookie files related to amazon, it will send it along with the
request
o If not, no cookie data will be sent with the request
Amazaon web server receives the request and examines the request for cookies
o If cookies are received, amazon can use them
© Copyright Virtual University of Pakistan
226
Web Design & Development – CS506 VU
o If no cookie is received, amazon knows that you have not visited before or the cookies
that were previously set got expired.
o Server creates a new cookie and send to your browser in the header of HTTP
Response so that it can be saved on the client machine.
Potential Uses of Cookies
Whether cookies have more pros or cons is arguable. However, cookies are helpful in the following
situations
Identifying a user during an e-commerce session. For example, this book is added into shopping
cart by this client.
Avoiding username and password as cookies are saved on your machine
Customizing a site. For example, you might like email-inbox in a different look form others. This
sort of information can be stored in the form of cookies on your machine and latter can be used to
format inbox according to your choice.
Focused Advertising. For example, a web site can store information in the form of cookies about
the kinds of books, you mostly hunt for.
statement
*/
}
} // end for
RepeatVisitorServlet.java
import java.io.*;import java.net.*;import
javax.servlet.*;import javax.servlet.http.*;
public class RepeatVisitorServlet extends HttpServlet {
// Handles the HTTP <code>GET</code> method.
protected void doGet(HttpServletRequest request,
// reading cookies
Cookie[] cookies = request.getCookies();
Cookie c = cookies[i];
// retrieving name & value of the cookie
String name = c.getName();
String val = c.getValue();
out.println("</body>");
out.println("</html>");
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet> <servlet-name> RepeatVisitorServlet </servlet-name><servlet-class> RepeatVisitorServlet
</servlet-class>
</servlet>
<servlet-mapping><servlet-name> RepeatVisitorServlet </servlet-name><url-pattern> /repeatexample
</url-pattern>
</servlet-mapping>
</web-app>
Output
On first time visiting this URL, an output similar to the one given below would be displayed
On refreshing this page or revisiting it within an hour (since the age of cookie was set to 60 mins),
following output should be expected.
Online Book Store example revolves around one ShoppingCartServlet.java. This Servlet has one global
HashMap (globalMap) in which HashMap of individual user (sessionInfo) are going to be stored. This
(sessionInfo) HashMap stores the books selected by the user.
What’s the part of cookies? Cookie (named JSESSIONID, with unique value) is used to keep the unique
sessionID associated with each user. This sessionID is passed back and forth between user and the server
and is used to retrieve the HashMap (sessionInfo) of the user from the global HashMap at the server. It
should be noted here that, HashMaps of individual users are stored in a global HashMap against a
sessionID.
ShoppingCartServlet.java
import java.io.*;import java.net.*;import
javax.servlet.*;import javax.servlet.http.*;
public class ShoppingCartServlet extends HttpServlet {
// used to generate a unique value which is
// used as a cookie value
response.setContentType("text/html;charset=UTF-8");
// declaring user's HashMap
HashMap sessionInfo = null;String sID = "";
// method findCookie is used to determine whether browser// has send any cookie named
"JSESSIONID"
Cookie c = findCookie(request);
// if no cookies named "JSESSIONID" is recieved, means that// user is visiting the site for the first time.
if (c == null) {
// make a unique string
sID = makeUniqueString();
// creating a HashMap where books selected by the// user will be stored
sessionInfo = new HashMap();
// add the user's HashMap (sessionInfo) into the// globalMap against unique string i.e. sID
globalMap.put(sID, sessionInfo);
// create a cookie named "JSESSIONID" alongwith
// value of sID i.e. unique string
out.println("<html>");
out.println("<head>");
out.println("<title>Shooping Cart Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Online Book Store</h1>");
out.println("<br/>");
out.println("<h1>You have selected followig books</h1>");
out.println("<br/>");
printSessionInfo(out, sessionInfo);
out.println("</body>");
out.println("</html>");
out.close();
} // end processRequest() // method used to generate a unique string
}
// used to print the books currently stored in// user's HashMap. i.e. sessionInfo
public void printSessionInfo(PrintWriter out,HashMap sessionInfo){
String title = "";
title= (String)sessionInfo.get("firstCB");
if (title != null){
out.println("<h3> "+ title +"</h3>");
}
title= (String)sessionInfo.get("secondCB");
if (title != null){
out.println("<h3> "+ title +"</h3>");
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet> <servlet-name> ShoppingCart </servlet-name><servlet-class> ShoppingCartServlet </servlet-
class>
</servlet>
<servlet-mapping>
<servlet-name> ShoppingCart </servlet-name>
<url-pattern> /shoppingcartex </url-pattern>
</servlet-mapping>
</web-app>
References:
Java A Lab Course by Umair Javed
Core Servlets and JSP by Marty Hall
Stanford Course – Internet Technologies
Java API documentation
Lesson 32
Session Tracking 2
In the last handout we have discussed the solutions for session tracking and talked about one important
mechanism cookies in detail. We said cookies allow the server to store information on a client machine and
later retrieve it. Now we will see two more mechanisms that provide us facility to maintain a session
between user’s requests. These are URL Rewriting and Hidden Form Fields. After that we will discuss a
session tracking API provided by java.
URL Rewriting
URL rewriting provides another way for session tracking. With URL rewriting, the parameter that we want
to pass back and forth between the server and client is appended to the URL. This appended information
can be retrieve by parsing the URL. This information can be in the form of:
. Extra path information,
. Added parameters, or
. Some custom, server-specific URL change
Note: Due to limited space available in rewriting a URL, the extra information is usually limited to a
unique session ID.
The following URLs have been rewritten to pass the session ID 123
If you want to add more than one parameter, all subsequent parameters are separated by & sign. For
example
Adding two parameters –
http://server:port/servletex/register ?name=ali&address=gulberg
URLRewriteServlet.java
import java.io.*;import java.net.*;import
javax.servlet.*;import javax.servlet.http.*;
public class URLRewriteServlet extends HttpServlet {
// used to generate a unique value which is
// used as a cookie value
globalMap.put(sID, sessionInfo);
}else {
// if parameter "JSESSIONID" has some value
// retrieve a HashMap from the globalMap against
© Copyright Virtual University of Pakistan
236
Web Design & Development – CS506 VU
sessionInfo = (HashMap)globalMap.get(sID);
}
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Shopping Cart Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Online Book Store</h1>");
// Making three URLS by using query string mechanism// The attributes/parameters are JSSESSIONID and
book name (like// firstCB) along with values sID and book name respectively
String firsturl ="http://localhost:8084/urlbookstore/urlrewriteservlet?JSESSIONID="
+ sID + "&firstCB=firstCB";
String secondurl ="http://localhost:8084/urlbookstore/urlrewriteservlet?JSESSIONID="
+ sID + "&secondCB=secondCB";
out.println("<h3><a href=" + firsturl + ">" + " java core servlts </a> </h3>"
+"<br>"+
"<h3><a href=" + secondurl + ">" +
" java how to program </a> </h3>" +
"<br>"+
);
out.println("<br/>");
out.println("<h1>You have selected following books</h1>");
out.println("<br/>");
printSessionInfo(out, sessionInfo);
out.println("</body>");
out.println("</html>");
out.close();
} // end processRequest()
// method used to generate a unique string
public String makeUniqueString(){return "ABC" +
S_ID++;}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet> <servlet-name> URLRewriteServlet </servlet-name><servlet-class> URLRewriteServlet
</servlet-class>
</servlet>
<servlet-mapping><servlet-name> URLRewriteServlet </servlet-name><url-pattern>
/urlrewriteservlet </url-pattern>
</servlet-mapping>
</web-app>
Hidden Form
Fields
HTML forms
can have an
element that
looks like the
following:
<INPUT
Hidden Forms Fields do not affect the appearance of HTML page. They actually contain the information
that is needed to send to the server. Thus, hidden fields can also be used to store information (like
sessionid) in order to maintain session.
In the above figure you can see the use of Hidden form fields for storing particular information.
To store information in Session object (sess), we use setAttribute() method of HttpSession class.
Session object works like a HashMap, so it is able to store any java object against key. So you can store
number of keys and their values in pair form. For example,
sess.setAttribute(“sessionid”, ”123”);
To retrieve back the stored information from session object, getAttribute()method of HttpSession class
is used. For example,
String sid=(String)sess.getAttribute(“sessionid”);
Note: -getAttribute() method returns Object type, so typecast is required.
4. Terminating a Session
After the amount of time, session gets terminated automatically. We can see its maximum activation
time by using getMaxInactiveInterval() method of HttpSession class. However, we can also terminate
any existing session manually. For this, we need to call invalidate() method of HttpSessionclass as
shown below.
sess.invalidate()
Example Code: Showing Session Information
To understand HttpSession API properly we need to have a look on an example. In this example, we will
get the session object and check whether it is a new user or not. If the user is visiting for the first time, we
will print “Welcome” and if we find the old one, we’ll print “Welcome Back”. Moreover, we will print the
session information and count the number of accesses for every user
import java.io.*;
© Copyright Virtual University of Pakistan
239
Web Design & Development – CS506 VU
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ShowSessionServlet extends HttpServlet {
// Handles the HTTP <code>GET</code> method.
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
}
// Handles the HTTP <code>POST</code> method.
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
processRequest(request, response);
}
// called from both doGet() & doPost()
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
// used for displaying message (like Welcomem, Newcomer) to user
private String heading;
response.setContentType("text/html");
web.xml
<servlet-mapping>
</servlet-mapping>
</web-app>
When we call getSession() method, there is a lot going on behind the scenes. For every user, a unique
session ID is assigned automatically. As the server deals with lot of users at a time, this ID is used to
distinguish one user from another. Now here is the question, how this ID sends to the user? Answer is,
there are two options
Option 1: If the browser supports cookies, the Servlet will automatically creates a session cookie
and store the session ID within that cookie.
Option 2: If the first option fails because of browser that does not support cookies then the Servlet
will try to extract the session ID from the URL
Servlet will automatically switch to URL rewriting when cookies are not supported or disabled by the
client. When Session Tracking is based on URL rewriting, it requires additional help from the Servlets. For
a Servlet to support session tracking via URL rewriting, it has to rewrite (encode) every local URL before
sending it to the client. Now see how this encoding works
HttpServletResponse provides two methods to perform encoding
String encodeURL(String URL)
String encodeRedirectURL(String URL)
If Cookies are disabled, both methods encode (rewrite) the specific URL to include the session ID and
returns the new URL. However, if cookies are enabled, the URL is returned unchanged.
encodeURL() is used for URLs that are embedded in the webpage, that the servlet generates. For example,
String URL = ”/servlet/sessiontracker”;
String eURL = response.encodeURL(URL);
out.println(“<A HREF=\” ” + eURL + ”\ ”> …… </A>”);
Whereas encodeRedirectURL() is used for URLs that refers yours site is in sendRedirect() call. For
example,
String URL = ”/servlet/sessiontracker”;
String eURL = response.encodeRedirectURL(URL);
Response.sendRedirect(eURL);
This book store is modified version of last one, which is built using URL rewriting mechanism. Here,
HttpSession will be used to maintain session.
ShoppingCartServlet.java
import java.io.*;import java.net.*;import
javax.servlet.*;import javax.servlet.http.*;
public class ShoppingCartServlet extends HttpServlet {
// Handles the HTTP GET method.
protected void doGet(HttpServletRequest request,
out.println("<html>");
out.println("<head>");
out.println("<title>Shopping Cart Example</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Online Book Store</h1>");
// Second URL built using query string, representing second book// Note that parameter name is still book,
so that later we need // to read only this parameter
String secondURL ="http://localhost:8084/urlrewritebookstore/shoppingcart?book=second"
// Encoding URLs
String eURL1 = response.encodeURL( firstURL );String eURL2 =
response.encodeURL( secondURL );
out.println("<h3><a href=" + eURL1 + ">" + " java core servlets </a> </h3>" +"<br>"+
"<h3><a href=" + eURL2 + ">" +
" java How to Program </a> </h3>"
);
out.println("<br/>");
out.println("<h1>You have selected following books</h1>");
out.println("<br/>");
} // end processRequest()
// used to display values stored in HttpSession object
public void printSessionInfo(PrintWriter out,HttpSession session){ String title = "";
// reading value against key fBook from session,// if exist displays it
title= (String)session.getAttribute("fBook");
if (title != null){
out.println("<h3> "+ title +"</h3>");
}
if (title != null){
out.println("<h3> "+ title +"</h3>");
}
} // end printSessionInfo
} // end ShoppingCartServlet
web.xml
</web-app>
References:
Java A Lab Course by Umair Javed
Core Servlets and JSP by Marty Hall
Stanford Course – Internet Technologies
Java Tutorial on Servlets
http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/Servlets11.html
Java API documentation
Lesson 33
AddressBook Case Study
Using Sevlets
Design Process
In this handout, we will discuss the design process of a simple address book. A step by step procedure of
creating a simple address book is given below.
Step 1
Create a database (AddressBook)
Make a table named Person according to the figure shown below. It has columns name, address,
phomeNum
Step 2
The next step is to create a class that can hold the information of a single person. Remember we have stored
the information in the database, now when we extract this information from the database as a result of some
search, we will require some object to store the data for that particular person. The PersonInfo class will be
used at that point to store the retrieved data and transport it to presentation layer. Also we extend this
application and add the functionality of “AddingNewContacts” in the database. The PersonInfo class can be
used to transport data from front end to the database.
Make a PersonInfo class with the following consideration
It has three three attributes: name, address, ph. No.
It has a parameterized constructor which takes in the above mentioned parameters
Override the toString() method
//File: PersnInfo.java
public class PersonInfo {
String name;
String address;
String phoneNum;
Note: To keep the code simple, attributes (name, address & phoneNum) are not declared as private,
which is indeed not a good programming approach.
Step 3
Now we will create a class that will be used to interact with the database for the search, insert, update and
delete operations. We will call it PersonDAO where DAO stands for the “data access object”. The
PersonDAO along with the PersonInfo class forms the data layer of our application. As you can see that
these two classes do not contain any code related to presentation or business logic (There is not much of
business logic in this application anyway). So PersonDAO along with PersonInfo is used to retrieve and
store data in this application. If at some stage we choose to use some other way of storing data (e.g. files)
only the PersonDAO class will change and nothing else, which is a sign of better design as compared to a
design in which we put every thing in a single class.
© Copyright Virtual University of Pakistan
246
Web Design & Development – CS506 VU
//File: PersonDAO.java
import java.sql.*;
public class PersonDAO {
// method searchPerson
public PersonInfo searchPerson(String sName){
PersonInfo person = null;
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:AddressBookDSN";
Connection con = DriverManager.getConnection(url);
String sql = "SELECT * FROM Person WHERE name = ?";
PreparedStatement pStmt = con.prepareStatement(sql);
pStmt.setString(1, sName);
ResultSet rs = pStmt.executeQuery();
if (rs.next( ) ) {
String name = rs.getString("name");
String add = rs.getString("address");
String pNum = rs.getString("phoneNum");
person = new PersonInfo(name, add, pNum);
}
con.close();
}catch(Exception ex){
System.out.println(ex);
}
return person;
}// end method
}
Step 4
To find what user wants to search, we need to give user an interface through which he/she can enter the
input. The SearchPesonServlet.java will do this job for us, It will collect the data from the user and submit
that data to another class. The SearchPersonServlet forms the part of our presentation layer. As you can see
that it is being used to present a form to the user and collect input.
Write SearchPersonServlet.java
Will take input for name to search in address book
Submits the request to ShowPersonServlet
//File: SearchPersonServlet.java
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
// url pattern of
// ShowPersonServlet"<h2> Enter name to
search </h2> <br/>" +"<input type=text name=pName /> <br/>" +"<input type=submit
value=Search Person />" +"</form>" +"</body>" +"</html>"
);
out.close();
}
Step 5
The data submitted by the SearchPersonServlet will be submitted to another servlet i.e. ShowPersonServlet,
which will interact with the DataLayer(Business logic processing) collects the output and show it to the
user. The ShowPersonServlet forms the part of our presentation layer and business layer. As you can see
that it is being used to do processing on the incoming data and giving it to data layer (business layer) and
present data/output to the user (presentation layer)
. Write ShowPersonServlet.java
. Receives request from SearchPersonServlet
. Instantiate objects of PersonInfo and PersonDAO class
. Call searchPerson() method of PersonDAOclass
. Show results
//File : ShowPersonServlet.java
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<h1>Search Results</h1>");
if (person != null){
out.println("<h3>"+ person.toString() +"</h3>" );
}
else{
out.println("</body>");
out.println("</html>");
out.close();
}
// Handles the HTTP GET method.protected void
doGet(HttpServletRequest request,HttpServletResponse
response)throws ServletException, IOException
{processRequest(request, response);}
// Handles the HTTP POST method.protected void
doPost(HttpServletRequest request,HttpServletResponse
response)throws ServletException, IOException
{processRequest(request, response); }
} // end ShowPersonServlet
Sequence Diagram: Address Book (search use case)
Package
Many times when we get a chance to work on a small project, one thing we intend to do is to put all java
files into one single directory (folder). It is quick, easy and harmless. However if our small project gets
bigger, and the number of files is increasing, putting all these files into the same directory would be a
nightmare for us. In java we can avoid this sort of problem by using Packages.
What is a package?
In simple terms, a set of Java classes organized for convenience in the same directory to avoid the name
collisions. Packages are nothing more than the way we organize files into different directories according to
their functionality, usability as well as category they should belong to. An obvious example of packaging is
© Copyright Virtual University of Pakistan
250
Web Design & Development – CS506 VU
One thing you must do after creating a package for the class is to create nested subdirectories to represent
package hierarchy of the class. In our case, we have the world package, which requires only one directory.
So, we create a directory (folder) world and put our HelloWorld.java into it.
import java.util.ArrayList;
Note: While working with IDEs, You don’t have to create folders (packages) and to place classes at right
locations. Many IDEs (like netBeans® 4.1) performs this job on your behalf.
JavaServer Pages (JSP)
Like Servlets, JSP is also a specification. JSP technology enables Web developers and designers to rapidly
develop and easily maintain, information-rich, dynamic Web pages that leverage existing business systems.
As part of the Java technology family, JSP technology enables rapid development of Web-based
applications that are platform independent. JSP technology separates the user interface from content
generation, enabling designers to change the overall page layout without altering the underlying dynamic
content.
The Need for JSP
With servlets, it is easy to
— Read form data
— Read HTTP request headers
— Set HTTP status codes and response headers
— Use cookies and session tracking
— Share data among servlets
— Remember data between requests
— Get fun, high-paying jobs
But, it sure is a pain to
— Use those println()statements to generate HTML
— Maintain that HTML
— Entire JSP page gets translated into a servlet (once), and servlet is what actually gets
invoked (for each request)
— The Java Server Pages technology combine with Java code and HTML tags in the same
document to produce a JSP file.
References:
Lesson 34
Java Server Pages
As we concluded in our discussion on JSP, JSP is a text based document capable of returning either static
or dynamic content to a client’s browser. Static content and dynamic content can be intermixed. The
examples of static content are HTML, XML & Text etc. Java code, displaying properties of JavaBeans and
invoking business logic defined in custom tags are all examples of dynamic content.
The web browser makes a request to JSP source code. This code is bifurcated into HTML and java code by
the JSP parser. The java source code is compiled by the Java compiler resulting in producing a servlet
equivalent code of a JSP. The servlet code is intermixed with HTML and displayed to the user. It is
important to note that a JSP only passes through all these phases when it is invoked for the first time or
when the changes have been made to JSP. Any later call to JSP does not undergo of compilation phase.
Benefits of JSP
Convenient
• We already know java and HTML. So nothing new to be learned to work with JSP.
• Like servlets (as seen, ultimately a JSP gets converted into a servlet), provides an
• extensive infrastructure for
Tracking sessions
Reading and sending HTML headers
Parsing and decoding HTML form data
Every request for a JSP is handled by a simple JSP java thread as JSP gets converted into a servlet. Hence,
the time to execute a JSP document is not dominated by starting a process.
Portable
Like Servlets, JSP is also a specification and follows a well standardized API. The JVM which is used to
execute a JSP file is supported on many architectures and operating systems.
Inexpensive
There are number of free or inexpensive Web Servers that are good for commercial quality
websites
Let’s compare JSP and Servlet technology by taking an example that simply plays current date.
First have a look on JSP that is displaying a current date. This page more looks like a HTML page except
of two strangely written lines of codes. Also there are no signs of doGet(), doPost().
Now, compare the JSP code above with the Servlet code given below that is also displaying the current
date.
//File: SearchPersonServlet.java
import java.io.*;
import java.net.*;
import javax.servlet.*;
import avax.servlet.http.*;
import java.util.*;
public class SearchPersonServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request,HttpServletResponse response)throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(
“<html>” + “<body>” + “<h3>” + “Current Date is:“ + new Date() +
“</h3>” + “</body>” + “</html>”
);
Clearly, a lot of code is needed to be written in the case of servlet example to perform a basic job.
Besides HTML, a JSP may contain the following elements.
Directive Elements
– Provides global control of JSP ……..…………….. <%@ %>
Scripting Elements
– JSP comments ……………………………………... <%----%>
– declarations ……………………………………... <%! %>
• Used to declare instance variables & methods
– expressions ……………………………………... <%= %>
• A java code fragment which returns String
– scriptlets ……………………………………... <% %>
• Blocks of java code
Action Elements
– Special JSP tags ……..…………………………….. <jsp: .…. />
We’ll discuss in detail all the ingredients of JSP. This handout will cover only scripting elements,
remaining ones will be discussed in next handouts.
Scripting Elements
Comments
Comments are ignored by JSP-to-servlet translator. Two types of comments are possibly used in
JSP. – HTML comment:
These comments are shown in browser, means on taking view source of the web page;
these sorts of comments can be read. Format of HTML comments is like to:
<!-- comment text-->
– JSP comment:
These comments are not displayed in browser and have format like:
<%-- comment text --%>
Expressions
The format of writing a Java expression is: <%= Java expression %>
These expressions are evaluated, after converted to strings placed into HTML page at the place it occurred
in JSP page Examples of writing Expressions are:
Scriptlets
The format of writing a scriptlet is: <%= Java code %>
After opening up the scriptlet tag, any kind of java code can be written inside it. This code is
inserted verbatim into corresponding servlet.
Example of writing a scriptlet is:
<%
String n = request.getParameter(“name”);
out.println(“welcome ” + n);
%>
The above scriptlet reads the name attribute and prints it after appending “welcome”
Declarations
The format of writing a declaration tag is: <%! Java code %>
This tag is used to declare variables and methods at class level. The code written inside this tag is
inserted verbatim into servlet’s class definition.
Example of declaring a class level (attribute) variable is:
– <%!
private int someField = 5; %>
%>
Example of declaring a class level method is:
– <%!
© Copyright Virtual University of Pakistan
256
Web Design & Development – CS506 VU
…………….
}
The next example code consists on two JSP pages namely first.jsp and second.jsp. The user will
enter two numbers on the first.jsp and after pressing the calculate sum button, able to see the sum
of entered numbers on second.jsp
first.jsp
This page only displays the two text fields to enter numbers along with a button.
<html>
<body>
<h2>Enter two numbers to see their sum</h1>
<!—the form values will be posted to second.jsp -->
<form name = "myForm" action="second.jsp" >
<h3> First Number </h3>
<input type="text" name="num1" />
<h3> Second Number </h3>
<input type="text" name="num2" /><br/><br/>
<input type="submit" value="Calculate Sum" />
</form>
</body>
</html>
second.jsp
This page retrieves the values posted by first.jsp. After converting the numbers into integers, displays their
sum.
<html>
<body>
<!-- JSP to sum two numbers -->
<%-- Declaration--%>
<%!
// declaring a variable to store sum
int res;
It’s important to note that every opening tag also have a closing tag too. The second.jsp of last
example is given below in XML style.
<? xml version="1.0" encoding="UTF-8"?>
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<!-- to change the content type or response encoding change thefollowing line-->
<jsp:directive.page contentType="text/xml;charset=UTF-8"/>
<!-- any content can be specified here, e.g.: -->
<jsp:element name="text">
<jsp:body>
<jsp:declaration>
int res;
public int sum(int op1, int op2) {
return op1 + op2;
}
</jsp:declaration>
<jsp:scriptlet>
String op1 = request.getParameter("num1");
String op2 = request.getParameter("num2");
int firstNum = Integer.parseInt(op1);
int secondNum = Integer.parseInt(op2);
res = sum(firstNum, secondNum);
</jsp:scriptlet>
<jsp:text> Sum is: </jsp:text>
<jsp:expression> res </jsp:expression>
</jsp:body>
</jsp:element>
</jsp:root>
References
Java A Lab Course by Umair Javed
Core Servlets and JSP by Marty Hall
Lesson 35
JavaServer Pages
We have started JSP journey in the last handout and thoroughly discussed the JSP scripting elements. JSP
directive elements and implicit objects will be discussed in this handout. Let’s review JSP journey again to
find out what part we have already covered.
Directive Elements
– Provides global control of JSP ……..…………….. <%@ %>
Scripting Elements
– JSP comments ……………………………………... <%----%>
– declarations ……………………………………... <%! %>
This variable is of type HttpServletRequest, associated with the request. It gives you
access to the request parameters, the request type (e.g. GET or POST), and the incoming
HTTP request headers (e.g. cookies etc).
– response
controller.jsp
<html>
<body>
<!-- scriptlet -->
<%
// reading parameter “page”, name of radio button using
// implicit object request
String pageName = request.getParameter("page");
// deciding which page to move on based on “page” value
// redirecting user by using response implicit object
if (pageName.equals("web")) {
response.sendRedirect("web.jsp");
} else if (pageName.equals("java") ) {
response.sendRedirect("java.jsp");
}
%>
</body>
</html>
web.jsp
<html>
<body>
// use of out implicit object, to generate HTML
<%
out.println( "<h2>" +
"Welcome to Web Design & Development Page" +
"</h2>"
© Copyright Virtual University of Pakistan
260
Web Design & Development – CS506 VU
);
%>
</body>
</html>
java.jsp
<html>
<body>
// use of out implicit object, to generate HTML
<%
out.println( "<h2>" +
"Welcome to Java Page" +
"</h2>"
);
%>
</body>
</html>
The details of remaining 5 implicit objects are given below:
session
This variable is of type HttpSession, used to work with session object.
application
This variable is of type ServletContext. Allows to store values in key-value pair form that are
shared by all servlets in same web application
config
This variable is of type ServletConfig. Represents the JSP configuration options e.g. init-
parameters etc.
Page Context
This variable is of type javax.servlet.jsp.PageContext, to give a single point of access to
many of the page attributes. This object is used to stores the object values associated with
this object.
exception
This variable is of type java.lang.Throwable. Represents the exception that is passed to JSP
error page.
page
This variable is of type java.lang.Object. It is synonym for this.
JSP Directives
JSP directives are used to convey special processing information about the page to JSP container. It affects
the overall structure of the servlet that results from the JSP page. It enables programmer to:
– Specify page settings
– To Include content from other resources
– To specify custom-tag libraries
Format
<%@ directive {attribute=”val”}* %>
In JSP, there are three types of directives: page, include & taglib. The formats of using these are:
–page: <%@ page {attribute=”val”}* %>
– include: <%@ include {attribute=”val”}* %>
– taglib: <%@ taglib {attribute=”val”}* %>
Lets you include (reuse) navigation bars, tables and other elements in JSP page. You can include files at
– Translation Time (by using include directive)
– Request Time (by using Action elements, discussed in next handouts)
Format
<%@include file=“relativeURL”%>
Purpose
To include a file in a JSP document at the time document is translated into a servlet. It may contain JSP
code that affects the main page such as response page header settings etc.
Example Code: using include directive
This example contains three JSP pages. These are index.jsp, header.jsp & footer.jsp. The header.jsp will
display the text of “web design and development” along with current date. The footer.jsp will display only
“virtual university”. The outputs of both these pages will be included in index.jsp by using JSP include
directive.
header.jsp
<%@page import="java.util.*"%>
<html>
<body>
<marquee>
<h3> Web Desing & Development </h3>
<h3><%=new Date()%></h3>
© Copyright Virtual University of Pakistan
262
Web Design & Development – CS506 VU
</marquee>
</body>
</html>
footer.jsp
<html>
<body>
<marquee>
<h3> Virtual University </h3>
</marquee>
</body>
</html>
index.jsp
<html>
<body>
// includes the output of header.jsp
<%@include file="header.jsp" %>
<TABLE BORDER=1>
<TR><TH></TH><TH>Apples<TH>Oranges
<TR><TH>First Quarter<TD>2307<TD>4706
<TR><TH>Second Quarter<TD>2982<TD>5104
<TR><TH>Third Quarter<TD>3011<TD>5220
<TR><TH>Fourth Quarter<TD>3055<TD>5287
</TABLE>
// includes the output of footer.jsp
<%@include file="footer.jsp" %>
</body>
</html>Example Code: setting content type to generate excel spread sheet
In this example, index.jsp is modified to generate excel spread sheet of the last example. The change is
shown in bold face.
index.jsp
// setting content type to generate excel sheet using page directive
</TABLE>
// includes the output of footer.jsp
<%@include file="footer.jsp" %>
</body>
</html>
JSP Life Cycle Methods
The life cycle methods of JSP are jspInit(), _jspService() and jspDesroy(). On receiving each
This example is actually the modification of the last one we had discussed in previous handout. User will
select either course “web design and development” or “java”. On submitting request, course outline would
be displayed of the selected course in tabular format. This course outline actually loaded from database.
The schema of the database used for this example is given below:
<html>
<body>
<h2>Select the page you want to visit</h2>
controller.jsp
Based upon the selection made by the user, this page will redirect the user to respective pages. Those are
web.jspand java.jsp
<html>
<body>
<!-- scriptlet -->
<%
// reading parameter named page
web.jsp
This page is used to display course outline of “web design and development” in a tabular format after
reading them from database. The code is:
<TR>
<TH>Session No.</TH>
© Copyright Virtual University of Pakistan
265
Web Design & Development – CS506 VU
<TH>Topics</TH>
<TH>Assignments</TH>
</TR>
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String conUrl = "jdbc:odbc:CourseDSN";
Connection con = DriverManager.getConnection(conUrl);
sessionNo = rs.getString("sessionNo");
topic = rs.getString("topic");
assignment = rs.getString("assignment");
if (assignment == null){
assignment = "";
}
%>
<%-- end of scriptlet --%>
<TR>
<TD> <%=sessionNo%> </TD>
<TD> <%=topic%> </TD>
<TD> <%=assignment%> </TD>
</TR>
<%
} // end while
%>
</TABLE >
© Copyright Virtual University of Pakistan
266
Web Design & Development – CS506 VU
</center>
</body>
</html>
java.jsp
The code of this page is very much alike of “web.jsp”. The only change is in making of query. Here the
value is set “java” instead of “web”
// importing java.sql package using page directive, to work with database
<%@page import="java.sql.*"%>
<html>
<body>
<center>
<TR>
<TD> <%=sessionNo%> </TD>
<TD> <%=topic%> </TD>
<TD> <%=assignment%> </TD>
</TR>
<%
} // end while
%>
</TABLE >
</center>
</body>
</html>
Issues with Last Example
Too much cluttered code in web.jsp and java.jsp. This makes it very difficult to understand (probably you
experienced it by yourself) and to make changes/enhancements.
A single page is doing everything that is really a bad approach while making of web applications. The tasks
performed by web.jspor java.jspare:
Displaying contents (Presentation logic)
Connecting with database (DB connectivity logic)
Results Processing (Business Logic)
Can we simplify it? Yes, the answer lies in the use of JavaBeans technology.
JavaBeans
A java class that can be easily reused and composed together in an application. Any java class that follows
certain design conventions can be a JavaBean.
JavaBeans Design Conventions
These conventions are:
A bean class must have a zero argument constructor
A bean class should not have any public instance variables/attributes (fields)
Private values should be accessed through setters/getters
For boolean data types, use boolean isXXX( ) & setXXX(boolean)
A bean class must be serializable
A Sample JavaBean
The code snippet of very basic JavaBean is given below that satisfies all the conventions described above.
The MyBean.java class has only one instance variable.
public class MyBean implements Serializable { private String name; // zero argument constructor
public MyBean( ){
name = “”;
}
// standard setter
public void setName(String n) {
name = n;
}
// standard getter
public String getName( ) {
return name;
}
This example is made by making more enhancements to the last one. Two JavaBeans are included in this
example code. These are CourseOutlineBean& CourseDAO.
The CourseOutlineBean is used to represent one row of the table. It contains the following attributes:
sessionNo
topic
assignment
The CourseDAO (where DAO stands of Data Acess Object) bean encapsulates database connectivity and
result processing logic.
The web.jsp and java.jsp will use both these JavaBeans. The code of these and the JSPs used in this
example are given below.
CourseOutlineBean.java
package vu;
import java.io.*;
public class CourseOutlineBean implements Serializable{
private int sessionNo;
private String topic;
private String assignment;
// no argument constructor
public CourseOutlineBean() {
sessionNo = 0;
topic = "";
assignment = "";
}
// setters
public void setSessionNo(int s){
sessionNo = s;
}
public void setTopic(String t){
topic = t;
}
public void setAssignment(String a){
assignment = a;
}
// getterspublic
int getSessionNo( ){
return sessionNo;
}
public String getTopic( ){
return topic;
}
public String getAssignment( ){
return assignment;
}
} // end class
CourseDAO.java
package vu;
import java.io.*;
import java.sql.*;
import java.util.*;
public class CourseDAO implements Serializable{
private Connection con;
public CourseDAO() {
establishConnection();
}
//********** establishConnection method ************* method used to make connection with
databaseprivate
void establishConnection(){
try{
// establishing conection
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String conUrl = "jdbc:odbc:CourseDSN";
con = DriverManager.getConnection(conUrl);
}catch(Exception ex){
System.out.println(ex);
}
}
//*********** retrieveCourseList method ********************
public ArrayList retrieveCourseList(String cName){
ArrayList courseList = new ArrayList();
try{
String sql = " SELECT sessionNo, topic, assignment " +"
FROM Course, SessionDetail" +"
WHERE courseName = ? " + "
AND Course.courseId = SessionDetail.courseID ";
} finally {
// to close connection
releaseResources();
}
// returning ArrayList object
return courseList;
} // end retrieveCourseOutline
//********** releaseResources method ********************
private void releaseResources(){
try{
if(con != null){
con.close();
}
}catch(Exception ex){
System.out.println();
}
} // end releaseResources
}//end CourseDAO
index.jsp
This page is used to display the course options to the user in the radio button form.
<html>
<body>
<h2>Select the page you want to visit</h2>
<form name="myForm" action="controller.jsp" >
<h3> <input type="radio" name = "page" value="web"/>
Web Design & Develoment
</h3> <br>
<h3> <input type="radio" name = "page" value="java"/>Java
</h3><br>
<input type="submit" value="Submit" />
</form>
</body>
</html>
controller.jsp
Based on user selection, redirects the user to desired page.
<html>
<body>
<!-- scriptlet -->
<%
String pageName = request.getParameter("page");
if (pageName.equals("web")) {
response.sendRedirect("web.jsp");
} else if (pageName.equals("java") )
{
response.sendRedirect("java.jsp");
}
%>
</body>
</html>
web.jsp
This page is used to display course outline of “web design and development” in a tabular format after
reading them from database. Moreover, this page also uses the JavaBeans (CourseOutlineBean &
CourseDAO).
© Copyright Virtual University of Pakistan
271
Web Design & Development – CS506 VU
<TH>Assignments</TH>
</TR>
<%-- start of scriptlet --%>
<%
// creating CourseDAO object
CourseDAO courseDAO = new CourseDAO();
// calling retrieveCourseList() of CourseDAO class and
// passing “java” as value. This method returns ArrayList
ArrayList courseList = courseDAO.retrieveCourseList("java");
CourseOutlineBean javaBean = null;
// iterating over ArrayList to display course outline
for(int i=0; i<courseList.size(); i++){
javaBean = (CourseOutlineBean)courseList.get(i);
%>
<%-- end of scriptlet --%>
<TR>
<TD> <%= javaBean.getSessionNo()%> </TD>
<TD> <%= javaBean.getTopic()%> </TD>
<TD> <%= javaBean.getAssignment()%> </TD>
</TR>
<%
} // end for
%>
</TABLE >
</center>
</body>
</html>
References:
Entire material for this handout is taken from the book JAVA A Lab Course by Umair Javed.
This material is available just for the use of VU students of the course Web Design and
Development and not for any other commercial purpose without the consent of author.
Lesson 37
JSP Action Elements and Scope
The journey we had started of JSP is very much covered except of JSP action elements. In this handout,
we’ll study the use of JSP action elements. Further also learn how and where to store JavaBean objects
that can be shared among JSP pages.
Let’s first quickly look on the JSP journey to find out where we have reached.
Directive Elements
– Provides global control of JSP ……..…………….. <%@ %>
Scripting Elements
– JSP comments ……………………………………... <%----%>
– declarations ……………………………………... <%! %>
Action Elements
– Special JSP tags ……..…………………………….. <jsp: .…. />
Format
Expressed using XML syntax
-Opening tag <jsp:actionElement attribute=”value” ….. >
-Body body
-Closing tag </jsp:actionElement>
The three action elements are used to work with JavaBeans. These are discussed in detail below.
It is used to obtain a reference to an existing JavaBean object by specifying id(name of object) and scope in
which bean is stored. If a reference is not found, the bean is instantiated.
The format of this action element is:
<jsp:useBean id = “name” scope = “page|request|session|application”
class=“package.Class ” />
The id attribute specifies the name of the JavaBean object that is also used for later references. The scope
attribute can have one possible value out of page, request, session and application. If this attribute is
omitted, the default value of scope attribute is page. We’ll discuss in detail about scope shortly.
The class attribute specifies the type of object is going to be created.
jsp:useBean is being equivalent to building an object in scriptlet. For example to build an object of
MyBeanusing scriptlet is:
<% MyBean m = new MyBean( );%>
Achieving above functionality using jsp:useBean action element will look like this:
<jsp:useBean id = “m” scope = “page” class=“vu.MyBean” />
In the above code snippet, we are assuming that MyBean lies in vu package.
To set or change the property value of the specified bean. String values are converted to types of properties
by using the related conversion methods.
The format of this action element is:
<jsp:setProperty name = “beanName or id” property = “name”value =“value” />
The name attribute should match the id given in jsp:useBean. The propertyattribute specifies the name of
the property to change and the value attribute specifies the new value.
jsp:setProperty is being equivalent to following code of scriptlet. For example to change the name property
of m (instance of MyBean) using scriptlet is:
<%
m.setProperty(“ali”);
%>
Achieving above functionality using jsp:setProperty action element will look like this:
<jsp:setProperty name = “m” property = “name” value = “ali” />
JSP getProperty Action Element
Use to retrieves the value of property, converts it to String and writes it to output stream. The format of
this action element is:
<jsp:getProperty name = “beanName or id” property = “name” />
jsp:getProperty is being equivalent to following code of scriptlet. For example to retrieve the name property
of m (instance of MyBean) followed by writing it to output stream, scriptlet code will look like:
<%
String name = m.getName( );
out.println(name);
%>
Achieving above functionality using jsp:getProperty action element will look like this:
<jsp:getProperty name = “m” property = “name” />
Example Code: Calculating sum of two numbers by using action elements and JavaBean
This example contains index.jsp and result.jsp and one JavaBean i.e. SumBean. User will enter two
numbers on index.jsp and their sum will be displayed on result.jsp. Let’s examine these one after another
SumBean.java
The SumBean has following attributes
– firstNumber
© Copyright Virtual University of Pakistan
275
Web Design & Development – CS506 VU
– secondNumber
– sum
The firstNumber and secondNumbers are “write-only” properties means for these only setters would be
defined. Whereas sum is a “read-only” property as only getter would be defined for it.
The SumBean also contain one additional method for calculating sum i.e. calulateSum(). After performing
addition of firstNumber with secondNumber, this method will assign the result to sum attribute.
package vu;
import java.io.*;
public class SumBean implements Serializable{
private int firstNumber;
private int secondNumber;
private int sum;
// no argument constructor
public SumBean() {
firstNumber = 0;
secondNumber = 0;
sum = 0;
}
// firstNumber & secondNumber are writeonly properties// setterspublic void setFirstNumber(int n){
firstNumber = n;
}
public void setSecondNumber(int n){
secondNumber = n;
}
index.jsp
This page will display two text fields to enter number into them.
<html>
<body>
</form>
</body>
</html>
result.jsp
This page will calculate the sum of two entered numbers by the user and displays the sum back to user. The
addition is performed using SumBean
Although the beans are indeed bound to local variables, that is not the only behavior. They are also stored
in four different locations, depending on the value of the optional scope attribute of jsp:useBean. The scope
© Copyright Virtual University of Pakistan
277
Web Design & Development – CS506 VU
attribute has the following possible values: page, request, sessionand application.
Let’s discover what impact these scopes can produce on JavaBeans objects which are stored in one of these
scopes.
page
This is the default value of scope attribute, if omitted. It indicates, in addition to being bound to local
variable, the bean object should be placed in the pageContextobject. The bean’s values are only
available and persist on JSP in which bean is created.
In practice, beans created with page scope are always accessed (their values) by jsp:getProperty,
jsp:setProperty, scriptlets or expressions later in the same page. This will be more cleared with the help
of following diagram:
PageContext
In the diagram above, first.jsp generates a request “request 1” that is submitted to second.jsp. Now,
second.jsp creates an object m of MyBeanby calling its default constructor and stores a value “ali” for
the name property by making a call to appropriate setter method. Since, the scope specified in this
example is “page”when the object of MyBean is instantiated using jsp:useBean action element.
Therefore, object (m) of MyBeanis stored in PageContext.
Whether, second.jsp forwards the same request (request 1) to third.jsp or generates a new request
(request 2), at third.jsp, values (e.g. ali) stored in MyBean object m, are not available. Hence,
specifying scope “page” results in using the object on the same page where they are created.
request
This value signifies that, in addition to being bound to local variable, the bean object should be placed
in ServletRequest object for the duration of the current request. In other words, until you continue to
forward the request to another JSP/servlet, the beans values are available. This has been illustrated in
the following diagram.
In the diagram above, MyBean is instantiated by specifying scope = “request”that results in storing object
in ServletRequest. A value “ali” is also stored in m using setter method.
second.jsp forwards the same request (request 1) to third.jsp, since scope of m (object of MyBean) is
request, as a result third.jsp can access the values(e.g. ali) stored in m. According to the figure, third.jsp
generates a new request (request 2) and submits it to fourth.jsp. Since a new request is generated therefore
values stored in object m (e.g. ali) are not available to fourth.jsp.
session
This value means that, in addition to being bound to local variable, the bean object will be stored in the
HttpSession object associated with the current request. As you already know, object’s value stored in
HttpSession persists for whole user’s session. The figure below helps in understanding this concept.
HttpSession
In the diagram above, MyBean is instantiated by specifying scope = “session”that results in storing
object in HttpSession. A value “ali” is also stored in m using setter method.
Irrespective of request forwarding or new request generation from second.jsp to other resources, the
values stored in HttpSession remains available until user’s session is ended.
application
This very useful value means that, in addition to being bound to local variable, the bean object will be
stored in ServletContext. The bean objects stored in ServletContext is shared by all JSPs/servlets in the
same web application. The diagram given below illustrates this scenario:
ServletContext
Summary of Object’s Scopes
Let’s take another view of session, request & page scopes in the next figure that helps us to understand the
under beneath things.
The figure shows four JavaServer Pages. Each page has its own page scope. Therefore objects stored in
page scope are only available to same pages on which they are created.
Suppose page1 forwards the request to page2. Objects stored in request scope remains available to page1 as
well to page 2. Similar case is true for page 3 & page 4.
If user makes a visit to all these pages in one session, object’s values stored in session scope remains
available on all these pages.
To understand the difference between sessions & application scope, consider the following figure:
As you can conclude from the figure, for each user (client), objects are stored in different sessions.
However, in the case of application scope, all users stores objects in single place.
More JSP Action Elements
Let’s talk about two important action elements. These are include& forward.
References:
. Java A Lab Course by Umair Javed.
. Core Servlets and JavaServer Pages by Marty Hall
Lesson 38
JSP Custom Tags
To begin with, let’s review our last code example of lecture 36 i.e. Displaying course outline. We
incorporated JavaBeans to minimize the database logic from the JSP. But still, we have to write some lines
of java code inside java.jsp & web.jsp. As discussed earlier, JSPs are built for presentation purpose only, so
all the other code that involves business and database logic must be shifted else where like we used
JavaBeans for such purpose.
There is also another problem attached to it. Generally web page designers which have enough knowledge
to work with HTML and some scripting language, faced lot of difficulties in writing some simple lines of
java code. To overcome these issues, java provides us the mechanism of custom tags.
Motivation
To give you an inspiration, first have a glance over the code snippet we used in JSP of the course outline
example of last lecture. Of course, not all code is given here; it’s just for your reference to give you a hint.
<%
CourseDAO courseDAO = new CourseDAO();
………………
// iterating over ArrayList
for (…………………… ) {
……………………
……………………
// displaying courseoutline
}
………………
%>
Can we replace all the above code with one single line? Yes, by using custom tag we can write like this:
<mytag:coursetag pageName=“java” />
By only specifying the course/page name, this tag will display the course outline in tabular format. Now,
you must have realized how significant changes custom tags can bring on.
What is a Custom Tag?
In simplistic terms, “a user defined component that is used to perform certain action”. This action
could be as simple as displaying “hello world” or it can be as complex as displaying course outline
of selected course after reading it form database.
It provides mechanism for encapsulating complex functionality for use in JSPs. Thus facilitates the
non-java coders.
We already seen & used many built in tags like:
Types of Tags
Three types of can be constructed. These are:
© Copyright Virtual University of Pakistan
284
Web Design & Development – CS506 VU
1 Simple Tag
2 Tag with Attribute
3 Tag with Body
1. Simple Tag
A simple tag has the following characteristics:
-Start and End of tag -No body is specified within tag -No attributes -For example
So far, we have used many built-in tags. Now the time has come to build your own one. Custom tags can be
built either by using JSP 1.2 specification or JSP 2.0 (latest) specification.
To develop custom tags using JSP 1.2 involves lot of cumbersome (too difficult for James Gossling
also☺). However, JSP 2.0 brings lots of goodies like
Simple tag extensions to build custom tags
Integrated Expression Language (will be discussed in coming lecture)
Also provides an alternate mechanism for building custom tags using tag files (.tag)
Improved XML syntax etc.
JSP implicit objects (e.g. out etc) are available to tag handler class through pageContextobject.
pageContextobject can be obtained using getJspContext() method.
For example to get the reference of implicit outobject, we write.
Note:If you are using any IDE (like netBeans® 4.1, in order to build custom tags, the IDE will
write .tldfile for you.
3. Deployment
• Place Tag Handler class in myapp/WEB-INF/classes folder of web application.
• Place .tld file in myapp/WEB-INF/tldsfolder of web application.
Note: Any good IDE will also perform this step on your behalf Use taglib directive in JSP to refer
to the tag library. For example
<%@ taglib uri=”TLD file name” prefix=“mytag” %>
The next step is to call the tag by its name as defined in TLD. For example, if tag name is hello then we
write:
< mytag:hello /> where mytag is the name of prefix specified in taglibdirective.
What actually happened behind the scenes? Container calls the doTag() method of appropriate tag handler
class. After that, Tag Handler will write the appropriate response back to the page.
Note: As mentioned earlier, if you are using any IDE (like netBeans® 4.1), the last two steps will be
performed by the IDE.
WelcomeTagHandler.java
© Copyright Virtual University of Pakistan
286
Web Design & Development – CS506 VU
package vu;
// importing required packages
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
customtags.tld
If using IDE, this file will be written automatically. In this file you specify the tag name along with Tag
Handler class.
</tag>
</taglib>
<%--
using taglib directive, specifying the tld file name as well asprefix. Note that you you use any value for
the prefix attribtute --%>
<%@taglib uri="/WEB-INF/tlds/customtags.tld" prefix="mytag" %>
<html> <body>
<h2>A Simple Tag Example</h2>
<h3> <%-- calling welcome tag with the help of prefix --%><mytag:welcome />
</h3>
</body></html>
Building tags with attributes
If you want to build a tag that can also take attributes, for example
<mytag:hello attribute=”value” />
To handle attributes, you need to add
© Copyright Virtual University of Pakistan
287
Web Design & Development – CS506 VU
Behind the scenes, container will call these setter methods implicitly and pass the value of the custom tag
attribute as an argument.
In this example, we will modify our course outline example to incorporate tags. Based on attribute value,
the tag will display the respective course outline in tabular format.
Approach
• Extend Tag Handler class from SimpleTagSupport class
-Add instance variable of type String
-Write setter method for this attribute
-Override doTag() method
CourseOutlineBean.java
This is the same file used in the last example
package vubean;
import java.io.*;
public class CourseOutlineBean implements Serializable{
private int sessionNo;
private String topic;
private String assignment;
// no argument constructor
public CourseOutlineBean() {
sessionNo = 0;
topic = "";
assignment = "";
}
// setters
public void setSessionNo(int s){
sessionNo = s;
}
while ( rs.next() ) {
sNo = rs.getInt("sessionNo");topic =
rs.getString("topic");assignment = rs.getString("assignment");
if (assignment == null){assignment =
"";}
// creating a CourseOutlineBean objectCourseOutlineBean cBean = new
CourseOutlineBean();
cBean.setSessionNo(sNo);cBean.setTopic(topic);cBean
.setAssignment(assignment);
// adding a bean to arraylist
courseList.add(cBean);
}
}catch(Exception ex){
System.out.println(ex);
} finally {
// to close connection
releaseResources();
}
// returning ArrayList object
return courseList;
} // end retrieveCourseOutline
© Copyright Virtual University of Pakistan
289
Web Design & Development – CS506 VU
try{
if(con != null){
con.close();
}
}catch(Exception ex){
System.out.println();
}
} // end releaseResources
}// end CourseDAO
MyTagHandler.java
The tag handler class uses JavaBeans (CourseOutlineBean.java & CourseDAO.java), and includes the logic
of displaying course outline in tabular format.
package vutag;
// importing package that contains the JavaBeansimport vubean.*;
import javax.servlet.jsp.tagext.*;import
javax.servlet.jsp.*;import java.util.*;
public class MyTagHandler extends SimpleTagSupport {
/**
* Declaration of pageName property.
*/
// to display course outline in tabular form, this method is// used – define below
display(courseList);
}
/**
* Setter for the pageName attribute.
*/
}
out.print("</TABLE>");
}catch(java.io.IOException ex){throw new
JspException(ex.getMessage());}}
} // end clas MyTagHandler.java
<taglib version="2.0"
xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSch
ema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-
jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>mytaglibrary</short-name>
<!—the value of uri will be used in JSP to refer to this tld -->
<uri>/WEB-INF/tlds/mytaglibrary</uri>
<!— Specifying the tag name and tag class. Also mentioning thatthis tag has no body
-->
<tag>
<name>coursetag</name>
<tag-class>vutag.MyTagHandler</tag-class>
<body-content>empty</body-content>
<!—
Specifying the attribute name and its type
-->
<attribute>
<name>pageName</name>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
index.jsp
This page is used to display the course options to the user in the radio button form.
<html>
<body>
</h3>
<br>
<input type="submit" value="Submit" />
</form>
</body>
</html>
controller.jsp
Based upon the selection made by the user, this page will redirect the user to respective pages. Those are
web.jspand java.jsp
<html>
<body>
<!-- scriptlet -->
<%
String pageName = request.getParameter("page");
if (pageName.equals("web")) {
response.sendRedirect("web.jsp");
} else if (pageName.equals("java") ) {
response.sendRedirect("java.jsp");}%>
</body>
</html>
java.jsp
<%-- using taglib directive, specifying the tld file and prefix --%>
<%@taglib uri="/WEB-INF/tlds/mytaglibrary.tld" prefix="mytag"%>
<html>
<body>
<center> <h2> Welcome to Java Learning Center </h2><h3> Course Outline</h3>
<%--calling coursetag and specifying java as attribute value
--%>
<mytag:coursetag pageName="java" />
</center>
</body>
</html>
web.jsp
<%-- using taglib directive, specifying the tld file and prefix --%>
<%@taglib uri="/WEB-INF/tlds/mytaglibrary.tld" prefix="mytag"%>
<html>
<body>
<center>
<h2> Welcome to Java Learning Center </h2><h3> Course Outline</h3>
<%--calling coursetag and specifying java as attribute value
--%>
<mytag:coursetag pageName="java" />
</center>
</body>
</html>
References
Lesson 39
MVC + Case Study
We have covered an adequate amount of Servlets and JSPs in detail. Now, the time has come to learn
different architectures that are most commonly used for the sake of web development. These architectures
also help us to understand where these components best fit in. In this handout, we’ll cover the most widely
used/popular architecture i.e. Model View Controller (MVC).
A small case study “Address Book” is also part of this handout that is based on MVC Model 1. Before
moving on to MVC, let’s see what error pages are and how they are used?
Error Page
Error Pages enables you to customize error messages. You can even hide them from the user's view
entirely, if you want. This also makes possible to maintain a consistent look and feel throughout an
application, even when those dreaded error messages are thrown.
By means of page directive, a JSP can be given the responsibility of an Error page. An Error JSP is called
by the web server when an uncaught exception gets occurred. This exception is passed as an instance of
java.lang.Throwable to Error JSP (also accessible via implicit exception object).
Defining and Using Error Pages
• JSP pages are informed about the error page by setting errorPage attribute of page directive
In the figure below, error.jsp is defined as JSP Error page and index.jsp is informed to call error.jsp if any
uncaught exception rose. This is done by setting attributes errorPage and isErrorPage of the page
directive on these JSPs.
index.jsp error.jsp
. Java Beans
. PersonInfo– Has following attributes:
– name
– address
– phoneNum
© Copyright Virtual University of Pakistan
293
Web Design & Development – CS506 VU
. PersonDAO
– Encapsulates database logic.
– Therefore, it will be used to save and retrieve PersonInfo data.
. searchperson.jsp
Error Page
. addbookerror.jsp
– This page is declared as an error page and used to identify the type of exception.
– In addition to that, it also displays the message associated with the received exception to the user.
Program Flow
Now let’s discuss the flow of program. Assume that the system has been deployed on a JSP compatible
Web Server like Tomcat and has been ready to use for clients. The following figure helps to understand the
program flow of this small example.
addperson.jsp takes person’s information from the user and sends it to saveperson.jsp. After receiving
request, saveperson.jsp makes an object of PersonInfo using received information and saves it into the
database using PersonDAOJava bean.
Similarly, searchperson.jsp takes search criteria (name) from the user and passes it to showperson.jsp that
searches the record in database using PersonDAO and shows the results to the user.
If any uncaught exception is generated on these JSP, addbookerror.jsp is called implicitly, which displays
an appropriate message to the user after identifying the exception type.
// no argument constructor
public PersonInfo() {
name = "";
address = "";
phoneNum = 0;
}
// setters
public void setName(String n){
name = n;
}
// getters
public String getName( ){
return name;
}
// default constructor
}
// used to search the person records against name and returns
// the ArrayList that contains only those PersonInfo objects
// which matches the search criteria i.e. name
public ArrayList retrievePersonList(String Name) throws SQLException {
ArrayList personList = new ArrayList();
// preparing query
String sql = " SELECT * FROM Person WHERE name = ?";
// executing query
ResultSet rs = pStmt.executeQuery();
String name;
String add;
int pNo;
while ( rs.next() ) {
name = rs.getString("name");
add = rs.getString("address");
pNo = rs.getInt("phoneNumber");
return personList;
} // end retrievePersonList
// this method accepts an object of PersonInfo, and stores it into // the database public void
addPerson(PersonInfo person) throws SQLException{
String sql = " INSERT INTO Person VALUES (?, ?, ?)";
PreparedStatement pStmt = con.prepareStatement(sql);
String name = person.getName();
String add = person.getAddress();
© Copyright Virtual University of Pakistan
296
Web Design & Development – CS506 VU
pStmt.setString( 1 , name );
pStmt.setString( 2 , add );
pStmt.setInt( 3 , pNo );
pStmt.executeUpdate();
} // end addPerson
// overriding finalize method to release acquired resources
public void finalize( ) {
try{
if(con != null){
con.close();
}
}catch(SQLException sqlex){
System.out.println(sqlex);
}
} // end finalize
This JSP page gets person record’s information from the user. It contains three Input
Fields for name, address and phone number as shown in the diagram. This page sends this information to
saveperson.jsp for further processing,
The code that is used to generate the above page is given below:
<%-- Although there are no chances of exception to arise on this page, for consistency, error
page is defined on top of all JSPs
--%>
<%@page errorPage="addbookerror.jsp" %>
© Copyright Virtual University of Pakistan
297
Web Design & Development – CS506 VU
<html> <body>
<center>
<h2> Address Book </h2>
<h3> Add New Person</h3>
</TABLE>
</form>
<h4>
<%-- A link to searchperson.jsp --%>
<a href="searchperson.jsp" > Search Person </a>
</h4>
</center>
</body>
</html>
saveperson.jsp
This JSP page gets data from the addperson.jsp, makes an object of PersonInfo and saves it to the database
using PersonDAO class. Apart from these, it also displays an informative message to the user if new person
record is saved successfully into the database and two hyperlinks to navigate on to the desired pages as
shown in the following diagram:
--%>
<jsp:setProperty name="personBean" property="*" />
<%--
to save Person record into the database, calling addperson
method of PersonDAO
--%>
<%
pDAO.addPerson(personBea
n);
%>
<center>
<h3> New Person Record is saved successfully!</h3>
<h4>
<a href="addperson.jsp" > Add Person </a>
</h4>
<h4>
<a href="searchperson.jsp" > Search Person </a>
</h4>
</center>
</body>
</html>
searchperson.jsp
It gets search criteria from the user (i.e. name) and sends it to showperson.jsp to display the search results.
The outlook of the page is given below:
The code used to generate the above page given page is:
<%-- defining error page --%>
<%@page errorPage="addbookerror.jsp" %>
<html> <body>
© Copyright Virtual University of Pakistan
299
Web Design & Development – CS506 VU
<center>
<h2> Address Book </h2>
<h3> Search Person</h3>
<%-- Form that contains Text input field and sending it to showperson.jsp
--%>
<form name ="search" action="showperson.jsp" />
<TABLE BORDER="1" >
<TR>
<TD> <h4 >Name</h4> </TD>
<TD> <input type="text" name="name" /> </TD>
</TR>
<TR> <TD COLSPAN="2" ALIGN="CENTER"">
<input type="submit" value="search" /><input type="reset" value="clear"
/>
</TD>
</TR>
</TABLE>
</form>
<h4>
<a href="addperson.jsp" > Add Person </a>
</h4>
</center></body>
</html>
showperson.jsp
showperson.jsp receives search criteria (i.e. name) from the searchperson.jsp, that is entered by the user to
find the matching record. This page retrieves the complete list of matching records from the database using
PersonDAO, and shows them to the user.
This following figure gives you the sight, when person named “saad” is searched.
<center>
<h2> Address Book </h2>
<h3> Following results meet your search criteria</h3>
</TR>
<jsp:useBean id="pDAO" class="vu.PersonDAO" scope="page" /> <%
// getting search criteria sent by searchperson.jsp
String pName = request.getParameter("name");
// retrieving matching records from the Database using // retrievePersonList() method of
PersonDAO
%>
<TR> <TD> <%= person.getName()%> </TD>
<TD> <%= person.getAddress()%> </TD>
<TD> <%= person.getPhoneNum()%> </TD>
</TR>
<%
} // end for
%>
</TABLE >
<a href="addperson.jsp" > Add Person </a>
<a href="searchperson.jsp" > Search Person </a>
</center>
</body>
</html>
addbookerror.jsp
This JSP error page is called implicitly by all other JSP pages whenever any uncaught / unhandled
exception occurs. It also finds out the type of the exception that is generated, and shows an appropriate
message to the user:
<%-- indicating that this is an error page --%>
<%@page isErrorPage="true" %>
<%-- importing class --%>
<%@page import = "java.sql.SQLException" %>
<html>
<head> <title>Error</title> </head>
<body>
<h2>
Error Page
</h2>
<h3>
<%-- scriptlet to determine exception type --%>
<%
if (exception instanceof SQLException) {
%>
An SQL Exception
<%
} else if (exception instanceof ClassNotFoundException){
%>
</h3>
<h3 > Please Try Again Later! </h3>
<%-- hyperlinks to return back to addperson.jsp or searchperson.sjp
--%>
<h3>
<a href="controller.jsp?action=addperson" > Add Person
</a>
<a href="controller.jsp?action=searchperson" > Search Person
</a>
</h3>
</body>
</html>
Also, several problems can arise when applications contain a mixture of data access code, business logic
code, and presentation code. Such applications are difficult to maintain, because interdependencies between
all of the components cause strong ripple effects whenever a change is made anywhere. High coupling
makes classes difficult or impossible to reuse because they depend on so many other classes. Adding new
data views often requires re-implementing or cutting and pasting business logic code, which then requires
maintenance in multiple places. Data access code suffers from the same problem, being cut and pasted
among business logic methods.
The Model-View-Controller architecture solves these problems by decoupling data access, business logic,
and data presentation and user interaction. Such separation allows multiple views to share the same
enterprise data model, which makes supporting multiple clients easier to implement, test, and maintain.
Participants and Responsibilities
The individual’s responsibility of three participants (model, view & controller) is given
below:
. Model
The model represents the state of the component (i.e. its data and the methods required to manipulate it)
independent of how the component is viewed or rendered.
. View
The view renders the contents of a model and specifies how that data should be presented. There can be
multiple views for the same model within single applications or model may have different views in
different applications or operating systems.
. Controller
The controller translates interactions with the view into actions to be performed by the model. In a web
application, they appear as GET and POST HTTP requests. The actions performed by the model
include activating business processes or changing the state of the model. Based on the user interactions
and the outcome of the model actions, the controller responds by selecting an appropriate view.
access JavaBeans that represent the application model. And the next view
to display (JSP page, servlet, HTML page, and so on) is determined either by hyperlinks selected in the
source document or by request parameters.
In Model 1 architecture, view selection is decentralized, because the current page being displayed
determines the next page to display. In addition, each JSP page or servlet processes its own inputs
(parameters from GET or POST). And this is hard to maintain, for example, if you have to change the view
selection, then several JSP pages need to be changed. In some Model 1 architectures, choosing the next
page to display occurs in scriptlet code, but this usage is considered poor form.
In MVC Model 1 architecture, the JSP page alone is responsible for processing the incoming request and
replying back to the client. There is still separation of presentation from content, because all data access is
performed using JavaBeans.
Although the Model 1 architecture should be perfectly suitable for simple applications, it may not be
desirable for complex implementations. Random usage of this architecture usually leads to a significant
amount of scriptlets or Java code embedded within the JSP page, especially if there is a significant amount
of request processing to be performed. While this may not seem to be much of a problem for Java
developers, it is certainly an issue if your JSP pages are created and maintained by designers which are only
aware of HTML and some scripting language.
Note: Probably some of you must be thinking about the case study discussed earlier in this handout.
Indeed, it is based on MVC Model 1 architecture.
References:
Java A Lab Course by Umair Javed
Java BluePrints - J2EE Patterns
http://java.sun.com/blueprints/patterns/MVC-detailed.html
Exploring the MVC Design Pattern
http://www.javaworld.com/javaworld/jw-12-1999/jw-12-ssj-jspmvc.html
Lesson 40
MVC Model 2 Architecture
We have studied page-centric approach and page-with-bean approach until now. You must be wondering
when we had covered these. Probably these buzz words are new one for you but we already covered these
topics. Let’s review these once again.
Page-Centric Approach
A web application that is collection of JSPs. Generally this approach is followed to get started with
developing web applications. This approach is represented in the following diagram:
The page-centric approach has lot of draw backs such as the code becomes a mixture of presentation,
business and data access logic. The maintenance and up-gradation of the application becomes a nightmare.
Scaling of such kind of application is also difficult and lots of code is also get duplicated.
Page-with-Bean Approach (MVC Model1)
This approach is different from page-centric approach in a way that all the business logic goes into
JavaBeans. Therefore, the web application is a collection of JSPs and JavaBeans. But still this approach is
insufficient to separate different kind of logics. We have made an address book example in the last handout
using this approach.
-Application state
It gives the single point of control to perform security checks and to record
logging information
It also encapsulates the incoming data into a form that is usable by the back-end MVC model.
We’ll discuss it with the help of an example.
The following figure will help you to understand the architecture and functioning of the application that is
built using MVC Model 2 architecture.
The client (browser) sends all the requests to the controller. Servlet/JSP acts as the Controller and is in
charge of the request processing and creation of any beans or objects (Models) used by the JSP.
JSP is working as View and there is not much processing logic within the JSP page itself, it is simply
responsible for retrieving objects and/or beans, created by the Servlet, extracting dynamic content from
them and put them into the static templates.
The address book example that is built using page-with-bean approach will be modified to incorporate
controller. We’ll show you how to implement controller using JSP as well as with servlet. Let’s first
incorporate controller using JSP.
Introducing a JSP as Controller
Add another JSP (controller.jsp) that
Acts as a controller
Recieves requests form addperson.jsp & searchperson.jsp
Identifies
the page
which
initiates the
request
Uses
JavaBeans
to save or
search
persons
to/from
database
Forwards
or redirects
the request
to
appropriate
As you can see in the diagram that all the requests are submitted to controller which uses the
JavaBeans and forwards/redirects the user to another view (JSP)? If any exception arises on
controller or JSPs, the control would automatically be transferred to addbookerror.jsp to display an
appropriate message.
How controller differentiates between requests?
Most likely, you must be thinking about it. The simplest solution lies in using the consistent name (e.g.
action) of the submit button across all the pages but with different and unique values. The same rule applies
to hyperlinks that send the action parameter along with value by using query string technique.
This eases the controller’s job to identify which page is actually generated the request and what to do next.
The controller simply retrieves the value of action parameter using request.getParameter() method. Now,
if-else structure can be used to compare the possible values of action to act upon the requested task.
Now, let’s first see the code of JavaBean that is used in this example.
PersonInfo
This JavaBean is used to represent one person record. The code is given below:
package vu;
import java.io.*;
public class PersonInfo implements Serializable{
private String name;
private String address;
private int phoneNum;
// no argument constructor
public PersonInfo() {
name = "";
address = "";
phoneNum = 0;
}
// setters
public void setName(String n){
name = n;
}
// getters
public String getName( ){
return name;
}
public String getAddress( ){
return address;
}
public int getPhoneNum( ){
© Copyright Virtual University of Pakistan
307
Web Design & Development – CS506 VU
return phoneNum;
}
} // end class PersonInfo
PersonDAO
This class will help in retrieving and storing person’s records in database. The code is given below:
package vu;
import java.util.*; import java.sql.*;
public class PersonDAO{
private Connection con;
// default constructor
// establishing conection
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String conUrl = "jdbc:odbc:PersonDSN";
con = DriverManager.getConnection(conUrl);
}
// used to search the person records against name and returns
the ArrayList that contains only // those PersonInfo
objects which matches the search criteria i.e. name
while ( rs.next() ) {
name = rs.getString("name");
add = rs.getString("address");
pNo = rs.getInt("phoneNumber");
return personList;
} // end retrievePersonList
// this method accepts an object of PersonInfo, and stores it into
// the database
pStmt.setString( 1 , name );
pStmt.setString( 2 , add );
pStmt.setInt( 3 , pNo );
pStmt.executeUpdate();
} // end addPerson // overriding finalize method to release acquired resources
public void finalize( ) {
try{
con.close();
}
}catch(SQLException sqlex){
System.out.println(sqlex);
}
} // end finalize
<%-- As mentioned in MVC2, all the requests are submitted to controller, that’s why
action’s contains the value of “controller.jsp”
--%>
<form name ="register" action="controller.jsp" />
<TABLE BORDER="1" >
<TR> <TD> <h4> Name </h4> </TD> <TD> <input type="text" name="name" />
</TD>
</TR>
<TR> <TD> <h4> Address </h4> </TD> <TD> <input type="text" name="address"
/> </TD>
</TR>
<TR> <TD> <h4>Phone Number</h4> </TD> <TD> <input type="text"
name="phoneNum" /> </TD>
</TR>
<TR> <TD COLSPAN="2" ALIGN="CENTER"">
<%-- As described above the technique to differentiate between the requests, the
name of the button is “action” with value “save”.
--%>
<input type="submit" name ="action" value="save" />
<input type="reset" value="clear" />
</TD>
© Copyright Virtual University of Pakistan
310
Web Design & Development – CS506 VU
</TR>
</TABLE>
</form>
<h4>
The code that is used to generate that above page is given below:
<%-- defining error page --%>
<%@page errorPage="addbookerror.jsp" %>
< html>
<body>
<center>
<h2> Address Book </h2>
<h3> Search Person</h3>
<%- The name of the button is still “action” but with different value
“search”.
--%>
<input type="submit" name ="action" value="search" />
<input type="reset" value="clear" />
</TD>
</TR>
</TABLE>
</form>
<h4>
<%- The action parameter with different value “addperson” are part of hyperlink
here as well.
--%>
<a
href="controller.jsp?action=addperson"
> Add Person </a>
</h4>
</center>
</body>
</html>
controller.jsp
As mentioned earlier that controller.jsp identifies the page which initiates the request and use JavaBeans to
save/search persons to/from database. Also its job list includes redirecting the user to appropriate page.
Since this JSP is doing only processing therefore no view available. Let’s check it out its code:
<%-- defining error page --%>
<%@page errorPage="addbookerror.jsp" %>
<%-- importing required packages. package vu contains JavaBeans --%>
<%@page import ="java.util.*" %> <%@page
import = "vu.*" %>
<html>
<body>
<%-- declaring PersonDAO object--%>
<jsp:useBean id="pDAO" class="vu.PersonDAO" scope="page" />
<%- scriptlet to identify JSP for redirection purpose if request comes from hyperlinks
--%>
<%
// retrieving action parameter value
// Remember that “action” is the name of buttons as well
// it is used in hyperlinks in making of query string
String action = request.getParameter("action");
// if "Add Person" hyperlink is clicked
if (action.equals("addperson") ){
response.sendRedirect("addperson.jsp");
</body>
</html>
saveperson.jsp
This page displays a successful message indicating that person record is saved. Its also give the options to
the user to move on to addperson.jsp or searchperson.jsp through hyperlinks. Note that these hyperlinks
also first take the user to controller.jsp then on to requested page.
<body>
<center>
<h3> New Person Record is saved successfully!</h3>
<h4>
<a href="controller.jsp?action=addperson" > Add
Person </a>
</h4>
</h4>
<a href="controller.jsp?action=searchperson" > Search
Person </a>
</h4>
</center>
</body>
</html>
showperson.jsp
This following figure gives you the view when name “saad” is searched.
</TR>
<%
// retrieving arraylist stored on controller.jsp to display PersonInfo objects
ArrayList personList = (ArrayList)request.getAttribute("list"); PersonInfo person =
© Copyright Virtual University of Pakistan
314
Web Design & Development – CS506 VU
null;
for(int i=0; i<personList.size(); i++) {
person = (PersonInfo)personList.get(i); %>
<%-- displaying PersonInfo details--%>
<TR> <TD> <%= person.getName()%> </TD> <TD> <%= person.getAddress()%>
</TD> <TD> <%= person.getPhoneNum()%> </TD>
</TR>
<%
} // end for
%>
</TABLE >
<h4>
<a href="controller.jsp?action=addperson"> Add Person </a> <a
href="controller.jsp?action=searchperson">Search Person</a>
</h4>
</c enter>
</body>
</html>
addbookerror.jsp
User will view this page only when any sort of exception is generated. The code of this page is given
below:
<%-- indicating that this is an error page --%>
<%@page isErrorPage="true" %>
<%-- importing class --%>
<%@page import = "java.sql.SQLException" %>
<html>
<head> <title>Error</title> </head>
<body>
<h2>
Error Page
</h2>
<h3>
<%-- scriptlet to determine exception type --%>
<%
if (exception instanceof SQLException) {
%>
An SQL Exception
<%
} else if (exception instanceof ClassNotFoundException){
%>
Since JSP that is performing the job of controller is doing only processing and there is no view available of
it. It includes the logic of selecting JSP and to retrieve/store records from/to dataset using JavaBeans.
But remember the reason for introducing JSPs? JavaServer Pages are built for presentation (view) only so
JSP is really not a good place for such kind of logic. Concluding, what’s the option we have? The answer
is, use Servlets as controller.
Introducing a Servlet as Controller
Remove the controller.jsp from the previous example code and add ControllerServlet.java (a servlet) into
this example. This ControllerServlet.java performs the same job that was previously performed by
controller.jsp.
Besides adding ControllerServlet.java, you have to modify all the addresses which are previously pointing
to controller.jsp. For example the value of action attribute of form tag & the address of hyperlink in all
concerned pages.
If controller is defined in web.xml as an alias of ControllerServlet.java, consider the following fragment of
code which shows the value of action attribute of form tag before and after introducing change.
processRequest(request, response);
}
request.setAttribute("javax.servlet.jsp.JspException" , sqlex);
RequestDispatcher rd = request.getRequestDispatcher("addbookerror.jsp");
rd.forward(request, response); }
request.setAttribute("javax.servlet.jsp.JspException" , cnfe);
RequestDispatcher rd =
request.getRequestDispatcher("addbo
okerror.jsp"); rd.forward(request,
response);
}
}// end addperson()
// if request comes to search person record from database
© Copyright Virtual University of Pakistan
318
Web Design & Development – CS506 VU
rd.forward(request, response);
}catch (SQLException sqlex){
// setting SQLException instance
request.setAttribute("javax.servlet.jsp.JspException" , sqlex);
RequestDispatcher rd =
request.getRequestDispatcher("addboo
kerror.jsp"); rd.forward(request,
response);
}catch (ClassNotFoundException cnfe){
// setting ClassNotFoundException instance
request.setAttribute("javax.servlet.jsp.JspException" , cnfe);
RequestDispatcher rd = request.getRequestDispatcher("addbookerror.jsp");
rd.forward(request, response);
}
}// end searchPerson()
} // end ControllerServlet
web.xml
As you already familiar, for accessing a servlet, you need to define a URL pattern in web.xml. This is
shown below:
<?xml version="1.0" encoding="UTF-8"?> <web-app>
<servlet>
<servlet-name> ControllerServlet </servlet-name>
<servlet-class> controller.ControllerServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> ControllerServlet </servlet-name>
<url-pattern> /controller </url-pattern>
</servlet-mapping>
</web-app>
eferences:
. Java A Lab Course by Umair Javed.
. Java E-commerce course at Stanford
Lesson 41
Layers and Tiers
How do you structure an application to support such operational requirements as maintainability,
reusability, scalability and robustness? The answer lies in using Layers and Tiers? What different
technologies Java provides to support layered or tiered architectures. The answer to these questions will
remain our focus in this handout. A small case study will also be used to comprehend the concept of layers.
However, both terms are used intractably very often. You must be confused what does logical & physical
view mean? Let’s elaborate layers and tiers further in detail to differentiate between them.
Layers
The partitioning of a system into layers such that each layer performs a specific type of functionality and
communicates with the layer that adjoin it.
The separation of concerns minimizes the impact of adding services/features to an application. The
application developed in layers also enables tiered distribution (discussed later). Furthermore easier
maintenance, reuse of code, high cohesion & loose coupling sort of additional benefits are also enjoyed by
the use of tiered architecture.
To begin with, layered architecture based on three layers. These are
Presentation Layer
Business Layer
Data Layer
Note:
However, there is no upper limit of number of layers an application can have. Each layer can also be further
break down into several layers depending upon the requirement and size of the application.
The figure given below shows a simplified view of an application and its layers.
As you can see in the figure, users can only interact with the presentation layer. The presentation layer
passes the user request to the business layer, which further passes the request to the data layer. The data
layer communicates with the data sources (like Database etc.) or other external services in order to
accomplish the user request.
Let’s discuss each layer’s responsibility in detail:
Presentation Layer
It provides a user interface to the client/user to interact with the application. This is the only part of the
application visible to client.
Its job list includes collecting user’s input, validating user’s input (on client side using JavaScript like
technologies OR on server side), presenting the results of the request made by the user and controlling the
screen flow (which page/view will be visible to the user).
Business Layer
Also called application layer, it is only concerned with the application specific functionality. It is used to
implement business rules and to perform business tasks.
For example, in a banking system, this layer will provide the functionality of banking functions such as
opening an account, transferring of balance from one account to another,
Calculation of taxes etc.
Data Layer
It is concerned with the management of the data & data sources of the system. Data sources can be
database, XML, web services, flat file etc. Encapsulates data retrieval & storage logic For example, the
address book application needs to retrieve all person records from a database to display them to the user.
Tiers
As mentioned, layers help in building a tiered architecture. Like layers, there is no restriction on using
number of tiers. An application can be based on Single-tier, Two-tier, Three-tier or N-Tier (application
which have more than three tiers). The choice of using a tiered architecture is contingent to the business
requirements and the size of the application etc.
Tiers are physically separated from each other. Layers are spread across tiers to build up an application.
Two or more layers can reside on one tier. The following figure presents a three-tier architectural view of
an application.
The server machine can consist on a single server machine or more. Therefore, it is possible web server is
running on one server machine while application server on another. Web server is used to execute web
pages like JSPs whereas application server is used to run special business objects like Enterprise
JavaBeans (discussed later). The web layer and applications server can be on two separate machines or
they can be on same tier as shown in the diagram
© Copyright Virtual University of Pakistan
321
Web Design & Development – CS506 VU
The client tier represents the client mThe database server is often running on a separate tier, i.e. DB
machine often called Enterprise information tier.
On business layer, JavaBeans (also referred as Plain Old Java Objects (POJO) ) can be used. While moving
towards a bigger architecture, the J2EE provides the special class that fits in business layer i.e. Enterprise
JavaBean (EJB).
EJBs are special java classes that are used to encapsulate business logic. They provide additional benefits in
building up an application such as scalability, robustness, scalability etc.
On data layer, Data Access Objects (DAO) can be used. Similarly you can use connectors. There are other
different
specialized
components
provided in java
that ease the
development of
data layer.
J2EE Multi-
Tiered
Applications
In a typical J2EE
Multi-Tiered
application, a
client can either
be a swing based
application or a
web based. As
you can see in the
following figure,
clients can access
the web server from behind the firewall as well.
© Copyright Virtual University of Pakistan
322
Web Design & Development – CS506 VU
Suppose, our client is HTML based. Client does some processing on HTML and transports it to web server.
JSP and Servlets are possible technologies that can be used in a web server. However, there are some
Frameworks such as JSF etc that can be used in a web server. The classes which form the presentation layer
reside on web server and of course controllers are also used over here.
If web server, wants to perform some business process, it usually gets help from some business layer
components. The business layer component can be a simple JavaBean (POJO) but in a typical J2EE
architecture, EJBs are used. Enterprise JavaBeans interacts with the database or information system to store
and retrieve data.
EJBs and JSP/Servlets works in two different servers. As you already know, JSP and Servlets runs in a web
server where as EJBs requires an application server. But, generally application server contains the web
server as well.
Application server including web server generally resides on a single tier (machine), which is often called
middle tier. This tier stores and retrieves data from the Enterprise Information Tier (EIS) which is a
separate tier. The response sends back to the client by the middle tier can be HTML, XML etc. This
response can be seen on the separate tier know as client tier.
Problem Statement
. Calculate product of two matrices of order 2 * 2
. Result of multiplication should be stored in DB as well as shown to the user.
Format
. Input format
-input will be in 4,2,6,5 format separated by commas where 4,2 represents entries of the first row
. Display format
-Displays the matrix as a square
. Storage format for DB
-Matrix will be stored as a string in the database along with the order of the matrix
-The following figure shows the table design that will be used to store the results.
The data layer has a class MatrixDAO that is used to save the matrix result into database. As mentioned in
the problem statement, that resultant matrix should be saved in the database. So, MatrixDAOis used to
accomplish that.
MatrixDAO called by the MatrixMultiplier, a business layer class. The functionality list of
MatrixMultiplier includes:
Converting the user input string (e.g.2, 3, 4, 1) into a proper object i.e. a matrix
data structure.
Helps in calculating product of two matrices
Controller layer’s class ControllerServlet calls the MatrixMultiplier. This layer calls the various business
methods (like multiplication of two matrices) of business layer class and got the resultant matrix.
Furthermore, ControllerServlet sends the output to the matrixresult.jsp and receives the input from
matrixinput.jsp.
The MatrixBean representing matrix data structure, as you can see in the figure is used across several
layers. In fact, the object formed by MatrixMultiplier from a user input string is of MatrixBean type. It is
used to transfer data from one layer to another.
First, look on the MatrixBean code given below:
MatrixBean
package bo;
import java.io.*;
public class MatrixBean implements Serializable{
matrixinput.jsp
This JSP is used to collect the input for two matrices in the form of string such as 2,3,5,8. The data will be
submitted to ControllerServlet from this page.
<html>
<body>
<h2>
Enter Two Matrices of order 2 * 2 to compute Product
</h2>
<h3>
<%-- “controller” is an alias/URL pattern of ControllerServlet -%>
First Matrix:
<input type="text" name = "firstMatrix" /> E.g. 2,3,4,1
<br/>
Second Matrix:
<input type="text" name = "secondMatrix" />
<br/>
<input type = "submit" value = "Calculate Product" />
</form>
</h3>
© Copyright Virtual University of Pakistan
325
Web Design & Development – CS506 VU
</body>
</html>
ControllerServlet
This servlet acting as a controller receives the input from matrixinput.jsp. Furthermore, it will interact with
the business layer class MatrixMultiplier to convert the string into a MatrixBean object, and to multiply two
matrices.
package controller;
import bl.*;
import bo.* ;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
processRequest(request, response);
}
processRequest(request, response);
}
} // end ControllerServlet
MatrixMultiplier
The business layer class that’s primary job is to calculate product of tow matrices given in the form of
MatrixBean. This class also has a method convertToObject that takes a String and returns back a
MatrixBean object. MatrixMultiplier will also interact with the data layer class MatrixDAOto store results
in the database.
package bl;
import bo.*;
import dal.*;
}
} // end MatrixMulitplier
MatrixDAO
As class name depicts, it is used to store product results into database. Let’s look on the code to see how it
is accomplished.
package dal;
import java.util.*; import java.sql.*;
import bo.*; public class MatrixDAO{
private Connection con;
// constructor public MatrixDAO() throws ClassNotFoundException , SQLException {
establishConnection();
}
// method used to establish connection with db private void establishConnection() throws
ClassNotFoundException , SQLException {
// establishing conection
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String conUrl = "jdbc:odbc:MatrixDSN";
con = DriverManager.getConnection(conUrl);
}
} // end finalize
} // end MatrixDAO class
matrixresult.jsp
Used to display resultant product of two matrices. The code is given below:
<%-- importing “bo” package that contains MatrixBean -%>
<%@ page import="bo.*"%>
<html>
<body>
</TR>
<TR>
<TD> <%= matrix[1][0] %> </TD>
<TD> <%= matrix[1][1] %> </TD>
</TABLE>
</body>
</html>
© Copyright Virtual University of Pakistan
329
Web Design & Development – CS506 VU
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name> ControllerServlet </servlet-name>
<servlet-class> controller.ControllerServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> ControllerServlet </servlet-name>
<url-pattern> /controller </url-pattern>
</servlet-mapping>
</web-app>
References:
. Java A Lab Course by Umair Javed.
. Java Passion by Sang Shin
Lesson 42
Expression Language
Sun Microsystems introduced the Servlet API, in the later half of 1997, positioning it as a powerful
alternative for CGI developers who were looking around for an elegant solution that was more efficient and
portable than CGI (Common Gateway Interface) programming. However, it soon became clear that the
Servlet API had its own drawbacks, with developers finding the solution difficult to implement, from the
perspective of code maintainability and extensibility. It is in some ways, this drawback that prompted the
community to explore a solution that would allow embedding Java Code in HTML – Java Server Pages
(JSP) emerged as a result of this exploration.
Java as the scripting language in JSP scares many people particularly web page designers which have
enough knowledge to work with HTML and some scripting language, faced lot of difficulties in writing
some simple lines of java code. Can we simplify this problem to ease the life of web designer? Yes, by
using Expression Language (EL).
JavaServer Pages Standard Tag Library (JSTL) 1.0 introduced the concept of the EL but it was constrained
to only the JSTL tags. With JSP 2.0 you can use the EL with template text.
Note: - JSTL will be discussed in the following Handout.
Overview
The Expression Language, not a programming or scripting language, provides a way to simplify
expressions in JSP. It is a simple language that is geared towards looking up objects, their properties and
performing simple operations on them. It is inspired form both the ECMAScript and the XPath expression
language.
Contrary to the above figure, have a look on the subsequent figure that gives you a hint how useful EL can
be?
Person Name: $ { p.name }
…
<c:if test = “$ {p.address == param.add }” >
$ { validExpression }
The valid expressions can consist on these individuals or combination of these given below:
Literals
Operators
Variables (object references)
Implicit call to function using property name
EL Literals
The list of literals that can be used as an EL expression and their possible values are given in the tabular
format below:
Literals Literal Values
Null Null
Examples of using EL literals are: . ${ false } <%-- evaluates to false --%> . ${ 8*3 } <%-- evaluates to 24
--%>
EL Operators
The lists of operators that can be used in EL expression are given below:
Type Operator
Arithmetic + -* / (div) % (mod)
Grouping ()
Relational == (eq) != (ne) < (lt) > (gt) <= (le) >= (ge)
Conditional ?:
EL Identifiers
Identifiers in the expression language represent the names of objects stored in one of the JSP scopes:
page, request, session, or application. These types of objects are referred to scoped variables throughout
this handout.
EL has 11 reserved identifiers, corresponding to 11 implicit objects. All other identifiers assumed to refer
to scoped variables.
EL implicit Objects
The Expression Language defines a set of implicit objects given below in tabular format:
Category Implicit Object Operator
The context for the JSP page, used to access the JSP
JSP pageContext implicit objects such as request, response, session,
out, servletContext etc.
${ cookie.name.value } -Returns the value of the first cookie with the given
.
name
-Equivalent to if (cookie.getName().equals(“name”){ String val =
cookie.getValue(); }
EL Identifiers (cont.)
We had started our discussion on EL identifiers. Let’s find out how these identifiers (variables) can be
stored/retrieved in/from different scopes.
Storing Scoped Variables
By using java code, either in pure servlet or in a scriptlet of JSP, we can store variables in a particular
scope. For example,
. Storing a variable in session scope using Java code
Assume that we have PersonInfo class and we want to store its object pin session scope then we can write
the following lines of code to accomplish that:
For the following lines of code, assume that request is of HttpServletRequest type. To store PersonInfo
object p in request scope, we’ll write:
You must be thinking of some another method (with which you are already familiar) to store a variable in a
scope, certainly by using JSP action tags, we learned how to store a variable in any particular scope.
If we want to store p of type PersonInfo in request scope by using JSP action tags, then we’ll
write:
<jsp:useBean id=”p” class=”PersonInfo” scope=”request”/>
Later, you can change the properties of object p by using action tag as well. For example
<jsp:setProperty name=“p” property=“name” value=“ali” />
in page scope,
then in request scope,
then in session scope
and finally in application scope
Then EL searches for p first in page scope, then in request scope, then in session scope where it found p.
After that it calls p.getName() method. This is also shown in pictorial form below:
EL Accessors
The dot (.) and bracket ([ ]) operator let you access identifies and their properties. The dot operator
typically used for accessing the properties of an object and the bracket operator is generally used to retrieve
elements of arrays and collections.
. Dot (.) operator
Assume that JavaBean PersonInfo has name property and its object person is stored in some scope.
Then to access the name property of person object, we’ll write the following expression using EL:
The EL accesses the object’s properties using the JavaBeans conventions therefore getName() must be
defined in PersonInfo. Moreover, if property being accessed itself an object, the dot operator can be applied
recursively. For example
${user. address. city}
. Bracket ([ ]) operator
This operator can be applied to arrays & collections implementing List interface e.g. ArrayList etc.
Moreover, this operator can also be applied to collections implementing Map interface e.g. HashMapetc.
EL – Robust Features
Some powerful characteristics of Expression Language are:
Multiple expressions can be combined and intermixed with static text. For example
© Copyright Virtual University of Pakistan
336
Web Design & Development – CS506 VU
${person.name}
Assume that person is null, then no exception would be thrown and the result would also be null.
Using Expression Language
Expression Language can be used in following situations
As attribute values in standard & custom actions. E.g.
<jsp:setProperty id = “person” value = ${….} />
In template text – the value of the expression is inserted into the current output. E.g.
<h3> $ { …… } </h3>
With JSTL (discussed in the next handout)
Example Code: AddressBook using EL
So far, we have shown you implementation of AddressBook example in number of different ways. This
time EL will be incorporated in this example. AddressBook code example consists on searchperson.jsp,
showperson.jsp, ControllerServlet, PersonInfo and PersonDAO classes. Let’s look on the code of each of
these components:
PersonInfo.java
The JavaBean used to represent one person record.
package vu;
import java.io.*;
public class PersonInfo implements Serializable{
// no argument constructor
public PersonInfo() {
name = "";
address = "";
phoneNum = 0;
}
// setters
public void setName(String n){
name = n;
}
// getters
public String getName( ){
return name;
}
}
PersonDAO.java
It is used to retrieve/search person records from database.
package vu; import java.util.*; import
java.sql.*; public class PersonDAO{
private Connection con;
// constructor
establishConnection();
}
while ( rs.next() ) {
© Copyright Virtual University of Pakistan
338
Web Design & Development – CS506 VU
name = rs.getString("name");
add = rs.getString("address");
pNo = rs.getInt("phoneNumber");
</TD>
</TR>
</TABLE>
</FORM>
</center>
</body>
</html>
ControllerServlet.java
The Controller Servlet receives request from searchperson.jsp and after fetching search results from
database, forwards the request to showperson.jsp.
package controller;
© Copyright Virtual University of Pakistan
339
Web Design & Development – CS506 VU
import vu.*;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ControllerServlet extends HttpServlet {
} // end processRequest()
processRequest(request, response);
}
// defined below
searchPerson(request, response);
} // end ControllerServlet
protected void searchPerson(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
try {
// creating PersonDAO object
PersonDAO pDAO = new PersonDAO();
RequestDispatcher rd = request.getRequestDispatcher("showperson.jsp");
rd.forward(request, response);
} // end searchPerson
showperson.jsp
This page is used to display the search results. To do so, it reclaims the stored ArrayList (personList) from
the request scope. Furthermore, this page also uses the Expression Language to display records.
</TR>
<%-- start of scriptlet --%>
<%
// retrieving ArrayList from request scope
ArrayList personList =(ArrayList)request.getAttribute("plist");
PersonInfo person = null;
for(int i=0; i<personList.size(); i++) {
person = (PersonInfo)personList.get(i);
request.setAttribute("p", person);
%>
<%-- The following expressions are now replaced by EL statements written above--%>
person.getPhoneNum()%> --%>
</TR>
<%
} // end for
%>
</TABLE >
</center>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<servlet>
<servlet-name> ControllerServlet </servlet-name>
<servlet-class> controller.ControllerServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> ControllerServlet </servlet-name>
<url-pattern> /controllerservlet </url-pattern>
</servlet-mapping>
</web-app>
References:
. Java A Lab Course by Umair Javed.
. Expression Language Tutorial by Sun
http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html
The JSTL Expression Language by David M. Geary
http://www.informit.com/articles/article.asp?p=30946&rl=1
Lesson 43
JavaServer Pages Standard Tag Library (JSTL)
Introduction
The JSP Standard Tag Library (JSTL) is a collection of custom tag libraries that implement general-
purpose functionality common to Web applications, including iteration and conditionalization, data
management formatting, manipulation of XML, and database access. Like JSP, JSTL is also a specification
not an implementation. The development theme of JSTL is “scriptlet free JSP”.
These tag libraries provide a wide range of custom action functionality that most JSP authors have found
themselves in need of in the past. Having a defined specification for how the functionality is implemented
means that a page author can learn these custom actions once and then use and reuse them on all future
products on all application containers that support the specification. Using the JSTL will not only make
your JSPs more readable and maintainable, but will allow you to concentrate on good design and
implementation practices in your pages.
JSTL & EL
JSTL includes supports for Expression Language thus EL can be used to specify dynamic attribute values
for JSTL actions without using full-blown programming language. Prior to JSP 2.0, EL can only be used in
attributes of JSTL tags but EL now becomes a standard part of JSP 2.0. This allows the use of EL anywhere
in the document.
Functional Overview
As mentioned, JSTL encapsulates common functionality that a typical JSP author would encounter. This
set of common functionality has come about through the input of the various members of the expert group.
Since this expert group has a good cross-section of JSP authors and users, the actions provided in the JSTL
should suit a wide audience. While the JSTL is commonly referred to as a single tag library, it is actually
composed of four separate tag libraries:
Core - contains tags for conditions, control flow and to access variables etc.
XML manipulation - contains tags for XML parsing and processing
SQL - contains tags for accessing and working with database.
Internationalization and formatting - contains tags to support locale messages, text, numbers and
date formation
Twin Tag Libraries
JSTL comes in two flavors to support various skill set personal
Expression Language (EL) version
- Dynamic attribute values of JSTL tags are specified using JSTL expression language (i.e.
${expression})
- The EL based JSTL tag libraries along with URIs and preferred prefixes are given below
in tabular format
Core http://java.sun.com/jsp/jstl/core c
XML http://java.sun.com/jsp/jstl/xml x
Using JSTL
As we discussed earlier, JSTL includes four standard tag libraries. As is true with any JSP custom tag
library, a taglib directive must be included in any page that you want to be able to use this library's tags.
For example, to use EL based core tag library, the taglib directive appears as:
<%@taglib prefix=“c” uri=http://java.sun.com/jsp/jstl/core %>
And to use RT based core tag library, the taglib directive appears as:
<%@taglib prefix=“c_rt” uri=http://java.sun.com/jsp/jstl/core_rt %>
c:set
Provides a tag based mechanism for creating and setting scope based variables. Its syntax is as follows:
<c:set var=“name” scope = “scope” value = “expression” />
Where the var attribute specifies the name of the scoped variable, the scope attribute indicates which scope
(page | request | session | application) the variable resides in, and the value attribute specifies the value to be
bound to the variable. If the specified variable already exists, it will simply be assigned the indicated value.
If not, a new scoped variable is created and initialized to that value.
The scope attribute is optional and default to page.
Three examples of using c:set are given below. In the first example, a page scoped variable “timezone” is
set to a value“Asia / Karachi”.
<c:set var=“timezone” value=“Asia/Karachi” />
In the second example, a request scoped variable “email” email is set to a value “[email protected]”
<c:set var=“email” scope=”request” value=“[email protected]” />
In the third example, a page scoped variable “email” is set to value of request parameter “email” by using
paramimplicit object. If email parameter is defined in JSP page as:
<input type=”text” value = “email” />
© Copyright Virtual University of Pakistan
344
Web Design & Development – CS506 VU
And of course, these beans and maps must be stored in some scope prior to any attempt is made to change
their properties.
For example, consider the following snippet of code that stores PersonInfo’s object person into request
scope using <jsp:useBean … /> tag. Then using c:set tag, person’s name property is set to “ali”.
<jsp:useBean id=“person” class=“vu.PersonInfo” scope=“request” />
<c:set target=“person” property =“name” value = “ali” />
c:out
A developer will often want to simply display the value of an expression, rather than store it. This can be
done by using c:out core tag, the syntax of which appears below:
<c:out value = “expression” default = “expression” />
This tag evaluates the expression specified by its value attribute, and then prints the result. If the optional
default attribute is specified, the c:out action will print its (default) value if the value attribute's expression
evaluates either to null or an empty String. This tag is equivalent to JSP expression i.e. <%=expression %>.
Consider the following examples in which the usage of c:out tag has shown. In the first example, string
“Hello” would be displayed
c:out value = “Hello” />
In the second example, if request parameter num evaluates to null or an empty string then default value “0”
would be displayed.
c:remove
As its name suggests, the c:removeaction is used to delete a scoped variable, and takes two attributes. The
var attribute names the variable to be removed, and the optional scope attribute indicates the scope from
which it should be removed and defaults to page.
For example, to remove a variable named square from page scope, we’ll write:
<c:remove var = “square” />
And if variable email is required to be removed from request scope, then c:remove tag will look like:
© Copyright Virtual University of Pakistan
345
Web Design & Development – CS506 VU
c:forEach
In the context of Web applications, iteration is primarily used to fetch and display collections of data,
typically in the form of a list or sequence of rows in a table. The primary JSTL action for implementing
iterative content is the c:forEach core tag. This tag supports two different styles of iteration:
Iteration over an integer range (like Java language's for statement)
Iteration over a collection (like Java language's Iterator and Enumeration classes).
When you use this form of the c:forEach tag, the items attribute is the only required attribute. The value of
the items attribute should be the collection/array over whose members the iteration is to occur, and is
typically specified using an EL expression. If a variable name is also specified using var attribute, then the
named variable will be bound to successive elements of the collection for each iteration pass.
For example, to iterate over a String array (messages) using java code, we used to write in JSP:
<%
for(int i=0; i<messages.length; i++) {
String msg = messages[i];
%>
<%= msg %>
<%
} // end for
© Copyright Virtual University of Pakistan
346
Web Design & Development – CS506 VU
%>
This can be done using c:forEach tag in much simpler way as shown below:
<c:forEach var=“msg” items=“${messages}” >
<c:out value= “${msg}” />
</c:forEach>
Similarly, to iterate over a persons ArrayList that contains PersonInfo objects, we used to write in JSP:
<%
ArrayList persons = (ArrayList)request.getAttribute(“pList”);
for(int i=0; i<persons.size(); i++)
{
PersonInfo p == (PersonInfo)persons.get(i);
String name = p.getName();
%>
<%= name %>
<%
} // end for
%>
Indeed, the above task can be achieved in much simpler way using c:forEach tag as shown below:
<c:forEach var=“p” items=“${persons}” >
<c:out value= “${p.name}” />
</c:forEach>
The c:forEach tag processes each element of this list(persons) in turn, assigning it to a scoped variable
named p. Note that typecast is also not required.
Furthermore, you can use the begin, end, and step attributes to restrict which elements of the collection are
included in the iteration.
c:if
Like ordinary Java’s if, used to conditionally process the body content. It simply evaluates a single test
expression and then processes its body content only if that expression evaluates to true. If not, the tag's
body content is ignored. The syntax for writing c:iftag is:
<c:if test= “expression” >
Body Content
</c:if>
For example, to display a message “a equals b” if two strings a & b are equal, the c:if tag is used as:
<c:if test= “${a == b}” >
<h2> A equals B </h2>
</c:if>
c:choose
c:choose the second conditionalization tag, used in cases in which mutually exclusively test are required to
determine what content should be displayed. The syntax is shown below:
<c:choose>
<c:when test= “expression” >
Body content
</c:when>
……………
<c:otherwise >
Body content
</c:otherwise>
</c:choose>
Each condition to be tested is represented by a corresponding <c:when> tag, of which there must be at least
one. Only the body content of the first <c:when> tag whose test evaluates to true will be processed. If none
of the <c:when> tests return true, then the body content of the <c:otherwise>tag will be processed.
Note, though, that the <c:otherwise> tag is optional; a <c:choose> tag can have at most one nested
<c:otherwise> tag. If all <c:when> tests are false and no <c:otherwise> action is present, then no
<c:choose> body content will be processed.
The example code given below illustrates the usage of c:choose tag in which two strings a & b are
compared and appropriates messages are displayed:
<c:choose>
<c:when test= “a == b” >
<h2> a equals b</h2>
</c:when>
<c:when test= “a <= b” >
<h2> a is less than b</h2>
</c:when>
<c:otherwise >
<h2> Don’t know what a equals to </h2>
</c:otherwise>
</c:choose>
If you are using netBeans 4.1 IDE then you have to add JSTL library to your project manually. To do so,
right click on the libraries folder, you can find it under project’s name and select the Add Library option.
This is also shown in the following figure:
The Add Library dialog box opens in front of you. Select JSTL 1.1 option and press Add Library button.
Now you can refer to any JSTL library in your JSPs.
Note: Remember that the JSTL 1.1 library is only added to current project. You have to repeat this step for
each project in which you want to incorporate JSTL.
PersonInfo.java
The JavaBean used to represent one person record.
package vu;
import java.io.*;
public class PersonInfo implements Serializable{
private String name;
private String address;
private int phoneNum;
// no argument constructor
public PersonInfo() {
name = "";
address = "";
phoneNum = 0;
}
// setters
public void setName(String n){
name = n;
}
public void setAddress(String a){
address = a;
© Copyright Virtual University of Pakistan
349
Web Design & Development – CS506 VU
}
public void setPhoneNum(int pNo){
phoneNum = pNo;
}
// getters
public String getName( ){
return name;
}
public String getAddress( ){
return address;
}
public int getPhoneNum( ){ return phoneNum;
}
}
Lesson 44
Client Side Validation & JavaServer Faces (JSF)
In this handout, we’ll talk about client side validation and also learn about growing in demand Java
technology i.e. JSF. First start with client side validation
Forms validation on the client-side is essential --it saves time and bandwidth, and gives you more options
to point out to the user where they've gone wrong in filling out the form. Furthermore, the browser doesn't
have to make a round-trip to the server to perform routine client-side tasks. For example, you wouldn't want
to send the browser to the server to validate that all of the required fields on a form were filled out.
Any scripting language can be used to achieve the said objective. However, JavaScript and VBScript are
two popular options
For example on the following form, we want to make sure that text filed for name should not be left empty
and age field does not contain any negative value. To accomplish this we’ll use JavaScript.
If user forgets to provide name and/or enters a negative value, a message would be displayed to the user
that indicates what was went wrong? However, if user conforms to requirements, he/she would be taken to
another page that displays a greeting message.
Note: In this example, JavaScript semantics isn’t discussed over here as I am assuming that you might be
familiar with some scripting language. Otherwise, www.w3schools.com is an excellent resource to
learn about scripting languages
The code that is used to generate this page is given below:
<HTML>
<HEAD>
<!— start of scripting code and mentioning type -->
<!— checking the value of the name field, if it is left empty then displaying a message -->
if (thisform.name.value == null || thisform.name.value == "")
{
alert("Username is required");
return false;
}
<!— if value of age is negative, displaying a message -->
if (thisform.age.value < 0 )
{
alert("Age can't be negative");
return false;
}
} // end of function
<BR/> <BR/>
</FORM>
</BODY>
</HTML>
JSF technology simplifies building the user interface for web applications. It does this by
providing a higher-level framework for working with your web applications. Some distinct
© Copyright Virtual University of Pakistan
352
Web Design & Development – CS506 VU
features will be discussed provided by this technology. To begin with, have a look on some
popular existing frameworks
Tapestry
Another popular framework that is extensively used in the industry is Tapestry. It has
almost similar sort of problems as with Struts.
JavaServer Faces
A framework which provides solutions for:
Representing UI components
Managing their state
Handling events
Input validation
Data binding
Automatic conversion
Defining page navigation
Supporting internationalization and accessibility.
If you are familiar with Struts and Swing (the standard Java user interface framework for desktop
applications), think of JavaServer Faces as a combination of those two frameworks. Like Swing,
JSF provides a rich component model that eases event handling and component rendering; and
like Struts, JSF provides Web application lifecycle management through a controller servlet
JSF UI Components
And some open course JavaServer Faces components are also available like:
A JSF application works by processing events triggered by the JSF components on the pages. These events
are caused by user actions. For example, when the user clicks a button, the button triggers an event. You,
the JSF programmer, decide what the JSF application will do when a particular event is fired. You do this
by writing event listeners. In other words, a JSF application is event-driven
For example, if you write a JSF code to create a button, you will write:
<h:commandButton value="Login“
actionListener=“#{customer.loginActionListener}”
action=“#{customer.login}” />
The value attribute specifies the text that appeared on the face of a button, the actionListener attributes
specifies to call the loginActionListener method written somewhere in a Customer class if an event is
triggered and on which to go next, is decided by the login method of Customer class and given as a value of
action attribute. The method specified in action attribute should return a String value as the returned
Stringvalue is used in page navigation.
Note: Many IDE provides visual support for JSF so you can drag and drop components instead of writing
tedious coding for defining JSF components as shown above. Sun Studio Creator® is a free open
source IDE that provides visual support for JSF and can be downloaded form Sun site. The code
examples are also built using this IDE.
Validators make input validation simple and save developers hours of programming. JSF provides a set of
validator classes for validating input values entered into input components. Alternatively, you can write
your own validator if none of the standard validators suits your needs. Some built-in validators are:
DoubleRangeValidator
Any numeric type, between specified maximum and minimum values
LongRangeValidator
Any numeric type convertible to long, between specified maximum and minimum values
LengthValidator
Ensures that the length of a component's local value falls into a certain range (between minimum
& maximum). The value must be of String type.
The example code (“hello user 2”) is given along with the handout. You can open it using Sun Studio
Creator IDE. It is strongly advised that you must see the lecture video in order to learn how this example is
built.
It is actually a modified version of the last example. This time, we’ll make sure that user couldn’t left blank
the name field and must enter a name between ranges of 2 to 10 characters. If any condition fails, an
appropriate message would be displayed.
© Copyright Virtual University of Pakistan
355
Web Design & Development – CS506 VU
These are JavaBeans defined in the configuration file and are used to hold the data from JSF components.
Managed beans represent the data model, and are passed between business logic and pages. Some other
salient features are:
Use the declarative model
Entry point into the model and event handlers
Can have beans with various states
Here is an example of a managed-bean element whose scope is session, meaning that an instance of this
bean is created at the beginning of a user session.
<managed-bean>
<managed-bean-name>myBean</managed-bean-name>
<managed-bean-class>myPackage.MyBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope> </managed-bean>
The syntax of binding expressions is based on the JavaServer Pages (JSP) 2.0 Expression Language. In
JSP, expressions are delimited with "${}", but in JSF they are delimited with "#{}".
Page navigation determines the control flow of a Web application. JSF provides a default navigational
handler and this behavior can be configured in configuration. However, you can do it visually in most tools
like Sun Studio Creator
Note: We have quickly breezed through the JSF technology essentials due to shortage of time. You must
explore it by yourself to excel on it. You can find the resources in the last handout to acquire further skills.
References:
Lesson 45
JavaServer Faces
In the last lecture, we have covered the basic nutshells of JSF. Having a belief on “learning by doing”, in
this lecture another example is also given to show you the capabilities of JSF.
Web Services
In the remaining handout, we’ll take an overview of web services’ potential, their types and working
model. Resources are given at the end for those who are interested in learning new technologies.
Introduction
Web services are Web-based enterprise applications that use open, XML-based standards and transport
protocols to exchange data with calling clients.
Web Service is becoming one of those overly overloaded buzzwords these days. Due to their increasing
popularity, Java platform Enterprise Edition (J2EE) provides the APIs and tools you need to create and
deploy interoperable web services and clients.
In the beginning, things were built and deployed typically in the form of client and server model in which
clients talk to a single server, for example, remote procedure calls (RPC).
The second phase can be called web-based computing in which many clients talk to many servers through
the net. In this phase, communicating partners still have to go through some pre-arrangement in terms of
what common object model they have to use or what common communication protocol they have to agree
upon.
Finally, the web services model in which service users and service providers can be dynamically connected.
And the pretty much every computing device and application participates as both service user and service
provider.
Interoperable
Connect across heterogeneous networks using ubiquitous web-based standards
Economical
Recycle components, no installation and tight integration of software
Automatic
No human intervention required even for highly complex transactions
Accessible
Legacy assets & internal apps are exposed and accessible on the web
Available
Services on any device, anywhere, anytime
Scalable
No limits on scope of applications and amount of heterogeneous applications
Data providers
For example, a service providing stock quotes
Web Service Description Language (WSDL pronounced as viz-dal) is industry agreed upon
XML language that can be used to describe web service. It provides XML format for
describing web services in terms of methods, properties, data types and protocols.
Service Registration (Publication) and Discovery There has to be registry by which a service can
be published and discovered.
Universal Description, Discovery & Integration (UDDI), a way to publish and find web services.
A repository of web services on the internet where a machine or a human can find different web
services. www.uddi.org
Service Invocation Then there has to be standard way of invoking a service. Finally, for business
transactions in which secure and reliable message delivery is important, there has to be a standard
electronic business framework.
The following figure represents simplified web service architecture and summarizes the working of web
services:
References:
Java A Lab Course by Umair Javed
Web services overview by sang shin
Resources:
http://www.apl.jhu.edu/~hall/java/
http://java.sun.com
http://www.javaworld.com
http://www.theserverside.com
http://www.jsfcentral.com
http://www.jspolympus.com
http://www.onjava.com
© Copyright Virtual University of Pakistan
359