Java - All in One (FAQs)
Java - All in One (FAQs)
Language:
1) What are the differences between the == operator and the equals() method?
Well, first off, == is a fundamental operator in the language. The result type of the
expression is a boolean. For comparing boolean types, it compares the operands for the same
truth value. For comparing reference types, it compares the operands for the same reference
value (i.e., refer to the same object or are both null). For numeric types, it compares the
operands for the same integer value or equivalent floating point values.
You can, however, call System.gc(), which is a "hint" to the runtime engine that now
might be a good time to run the GC. Some implementations take that hint to heart and
some don't.
There are two primary axes of "inheritance" in object-oriented languages like Java.
"Implementation" inheritance is where the sub-class inherits the actual code implementation
from the parent. "Interface" inheritance is where the "sub-class" adheres to the public interface
of the "parent".
Alas, Java actually mixes the two notions together a bit... Java interfaces are nice and
clean -- when you "implement" an interface, you are stipulating that your class adheres
to the "contract" of the interface that you specified. Java class inheritance isn't so clean
-- when you sub-class in Java you are getting both the code inheritance but you are also
stipulating that your sub-class adheres to the "contract" of the interface of the parent
class.
Abstract classes in Java are just like regular Java classes but with the added constraint
that you cannot instantiate them directly. In terms of that added constraint, they are
basically classes which don't actually implement all of the code specified by their
"contract".
Page 1 of 138
So, it's generally considered good OO practice to specify the "contract" which you want
to adhere to via Java interfaces. Then use normal Java class inheritance primarily for
code reuse purposes. Use abstract Java classes when you want to provide some
standard base code but want/need to force the user's of your class to complete the
implementation (i.e., you create a skeleton implementation and the sub-classes must
flesh it out).
Instance variables have separate values for each instance of a class. Class
variables maintain a single shared value for all instances of the class, even if no
instance object of that class exists.
You would use the static keyword to change an instance variable into a class
variable.
Both instance and class variables are declared at the class level, not within
methods:
Note also that classes are loaded by classloaders therefore class variables are
unique on a per-classloader basis.
Overloaded methods are multiple methods in the same class that share the same
name but have different parameter lists. Overloaded methods cannot have the
same parameter lists with different return types.
When you declare a class to be final, it can never be subclassed. This is usually
done for security or performance reasons.
Page 2 of 138
7) What is a final method?
The classes in the java.lang package are so important that the compiler implicitly
imports all the classes there. This ensures classes in the unnamed package are
not accidently used instead of the key classes and interfaces.
9) Can I override a method that doesn't throw exceptions with one that does?
Overriding methods cannot change the signature of the overridden method. All
exceptions are included in the signature of the method except for
RunTimeException and it's subclasses. So, the only exceptions you may add to
an overriding method must be a (sub-class of) RunTimeException.
11) How do I have one thread wait for another thread to finish before continuing?
You can wait for a thread to finish by calling its join() method. For instance, in the
following code, the current thread will wait until thread2 finishes before printing
Done.
thread2.start();
// do more stuff here
thread2.join();
System.out.println("Done");
The signature of a method is the combination of the method's name along with
the number and types of the parameters (and their order).
Page 3 of 138
13) Why does "float f = 3.5;" generate a compile-time error?
The constant value 3.5 is recognized by the compiler to be a double rather than a
float. You must place an f after the 3.5 for it to be recognized as a floating point
constant value:
float f = 3.5f;
14) What is the difference between the & and && operators?
For integer arguments, the single ampersand ("&")is the "bit-wise AND" operator.
The double ampersand ("&&") is not defined for anything but two boolean
arguments.
For all other argument types and combinations, a compile-time error should
occur.
16) How is Java's "byte code" different from other codes (like source code, native code, etc.)?
Java's byte code is what the typical Java compilers create in the .class files. It is
a binary language that is defined for the Java Virtual Machine (JVM). The JVM is
the abstract machine which runs the byte codes (analogously to how an Intel
80386 runs .obj files).
Page 4 of 138
With one exception, anonymous classes cannot contain static fields, methods, or
classes. The only static things they can contain are static final constants.
18) When I create anonymous classes, what access modifier do they get?
Anonymous classes get the default, unnamed access modifier. You cannot make
them private, protected, public, or static.
Since anonymous classes don't have names, you cannot create a constructor by
just using the name of the class. What you can do instead is to use an "instance
initializer". Instance initializers basically look like methods with no names or
return values:
The most common use that I see for private (and protected) constructors
is in implementing singletons and some types of object factories. Basically, you
use a static method to manage the creation of one (or more) instances of the
class.
21) I'm trying to use an AWT List and the List collection in my program. How do I overcome the
class name conflict?
If you need only one definition but your type-import-on-demand (using import
xxx.yyy.*;) causes the conflict, use explicit import for the reference you need.
import java.awt.*;
import java.util.List; // if you need this List in your program.
If you need both in the same Java file, you will have to explicitly refer at least
one.
Page 5 of 138
import java.awt.*;
import java.util.List; // your can use "List" for this one.
....
java.awt.List myAwtList = new java.awt.List();
The simplest approach to deep cloning is to use Java serialization, where you
serialize and deserialize the object and return the deserialized version. This will
be a deep copy/clone, assuming everything in the tree is serializable. If
everything is not serializable, you'll have to implement the deep cloning behavior
yourself.
23) What are the differences between the built-in, primitive types (like int) and the equivalent,
non-primitive object-wrapper classes (like Integer)?
The elemental types (int, long etc.) are fundamental parts of the Java language -
they're reserved words. They directly represent a quantity, a character, etc.
The java.lang classes (e.g. Void, Integer, Long etc.) serve two functions - first,
they provide utility methods (generally static to those classes) for doing
commonplace tasks like turning an integer into a String and vice versa.
The second use for the java.lang classes is as a wrapper for the elemental types
- this is needed because Java represents all collections (other than arrays) in
terms of java.lang.Object - so e.g., a Vector can only contain objects, not
elemental types. If you wanted a Vector or Hashtable of ints, you'd have to wrap
Page 6 of 138
each int in a java.lang.Integer, and then unwrap the int when you retrieved values
from the collection.
Equally, if you wanted to define a method that returned either a String or an int,
you would define the function as returning a java.lang.Object; and then in
practice you'd return either a java.lang.String or a java.lang.Integer, as
appropriate.
24) In the main method of a class (or any static method), how can I find out what class I am in?
To get the Class object associated with that class, you have to reference the
name of the class directly and use the .class keyword. I.e., if your class is named
Foo use Foo.class to get the Class object for Foo.
25) How do I get a list of the files in a .zip file from Java?
A JAR file or Java ARchive is a way of bundling multiple files together as a single
file. Like a ZIP file, they support compression and retain the directory structure of
the files. They can be used for delivering things like JavaBeans and Applets, and
usually include support files like image and sound files, in addition to the actual
Java classes. In addition, they can be digitally signed so a user can grant
privileges to allow the software to perform operations not normally permitted from
untrusted software.
To create a JAR file, use the jar tool that comes with the JDK.
28) What are the differences between casting to String, using the toString() method, and using
the String.valueOf() method?
Page 7 of 138
Casting only transforms the reference to the object from one type to another.
Casting does nothing to the underlying object itself. The compiler and/or the
runtime engine will verify the fact that the reference that you're casting to a
reference to a String is, in fact, referring to an object which is (type compatible
with) a String.
The String.value() method allows for the creation of a String representation of the
built-in, primitive data types such as int, boolean, float, etc.
The .toString() method is a method which all Java classes inherit from the
java.lang.Object root class (and which many classes override). The .toString()
method of each class is supposed to create an appropriate String representation
of objects of that class.
29) What is the difference between a Java compiler and a Java interpreter?
Typically, when used in that generic manner, the term Java compiler refers to a
program which translates Java language source code into the Java Virtual
Machine (JVM) bytecodes. The term Java interpreter refers to a program which
implements the JVM specification and actually executes the bytecodes (and
thereby running your program).
30) Why are the methods wait() and notify() defined in the Object class when they are used
with Threads?
The wait() and notify() methods are object-specific. The wait() method suspends
the current thread of execution, and tells the object to keep track of the
suspended thread. The notify() method tells the object to wake up the suspended
threads that it is currently keeping track of. Since wait() and notify() are object
specific, they must be used within code that is synchronized on the object in
question.
It is also important to use state variables when using wait() and notify(), as
threads can be woken up by conditions other than notify().
suspend() is similar to wait() but does not add the thread to an object's wait list.
Page 8 of 138
Technically, the term "JVM" specifies the Java Virtual Machine. I.e., the "JVM" is
the definition of the abstract, stack-based computational engine used to execute
Java bytecodes. The term "JRE" stands for the Java Runtime Environment (if
you follow Sun's nomeclature) or, interchangeably, Java Runtime Engine. I.e., a
JRE is a specific implementation of the the JVM, including the core libaries.
Alas, in practice, many people use "JVM" for both cases. So, be careful to
understand the context that people are talking about when using the term "JVM"
to distinguish between the abstract definition and a specific implementation.
The "JDK" is the Java Development Kit. I.e., the JDK is bundle of software that
you can use to develop Java based software. The "JRE" is the Java Runtime
Environment. I.e., the JRE is an implementation of the Java Virtual Machine
which actually executes Java programs.
Typically, each JDK contains one (or more) JRE's along with the various
development tools like the Java source compilers, bundling and deployment
tools, debuggers, development libraries, etc.
34) What are the differences between checked and unchecked exceptions?
As per the dictionary, mutable objects are objects which can change their values
and immutable objects are objects which cannot have their values changed.
Page 9 of 138
36) Is it possible to start an application (from command line) from a method other than main?
No, it is not possible to start an application from a method other than main, as the
runtime system will look for a method i.e., public static void main. If the method is
not found we get an error by name java.lang.NoSuchMethodError.
On the other hand, "Java" is a programming language, core set of libraries, and
virtual machine platform that allows you to create compiled programs that run on
nearly every platform, without distribution of source code in its raw form or
recompilation. While the two share part of their names in common, they are really
two completely different programming languages/models/platforms. Yes, they
can communicate with each other through technologies like LiveScript. However,
you should really consider them as two completely separate technologies.
If the first four bytes of a file are not 0xCAFEBABE then you do not have a Java
class file. This testing is done as part of the first pass of the Java verifier.
40) What are the differences between PATH and CLASSPATH environment variables?
The PATH environment variable is typically something that the operating system
uses to find executable files. See the system manuals for your platform for more
information.
Page 10 of 138
41) Can a Java class be static?
Yes and no. The static modifier is only applicable to so-called member classes --
i.e., classes which are directly enclosed within another class.
If a subclass shares a method name with identical arguments and return type, it
overrides the method of its superclass. Overridden methods may differ in
exceptions thrown by throwing a more specific exception type or none at all.
43) How do I find out how much system memory is available in my system?
The Runtime class has two methods to help you determine memory resources:
freeMemory() and totalMemory(). The freeMemory() method reports the free
bytes in Java's memory space. The totalMemory() reports the total bytes in
Java's memory space.
44) What is the difference between the stream tokenizer and string tokenizer?
The StringTokenizer parses a string into a series of tokens. It is then your responsibility
to figure out what each token returned is, beyond the definition of a token separated by
delimiters. Usually, you just treat things as words when using StringTokenizer.
On the other hand, a StreamTokenizer allows you to ask is the next token a number,
word, quoted string, end-of-file, end-of-line, comment, or whitespace. In this case, the
StreamTokenizer is smarter, though can be considerably harder to use.
45) Can I override the equals() method to take a parameter other than Object?
If you are trying to override a method with a different argument list, that isn't overriding,
but overloading. In order for the method to be properly overridden, and thus called
appropriately, the subclass method signature must explicitly match that of the
superclass. In the case of equals() that means the return type must be boolean and the
argument must be Object.
Page 11 of 138
46) Should I declare the constants in my interface as public final static, and my methods as
public abstract?
The use of the these modifiers in interfaces is completely optional. The following
point out the relevant sections of the Java Language Specification:
• According to the section 9.1.5: All interface members are implicitly public.
• According to section 9.3: Every field declaration in the body of an interface is
implicitly public, static, and final
• According to section 9.4: Every method declaration in the body of an interface is
implicitly public and Every method declaration in the body of an interface is
implicitly abstract
47) Why doesn't the Java runtime complain if the main() method isn't declared public?
With Sun's reference implementation, they introduced this bug into the 1.2
implementation and haven't fixed it through the 1.3 release. The main() method is
supposed to be public static void but it seems any access modifier works fine.
As is the case with most things in life, I believe there are multiple reasons for why
we have so many programming languages. Here are what I believe to be the
more significant reasons:
• Programming languages vary with respect to the speed with which programs
written in them can be executed. So if you have a real-time application, you'd
choose a language that would be capable of delivering results under the
applicable time constraints. So for a problem in dynamic control, you might
choose, say, C over C++ or Java.
• Certain application domains require programming languages that are specifically
targeted for those applications. Cobol, for example, represents a language that
was developed specifically for business applications. It is easy to learn by people
without advanced degrees in computer science and it is efficient for what it was
designed to do.
• Much early programming dealt with solving numerically intensive problems, such
as problems encountered in scientific calculations. Fortran emerged as a favorite
of many for such applications. I believe it continues to be a widely used language
for solving numerically intensive problems on supercomputers.
• Many programming languages that have emerged from academic laboratories
are a result of researchers trying mimic certain aspects of human cognition.
Languages like Lisp and Prolog fall in this category.
• Another reason for why we have so many programming languages is purely
evolutionary. Consider, for example, the evolution from C to C++ and then on to
Page 12 of 138
Java. As it began to be realized that we needed richer representations for our
concepts and as we sought ways to make large programs more easily extensible
and maintainable, the concepts of object-oriented programming came into
existence. Then as we better understood what was meant by object-oriented
programming through pioneering languages like Smalltalk, C led to the
development of C++. And then as it dawned on us that the wide generality of
C++ (with regard to inheritance, operator overloading, and other issues) could
become a liability in some cases, Java emerged.
• As the role of computers as "information presentation devices" proliferated in the
society, there emerged a concomitant need for languages designed specifically
for formatting the visual display of information. Languages such as HTML, XML,
and their variants are fulfilling those needs.
The only relatively surefire way that I know of is to make the entire class final.
I.e., since there's no way to subclass that class then nobody can overload that
method.
A so-called marker interface is a Java interface which doesn't actually define any fields.
It is just used to "mark" Java classes which support a certain capability -- the class
marks itself as implementing the interface. For example, the java.lang.Cloneable
interface.
Basically, static blocks are blocks defined within the body of a class using the
static keyword but which are not inside any other blocks. I.e.,
Page 13 of 138
static
{
foo = 998877;
}
}
The primary use of static initializers blocks are to do various bits of initialization
that may not be appropriate inside a constructor such that taken together the
constructor and initializers put the newly created object into a state that is
completely consistent for use.
In contrast to constructors, for example, static initializers aren't inherited and are
only executed once when the class is loaded and initialized by the JRE. In the
example above, the class variable foo will have the value 998877 once
initialization is complete.
Note also that static initializers are executed in the order in which they appear
textually in the source file. Also, there are a number of restrictions on what you
can't do inside one of these blocks such as no use of checked exceptions, no use
of the return statement or the this and super keywords.
Personally, I think this is yet another odd little wart in the Java language that is
due to the fact that Java doesn't have first-class classes. Sigh.
53) Are classes that implement Serializable required to have no-argument constructors?
No. This is a common misconception. The deserialization process does not use
the object's constructor - the object is instantiated without a constructor and
initialized using the serialized instance data. The only requirement on the
constructor for a class that implements Serializable is that the first non-
serializable superclass in its inheritence hierarchy must have a no-argument
constructor. (See http://www.jguru.com/jguru/faq/view.jsp?EID=34802 for a more
complete explanation). This makes sense: deserialization needs to reconstruct
the entire object state, which includes the state of any superclasses. If the
superclass is not itself serializable, then deserialization needs to instantiate that
superclass from scratch - thus the requirement. For example, with the following
class:
Page 14 of 138
you do not need a no-argument constructor. MySerializableClass meets all
requirements because its first non-serializable superclass, Object, has a no-
argument constructor. In the following example:
All the requirements for an object that implements Serializable are listed at
http://www.jguru.com/jguru/faq/view.jsp?EID=31434.
A static method is simply a method that does not need an instance of a class to
execute.
Static methods are most useful as utility methods in classes that don't require
state. For example, the java.lang.Math class has several static methods that you
can call for calculations. No state is needed, so you don't need an instance of the
Math class to perform the methods.
You call static methods using the class name rather than an instance name. For
example
int x = Math.max(x,y);
Static methods are often used to access class variables. Class variables are
variables in the class that are declared static. There is only one instance of the
class variables on the system, so they make a great place to store constant
values, "global" counts, and singleton instances.
Page 15 of 138
private static int count = 0;
This allows reading and modification of the class variables while retaining control
of the values. Noone can directly access private class variables other than this
class, so you can restrict the types of updates (for example, only incrementing
the count).
Note that static methods cannot access any instance variables defined in the
object. Why? Because you don't have an instance of the object to know which
instance variables you want to access.
The methods are basically equivalent. Both suggest to the JRE that it might be a
good idea if the garbage collector actually does some work now.
While Timesteamp extends Date, it stores the fractional part of the time within
itself instead of within the Date superclass. If you need the partial seconds, you
have to add them back in.
Nothing. All interface's are, by definition, abstract. In fact, the JLS says that use
of the abstract modifier is obsolete and therefore should not be used in new
programs.
Page 16 of 138
58) Why is method invocation in Java polymorphic but field access isn't?
The designers of the Java programming language feel that the lack of dynamic
lookup on field accesses provides greater run-time efficiency. In addition, if
people want dynamic lookup on fields then they can easily use an accessor (aka
"getter") instance method instead of direct field access. I.e., they leave the
tradeoff up to the programmer.
In order for the Java Collections to work properly (and everything else in Java),
the equals() and hashCode() methods must be compatible. Here, compatible
means that if equals() reports that two instances are the same, then the
hashCode() of both instances must be the same value.
Use the getComponentType() method of the class of the object that is the array.
62) Does Java use pass by value or pass by reference semantics when passing parameters to
methods?
Page 17 of 138
Java passes parameters to methods using pass by value semantics. That is, a
copy of the value of each of the specified arguments to the method call is passed
to the method as its parameters.
Note very clearly that a lot of people confuse the "reference" terminology with
respect to Java's references to objects and pass by reference calling semantics.
The fact is, in dealing with Java's references to objects, a copy of the reference's
value is what is passed to the method -- it's passed by value. This is, for
example, why you cannot mutate the (original, caller's) reference to the object
from inside the called method.
An API is really no more than a set of method signatures and other information
necessary to use a class or set of classes. The API is totally distinct from the
implementation. For example, a number of vendors have implemented the servlet
API, each in a different way. The API by itself has no implementation.
TypeCasting is a feature of the language whereby you are telling the compiler
(and readers of your source code :-) that you explicitly want it to treat the object
as if it were really of the type that you specified rather than it's actual type.
Data conversion is physically changing one chunk of data into another, often with
interpretation.
Typecasting:
Page 18 of 138
Object o = new String("1234");
This allows you to cast the type of o to it's proper type, String.
Data conversion:
Integer i = Integer.parseInt(o);
This converts the String "1234" into the Integer which represents the value 1234
(one thousand two hundred twenty four).
65) Why does Java not support function/method pointers/references ala C/C++?
The Java, OO way of doing the equivalent is pass around an object reference
where that object adheres to a particular interface and so you can invoke the
appropriate methods.
Collections
Page 19 of 138
Enumeration enum = ...;
while (enum.hasMoreElements()) {
Object element = iterator.nextElement();
// process element
}
5) How do you store a primitive data type within a Vector or other collections class?
You need to wrap the primitive data type into one of the wrapper classes found in the java.lang
package, like Integer, Float, or Double, as in:
8) Which is the preferred collection class to use for storing database result sets?
When retrieving database results, the best collection implementation to use is the LinkedList.
The benefits include:
Retains the original retrieval order
Has quick insertion at the head/tail
Doesn't have an internal size limitation like a Vector where when the size is exceeded a new
internal structure is created (or you have to find out size beforehand to size properly)
Permits user-controlled synchronization unlike the pre-Collections Vector which is always
synchronized
Basically:
If there are multiple columns in the result set, you'll have to combine them into their own data
structure for each row. Arrays work well for that as you know the size, though a custom class
might be best so you can convert the contents to the proper type when extracting from
databse, instead of later.
Page 20 of 138
Why doesn't the Iterator interface extend the Enumeration interface?
If the Iterator interface extended the Enumeration interface, the Iterator interface would end up
with five methods where two methods just called other methods in the interface. The designers
of the framework wanted to get rid of the cumbersome Enumeration method names so had the
Iterator interface stand on its own with new shorter method names.
Arrays.sort(theArray);
If, however, it is an array of objects that don't implement the Comparable interface then you
need to provide a custom Comparator to help you sort the elements in the array.
13) What's the fastest way to traverse all the elements of a Vector?
If speed is of the essence, do not use a Vector. Instead, use an ArrayList. All accesses to a
Vector are synchronized, whether you need it or not. If you know you aren’t accessing the
structure from multiple threads, the ArrayList will be much faster.
Page 21 of 138
With that said, what about if you need to stay with a Vector? There are at least four ways to
traverse through all the elements of a Vector:
Using a for loop and accessing each element with elementAt(index) or get(index)
Using an Emumeration
Using an Iterator
Using an Enumeration/Iterator, but relying on an exception to catch ending
Of the four, there are neglible differences in performance. While looping through to a specific
index is a little faster, you lose the flexibility of changing to another data structure at a later
time. With the Enumeration / Iterator approach, there is the added cost to create the
Enumeration/Iterator to walk through. With the exception approach, you are relying on
NoSuchElementException to be thrown to catch the ending of the walk through. While creating
the exception takes time, this approach avoids the repeated test of hasMoreElement(). As the
structure gets larger, avoiding the test condition can save lots of time.
17) How can I process through the keys of a Hashtable in sorted order?
Page 22 of 138
In order to get all the keys for a Hashtable, you use the keys() method to get an Enumeration
or the keySet() method to get a Set. If you are using Java 2, and can use the collections
framework, what you should do is get the key set of the Hashtable and create a TreeSet from
it. You can then get an iterator() from the created TreeSet that will have the keys in order. If
you can't use the collections framework, you'll have the sort the Enumeration you get back
from keys() yourself.
20) What is the difference between a singly linked list and doubly linked list?
A singly linked list is one that has only a pointer/reference to the next element in the list. A
doubley linked list has both a previous and next pointer/reference.
In the context of Java collections, the polymorphic algorithms are all supplied by the
various static methods of the java.util.Collections class. Consider, for example, the
method sort( List list ). This method is capable of sorting any collection that has
implemented the List interface, and that includes containers of types ArrayList,
LinkedList, Vector, etc.
23) How do you control growth of vectors when their internal arrays are full?
Page 23 of 138
The vector constructor can include either an initial capacity or a capacity and growth
increment. When not specified, the initial size of the vector is 10 and growth will double when
necessary. Otherwise, initialize size and growth will grow when needed as specified by the
arguments to the constructor.
If the argument to the constructor is a collection, the initial size of the internal structure is 10%
larger than the collection. Since there is no second argument to control growth, the capacity
will double when necessary.
25) What is a weak reference and what are they used for?
Normally the Java garbage collector plays safe. It will only free up the memory used by an
object when that object can no longer be accessed by the program. Once an object become
impossible to reach it is eligible for collection, and eventually its memory will be reclaimed.
This eliminates one of the most common programming errors in some other languages (like
C++), where code accidentally tries to access an object that has been freed. Unfortunately it
can lead to another problem, where you leave open a potential access route to an object that
you don't need any more. Memory fills up, and the program slows down or reports an "Out of
Memory" error.
To avoid this, you can be very careful to close off access paths to an object once you have
finished using it. Java 2 introduces another alternative, the weak reference. Weak references
provide access to an object without preventing it from being freed. When you use a weak
reference you have to accept that the object referred to may have disappeared, which results
in the reference being automatically set to null. On the other hand, the weak reference will not
hold the object in memory once it is inaccessible via normal references (or via "soft" references
- see below). Weak references are not appropriate in all circumstances, but sometimes they
can make code easier to write and understand.
The most common use of weak references is indirect - they are used internally by the
WeakHashMap class. Like HashMap, WeakHashMap associates key objects with values.
However, once the key object becomes inaccessible via stronger references it becomes
eligible for garbage collection. When it is freed, the map entry magically disappears. The
assumption here is that if you are not using the key anywhere other than in the map you will
have no need to look it up, so it should be freed.
Other specialist references are soft references (which inhibit collection until memory runs
short), and phantom references (used for cleanup when objects are freed).
For more detailed (and precise) information, see the java.lang.ref API docs, and also the article
Reference Objects and Garbage Collection at the Sun website.
Another difference is that iterator in the HashMap is fail-safe while the enumerator for the
Hashtable isn't. If you change the map while iterating, you'll know.
And, a third difference is that HashMap permits null values in it, while Hashtable doesn't.
28) What are the differences between Vector and ArrayList? Which is best to use?
Vector and ArrayList are very similar. Both of them represent a 'growable array', where you
access to the elements in it through an index.
ArrayList it's part of the Java Collection Framework, and has been added with version 1.2,
while Vector it's an object that is present since the first version of the JDK. Vector, anyway, has
been retrofitted to implement the List interface.
The main difference is that Vector it's a synchronized object, while ArrayList it's not.
While the iterator that are returned by both classes are fail-fast (they cleanly thrown a
ConcurrentModificationException when the orignal object has been modified), the Enumeration
returned by Vector are not.
Unless you have strong reason to use a Vector, the suggestion is to use the ArrayList.
Threads
1) What is a thread?
A thread is a set of instructions executing apart from other threads (with its own
stack) but sharing the same memory space (with the same heap).
Creating a thread involves creating a new Thread and invoking its start() method.
Calling start() causes the run() method of the Thread subclass or the Runnable
object passed to the Thread constructor to execute.
Page 25 of 138
public void run() {
for (int i=0; i<100; i++) {
System.out.println("Tastes Great");
}
}
};
t1.start();
t2.start();
The static sleep() method of the Thread class will let your thread sleep for a set
number of milliseconds (or nanoseconds). When the thread wakes up, it will be
scheduled to execute in the future. It may not start executing immediately after
the timeout.
try {
Thread.sleep(3000); // 3 seconds
} catch (InterruptedException e) {
System.err.prinlnt("You interrupted me");
}
You can have another thread wake up the sleeping thread prematurely by calling
t.interrupt() (where "t" is a pointer to the thread object).
Note that since Thread.sleep is a static method, the following code will not do
what you expect it to:
Page 26 of 138
System.err.prinlnt("You interrupted me");
}
It will pause the current thread, meaning the thread executing the shown code,
not the child thread (t/MyThread).
5) How can one thread wait for another thread to die before it continues execution?
The thread's join() method allows you to wait for another thread to finish
execution.
6) What is the use of start () function in starting a thread? Why we do not use the run() funtion
directly to run the thread?
The start() method tells the Java Virtual Machine that it needs to create a system
specific thread. After creating the system resource, it passes the Runnable object
to it to execute its run () method. Calling the run() method directly has the
"Thread" execute in the same thread as the calling object, not in a separate
thread of execution, as intended.
In other words, calling run() is just like a normal method call. Whereas, calling
start() tells the thread to create the necessary system resources and then
execute the run() method asynchronously.
Page 27 of 138
7) What is the main difference between a preemptive scheduler and a non-preemptive
scheduler?
The lowest level preemptive scheduler (kernel layer) uses the system timer
interrupt and context switching to manage timeslices. When any CPU interrupt
occurs, the CPU makes a note of where it was, and what it was doing (pushes all
registers onto the stack). The CPU then processes the interrupt and returns to
what it was previously doing (pops all registers from the stack). The thread
context in this sense, is the information the CPU needs to start or resume
execution in any section of code. The scheduler is invoked by the timer interrupt
routine (it can also be part of the timer interrupt). The scheduler checks to see if
the current timeslice has expired; if so, the current thread context is stored and
the next valid thread context is restored. The most basic implementation is a
stack swap, as each thread has its own stack. When a thread is created, it gets a
new context with an empty stack. The new context directs the CPU to the
thread's run() member at the beginning of its timeslice. A thread's context is
destroyed when the thread returns from the run() member, or its stop() member
is successfully invoked.
9) What are the differences between extending the Thread class and implementing the
Runnable interface?
Extending the Thread class will make your class unable to extend other classes,
because of the single inheritence feature in JAVA. However, this will give you a
simpler code structure. If you implement runnable, you can gain better object-
oriented design and consistency and also avoid the single inheritance problems.
Page 28 of 138
will be acquired. (The parameter is implicit when marking a method, as shown
below.)
synchronized (foo) {
...
}
Acquires a lock on the object instance "foo" at the open brace, and
releases the lock at the close brace.
synchronized (this) {
...
}
void bar() {
synchronized (this) {
...
}
}
class Foo {
synchronized static void bar() {
...
}
}
I know this sounds confusing, but it has the same semantics as any
other use of static: all statics (methods, variables, etc) are
Page 29 of 138
essentially global, interact with all other statics of the same class,
and do not interact with non-static instance data.
12) What is a daemon thread? When should I use setDaemon() and why?
[In short: daemon threads do not keep the program from quitting; user threads
keep the program from quitting. -Alex]
Thread.sleep() sends the current thread into the "Not Runnable" state for some
amount of time. The thread keeps the monitors it has aquired -- i.e. if the thread
is currently in a synchronized block or method no other thread can enter this
block or method. If another thread calls t.interrupt() it will wake up the sleeping
thread.
Note that sleep is a static method, which means that it always affects the current
thread (the one that is executing the sleep method). A common mistake is to call
t.sleep() where t is a different thread; even then, it is the current thread that will
sleep, not the t thread.
Page 30 of 138
object.wait() sends the current thread into the "Not Runnable" state, like sleep(),
but with a twist. Wait is called on a object, not a thread; we call this object the
"lock object." Before lock.wait() is called, the current thread must synchronize on
the lock object; wait() then releases this lock, and adds the thread to the "wait
list" associated with the lock. Later, another thread can synchronize on the same
lock object and call lock.notify(). This wakes up the original, waiting thread.
Basically, wait()/notify() is like sleep()/interrupt(), only the active thread does not
need a direct pointer to the sleeping thread, but only to the shared lock object.
[This answer was edited; the original answer was clear but I felt I should expand
on some points; please blame me, not Ingo, for any errors. -Alex]
[Short answer: threads are lightweight, programs (aka processes or tasks) are
heavyweight. -Alex]
In a lightweight process, threads are used to divvy up the workload. Here you
would see one process executing in the OS (for this application or service.) This
process would posess 1 or more threads. Each of the threads in this process
shares the same address space. Because threads share their address space,
communication between the threads is simple and efficient. Each thread could be
compared to a process in a heavyweight scenario.
The benefits of a lightweight process come from the conservation of resources. Since threads
use the same code section, data section and OS resources, less overall resources are used.
The drawback is now you have to ensure your system is thread-safe. You have to make sure
the threads don't step on each other. Fortunately, Java provides the necessary tools to allow
you to do this.
Basically, calling a method "thread-safe" means that even if multiple threads try
to access it simultaneously, nothing bad happens. Here "bad" usually means that
due to race conditions, or deadlock, or other pitfalls, the object's state gets
corrupted, or its methods produce unreliable results. A method usually acheives
Page 31 of 138
thread-safety by protecting access to shared resources. This usually translates to
using the Java synchronized keyword to protect blocks of code that access
instance variables, or other shared variables.
It is very difficult to prove that an object is thread-safe. The main rule of thumb for
making thread-safe objects is, "Make all the instance variables private, and all
the public accessor methods synchronized." However, this is sometimes difficult
to achieve in practice, due to exigencies of performance, architecture, or
implementation.
Accurate multithreaded programming is a true art, and very difficult to master. Read "Java
Threads" by Oaks and Wong, and "Concurrent Programming in Java" by Lea, for inspiration in
your quest to become a thread-safe programmer.
16) How can I actually, really deallocate a Thread to release the memory? Setting thread = null
does not work!
Using thread = null will not release a running thread. In order to release the
memory associated with a thread, you need to make sure that all of the following
are done:
• Make sure that the thread's start() method has been called.
• Make sure that the thread has stopped executing.
• Clear any references to that Thread object (thread = null;).
This is the best you can do to ensure the release of memory for a Thread. You
have to call start() on the thread because several JVMs have a bug where they
will not release all the thread's memory if the thread is not started.
Another name for thread is "lightweight process" to distinguish it from the "heavyweight"
system processes.
Page 32 of 138
18) What is the difference between threads and interrupts ?
The confusing part is the fact that the thread of execution in an interrupt handler
is often referred to as an interrupt.
A simple deadlock situation is one in which a two threads are waiting. Each
thread waiting for a resource which is held by the other waiting thread. [In Java,
this resource is usually the object lock obtained by the synchronized keyword.]
This deadlock situation can range from the above two thread situation to any
number of threads waiting in a circular fashion.
Many solutions to this well known problem have been defined over the years
including the large range of solutions to "The Dining Philosophers" problem.
This means that you can safely ignore the exception (with
catch (InterruptedException e) {}) since in general, only code that you write will
ever call interrupt. Since you didn't write it, you know it won't happen. :-)
Page 33 of 138
InterruptedException was not implemented in Java 1.0; however, it is definitely
available now.
The exception will also get thrown if the "interrupted" flag is set in the thread,
which happens if another thread calls interrupt even before the original thread
sleeps.
Toolkit.getDefaultToolkit();
import java.awt.*;
public class X
{
static Frame f;
23) What is the difference between multithreading and multitasking? What about
multiprogramming? Multiprocessing?
Page 34 of 138
Multiprocessing involves using multiple CPUs, either in the same (SMP) or
different (MPP) host boxes, to run a program. See whatis.com for a good
definition.
Most Java implementations will split threads among different processors if they're
running on an SMP box.
24) Why is Thread.run() declared public? Shouldn't it be declared protected, as only the
Thread superclass can invoke it?
One reason is that Thread implements Runnable, which requires that run() be
public. This is an unfortunate consequence of the definition of Java interfaces.
It is also not clear whether you would want to prohibit other classes from calling a
Thread's run() method in a synchronous manner -- as it is, they have the option
of calling either run() or start() depending on their needs.
25) Is there any method by which I can join() to a group of threads instead of a single one?
Yes. Just join to each one in turn. That way, when the loop exits, you know that
all the threads have exited -- whether it was the first thread or the seventh thread
that took the longest, all threads will be waited for. Remember, join() on a thread
that's already exited takes no time.
Iterator i = myThreads.iterator();
while (i.hasNext()) {
((Thread)i.next()).join();
}
Unfortunately, certain system threads are started as regular threads, not daemon
threads. One example is the AWT thread. That means that if your app opens a
window, then even if that window is closed, the AWT thread continues, so your
app will never quit on its own.
There are many cases where a Java program will quit on its own when main()
exits, but there are also many sneaky cases where a thread is launched without
your knowledge by a library routine. Database Connection Pools are notorious
for doing this.
A warning: Make sure you only call System.exit() when you're really really sure
all background threads have stopped processing. Otherwise the threads will be
Page 35 of 138
stopped prematurely, and may leave things in a bad state (for instance, if they're
halfway through writing a file).
yield() tells the JVM Thread Scheduler that it's OK to give other threads time
slices. Usually the JVM uses this call to activate another thread of the same
thread priority. In a good preemptive multithreading environment, yield() is a no-
op. However, it is important in a cooperative multithreading environment, since
without yield(), one thread can eat up all of the CPU.
sleep(x) tells the JVM Thread Scheduler to actively put this thread to sleep and
not run it again until at least x milliseconds have elapsed.
Neither sleep() nor yield() change anything about the status of synchronization
locks. If your thread has a lock, and you call sleep(1000), then at least a second
will elapse before your thread wakes up. When it wakes up it may decide to
release the lock -- or it may hold on to it longer.
28) How do we stop the AWT Thread? Our Swing application will not terminate.
29) How soon after calling start() will the run() method be executed?
Your run method is not guarenteed to run immediately after the Thread.start ()
method is called.
Any decent implementation will have your thread start as soon as possible under
the scheduling algorithm, so a five minute wait would be unreasonable.
Every object instance in Java has a little piece of data hanging off of it called a
"monitor lock." This is similar to a semaphore.
When you use the synchronized keyword, the current thread attempts to obtain
the monitor lock for the object in question (either "this" or the object named
Page 36 of 138
explicitly). If the lock is unavailable, because another thread has acquired it, then
the current thread pauses indefinitely. When it wakes up again, it will have
acquired the lock, and will retain it until the end of the code block where
synchronized was used.
One confusing part is that the only thing that this lock locks is access to the lock
itself. It does not control access to instance variables or method access in and of
itself. Other threads can reach in and modify variables and call methods. If you
want the lock to control access to variables, then you must explicitly use the
synchronized keyword every single place in your code that accesses them.
31) How do I capture an exception stack trace and put it into a string?
Call sleepingThread.interrupt().
Page 37 of 138
I/O
1) How can I compress my data to save bandwidth when sending across a socket?
The GZIPInputStream and GZIPOutputStream classes found in the java.util.zip package
compress data with the GZIP file format, as defined by RFC 1952
try {
RandomAccessFile raf =
new RandomAccessFile("filename.txt", "rw");
raf.skipBytes( (int)raf.length() );
// You are now at the end of the file,
// and can start writing new data out, e.g.
raf.writeBytes(
"Log restarted at 13:00pm 3-2-2000\n");
raf.close();
} catch (IOException ex ) {
ex.printStackTrace();
}
FileWriter writer =
new FileWriter("filename.txt", true);
3) How can I see from an applet the names of files and directories that are in the server?
There is no built-in support for this. Basically, you must create a service on the
server that when requested returns a list of available files and directories.
4) How can I read .zip and .jar file using standard Java classes?
The ZIP and JAR reading classes are found in the java.util.zip and java.util.jar
packages respectively. The following demonstrates reading from a ZIP file, listing
all the files in the zip and displaying the contents of the first file in the zip. JAR file
reading is similar, just with different classes and having a manifest.
import java.util.zip.*;
import java.util.*;
Page 38 of 138
import java.io.*;
Exactly how depends upon which stream you are reading from. If you are reading
with the read() method of InputStream/Reader, this will return -1 on EOF. If
however you are using BufferedReader.readLine(), then this will return null on
end of file. And, the readXXX operations of the DataInput interface throw an
EOFException. If you are unclear how to terminate your reading, check the
javadoc for the stream you are using.
6) Under what circumstances would I use random access I/O over sequential, buffered I/O?
Page 39 of 138
Whether you use random access I/O or sequential access really depends upon
what you are trying to do. Random access I/O is usually used for fixed-size data
records, where you want to overwrite the original record with changes, or to
create something like a rolling log file. Nowadays, there are lightweight database
systems that would do this type of operation for you, adding capabilities like
querying and a standard JDBC access so you wouldn't have to waste your time
redesigning the wheel. While not trying to tell you to never use random access
I/O, the Java RandomAccessFile class lives outside the Java streams class
hierarchy meaning that you can't add a facade around the random access file to
buffer it or enrich its capabilities in any manner. And you would also need to
program in things like simultaneous access.
Sequential access is just for that, when you need to access a file sequentially
from start to finish. While you can skip() around the data, it is generally meant to
be read from beginning to end, where the whole file has some meaning. For
performance reasons, it is best to always buffer your I/O, at least when using
Reader, Writer, InputStream, and OutputStream classes, but not
RandomAccessFile.
Create a java.io.File for the directory, then ask for the list of files with one of the
following:
The first two return the filenames as strings (for that directory), the latter three
return actual File objects.
Page 40 of 138
Provided you have write access to the file and are using JDK 1.2 or later, the
public boolean setLastModified(long time) method of File allows you to modify
the timestamp associated with a file.
To create a temporary file, use the createTempFile() method of the File class.
This allows you to set the file prefix, suffix, and directory. If no directory is
specified, then the java.io.tmpdir System property is used. To ensure the file is
deleted when the program ends (assuming normal termination), be sure to call
the deleteOnExit() method of the File object created by createTempFile().
Page 41 of 138
To make a copy of a file, open the source file as a FileInputStream. Open the
destination as a FileOutputStream. As you read a byte from the input, write it to
the output. There is no built-in method to make a file copy for you.
16) How can I open the same file for reading as well as writing?
The RandomAccessFile class supports simultanous reading and writing from the
same file. Just open it in "rw" mode:
RandomAccessFile raf =
new RandomAccessFile("filename.txt", "rw");
The listRoots() method of the File class was introduced with the 1.2 release for
this:
18) How to insert content into the middle of a file without overwriting the existing content?
Page 42 of 138
There is no support for getting the creation date and time of a file from Java. All
you can get is when the file was last modified, with the the lastModified() method
of File.
20) How can you combine multiple input streams to be treated as one?
The File class has a renameTo() method that allows you to rename files, just
pass in an argument of the new name as a File object. A boolean status is
returned to report success or failure.
22) When do you use the Reader/Writer classes, instead of the InputStream/OutputStream
classes?
The InputStream/OutputStream classes are for reading and writing bytes, while
the Reader/Writer classes are for reading characters / text. If you need to
process text, you use Reader/Writer. If you need to process content at the byte
level, either as the raw bytes, or as higher level data like primitives (through
DataInput/Output), objects (through ObjectInput/Output), or possibly compressed
data (GZIPInput/Output), then you would work with an InputStrem/OutputStream.
There is only support in Java to make a writable file read-only. There is no way to
go the other way. I guess someone considered this a security risk so didn't add
an appropriate API to perform.
Alas, using pure, portable Java, you cannot trap those sorts of system-specific
key sequences.
25) How can I get the current working directory with Java?
The current working directory is stored in the system property "user.dir". The
following example shows how to read this system property from your application:
Page 43 of 138
public class userdir {
public static void main(String[] args) {
System.out.println("Working Directory = " +
System.getProperty("user.dir"));
}
}
Garbage collection manages only memory, not other system resources. If your
Java program has plenty of free memory, garbage collection will not be triggered
automatically. Usually, however, there are other resources that are more limited
than memory. For example, all OSes have limits on the number of sockets, file
handles, etc. that can be open. Sometimes this limit is quite low. This is true even
on a desktop, e.g. if your system has 128KB of memory, your Java program can
easily allocate all the available file handles without coming near to filling up the
heap. If this happens, your Java program will fail. This is what we call a resource
leak; the unintentional maintenence of references to non-memory resources.
27) Why are there two type of I/O in Java, namely byte streams and character (Reader/Writer)
streams?
The Reader and Writer classes were added to JDK 1.1 to support
internationalization, since the existing streams at that time didn't properly support
the use of multi-byte Unicode characters or character encodings other than
ASCII. The Reader and Writer classes make it possible to work with
internationalized character streams rather than byte streams.
28) Is there an easy way of counting line numbers? Or do you have to go through the entire
file?
Page 44 of 138
try {
LineNumberReader lnr = new LineNumberReader(new FileReader(filename));
String s;
while ((s = lnr.readLine()) != null);
System.out.println("Lines: " + lnr.getLineNumber());
The piped I/O streams are for inter-thread communication. They manage the
synchronization across thread boundaries of the buffer.
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.ProgressMonitorInputStream;
Page 45 of 138
ProgressMonitorInputStream pm =
new ProgressMonitorInputStream(f,"Reading the big file",in);
// read the file. If it's taking too long, the progress
// monitor will appear. The amount of time is roughly
// 1/100th of the estimated read time (based on how long
// it took to read the first 1/100th of the file.)
// Note that by default, the dialog won't appear unless
// the overall estimate is over 2 seconds.
int c;
while((c=pm.read()) != -1) {
// do something
}
pm.close(); // needs better error handling, of course...
}
catch(Exception ex) {
ex.printStackTrace();
}
}
}.start ();
}});
For any type of file, just use the setReadOnly() method of File to mark a file as
read-only. There is no argument to make it writable once it is read-only.
I18N
Page 46 of 138
1) What is Unicode?
Unicode provides a standard encoding for the character sets of different languages. The
encoding is independent of the platform, program, or language used to access said data. Visit
the Unicode Consortium (http://www.unicode.org) to learn more about Unicode developments.
2) How can I get the number of days that have elapsed between two Date objects?
That depends on what you mean by "between".
If you want to find out the number of 24-hour periods between two Date objects d1 and d2 (d2
> d1) then you would do this:
Since Date.getTime returns milliseconds, you divide by 1000 to get seconds, by 60 to get
minutes, by 60 again to get hours, and by 24 to get days.
Sometimes this can cause difficulties, especially in countries that have a form of daylight
savings time. For example, in the U.S., there is one day in the Fall which has 25 hours, and
one day in the Spring which has 23 hours. An elapsed-number-of-days calculation on Dates
falling on one of these days may not give the answer you expect.
Anyway, that's the easy way, and if you're satisfied with that, then read no further.
If, on the other hand, you mean the number of midnight-crossings (so that the number of days
elapsed between 11:00 PM and 1:00 AM the next day is 1) then you're better off using the
Calendar class and computing the Julian Day.
By the way, don't mistake the Julian Day for the Julian Calendar. The two are different and
named after different "Julians".
The Julian Day is defined as the number of days elapsed since Nov 24, 4714 BC, 12:00 GMT
Gregorian. The year was chosen as being sufficiently in the past so as not to have negative
Julian Days, the date was chosen because of the (in that year) 37-day difference between the
Julian and Gregorian calendars (Nov 24, 4714 BC Gregorian would be Jan 1, 4713 BC Julian),
and the time was chosen because astronomers do their work at night, and it would be a little
confusing (to them) to have the Julian Day change in the middle of their work. (I could be
wrong)
Anyway, the algorithm for computing the Julian Day from a Gregorian or Julian calendar date
for years 400 AD and above is as follows:
Let the date be Y, M, D, where Y is the AD year, M is the month (January=1, December=12),
and D is the day (1-31).
For the following calculations, use integer arithmetic (i.e. lop off the fractional part of any
result).
Page 47 of 138
If M==1 or M==2 then Y--, M+=12.
Let A = Y/100
Let B = A/4
Let C = 2-A-B (or C=0 if you're using the Julian calendar)
Let E = 365.25*(Y+4716)
Let F = 30.6001*(M+1)
There would be a further adjustment for the time of day, but we're not looking at that. If you
want your Julian Days to start at midnight, subtract 1524 rather than 1524.5.
c1.setTime (d1);
c2.setTime (d2);
long j1 = julian_day(c1.get(YEAR),
c1.get(MONTH)+1, c1.get(DAY));
long j2 = julian_day(c2.get(YEAR),
c2.get(MONTH)+1, c2.get(DAY));
And this would properly calculate the number of midnight-crossings between 11:00 PM on one
day and 1:00 AM the next day.
You can get a little more information about the Julian Day calculations here.
You can get much more information about different calendar systems here, here, and here.
import java.sql.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
public JDFDP()
{
super( "JDFDP" );
addWindowListener( this );
jb.addActionListener( this );
jp.add(jlI);
jp.add(jtI);
jp.add(jb);
jp.add(jlD);
jp.add(jtD);
jp.add(jlP);
jp.add(jtP);
show();
} // end constructor
// ActionListener Implementation
public void actionPerformed(ActionEvent e)
{
jtD.setText( "" );
jtP.setText( "" );
try
{
java.util.Date d = dfLocal.parse(
jtI.getText() );
jtI.setText( dfLocal.format( d ) );
jtD.setText( dfGermany.format( d ) );
d = dfGermany.parse( jtD.getText() );
// get new java.sql.Date
Page 50 of 138
jsqlDate = new java.sql.Date( d.getTime() );
jtP.setText( jsqlDate.toString() );
}
catch( ParseException pe ) { jtI.setText( "" ); }
} // End actionPerformed
Serialization
Serializing an object involves encoding its state in a structured way within a byte
array. Once an object is serialized, the byte array can be manipulated in various
ways; it can be written to a file, sent over a network using a socket-based
connection or RMI, or persisted within a database as a BLOB.
The serialization process encodes enough information about the object type
within the byte stream, allowing the original object to be easily recreated upon
deserialization, at a later point in time.
Page 51 of 138
No. While serialization is a highly versatile mechanism having numerous
applications, your long term storage needs should continue to be addressed by
conventional relational or object databases.
Note that serialization does not provide any features for transaction management
and concurrency control. Nor does it provide typical database features like
indexed access, caching and a query language.
Variables declared as static members are not considered part of the state of an
object because they are shared by all instances of that class. Classes which
need to preserve the value of static members during serialization should save
and restore these values explicitly using private void
readObject(ObjectInputStream) and private void
writeObject(ObjectOutputStream).
Page 52 of 138
A class that implements Serializable must also:
RMI uses serialization as its basic and only mechanism for sending objects
across a network.
9) How can I read and write serialized objects to and from a database?
If your RDBMS supports them, you can store serialized objects as BLOBs.
These are JDBC 2.0 features, but take a look at java.sql.Blob, ResultSet and
PreparedStatement for more information.
Page 53 of 138
10) Can a Vector or a Hashtable be serialized and deserialized?
Both these classes implement Serializable, and have been designed for
serialization. So yes, they can be serialized.
One thing you have to watch out for, though, is that in order to serialize a
collection like Vector or Hashtable, you must also be able to serialize all of the
objects contained in these collections. Otherwise, the collection would not be
able to be completely restored. Your program will throw a
NotSerializableException unless all objects stored in the Vector or Hashtable are
also serializable.
11) Is there any way to save the state of an object of a class which does not
implement Serializable or Extenalizable?.
Yes. You will have to write the value of each and every instance variable into the persistent
storage. If there are 100 variables, you will have to store each of them individually. If some
of the variables are object references, you will have to follow each reference and save the
state of that object as well. You can do that, but it would be a proprietary solution and each
class that wanted to read your object would also have to know all about your proprietary
format.
A big part of EJB is that it is a framework for underlying RMI: remote method
invocation. You're invoking methods remotely from JVM space 'A' on objects
which are in JVM space 'B' -- possibly running on another machine on the
network.
To make this happen, all arguments of each method call must have their current
state plucked out of JVM 'A' memory, flattened into a byte stream which can be
sent over a TCP/IP network connection, and then deserialized for reincarnation
on the other end in JVM 'B' where the actual method call takes place.
If the method has a return value, it is serialized up for streaming back to JVM A.
Thus the requirement that all EJB methods arguments and return values must be
serializable. The easiest way to do this is to make sure all your classes
implement java.io.Serializable.
Security
A private key cryptography algorithm uses the same key for encryption and decryption.
Since the key is the only data required to decrypt the ciphertext, it must be kept
private/secret.
Page 54 of 138
Encryption; creating ciphertext from plaintext with a specific encryption algorithm and an
encryption key
Decryption; recovering plaintext from cipertext using a specific encryption algorithm and a
decryption key
A public key cryptography algorithm uses two different (but related) keys for encryption and
decryption. The key used for decryption is kept secret (Private) whereas the encryption key
can be distributed openly (Public). Thus, anyone in possession of the public encryption key
may encrypt and send a message to the holder of the private decryption key. However,
only the holder of the private decryption key may decipher the message. Both keys must be
created and used in conjunction, and are often referred to as a key pair.
The size of a Message Digest is always the same, independent of the size or content of the
message from which it was created. Generally, the size of a Message Digest is fairly short (
1024 bits). The ideal Message Digest algorithm would possibly alter 50% of the bits in the
resulting hash if one bit was altered in the plaintext message.
Digital Signatures are used to ensure the identity of a sender. In conjunction with Message
Digests, Digital Signatures prevents someone from altering a message and falsely claiming
you wrote the altered message. Digital Signatures are a byproduct of public key cryptography,
as demonstrated below. (Believe me, it is simpler to describe the concept of a Digital Signature
by taking an example).
Page 55 of 138
Generally
Aspect Explanation Effect
achieved by
Transmission
eavesdroppers
Protects message content from cannot read or
Confidentiality Encryption
any but sender and recipient use the
message
content.
Transmission
hijackers
Message Verifies that a message has not
Integrity cannot modify
Digest been modified since it was sent
message in
transit
Digital Verification of
Uniquely identifies the sender
Authenticity Signature + actual sender
of a message
Password possible
Message
recipient can
Cryptographic Prevents a sender from falsely
Nonrepudiation prove that a
Receipt denying sending a message
message was
sent by sender
7) What is SSL?
SSL stands for Secure Socket Layer. It is a protocol developed by Netscape for
encrypting information sent between processes over TCP/IP sockets. It sits
between application software and the TCP/IP sockets. You'll find it frequently
used between web browsers and web servers using the https URL prefix,
providing encryption, integrity, authentication, and non-repudiation.
The servlet technology by design already supports https (SSL). However, the
way this works is not through the servlet technology but through the Web Server.
The web server controls whether information is done securely (https) versus non-
securely (http).
One way to force servlets to go down the https path is to define your web server
to only allow secure connections when accessing servlets. In IIS this can be
accomplished through the definition if ISAPI filters. The ISAPI filter can instruct
the web server to route all requests that end with a pre-defined prefix to the
servlet engine. The trick is to then define files, with the predefined extension, in
the web servers directory. For example, if the servlet's name is MyServlet a file
with the name MyServlet.xxx would be placed on the web server. All calls to this
file would be routed to the servlet engine. And IIS would be used to force all calls
Page 56 of 138
to the MyServlet.xxx file to go through https. The JRun servlet engine has
examples of how to do this documented on their web page.
Applets
1) How can I download a file (for instance, a Microsoft Word document) from a server
using a servlet and an applet?
You may also want to check the web server configuration to make sure the
approprate MIME-type configuration is set. If your servlet is the one fetching the
document (or creating it on the fly), then it must set the MIME-type using
response.setContentType("application/ms-word") or equivalent.
In short, get the applet's context and tell it to show a different document:
getAppletContext().showDocument(new
URL("http://foo.com/whatever/blah.doc")). You can also provide a target frame
string as in getAppletContext().showDocument(new
URL("http://foo.com/whatever/blah.doc"), "target"). There are four special targets
strings. Any other string will act as a named top-level window, if the frame doesn't
exist.
// Options
CODEBASE = codebaseURL
ARCHIVE = archiveList
ALT = alternateText
NAME = instanceName
ALIGN = alignment
Page 57 of 138
HSPACE = pixels
VSPACE = pixels
>
<PARAM NAME = attribute1 VALUE = value1>
<PARAM NAME = attribute2 VALUE = value2>
...
Alternate HTML
</APPLET>
While there is some upper bounds to the number of parameters the browser will
let you specify, if you would like to let a user specify an undefined number of
values, you can let them specify a parameter with a number at the end and keep
counting until no more parameters following that pattern are there, as in:
import java.applet.*;
1. The hard way. Untrusted applets cannot touch the hard disk of a
computer. Thus, your applet cannot use native or other local files (such as
JDBC database drivers) on your hard drive. The first alternative solution is
to create a digitally signed applet which may use locally installed JDBC
drivers, able to connect directly to the database on the server side.
Page 58 of 138
2. The easy way. Untrusted applets may only open a network connection to
the server from which they were downloaded. Thus, you must place a
database listener (either the database itself, or a middleware server) on
the server node from which the applet was downloaded. The applet would
open a socket connection to the middleware server, located on the same
computer node as the webserver from which the applet was downloaded.
The middleware server is used as a mediator, connecting to and extract
data from the database.
To show a message in the status bar, you would call the showStatus() method of
the AppletContext:
getAppletContext().showStatus(message);
Keep in mind that the browser can overwrite the message at any time or the
browser might not have a visible status bar. This basically means you should not
use the status bar for messages that might be missed.
Applet security restrictions do not let you get this in an untrusted applet via
InetAddress.getLocalHost().
However, you can get this address by creating a Socket connection back to the
web server from which you came and asking the Socket for the local address:
Page 59 of 138
Instead of specifying the CODE attribute of an <APPLET> tag, you use the
OBJECT attribute, as in:
<APPLET
OBJECT=TheApplet.ser
WIDTH=300
HEIGHT=300
>
</APPLET>
This allows you to preinitialize your applet to some saved state, instead of having
to reinitialize your applet each time it is loaded.
10) From one applet, how do I communicate with another applet loaded from the same
server?
It really doesn't matter that they are loaded from the same server, as long as they
are running in the same JVM in the browser, you can call methods between
them.
If you include a name="appletA" value in the applet tag of the applet you want to
call methods on, you get a reference to it by using the AppletContext:
Checking that you get a reference to the class you expect is left as an exercize to
the reader :-)
The initial order in which the lifecycle methods of applets are executed when
loaded is:
init()
start()
paint()
stop()
destroy()
Page 60 of 138
This also holds when you call repaint() in the init() method. However, the init()
method will not be called if you load a serialized applet.
12) What are the main differences between JavaBeans and applets?
Applets are Java programs which are meant to be run by an applet-runner (which
is typically inside a web browser). By definition, applets are applets because they
inherit from java.applet.Applet. Also, applets are pretty constrained in what they
are/aren't allowed to do.
You would specify the location of the class files in the CODEBASE attribute of
the <APPLET> tag:
<applet code=MyApplet
width = 300 height = 300
CODEBASE="http://www.jguru.com/appletdirectory/">
</applet>
14) When you communicate with a servlet from an Applet or an application, how can
you ensure that the session information is preserved? That is, how do you
manage cookies in applet-servlet communication?
For sessions, your best bet is to have the servlet rewrite the URLs to include the
session information. With cookies read I am writing an application that retrieves a
URL, but that URL requires a cookie. Is there a way to hold that cookie within my
application and send it back to the URL when requested? Essentially, you can send
the cookie back easily with HTTP. For instance,
urlConnection.setRequestProperty("cookie",_cookie); Where the _cookie is coming
from a previous call: String _cookie = urlConnection.getHeaderField("set-cookie");
Page 61 of 138
16) In detail, how do the applet life cycle methods init(), start(), paint(), stop(), and destroy()
work?
The life cycle methods of an applet are init(), start(), stop(), and destroy(). While
frequently grouped with the methods, the paint() method is not really part of the
applet's life cycle. The method is just called by the browser whenever a part of
the screen has become invalidated or in response to a programmer-generated
repaint request. The update() method falls into the same category as paint().
Use the start() / stop() method pair to deal with starting and stopping threads, as
when the page isn't active it isn't nice to use up resources.
Don't rely on the destroy() method being called to free a crucial resource, in case
the browser crashes.
I had heard that start() / stop() were called for iconifying and deiconifying, but a
test with the latest browser versions shows they aren't called.
The browser’s HTML interpreter reads the parameters from the APPLET tag. The
relevant parameters used to load the applet’s class are CODE, CODEBASE, and
ARCHIVE (CODEBASE and ARCHIVE are optional - OBJECT can be used
instead of CODE). The CODE parameter holds the name of the applet’s class
file. The CODEBASE holds the class file directory (the default is the current
directory), and the ARCHIVE is the name of a jar or zip file that the applet’s class
files are stored in (the default is no archive).
The browser then reads the byte code from the class files and performs a
verification pass, checking for access violations and invalid opcodes (among
other things). The Java Virtual Machine (JVM) then builds an object for each
class (provided the objects have not been created by a previous instance), and
executes any static code in each object’s initialization section. Object initialization
also includes the construction of the superclass objects (the superclass files from
Applet to Object are typically loaded from the browser’s own Java API on the
local file system).
Page 62 of 138
If the applet makes it this far without generating security exceptions, missing
class errors, or common errors in static code segments, the JVM will make calls
to initialization functions in the superclass, then to the applet’s init() member.
18) What is needed in the APPLET tag to cause an applet to be loaded from a JAR file?
To specify an that an applet loads from a JAR file, instead of from separate
classes, add an ARCHIVE attribute to your <APPLET> tag:
<APPLET
CODE=AppletClass
ARCHIVE="foo.jar"
WIDTH=200
HEIGHT=200>
</APPLET>
If you need to specify multiple JAR files, provide a comma separated list.
19) When should one use applets and when should one use servlets?
Applets run inside browsers, and servlets run inside servers. So broadly
speaking, use applets when you need dynamism on the client side, and use
servlets when you need dynamism on the server side.
Servlets can produce any HTML (or indeed, any file type), and therefore are
much more versatile than applets. Servlets can tailor the HTML they produce
based on the browser type (as specified in the "User-Agent" header), and thus
can produce output that will work in virtually any client, including WAP browsers
or the like. Applets are notoriously poorly supported, and even in browsers that
ostensibly have Java support, don't work consistently.
Servlets can also produce HTML with embedded JavaScript, which allows a fair
amount of dynamic behavior on browsers which support it.
One doesn't see constructors in applets because the applet container doesn't
guarantee a complete environment (valid applet context) until the init() method is
called.
Page 63 of 138
Applets are loaded with an HTML file. You need to specify an <APPLET> tag in the
.html file to load the APPLET.
22) What are the differences between trusted and untrusted applets?
In general, applets loaded over the net are prevented from accessing files on the
client machine, and from making network connections except to the host
originating the applet.
In addition, applets loaded over the network are prevented from starting other
programs on the client. Applets loaded over the network are also not allowed to
load libraries, or to define native method calls, providing accessing to the
underlying computer.
On the other hand, trusted applets can be permitted to do all that. The trust
model in Java allows you to enable only certain operations, so it is possible that
you enable network connections to/from anywhere but don't permit access to the
local file system.
How to enable trusting an applet is different for each browser, IE, Netscape, and
standard Java with the Plug-in.
23) Why doesn't an applet viewed through the browser respond to keyboard events,
but the same works fine from within appletviewer?
In order to respond to keyboard events your applet needs to have the input
focus. In the case of appletviewer, there is nothing else on the page that might
have focus. In the case of a browser, there is. Just click into the applet's area to
have it get the input focus and then it will respond to keyboard events.
The Plug-in is a replacement Java Runtime Environment for your browser. It allows
you to upgrade the browser's supported Java version without waiting for the browser
vendor to release a new version of the browser.
25) How do I automatically set the input focus in my applet to a specific component/text field
when the browser loads the page that contains the applet?
The java.awt.Component class has a method named requestFocus(), you can use this to
request focus on any component.
An applet stub is an interface that the applet container (browser) creator will
implement abstracting out capabilities like getting applet parameters, the applet's
Page 64 of 138
code/document base and other information necessary for the contained
applet(s). As an applet program, you'll rarely use the interface. The only time you
really run across a need to do anything with the interface is if you try to run your
applet in your own container. You'll then have to implement the AppletStub
interface yourself, along with the AppletContext interface.
Browsers will constantly call the applet life-cycle methods. There is no way to
stop them. The only way to stop an applet from running / displaying anything /
taking up CPU time is to set a flag in the code and check it within each of the life-
cycle methods. Calling destroy() is not something you as a user / developer
should do. Calling the method is the responsibility of the applet container (the
browser) when it wants to unload the applet.
28) How can an applet get information about the URL it was called from?
The getDocumentBase() method of Applet returns the base URL of the HTML file
that loaded an applet. It is frequently used in conjunction with getting
supplemental files like images, as in Image image =
getImage(getDocumentBase(), "foo.gif");
While in most cases it returns the full URL of the HTML file that loaded the
applet, the API docs specify that it only needs to return the URL for the directory
of the file.
30) What API changes are there for applets with JDK 1.4?
Also, the AppletContext interface now has three new methods: setStream(),
getStream(), and getStreamKeys().
31) Are there any restrictions placed on applets loaded from HTML pages generated from
servlets / JSP pages?
It is good practice to include the CODEBASE attribute in the APPLET tag and
specify a directory other then the servlet directory for storing the applet-related
classes. For example:
Page 65 of 138
out.println(<"APPLET CODE=Foo.class CODEBASE=/applets WIDTH=400
HEIGHT=400">);
Some Web servers think that all classes loaded from the servlets directory are
automatically servlets, thus causing the applet not to load.
32) How can I easily provide default values for when applet parameters are not specified?
import java.applet.*;
}
}
34) My applet runs fine with appletviewer but not in the browser, what can be the problem?
Applets loaded through appletviewer are more then likely loading their classes
from the local CLASSPATH, not over the network. As such, they get different
permissions and can do things that applets loaded over the network cannot. Try
using Tomcat and serving the Applet through an HTTP connection, instead of
loading the .HTML file from the file system.
Page 66 of 138
Also, Java runtimes in browsers are based on Java 1.1.x. If you need to use
newer capabilities, you'll need to use the Java Plug-in. Without it, you're stuck
with the older Java runtime capabilities.
35) What does the class hierarchy of the Applet class look like?
+-----------+
| Object |
+-----------+
|
+-----------+
| Component |
+-----------+
|
+-----------+
| Container |
+-----------+
|
+-----------+
| Panel |
+-----------+
|
+-----------+
| Applet |
+-----------+
In start(), instead of always creating a new object, return the existing one if it
exists or create a new one if it doesn't.
Networking
UDP stands for User Datagram Protocol. UDP provides an unreliable packet
delivery system built on top of the IP protocol. As with IP, each packet is an
individual, and is handled separately. Because of this, the amount of data that
can be sent in a UDP packet is limited to the amount that can be contained in a
single IP packet. Thus, a UDP packet can contain at most 65507 bytes (this is
the 65535-byte IP packet size minus the minimum IP header of 20 bytes and
minus the 8-byte UDP header).
UDP packets can arrive out of order or not at all. No packet has any knowledge
of the preceding or following packet. The recipient does not acknowledge
Page 67 of 138
packets, so the sender does not know that the transmission was successful. UDP
has no provisions for flow control--packets can be received faster than they can
be used. We call this type of communication connectionless because the packets
have no relationship to each other and because there is no state maintained.
The destination IP address and port number are encapsulated in each UDP
packet. These two numbers together uniquely identify the recipient and are used
by the underlying operating system to deliver the packet to a specific process
(application). Each UDP packet also contains the sender's IP address and port
number.
One way to think of UDP is by analogy to communications via a letter. You write
the letter (this is the data you are sending); put the letter inside an envelope (the
UDP packet); address the envelope (using an IP address and a port number); put
your return address on the envelope (your local IP address and port number);
and then you send the letter.
Like a real letter, you have no way of knowing whether a UDP packet was
received. If you send a second letter one day after the first, the second one may
be received before the first. Or, the second one may never be received.
2) What is a Datagram?
Java provides two classes for explicitly dealing with datagrams, DatagramSocket
and DatagramPacket. These are both found in the java.net package.
Two reasons: speed and overhead. UDP packets have almost no overhead--you
simply send them then forget about them. And they are fast, because there is no
acknowledgement required for each packet. Keep in mind that unreliable doesn't
mean that packets can be lost or misdirected for no reason - it simply means that
UDP provides no built-in checking and correction mechanism to gracefully deal
with losses caused by network congestion or failure.
UDP is appropriate for the many network services that do not require guaranteed
delivery. An example of this is a network time service. Consider a time daemon
that issues a UDP packet every second so computers on the LAN can
synchronize their clocks. If a packet is lost, it's no big deal--the next one will be
by in another second and will contain all necessary information to accomplish the
task.
Page 68 of 138
A broad class of applications is built on top of UDP using streaming protocols.
With streaming protocols, receiving data in real-time is far more important than
guaranteeing delivery. Examples of real-time streaming protocols are RealAudio
and RealVideo which respectively deliver real-time streaming audio and video
over the Internet. The reason a streaming protocol is desired in these cases is
because if an audio or video packet is lost, it is much better for the client to see
this as noise or "drop-out" in the sound or picture rather than having a long pause
while the client software stops the playback, requests the missing data from the
server. That would result in a very choppy, bursty playback which most people
find unacceptable, and which would place a heavy demand on the server.
TCP and UDP are both unicast protocols; there is one sender and one receiver.
Multicast packets are a special type of UDP packets. But while UDP packets
have only one destination and only one receiver, multicast packets can have an
arbitrary number of receivers.
Multicast is quite distinct from broadcast; with broadcast packets, every host on
the network receives the packet. With multicast, only those hosts that have
registered an interest in receiving the packet get it.
This is similar to the way an AWTEvent and its listeners behave in the Abstract
Window Toolkit. In the same way that an AWTEvent is sent only to registered
listeners, a multicast packet is sent only to members of the multicast group. AWT
events, however, are unicast, and must be sent individually to each listener--if
there are two listeners, two events are sent. With a MulticastSocket, only one is
sent and it is received by many.
Page 69 of 138
RFC stands for "Request for Comment". The RFCs form an integral part of the
Internet standards; standards are formed by first publishing a specification as an
RFC.
Page 70 of 138
String host = InetAddress.getByName("216.217.9.172").getHostName();
ip =InetAddress.getByName("www.jguru.com").getHostAddress();
Note the use of "Stream" classes instead of "Reader" classes. This is done because
in general a URL may contain binary data, as in this example. Also note that both
the input and the output streams are buffered - this greatly speeds the download
time and is far more efficient that reading and writing a single byte at a time,
especially over the network.
Page 71 of 138
are lost occasionally, just like IP packets. The difference is that the TCP protocol
takes care of requesting retransmits to ensure that all packets reach their
destination, and tracks packet sequence numbers to be sure that they are
delivered in the correct order. While IP packets are independent, with TCP we
can use streams along with the standard Java file I/O mechanism.
There are four distinct elements that make a TCP connection unique:
Each requested client socket is assigned a unique port number while the server
port number is always the same. If any of these numbers is different, the socket
is different. A server can thus listen to one and only one port, and talk to multiple
clients at the same time.
When you try to create a new URL by calling its constructor, it will throw a
MalformedURLException if the URL string is not parseable or contains an
unsupported protocol.
13) How can I get the real local host IP address in an applet?
Applet security restrictions do not let you get this in an untrusted applet via
InetAddress.getLocalHost().
Page 72 of 138
However, you can get this address by creating a Socket connection back to the
web server from which you came and asking the Socket for the local address:
14) How do I get the real local host IP address in an application (or trusted applet)?
15) My machine has more than one IP address. How can I specify which address to use for
a socket connection?
Both Socket and ServerSocket have a constructor which allows you to specify a
particular local IP address to use. In the case of Socket, there are two
constructors:
16) Are there any performance advantages to be gained by using a Socket to connect to an
HTTP server, instead of URL or URLConnection?
Using a Socket gives you more control over the connection - you can set socket
options, use your own streams, or even use your own socket implementation
factory. However, this comes at great expense; URL and URLConnection do a lot
of things for you that you would need to implement from scratch. For example,
you would have to completely implement the HTTP protocol, including support for
proxies, maintain this code, and keep it up to date as HTTP evolves. URL and
URLConnection let you extend functionality through content and protocol
Page 73 of 138
handlers - you would need to implement this mechanism yourself or lose that
extensibility. I don't know why you would want to do this - the network overhead
for HTTP dwarfs any potential savings in CPU time you might get from dealing
with low-level sockets, and you lose generality, flexibility, and maintainability.
If you're convinced you really want control at the socket level, I would suggest
that you consider writing and using your own protocol handler instead of
reinventing URL and URLConnection.
17) Do I have to explicitly close the socket input and output streams before I close a
socket?
While closing the socket will close the underlying socket input and output
streams, programs typically wrap these streams in other streams. It is important
to flush and close these other streams, preferably in a finally block, before
closing the socket. This will help to ensure that all application data is properly
sent or received and that your program isn't unnecesarily holding on to file
descriptors that it no longer needs. An example of this follows:
Socket socket;
BufferedOutputStream out;
try {
socket = new Socket(host, port);
out = new BufferedOutputStream(socket.getOutputStream());
//
// write to the socket using the"out" stream
//
}
catch (IOException e) {
// handle errors
}
finally {
try {
out.flush();
out.close();
socket.close();
}
catch (IOException e) { /*ignore*/ }
}
Although the structure of the finally block is a little awkward in this case, it does
ensure that the streams and the socket are properly closed down, whether or not
an exception occurred.
18) What protocols are supported by the URL and URLConnection classes?
Page 74 of 138
The protocols supported by URL and URLConnection are VM-specific. Sun's
JDK supports a different set than the browser VMs or third-party JDK VMs. The
protocols that seem to be common to all implementations are HTTP and FTP and
file. Other protocols that might be supported include HTTPS, mailto, gopher, and
TELNET.
In the table below, some of the more common VMs are listed showing the major
protocols they support. There are other protocols not shown in this table that may
be supported.
* JDK 1.2 supports HTTPS only when the JSSE extension is installed
If a protocol is not supported in your VM, you can extend the functionality of the
URL class by writing and installing your own protocol handler.
19) How can I use the mailto: protocol from URL or URLConnection?
Both URL and URLConnection act as mail user agents when using the mailto:
protocol. They need to connect to a mail transfer agent to effect delivery. An
MTA, for example sendmail, handles delivery and forwarding of e-mail.
Note that a mailto: URL doesn't contain any information about where this MTA is
located - you need to specify it explicitly by setting a Java system property on the
command line. For example, to run the program mailto.java shown below, you
would use the command:
import java.io.*;
import java.net.*;
out.print(
"From: jguru-fan@yourisp.com"+"\r\n");
out.print(
"Subject: Works Great!"+"\r\n");
out.print(
"Thanks for the example - it works great!"+"\r\n");
out.close();
System.out.println("Message Sent");
} catch (IOException e) {
System.out.println("Send Failed");
e.printStackTrace();
}
}
}
The term "Uniform Resource Locator" (URL) refers to the subset of URI that
identify resources via a representation of their primary access mechanism (e.g.,
their network "location"), rather than identifying the resource by name or by some
other attribute(s) of that resource.
1. First allocate space to hold the data we are sending and create an
instance of DatagramPacket to hold the data.
2. byte[] buffer = new byte[1024];
3. int port = 1234;
4. InetAddress host = InetAddress.getByName("jguru.com");
5. DatagramPacket packet = new DatagramPacket(buffer, buffer.length,
6. host, port);
7. Create a DatagramSocket and send the packet using this socket.
8. DatagramSocket socket = new DatagramSocket();
9. socket.send(packet);
Page 76 of 138
The DatagramSocket constructor that takes no arguments will allocate a free
local port to use. You can find out what local port number has been allocated for
your socket, along with other information about your socket if needed.
The client then waits for a reply from the server. Many protocols require the
server to reply to the host and port number that the client used, so the client can
now invoke socket.receive() to wait for information from the server.
The server can now process the data it has received from the client, and issue an
appropriate reply in response to the client's request.
Port numbers are the means by which an operating system routes incoming
packets to the appropriate waiting process. Only one process at a time can listen
for incoming packets on a given port. The combination of destination IP address
and port uniquely identifies the destination process for a packet. Likewise, the
combination of source IP address and port uniquely identifies the source
process.
Page 77 of 138
For both TCP and UDP, the port number field of a packet is specified as a 16-bit
unsigned integer - this means that valid port numbers range from 1 through
65535. (Port number 0 is reserved and can't be used).
Java does not have any unsigned data types; Java's short data type is 16 bits,
but its range is -32768 to 32767 because it is a signed type. Thus, short is not
large enough to hold a port number, so all classes which use or return a port
number must represent the port number as an int. In the JDK 1.1+, using an int
with a value greater than 65535 will generate an IllegalArgumentException. In the
JDK 1.0.2 and earlier, values greater than 65535 are truncated and only the low-
order 16 bits are used.
Port numbers 1 through 255 are reserved for well-known services. A well-known
service is a service that is widely implemented which resides at a published,
"well-known", port. If you connect to port 80 of a host, for instance, you may
expect to find an HTTP server. On UNIX machines, ports less than 1024 are
privileged and can only be bound by the root user. This is so an arbitrary user on
a multi-user system can't impersonate well-known services like TELNET (port
23), creating a security problem. Windows has no such restrictions, but you
should program as if it did so that your applications will work cross-platform.
24) How do I control whether URLConnection uses the POST or GET method when
sending data to an HTTP server?
Since these methods are part of the HTTP protocol, they can only be used when
the URL is an "http://" URL. In that case, you can cast the connection returned
from URL.openConnection() to be a HttpURLConnection, which has a
setRequestMethod() method which lets you select whether GET or POST is
used. For example:
Page 78 of 138
There are two types of URIs:
try {
ServerSocket s = new ServerSocket(portno);
}
catch(IOException e) {
System.out.println("port " + portno + " already in use");
}
28) How can I determine when multiple instances of my program are running on the same
machine?
The most portable, general way is for your program to attempt to create a server
socket on a particular port. The first instance will be able to create the port and
so it will know that it's the first. Subsequent instances won't be able to bind to that
server socket and so they'll know that they aren't the first.
If you need to track or otherwise manage all of the instances then you can
change things such that if they can't bind to the server socket that they then try to
connect to the first instance of the program using a client connect through the
socket and you can do whatever you want from there.
If both ends of the connection knew exactly what was happening or expected
(e.g. a single file with a constant filename, in the simplest case), you could do
something as simple as have one end read from a FileInputStream and write to
the socket's OutputStream, while the other end reads from the socket's
InputStream and writes to a FileOutputStream.
If you need to transfer multiple files, or need to transfer some details about the
file other than the contents (for example, the file name and path), you could
Page 79 of 138
create a class which represents the file and serialize it out to the socket. At the
simplest that might look like this:
import java.io.*;
.. at one end you could create the TransferableFile and serialize it out to the
socket. At the other end you deserialize and invoke writeFile().
If you need to do anything more complex than that, your best bet is to get an FTP
client/server. A quick search in this Networking FAQ or in Google should list a
few options.
31) My computer is mapped to more than one IP adress. From my program, how can I
retrieve all the IP addresses the machine is mapped to?
Page 80 of 138
InetAddress ia=InetAddress.getLocalHost();
InetAddress[] a=ia.getAllByName(ia.getHostName());
32) What is a Keep-Alive? How is it implemented differently in HTTP 1.0 and HTTP 1.1?
HTTP 1.0
The HTTP 1.0 specification does not really delve into how Keep-Alive should
work. Basically, browsers that support Keep-Alive appends an additional header
to the request as:
Connection: Keep-Alive
When the server processes the request and generates a response, it also adds a
header to the response:
Connection: Keep-Alive
When this is done, the socket connection is not closed as before, but kept open
after sending the response. When the client sends another request, it reuses the
same connection. The connection will continue to be reused until either the client
or the server decides that the conversation is over, and one of them drops the
connection.
HTTP 1.1
Under HTTP 1.1, Keep-Alive is implemented differently. All connections, by
default, are kept open, unless stated otherwise with the following header:
Connection: close
Page 81 of 138
inspect the properties of the remote object before actually transporting it locally.These
attributes are exposed by the http protocol specification and as such only make sense for
URL objects that are using the http protocol.
Tomcat
First off, you should always do your own exception handling. An uncaught
exception can silently kill your servlet, and if you don't know where to look in the
log files, or if your server has a bug in it whereby it silently swallows certain
exceptions, you'll have no idea where the trouble is.
The following code sets up a catch block that will trap any exception, and print its
value to standard error output and to the ServletOutputStream so that the
exception shows up on the browser (rather than being swallowed by the log file).
Chances are that any error is in your code; the exception shows you what line
the problem happened at. (If you see "Compiled Code" instead of line numbers in
the exception stack trace, then turn off the JIT in your server.)
res.setContentType("text/html");
ServletOutputStream out = res.getOutputStream();
try {
// do your thing here
...
}
catch (Exception e) {
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
e.printStackTrace(pw);
out.println("
");
out.print(sw.toString());
out.println("
");
}
Lately, I've started catching all Throwables, just in case. I know this is bad form
but what are you gonna do?
Next, you should make liberal use of the log() method, and you should keep your
own log files. Again, don't trust the server to do the right thing. Also, printing the
log after every request can help debugging because you can immediately see the
output of your servlet without going into the server-side log files. (Another
problem this avoids is that some servlet engines forget to flush their logs after
Page 82 of 138
each request, so even if you go to the server, you won't see the most recent log
messages.)
Here's some source code you can add to any HttpServlet that keeps an in-
memory log:
And here's some code that you can add to the end of your doGet or doPost
method that prints out the entire log after each request:
Both of these should be disabled once you actually ship your servlet, but they
can be very useful during development and debugging.
A few IDEs support servlet debugging. Symantec Cafe claims to have a fairly
robust system for doing visual source-level debugging of servlets (as well as
RMI, CORBA, and EJB objects).
For Tomcat:
Page 83 of 138
Download jk_nt_service.exe and follow the instructions in the document "NT-
Service-howto.html" (on the Jakarta Web site and included in the Tomcat
distros). Also see the minimalistic users guide, included with the Tomcat
distribution.
For JWS:
Near the end of the installation program you will be asked if you want to have the
Java Web Server start automatically on system reboot. (That is, whether you
want to install the Java Web Server as an NT Service).
If you click Yes: An entry will be added to the Control Panels -> Services and the
JavaWebServer NT Service will be started up automatically every time you
restart your system.
If you click No: No entry will be made in the Control Panel's Services panel.
If you change your mind later, the product documentation provides instructions
for how to setup the web server to start automatically. For instructions, see the
file:
[server_root]\doc\en\administration\server_start_Win.html
3) While I am still making changes to a servlet code, how can I make a servlet
reload every time I test it?
It depends on the web server you are using to test your servlet. For instance,
with Tomcat, you would replace the WAR file and the server notices the change
and loads the new servlet on the next request, without having to restart the
server.
[Short answer: for Tomcat, add reloadable="true" to the <Context> tag for that
web application.
Note that there is a bug in Tomcat where replacing the WAR file doesn't work;
you also have to delete the unpacked directory under TOMCAT/webapps/foo (for
TOMCAT/webapps/foo.war).
If you are not using WAR file deployment, simply replacing the servlet classfile
should work, as long as the class file is stored in webapp/WEB-INF/classes, or
replacing the JAR file in webapp/WEB-INF/lib/foo.jar.
4) Is there any method to unload a servlet from Web Server memory without
restarting the server?
Page 84 of 138
administration module. Others, like Tomcat, require you to just replace the WAR
file.
5) I've just set up Tomcat 3.1, created a context, and when I try and run a sample
JSP page, I get: Error: 500, Internal Servlet Error: java.lang.NullPointerException
<context>/WEB-INF/classes
6) How do I make Tomcat 3.1 invoke my servlets via the url <host>/servlets/<class>
instead of <host>/servlet/<class> that it's doing now?
Change the url-pattern of the default servlet invoker located in the "deployment
descriptor" for your web application. This file us usually located in
<context>/WEB-INF/web.xml file. Replace:
/servlet/*
with:
/servets/*
Also note that in Tomcat 3.1, web applications begin with the default "deployment
descriptor" located in <tomcat home dir>/conf/web.xml. You can change the
"default" for all web applications there.
7) Why doesn't Tomcat shut down when I run shutdown.bat (or shutdown.sh)?
One possibility is that if you disabled the Apj12 connector in your server.xml you
have also disabled the mechanism by which Tomcat shutdown is executed -- try
putting that back in if you've commented it out
For server.xml, look in the Tomcat distribution, in the directory you unzipped,
under /doc/uguide/tomcat_ug.html -- scroll down to the "Tomcat's Configuration
Files" section.
Page 85 of 138
It depends on the servlet engine. Each has its own type of config file in which you
can set the names and values of init parameters; these get passed to the servlets
(or JSPs) via the getInitParameter() call.
IMHO yes.
We are presently running Tomcat (servlet & jsp requests) with Apache (graphics,
perl, html) on 9 Solaris/Sparc servers servicing over 10 million servlet/jsp
transactions per day.
Yes, there is a bug in Tomcat 3.1 (and possibly other servlet engines). To send a
cookie through a redirect, you must set the headers manually.
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORA
RILY);
response.setHeader("Location",REDIRECT_PAGE);
Page 86 of 138
Sun Java Web Server 1.1 2.0 -
Sun/Netscape iPlanet Web Server 4.1 2.2 ?
Where you place the beans and servlets depends on which "application" it
belongs to. Assuming that you are running your JSP pages under the default
"examples" application, you should place your servlets under the path
/tomcat/examples/WEB-INF/classes
/tomcat/examples/WEB-INF/jsp/beans
Both these paths are placed within CLASSPATH by Tomcat's startup script file.
14) Can I configure Tomcat so that the name of the webapp is not used in the URL?
E.g. http://localhost/servlet/HelloWorld, instead of
http://localhost/examples/servlet/HelloWorld.
You can ... but I'm not sure I'd do this on a live system!
The path you give a context must be unique within the server.xml document.
Therefore, all you need to do is change the path of the ROOT webapp (to "/root"
for example) and change the path of your webapp to an empty string as below.
15) Can I use Tomcat under Windows 98? Is there anything I have to watch out for
during configuration?
Tomcat works very well with win95/win98. Generally there is just one problem, in
that, calling startup.bat or tomcat.bat results in very strange outputs. This is
related to a space characters problem within the .bat file due to difference in file
formats under win95 and winNT.
For all these problems, my standard solution was to copy the file with an editor
like MS Word and save to another bat file. If you starts changing bat file yourself,
its very confusing.
I recently did this with Apache and Tomcat. Using Basic HTTP Authentication is
an Apache function, so this method should work with Apache and any servlet
engine. Different web servers will, of course, work differently.
Page 87 of 138
If you haven't already done so, read the Apache FAQ about authentication
(section G) at apache.org, especially QA G.2. Also read the Apache Week article
referenced there (http://www.apacheweek.com/issues/96-10-18#userauth).
These resources will give you a good idea about how Apache can be configured
to restrict access to URL's. Neither one explicitly tells you how to use
authentication with servlets, so I'll spell it out here.
Use the <Location> directive to indicate to Apache that your specific servlet URL
or servlet URL prefix (for multiple servlets) can be accessed only by
authenticated users. The following template should be added to one of the
Apache configuration files (such as http.conf) with appropriate substitutions for
your system:
This <Location> directive tells Apache to restrict access to the specified URL, so
don't use the filesystem path to your servlet. Use the servlet's URL.
17) With regard to version 3.1 of Tomcat, what specifically must be done to enable
automatic reloading of servlets?
Page 88 of 138
7. The file TOMCAT_HOME/conf/tomcat.properties allows you to specify a
classpath that is passed on to the JVM. The servlets that you want
automatically reloaded must not be in this classpath. Note that this
classpath is in addition to the classpath specified in the startup file
tomcat.bat in the directory TOMCAT_HOME/bin. For the simple webapp
form-processing that I mentioned above, I do not need to specify any
additional classpaths in the TOMCAT_HOME/conf/tomcat.properties file.
For those just getting into Tomcat 3.1, I should add the caveat mentioned in the
Tomcat readme file that the automatic reload feature in Tomcat 3.1 is not
recommended for production applications. At this time, it is an experimental
feature that when enabled creates extra overhead in processing servlet requests.
18) I had Tomcat installed on c:\tc\jakarta-tomcat, but need to run .jsp stored on
d:\abc\test. How can I accomplish this?
Unless you are using a "J2EE web application" there is no simple way to do this. I
would suggest creating a new web application and registering it with tomcat.
Once you've setup your web application, you can register it with tomcat by opening
up the server.xml file from the "conf" directory under your tomcat installation. Again,
take a look at how the example application is registered and use the same
mechanism for registering your new webapp. All you need to do is specify the
"docBase" attribute as a fully qualified path.
19) If I enable automatic servlet reloading for a webapp, will the init() method of the
servlet get executed for each automatic reload?
Yes.
The following simple servlet, called TestServlet, can be used to verify the answer
to the question. In my Tomcat 3.1 container, this servlet is inside a webapp called
test-suite and resides in the directory
TOMCAT_HOME/webapps/test-suite/WEB-INF/classes
Page 89 of 138
In accordance with the jGuru FAQ posting, I have enabled automatic reloading
for this webapp by including the following element in the server.xml file in the
TOMCAT_HOME/conf directory:
As the following code shows, the servlet contains a line "Revision number: xx"
where xx can be edited to create a change in the servlet to trigger automatic
reload. Upon each reload, the print statement in the init() method will be printed
out in the Tomcat console window. Here is the code for this servlet:
//filename: TestServlet.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
out.println( "<html>" +
"<head><title> TestServlet </title></head>" +
"Hello there from TestServlet ----- " +
"Revision number: 18" +
"</body></html>" );
}
}
Tomcat is the code name for the flagship product of the Jakarta Project . It is a
commercial-quality, open-source implementation of the Java Servlet 2.2 and
JavaServer Pages 1.1 Specifications that runs either standalone or integrated with a
Page 90 of 138
web server. It is also the official Reference Implementation for those specifications
(sanctified by Sun).
21) With regard to automatic servlet reloading in Tomcat 3.1, what happens if one
servlet makes references to other servlets in the same webapp? Will automatic
reloading get enabled for all such servlets?
Let's say that a webapp for which automatic reload has been enabled consists of
a group of mutually referencing servlets. Let's also say that you have modified
and recompiled all the servlets. When you hit the reload button on the browser,
only one servlet -- the servlet that the browser is pointing to -- will be
automatically reloaded by the container. Hitting the reload button on the browser
for the other servlets will not cause their reload into the container and you will
only see their older versions. If you want the newer versions of the other servlets
to be reloaded into the container, in general you'd need to shutdown and restart
the servlet container.
This behavior of Tomcat 3.1 is in keeping with the following statement that
appears in Tomcat 3.1 release notes:
"...... changes to classes other than the servlet you are requesting
do not trigger class reloads -- you will need to restart Tomcat to
reflect changes in those classes."
In the rest of this posting, I will explain this property of Tomcat 3.1 with the help
an example. The reader is also referred to a posting by Costin Manolache on this
aspect of automatic class reloading in Tomcat 3.1.
Let's say that after starting the servlet container, you point your browser to the
following URL:
http://localhost:8080/test-suite/servlet/TestServlet_1
Page 91 of 138
the servlet container will load TestServlet_1 into the container, which will cause
the browser to display a "Hello..." message. If you click inside this message
where indicated, the browser will make a request for TestServlet_2 and it will be
loaded into the container.
Now suppose you make changes to both the servlets by altering, say, the value
of "Revision number: ". If your browser is pointing to TestServlet_1 and you hit
reload button, the servlet container will automatically reload TestServlet_1. But
the container will NOT reload TestServlet_2 even if you hit the reload button on
the browser when the browser is pointing to TestServlet_2.
To see the newer version of TestServlet_2, you have two choices: 1) Recompile
the classes and this time start out by pointing your browser to TestServlet_2. Or,
2) Shutdown and restart the servlet container.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
out.println( "<html>" +
"<head><title> TestServlet_1 </title></head>" +
"Hello there from TestServlet_1 ------- " +
"To see the hello message from TestServlet_2," +
" click <a href=\"/test-suite/servlet/TestServlet_2\">here</a> ------ " +
"Revision number: 17" +
"</body></html>" );
}
}
Page 92 of 138
////////// file: TestServlet_2.java //////////
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
out.println( "<html>" +
"<head><title> TestServlet_2 </title></head>" +
"TestServlet_2 saying hello ------- " +
"To see the hello message from TestServlet_1," +
" click <a href=\"/test-suite/servlet/TestServlet_1\">here</a> ------ " +
"Revision number: 17" +
"</body></html>" );
}
}
22) Is there any way to tell Tomcat (or any servlet engine) never to use cookies for
session management?
I'm not sure about Tomcat but in WebLogic (from 4.0.2 to 5.1 versions) there is
parameter in the weblogic.properties file which can enable (or disable) cookies.
Page 93 of 138
23) Is it possible to use a TagLib without defining a web app using Tomcat? [I'm
using .jsp without webapps and everything's ok, but I can't make it work with
taglibs]
When using taglibs with an application you specify the location of a tag library in
the web.xml file, web.xml resides in TOMCAT_ROOT/webapps/APPNAME/WEB-
INF. The taglib entries in web.xml look like:
<taglib>
<taglib-uri>
blahblah
</taglib-uri>
<taglib-location>
/WEB-INF/jsp/BlahBlah.tld
</taglib-location>
</taglib>
No, Tomcat does not support EJB. It is a Servlet/JSP container, not an EJB
container.
Currently (as of version 3.2) the procedure for deploying a new WAR file is:
1. Stop Tomcat.
2. Delete existing deployment. If you have previously deployed "foo.war" in
TOMCAT_HOME/webapps, then it has been unpacked into
Page 94 of 138
webapps/foo/... You must delete this directory and all its contents. On
Unix, this can be done with
rm -r $TOMCAT_HOME/webapps/foo
This process may become easier in the future. A "deploy tool" is on the Tomcat
"to-do" list.
Note that if you deploy a WAR file in this manner, you do not need to make any
changes to server.xml -- it will automatically be recognized and activated.
However, if you wish to specify non-default options for this webapp, you may do
so by adding an element like
to server.xml.
26) What is the difference between JServ and Tomcat? And what's up with
mod_jserv and mod_jk?
JServ was one of the very first servlet engines. It is now an open source project,
consisting of two parts: a pure-java servlet engine, compliant with the Servlet
spec version 2.0, and an Apache module written in C called mod_jserv that
allows Apache to send servlet requests to the JServ JVM.
Here's the confusing part: originally, when it was time to write a connector from
Apache to Tomcat, they started with the code base of mod_jserv. Although it has
been rewritten and revised to the point where it is no longer compatible with the
mod_jserv that comes with JServ, unfortunately, it is still called mod_jserv. This
means that if you have the JServ mod_jserv installed, it will not work with
Tomcat, and vice versa.
Fortunately, the latest version of Tomcat comes with a new connector for
Apache, called mod_jk. This connector supports Tomcat but not JServ. It is also
more advanced, in that it supports Tomcat-style load balancing, and also
supports SSL authentication (though this latter functionality is still a bit rough and
may have bugs in actually *reporting* that the connection is secure).
So if you just use mod_jk and Tomcat, you should have no problems (at least as
far as this connector issue is concerned).
Page 95 of 138
27) I am runing Tomcat on Apache for NT. When I put a \ after the the jsp page, e.g.
"http://www.myserver.com/includes/top_nav.jsp\", it shows the code, i.e. the java
embedded in the HTML. How do I resolve this issue?
This is a bug. AFAIK it has been fixed in the latest version (3.2) of Tomcat.
/index.html
/howto.jsp
/feedback.jsp
/images/banner.gif
/images/jumping.gif
/WEB-INF/web.xml
/WEB-INF/lib/jspbean.jar
/WEB-INF/classes/com/mycorp/servlets/MyServlet.class
/WEB-INF/classes/com/mycorp/util/MyUtils.class
cd /home/alex/webapps/mywebapp
jar cf ../mywebapp.war *
Page 96 of 138
31) How are initialization parameters passed to a servlet under Servlet API version 2.2?
Through the webapp deployment descriptor, which is the web.xml file in the
directory WEB-INF.
Note that there are two different types of web.xml files in Tomcat 3.x: There is a
web.xml that sits in the top-level configuration directory TOMCAT_HOME/conf
and then there can be a separate web.xml for each webapp in the directory
WEB-INF for that webapp. You would want to keep webapp specific deployment
information, such as initialization parameters and their values, in the web.xml
specific to that webapp.
The best on-line example that illustrates servlet initialization through a webapp's
deployment descriptor is, I believe, the ServletParam servlet in the test webapp
in your Tomcat software package. This servlet can be called with two different
canonical names, as for example in
http://localhost:8080/test/servlet/servletParam1
and
http://localhost:8080/test/servlet/servletParam2
param1 value1
param2 value2
and when the same servlet is called with the name servletParam2, the
parameter-value pairs are
param3 value3
param4 value4
<?xml version="1.0"?>
Page 97 of 138
<!DOCTYPE web-app SYSTEM "http://java.sun.com/j2ee/dtds/web-
app_2.2.dtd">
<web-app>
<servlet>
<servlet-name>
servletParam1
</servlet-name>
<servlet-class>
ServletParam
</servlet-class>
<init-param>
<param-name>param1</param-name>
<param-value>value1</param-value>
</init-param>
<init-param>
<param-name>param2</param-name>
<pram-value>value2</pram-value>
</init-pram>
</servlet>
<servlet>
<servlet-name>
servletParam2
</servlet-name>
<servlet-class>
ServletParam
</servlet-class>
<init-pram>
<pram-name>param3</pram-name>
<pram-value>value3</pram-value>
</init-pram>
<init-pram>
<pram-name>param4</pram-name>
<pram-value>value5000</pram-value>
</init-pram>
</servlet>
</web-app>
The first half of the web.xml file associates the servlet ServletParam with the
name servletParam1 and then goes on to declare its parameter-value pairs. The
second half does the same for the name servletParam2.
32) Is it possible to bind Tomcat to one specific IP address on a multi-homed host (for
virtual hosting)?
Page 98 of 138
Yes, from version 3.1 you can a virtual host bind to one of the ip adresses owned
by the machine, if you add something like the following to server.xml:
as you can see you can put a IP adress for the Virtual Host name, ergo you can have a
Virtual Host pointed to any particular IP configured in your machine.
33) Can I use the latest version of Tomcat inside Sun's J2EE implementation?
The J2EE reference implementation ships with Tomcat. The classes for Tomcat
are located inside the \lib\j2ee.jar. If you wanted to use the latest version of
Tomcat you would have to replace the classes in this archive.
34) What are the advantages/disadvantages of using Tomcat's built-in HTTP server
instead of, say, Apache?
The page further says that " For all these reasons it is recommended that real
world sites use an industrial strength web server, such as Apache, for serving the
static content of the site, and use Tomcat as a Servlet/JSP add-on."
The main thing that Tomcat has going for it is that it the official reference
implementation of the Java Servlet 2.2 and JavaServer Pages 1.1 technologies
developed under the Apache license by some of the best developers around the
world.
The "invoker servlet" is a system-supplied servlet that extracts the name of the
requested servlet class from the portion of the URL that comes after "/servlet".
Page 99 of 138
The invoker servlet then loads the requested servlet into the container and
executes it.
If you look at the contents of the webapp deployment descriptor file, web.xml, in
the TOMCAT_HOME/conf directory, you will find the following servlet element at
the beginning:
<servlet>
<servlet-name>
invoker
</servlet-name>
<servlet-class>
org.apache.tomcat.servlets.InvokerServlet
</servlet-class>
</servlet>
which declares the name and the place of the system-supplied invoker servlet.
Shortly thereafter appears the following servlet-mapping element:
<servlet-mapping>
<servlet-name>
invoker
</servlet-name>
<url-pattern>
/servlet/*
</url-pattern>
</servlet-mapping>
which tells the container that all requests that begin with "/servlet" (relative to root of the
webapp specified by the name that comes before "/servlet") are to be sent to the
invoker servlet.
The observation you make does not apply to the version of Tomcat 3.1 that is
currently available for download from the Jakarta-Tomcat site. However, it does
apply to Tomcat 3.2 beta 4. More on 3.2 later in this posting. First, I'd like to say a
few words about what I am basing my 3.1 answer on.
and when the destroy() method is invoked, it prints out the following message in
the Tomcat window:
Note that the init() method will only be invoked when the servlet class is loaded
into the container and its instance created. The destroy() method will only be
invoked just prior to the container unloading the servlet.
RELOAD!!!
This shows the servlet is actually unloaded and its destroy() method invoked
before the new version of the servlet is automatically loaded in.
import java.io.*;
out.println( "<html>" +
"<head><title> TestServlet </title></head>" +
"Hello there from TestServlet" +
"</body></html>" );
out.close();
}
Therefore, with regard to automatic loading and unloading, Tomcat 3.1 works as
specified in the Servlet 2.1 API. However, the beta 4 version of Tomcat 3.2
seems to have a bug in it. When you do exactly the same thing as described
above in Tomcat 3.2, the destroy() method is not invoked, meaning that the old
copy of the servlet does not get unloaded.
38) I've setup Tomcat 3.1 with Apache on my web server to serve JSP pages. It
works well for Java Servlets and JSP pages. However, this is one issue: if the
target JSP page does not exist, the server will send out a File Not Found Error
If you look the code of the Tomcat's JSPServlet.java, you will find the following
code in the service method:
try{
//look for the jsp file
} catch (FileNotFoundException ex) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
Constants.getString("jsp.error.file.not.found", new Object[] { ex.getMessage() }));
As you can see that the FileNotFoundException directly works with the response
object and the message is taken from the messages.properties files to send it
directly to the caller (browser). Also I did not find any other mechanism in the
Tomcat's configuration to suppress the error messages. So it will not be possible
to suppress this message.
Section 3.3.3.1 of the Servlet 2.2 API Specification document says that if a
servlet implements the SingleThreadModel it is guaranteed "that only one
request thread at time will be allowed in the service method." It says further that
"a servlet container may satisfy this guarantee by serializing requests on a
servlet or by maintaining a pool of servlet instances."
Obviously, for superior performance you'd want the servlet container to create
multiple instances of a SingleThreadModel type servlet should there be many
requests received in quick succession. Whether or not a servlet container does
that depends completely on the implementation. My experiments show that
40) Which servlet containers have persistent session support? Specifically, does Tomcat
3.1?
All servlet containers that implement the Servlet 2.2 API must provide for session tracking
through either the use of cookies or through URL rewriting. All Tomcat servlet containers
support session tracking.
41) How do I write to a log file using JSP under Tomcat? Can I make use of the log()
method for this?
Yes, you can use the Servlet API's log method in Tomcat from within JSPs or
servlets. These messages are stored in the server's log directory in a file called
servlet.log.
42) When Using Tomcat 3.1 with Apache, how do you set up your context and web server
index so that a .jsp file is set as the index file?
In Apache, first map the desired jsp filename to the directory index. For example:
DirectoryIndex index.jsp
Then in your webapp's web.xml or in your server's web.xml, look at the bottom
for the <welcome-file-list> tag. You can add <welcome-file> tags to this tag, such
as:
<welcome-file-list>
<welcome-file>
desired-index.jsp
</welcome-file>
</welcome-file-list>
43) Can I include two jsp:plugin actions on one JSP page? It does not compile under Tomcat
Yes. Just include an extra set of {}'s around the plugin code:
<% { %>
<jsp:plugin
type="applet"
code="Clock2.class"
codebase="/examples/jsp/plugin/applet"
jreversion="1.2"
[Question continues: I'm able to get the dialog box requesting the username and
password to pop up, however, even though I insert one of the usernames and
passwords from the tomcat-users.xml file, I always get an "Authorization failed.
Retry?" dialog.]
Make sure that the user has been designated a role in the tomcat-users.xml that
matches the role(s) defined in the auth-constraint section of the web.xml:
web.xml:
<auth-constraint>
<role-name>role1</role-name>
</auth-constraint>
tomcat-users.xml:
<tomcat-users>
<user name="test" password="tomcat" roles="role1" />
</tomcat-users>
In Tomcat 3.2b6, it is very easy to setup virtual hosts in standalone mode. First,
be sure to set the correct port for the HTTP listener (the default is 8080, and
you'll probably want to change it to 80). Second, wrap your servlet context
definitions (in your server.xml) with a <host> tag, specifying the domain name to
work on. Here is an exerpt from a server.xml that is configured for virtual hosting:
You can configure your Apache server's virtual hosts to map to virtual hosts in a
single Tomcat instance. Each virtual host would exist as a separate servlet
context.
ApJServManual on
ApJServSecretKey DISABLED
ApJServMountCopy on
ApJServLogLevel notice
ApJServDefaultProtocol ajpv12
ApJServDefaultPort 8007
ApJServDefaultHost localhost
NameVirtualHost 192.168.0.2
<VirtualHost 192.168.0.2>
DocumentRoot /var/www/server1
ServerName server1.lokitech.com
ApJServMount /servlet /ROOT
<Directory /var/www/server1/WEB-INF>
Order allow,deny
Deny from all
</Directory>
</VirtualHost>
<VirtualHost 192.168.0.2>
DocumentRoot /var/www/server2
ServerName server2.lokitech.com
ApJServMount /servlet /ROOT
<Directory /var/www/server2/WEB-INF>
Order allow,deny
Second, configure Tomcat for virtual hosts. In your server.xml, you will wrap each
servlet context in a <host>. Here is a sample from server.xml:
<Host name="server1.domain.com">
<Context path="" docBase="/var/www/server1" reloadable="true" debug="0" />
</Host>
<Host name="server2.domain.com">
<Context path="" docBase="/var/www/server1" reloadable="true" debug="0" />
</Host>
47) How do you do servlet aliasing with Apache and Tomcat?
Servlet aliasing is a two part process with Apache and Tomcat. First, you must
map the request in Apache to Tomcat with the ApJServMount directive, e.g.,
Second, you must map that url pattern to a servlet name and then to a servlet
class in your web.xml configuration file. Here is a sample exerpt:
<servlet>
<servlet-name>myservlet</servlet-name>
<servlet-class>com.mypackage.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myservlet</servlet-name>
<url-pattern>/myservlet</url-pattern>
</servlet-mapping>
48) Can Tomcat be configured to interpret all, or selected, .html files within a given context as
JSP? Or, do JSP files have to end with a .jsp extension?
yes you can do that by modifying the web.xml file. You will have to invoke the
org.apache.jasper.runtime.JspServlet for all the requests having extension .html.
You can do that by changing the Servlet mapping code:
<servlet-mapping>
<servlet-name>
jsp
</servlet-name>
<url>*.html</url>
</servlet-mapping>
49) Is there any way I can assign different values of CLASSPATH to different contexts?
One way to get the functional equivalent is to put the files in question in either
"<app-path>/WEB-INF/classes" or "<app-path>/WEB-INF/lib", depending on
whether you are talking about a .class or .jar. The CLASSPATH for a given
webapp will include WEB-INF/classes and all the .jar files found in WEB-INF/lib.
Say you had utils.jar and form-taglib.jar in WEB-INF/lib, the resulting classpath
would look like:
$CLASSPATH:<app-path>/WEB-INF/classes:<app-path>/WEB-
INF/lib/utils.jar:<app-path>/WEB-INF/lib/form-taglib.jar
For SimpleTcpConnector, change the sub-element "port" value to 80. Yes, You
got it!
Just place the mail.jar and activation.jar files (and possibly the pop.jar file if you are using
POP3) in the CLASSPATH of the web server. The simplest way to do this is to rely on the Java
extensions framework. Add them to the JAVA_HOME/jre/lib/ext directory. Just copy the files
there. Otherwise, set the CLASSPATH environment variable before starting Tomcat. The
startup scripts retain the existing CLASSPATH, adding the Tomcat-specific stuff to the end.
52) What is the difference between apache webserver, java webserver and tomcat server?
Apache is an HTTP server written in C that can be compiled and run on many
platforms. See http://www.apache.org/
Java WebServer is an HTTP server from Sun written in Java that also supports
Servlets and JSP.
Catalina is the name given to the Tomcat 4.0 servlet engine component, in the
same way that the JSP compiler/runtime component is called Jasper.
54) Where do I install the JDBC driver ZIP files, JAR files & DLLs? How do I ensure they're in
Tomcat's CLASSPATH?
Since version 3.2, all the JARS present in the %TOMCAT_HOME%/lib directory
are automatically appended to Tomcat's classpath, but only the jars are
appended. To have a ZIP automatically appended rename it to *.jar ( as a jar is
only a renamed zip ) and voila....
1. Put the jar file in your webapp's WEB-INF/lib/ directory. This set of JARs is
added to the classpath for your webapp only. Be careful, however: if a
different driver for the same JDBC URL is already on the system
classpath, then it may (may!) be loaded instead of yours. (Whether it is or
not depends on whether that driver has already been loaded yet.)
2. Change the Tomcat CLASSPATH environment variable, or "-classpath"
command-line option, to contain your JAR or ZIP. This is set in the Tomcat
startup script, tomcat.bat/tomcat.sh. Read that file for details on how to
edit it.
By default, they will go to the console where the tomcat is started. You have to modify the
startup scripts to redirect them to appropriate files.
On the other hand, if you are running Tomcat as an NT Service, you can modify the
conf/wrapper.properties file and set wrapper.stdout and wrapper.stderr properties to
point to your log files.
56) I've written a servlet that was using JServ and now I upgrade to use Tomcat. What would I
need to change?
The only thing you should have to change code-wise is whatever has been
changed in the Servlet API between the API used in JServ and the api used it
Tomcat... just a couple that come to mind are
Not yet.
The next version (2.3) of the Servlet Spec will allow something like servlet
chaining. It's called "filters."
58) Can I use a Generic SAX/DOM XML parser for Tomcat instead of parser.jar? I tried using
Xerces and get class not found errors for sun.xxxx parser during Tomcat initialization.
Example:
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"org.apache.xerces.jaxp.DocumentBuilderFactoryImpl");
System.setProperty("javax.xml.parsers.SAXParserFactory",
"org.apache.xerces.jaxp.SAXParserFactoryImpl");
Most of the Servlet containers reload the servlet only it detects the code change
in the Servlet, not in the referenced classes.
<Context path="/myApp"
docBase="D:/myApp/webDev"
crossContext="true"
debug="0"
reloadable="true"
trusted="false" >
</Context>
But if the class that is referenced by the Servlet changes, then the Servlet will not
get loaded. You will have to change the timestamp of the servlet or stop-start the
server to have the new class in the container memory.
60) Why do I get the compiler error "package javax.servlet does not exist" or "package
javax.servlet not found in import"?
c:\tomcat
set classpath=c:\tomcat\lib\servlet.jar
61) How can you set the session timeout in tomcat higher?
Does anybody know how you can set the session time in tomcat higher? Now it is 30 minutes,
but I want to set it higher.
You can specify the timeout of a session in the deployment descriptor of your
web application (web.xml):
<web-app>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
...
</web-app>
In short, no.
Putting things very very simply, Tomcat is essentially a Java Servlet Compiler,
taking the .jsp file you write and translating it to a java servlet that runs in the
background.
I hope you know this, but JavaScript and Java are two entirely different
languages (some things are similar, but most are not). The two technologies are
by no means interchangeable, and this intuitively applies to Tomcat. To the best
of my knowledge the Apache Tomcat developmental teams have no current
plans to integrate other scripting technologies into the software (for many
reasons, of which I won't go into here for brevity).
However, you may include JavaScript within the .jsp file (not within jsp
interpretable <% %> tags), and it will be output to the client browser for
interpretation just like in an HTML page. The key here is to realize that it has no
interaction/functionlity with the server before it is sent to the client.
No.
In this case the given page will be statically included inside the the jsp page.
With this syntax, the page will be included statically or dinamically, depending on
the page itself.
Note: with Jsp 1.1 the "flush" parameter can only be true.
65) Where to save the Images, HTML, and other static data in Tomcat?
Images and HTML shall be put inside the context of your application:
war-file
|
|----META-INF
| |---MANIFEST.MF
|
|---WEB-INF
| |---web.xml
| |---jsp
| | |---taglib (.tld)
| |---classes
| |---(.class/.properties)
|---jsp
| |---(.jsp/.html/.shtml)
|
|---images
| |---(.gif/.png/.jpeg)
|
|---binaries
|---(.zip/.tar/...)
66) How do I find out Tomcat's home directory from inside a running servlet?
67) How to read a file from the WAR or webapp? If I have a configuration file, say an XML file,
stored inside the WAR, how do I open it from a servlet? I.e.,
The WAR file is automatically opened by the servlet container during the
startup... at least this is what the servlet specs are saying (and it is happening
with both Resin and Tomcat). Once you reach the servlet just use
ServletContext.getRealPath() to get the file.
For example if the file is in a 'template' dir under the root of the context, use
getRealPath("/template/file.xml");
68) How and where do I change the option for JVM heap memory in Tomcat?
If you look into the tomcat.sh or tomcat.bat under the bin directory of tomcat, you
can see an environment variable called TOMCAT_OPTS.
You can use it for passing all the JVM specific parameters, like the -X or -D.
You can set it directly in the file, or set it in the environment before calling it. For
example in unix you can do:
export TOMCAT_OPTS=" -Xms15M -Xmx15M"
tomcat.sh start
69) Where are the servlet source files for JSPs compiled in Tomcat?
[JSP is first translated into servlet than compiled. So where are those servlet
.java or .class files for JSP examples in Tomcat?]
They are located in the work directory of the TOMCAT_HOME, under a directory
that is normally called localhost_<port>%20<context_name>.
The source for JSPs from the examples webapp should be something like
localhost_8080%20examples.
71) How do I assign the user's role without using a login form?
Basically the concept is that you can use the standard http authentication schemes (i.e.: basic,
digest). This means that you can authenticate a user among a database (or, for example,
another source) without developing html login forms.
The main difference is that the Pool connector will create a pool of simple
connectors, allowing the server to answer to more requests at the same time,
while a simple connector can anwer only a response at a time.
The simple connector hasn't been designed to be used unless you know that you
will process only a request at a time.
73) Do I really need to build a complete 'webapp' just to add a simple 'Helloworld' servlet to the
server?
Not at all. You can put a single servlet anywhere on your hard disk but you will
have to configure your path in server.xml and servlet alias in web.xml as usual.
<servlet-name>hello</servletname>
<servlet-class>HelloWorld</servlet-class>
that tomcat considers while starting and you can start your servlet.
74) Why does Tomcat's first servlet request take so long?
Sounds like it is the SecureRandom class initializing. Please disable this (set the
value in server.xml to "java.util.Random") and see if it helps.
However, be warned that this method leaves your sessions open to attack. It
would take a dedicated hacker, but if you're storing any sensitive data, this is a
big no-no. So put it back to SecureRandom when you're done testing this.
className="org.apache.tomcat.service.PoolTcpConnector"
76) How do I prevent users from viewing the contents of my WEB-INF directory?
Servlet Engines (e.g. Resin or Tomcat) should not allow directory browsing of
WEB-INF. Tomcat 3.2, for example, had that same issue and they have fixed it in
Tomcat 3.2.1. This was happening when Tomcat was used standalone (not just
as a container, but even as a web server).
If this problem happens with a specific version of a standalone Resin, you should
consider to try the latest version (I'm running 1.2.5) and, eventually, send a bug
to Caucho.
Consider that this issue should happen when using the container in standalone
mode. When the container (Resin, Tomcat or abother one) is used just for
serving servlet & jsp behind a more reliable and complete web server, like
Apache, the problem is on Apache, that is serving everything else. When you ask
for WEB-INF, in fact, Apache doesn't even connect to Tomcat, there is no
reason.
So, if this is your scenario, you should add lines like these:
<Directory /WEB-INF>
AllowOverride None
Deny From All
</Directory>
Inside the virtual host or whatever you think is appropriate and, obviously,
changing "/WEB-INF" with the appropriate context.
Normally the servlet container knows how to execute servlets and what to call for
executing jsps, so you can survive without defining your own web.xml file.
There are many advantages of the web application descriptor, though. For
example if you have a servlet that it's part of a package, you would be able to
assign it a name and a mapping, so instead of calling it, for example, with
/servlet/com.foo.servlets.MyServlet, you can make it /MyServlet. Or, you can use
a servlet name that it's common and when you change the class that you are
using, you don't have to change the code or the pages that are using it.
Plus there are other interesting features, like parameter passing, securities and
so on.
But, again, to answer to your question: yes, you don't need to create a web.xml
file.
79) Can the web application reside on a machine other than where Tomcat is running?
If by "web application" you mean the set of jsps, servlets, classes, and all the
other required files, I'm afraid not. [Tomcat must be able to read the files from a
locally mounted file system.]
What you can do, though, is to have Tomcat running on one machine and the
web server running on another, but I don't think that you can have the files of the
application be read through the net without some sort of file server mounting
solution like ntfs, samba or similar.
80) Can anyone tell me the advantages and disadvantages between Tomcat, JRun, and JServ
for Apache Web Server?
Tomcat is just a servlet container, not an EJB container nor an application server, so it does
not contains any JMS basic support.
82) How do I load an applet from a servlet or JSP? Where do I place my applet class files?
An applet is executed on the client side (browser), not on the server side (servlet
container). You need to place the applet class files in a location accessible from
the browser, which means you have to treat them like normal files (like HTML or
GIF files that you want the browser to load). Thus they need to go in the webapp
directory tree, but not in the WEB-INF subdirectory.
It is best to think of the set of applet class files as entirely different from the set of
servlet class files. They will be loaded by different Virtual Machines, and may
even have different versions of classes. It is a simple matter to configure your
build environment (Ant or make) to create copies of common class files in the two
different classpath directories.
Since the concept of "current directory" is kind of fuzzy in the Servlet API, it is
usually easiest to make a separate directory just for your applet class files, and
use the optional CODEBASE parameter to the APPLET tag. Here is an
architecture that works well:
myapp/WEB-INF/classes/MyServlet.class
myapp/WEB-INF/classes/Util.class
myapp/index.html
The browser will be able to load MyApplet.class and Util.class from your /applets
web directory. It will not be able to load anything from WEB-INF/classes, since
those files are accessible only by the servlet engine.
Note that loading an applet from a page generated by a servlet is much the same
as loading an image. It is also easier to use a common "images" directory in that
case, so that images can be loaded from any page regardless of "current"
directory.
83) Is it possible in Tomcat to allow running all servlets from a directory without configuring
each one in web.xml ?
maybe you can just use the same logic that is used by the servlet, calling an
invoker for the given directory. I never tested it, but it sound right:
<servlet>
<servlet-name>
invoker
</servlet-name>
<servlet-class>
org.apache.tomcat.servlets.InvokerServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>
invoker
</servlet-name>
<url-pattern>
/myDirectory/*
</url-pattern>
</servlet-mapping>
84) Using jsp:forward on Tomcat, why do I get the error java.lang.IllegalArgumentException at
javax.servlet.http.HttpUtils.parseName(HttpUtils.java:285) ?
doesnt. The later is what we had in our code hence the exception.
It's not that difficult. You can simply use the Java Security, provided you have
Java 2.
For example :
grant {
permission java.io.FilePermission "-", "read,write";
}
This only allows to read and write in the current directory and its sub-directories.
Write this in your tomcat.policy file and then start tomcat like this :
/path/to/java/bin/java -Djava.security.manager
-Djava.security.policy=/path/to/tomcat/conf/tomcat.policy
-Dtomcat.home=/path/to/tomcat org.apache.tomcat.startup.Tomcat "$@" &
Don't forget the necessary permissions for tomcat to work properly.
This method returns a URL to the class file in question. From that you can
manipulate it to get what you want.
return classURL;
}
http://localhost:8080/manager/list
You will get a page (very simple) that show all the active web applications.
<session-config>
<session-timeout>60</session-timeout> <!-- 30 minutes -->
</session-config>
TOMCAT 4.0.1 on NT4 throws the foll exception when i try to connect to Oracle
DB from JSP.
javax.servlet.ServletException : oracle.jdbc.driver.OracleDriver
But, the Oracle JDBC driver ZIP file (classes111.zip)is avbl in the system
classpath.
My problem was solved. I copied the Oracle Driver class file (classes111.zip) in
%TOMCAT_HOME%\lib directory and renamed it to classess111.jar. It worked.
Now i am able to connect to Oracle DB from TOMCAT 4.01 via Oracle JDBC-
Thin Driver.
Sun's specifications for Servlet define only the WEB-INF/classes and WEB-
INF/lib directories in order to make the web application portable.
The startup script for Tomcat 3.2.x should automatically add that classpath to the
one used by Tomcat, while, with version 4.0.x and 3.3.x, you definitely need to
make a small change in the startup script to add the CLASSPATH environment
to the one that is generated by the script to esecute Tomcat.
The only issue is that the classes/jars you've added will be available to all the
web applications running under that instance.
<init-pram>
<pram-name>readonly</pram-name>
<pram-value>false</pram-value>
</init-pram>
<security-constraint>
<web-resource-collection>
<web-resource-name>The Entire Web Application</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>tomcat</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Tomcat Supported Realm</realm-name>
</login-config>
<security-role>
<description>
An example role defined in "conf/tomcat-users.xml"
</description>
<role-name>tomcat</role-name>
This modified things so you need to login as a user defined as having a role of
"tomcat" in conf/tomcat-users.xml in order to edit or view anything in the webdav
directory.
I need it to allow anyone to access the file over the web, but only prompt for a
password if they try to modify the file.
I added the following and the behavior is what I was trying for:
<web-resource-collection>
....
<http-method>DELETE</http-method>
<http-method>POST</http-method>
<http-method>PUT</http-method>
<http-method>LOCK</http-method>
</web-resource-collection>
This prompts for authentication when a user tries to lock a file for editing as well
as POSTing and PUTting. I'm not sure if this will have any effect on forms ability
to function and send stuff to a jsp page. (For example: will the user be asked for
a password if they fill out and submit a form.) This isn't really a problem because
all my webdav content will be in a separate folder at this point.
93) Where should I copy the class file of applet in Tomcat? Where should I copy respective
HTML file?
HTML (and .JSP) files are placed under the webapps/ROOT directory under the
installation directory (or other than ROOT if you've defined a different context).
Applet .class files would then be placed relative to the location of the HTML file.
You can also specify a specific codebase by providing that paramter to the HTML
file.
As far as I know, there is no user that is assigned the 'admin' role after an
installation of tomcat. (For security reasons I assume).
95) I put my JAR file inside WEB-INF/lib, but my classes are not getting found. However, when
i unzipped classes into WEB-INF/classes/, it works. What's up?
Some old versions of Tomcat do not include WEB-INF/lib/*.jar in WebApp classpath. You may
handle it updating to a newer version of tomcat or (as you did) unpacking jars into WEB-
INF/classes/.
As specified by the documentation, this method returns the login of the user
making this request, if the user has been authenticated, or null if the user has not
been authenticated.
The authentication, in this case, is the http authentication.
Application Server
1) How can I get access to the properties of my running WebLogic server that have
been set inside the weblogic.properties file? In particular I am after the document
root of my server.
In WebLogic 5.1, to gain access to the weblogic properties, you can use the
ConfigServicesDef interface which is accessible from the T3Client. The particular
property that you are after is :
• weblogic.httpd.documentRoot
You may need to pre-pend the following properties to get the full path
• weblogic.system.home
• weblogic.system.name
The following is some sample code that should get you going
import weblogic.common.*;
2) What is the difference between WebLogic Express server and WebLogic server?
WebLogic Express is a "cut-down" version of the WebLogic Server and contains the
JDBC connection pool and Servlet functionality but amongst others, does not
contain an EJB Container or transcation services.
3) What are the tradeoffs between using a single JRE versus running multiple,
separate instances of the JVM for a complex application like an application
server?
One of the major problems with JVM is garbage collection. When running small,
short-lived applications there are not significant problems with Garbage
Collection.
However, in the case of an Application Servers, which must service clients for
long durations, memory usage is high and the amount of work required by the
Garbage Collector is in turn high. This can lead to the following problems: Slow
Garbage Collection or the Garbage Collector taking large amounts of
time/resources to complete its' cycles.
So, for scalability, it is better to run multiple VMs - making each VM use only 100
- 200 megs of memory.
There should be one answer to this question that works for all 2.2 compliant
servlet containers. The answer is to edit the web.xml deployment descriptor for
your web app and add an error-page tag. The error-page tag tells the container
the location of a page to return when an exception or error occurs. You can use
the same mechanism to return customized error pages based either on a specific
exception that is thrown, or based on the HTTP status code that is returned. The
tag looks like this:
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>myPage.html</location>
</error-page>
Or
The time of creation of stubs and skeletions for EJB components varies from
server to server.
The creation of stubs and skeletons for the popular servers is outlined below:
jBoss Server
In jBoss, the stubs and skeletons are not required to be generated by the
developer or deployer. The Server takes care of the creation and downloading of
stubs.
• You can't specifiy storage of objects. For instance, Oracle 8i does support
storage of objects, i.e Blobs and Clobs.
• You are limited to the String objects and a few other primitive types. (For
storage of arrays of values, you may need to find a work around. )
• An Entity Bean can only map to one table, if more complex joins are
required, you may require a more complex persistence manager( such as
CocoBase or TopLink)
A general strategy for determining the optimal value for your system is to monitor
your CPU utilization whilst running a test application.
If the WebLogic server is not responding to requests made from a client, and the
CPU utilization is not at least 75% +, then you should increase the value and re-
run the test.
<finder>
<method-name>findByAccount</method-name>
<method-params>
<method-pram>java.lang.String </method-pram>
<method-pram>java.lang.String </method-pram>
</method-params>
The weblogic.properties file is a plain text file that follows the standard Java
property file format - see this FAQ for more details. All configuration information
for the Weblogic server is placed inside this file, including:
weblogic.system.listenPort=7001
To create a new weblogic.properties file, simply create a new text file with the
name weblogic.properties.
You can do this by setting the following property in your weblogic.properties file
weblogic.system.enableConsole=false
First party tools would be something you create yourself. Second party tools
would be tools you buy from a vendor, like an IDE. Third party tools are tools for
use with second party tools that aren't from the second party vendor. Think of
them as add-ons to make second party tools more useful.
12) How do you deploy EJB components inside the iPlanet Application Server?
The iPlanet deployment tool, is in my opinion, the simplest way to deploy EJBs.
However, for a more flexible and faster way using command line, the process is
the following:
Example assumes bean called Foo
3. Place your files and the compiled stubs in a directory along with the XML
descriptors in a Jar compliant directory structure.
4. Generate a jar file (Foo.jar) that contains the descriptors, the stubs, your
class files and the manifest.
5. Execute ejbreg as follows: ejbreg Foo.jar
This will register the bean. You will still need to make sure that the jar file is in
iPlanet's classpath (kregedit for NT, edit kjs in Unix)
13) In WebLogic, How I can set my own property name and value in the
weblogic.properties file and read that properties from a my code?
Page 128 of 138
To do this, prepend your property with java.system.property.
and access your property using the System class. For example, if we have a
property called "website" then we would add it to our property file as follows:
java.system.property.website=www.jguru.com
String s = System.getProperty("website");
14) In Weblogic, where do you find the classes for the javax.naming and javax.sql
packages?
<weblogic dir>\lib\weblogic.jar
15) In WebLogic 5.1, what options are there for Session Persistence? How do they
compare in relation to performance, and level of fail-over?
For customers who want the highest in servlet session persistence, JDBC-based
persistence is the best choice.
16) When calling an EJB from another EJB should they both be packaged in same
JAR?. Are the any preferences for Weblogic or any other servers?
The only possible catch is to have the client classes available to the calling bean.
17) Which WebLogic 4.5x/5.x property is used to control the number of queued
requests inside the WebLogic server?
18) When I try load *.jsp files, I see the source code of each JSP files in my browser,
what is wrong?
You can only load a JSP file through you webserver, if you open them by hand
the browser will show the Java code inside the HTML file. By starting you Tomcat
(or an other JSP / Servlet engine) the server will compile the JSP and will send a
'normal' HTML file to you browser that will behave as you coded it in the Java
code between the HTML tags.
If you did start the JSP / Servlet engine but you are still seeing the JSP code then
the server mappings are wrong. The engine does not know that it should compile
the JSP file that is requested and simple shows the complete file. In the Tomcat
engine this is specified in the server.xml file in the conf directory. The server.xml
should contain this:
<servlet>
<servlet-name>
jsp
</servlet-name>
<servlet-class>
org.apache.jasper.runtime.JspServlet
</servlet-class>
<load-on-startup>
-2147483646
</load-on-startup>
</servlet>
This piece of XML tells the Tomcat server that it must use the JspServlet class
when a JSP file is requested. The JspServlet then checks if the JSP file is
compiled or not.
e.g.
...
super.init(config);
...
weblogic.httpd.register.servlets=weblogic.servlet.ServletServlet
21) In a Weblogic CMP EJB, how to obtain the maximum value in the specified
database column? In WLQL is there something similar to MAX() function in SQL?
dont know how to write in WLQL. Another solution is to write the query using
SQL inside the weblogic-cmb-rdbms-jar.xml file.
<finder-list>
<finder>
<method-name>findByOrgn</method-name>
<method-params>
<method-pram>
<pram-type>java.lang.String</pram-type>
<pram-name>orgnCode</pram-name>
</method-pram>
</method-params>
<finder-type>SQL</finder-type>
<finder-query>
< ! [ CDATA[SELECT * FROM Asn_Goal_M WHERE ( orgn_code = #orgnCode
and DELETE_FLAG='N') ] ] >
22) When using JavaBeans from my JSP inside WebLogic, where should I place the
JavaBean classes?
If you are using an older version of WebLogic, you can place these classes on
your Servlet Classpath.
23) What is the difference between an Application server and a Portal server?
env.put(Context.InitialContextFactory, "com.sun.jndi.ldap.LdapCtxFactory"); // I
added this line myself
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires,
o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");
// Create the initial context
DirContext ctx = new InitialDirContext(env);
You may want to store the actual LDAP tree that contains the users you are
authenitcating so youi can dynamically set it without recoding, so the actual code
may look like this if you store the LDAP tree name in JNDI as
"myUserLDAPTree" (ou=NewHires, o=JNDITutorial):
env.put(Context.InitialContextFactory, "com.sun.jndi.ldap.LdapCtxFactory"); // I
added this line myself
env.put(Context.SECURITY_AUTHENTICATION, "simple");
java.system.property.myproperty=myvalue
To be WebLogic 6 and J2EE compliant, you should use environment entries inside
your xml descriptors for both EJB application archives and web application archives
and use the JNDI environment naming context (ENC) to retrieve the values.
27) Differences in obtaining connection pools I'm trying to understand the difference
between two ways to get a connection from a Weblogic 6.0 connection pool.
What are the two ways and is either method preferable to the other? Or does it not
matter?
The two different ways that we can get a connection from a pool are listed as
follows(taken from the original posting from the author).
1. Have a connection pool manager with a getConnection method that uses the
following code:
2. Using JNDI and providing a URL (such as PROVIDER_URL below) for the
machine the connection pool is on. The following code could be used in a
ConnectionPoolManager class too:
try {
ctx = new InitialContext(ht);
javax.sql.DataSource ds =(javax.sql.DataSource)
ctx.lookup("myJtsDataSource");
java.sql.Connection conn = ds.getConnection();
} catch (Exception ex) {}
The underlying result is the same. However, using a DataSource is the newer
and much preferred method as the developer does not tie themselves to a
particular driver or connection pool. There is also the added flexibility of changing
connection pool properties without modifying the code.
27) Is there a simple example of how to use web application security in WebLogic?
Following is an example for WebLogic 6.x that protects all URLs that begin with
/secure:
<web-app>
<security-constraint>
<web-resource-collection>
<web-resource-name>SecurePages</web-resource-name>
<description>Security constraint for resources in the secure
directory</description>
<url-pattern>/secure/*</url-pattern>
<http-method>POST</http-method>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<description>only let the admin role access the pages
</description>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<description>SSL not required</description>
<login-config>
<auth-method>BASIC</auth-method>
<security-role>
<description>A role to access the secured pages</description>
<role-name>admin</role-name>
</security-role>
</web-app>
<weblogic-web-app>
<security-role-assignment>
<role-name>admin</role-name>
<principal-name>system</principal-name>
</security-role-assignment>
</weblogic-web-app>
You can think of a Multipool as a "pool of pools". WebLogic 6.x allows you to
create a Multipool and have it mapped to a DataSource.
Multipools support two mutually exlusive algorithms:
1. Load Balancing - where requests are shared amongst the pools and,
2. High Availability - where the first pool is used until a fatal exception
occurs, then control is passed to the second pool. Note that transaction
information is not saved in the event of an error.
The client program is un-aware that a Mutlipool is being used, so there are no
coding changes required, it is simply an administration change. Multipools work
well with database failover products such as Oracle Parallel Server.
29) What are the valid values for the Session Descriptor inside the weblogic.xml file for
WebLogic 6.1?
• CacheSize
• ConsoleMainAttribute
• CookieComment
• CookieDomain
• CookieMaxAgeSecs
• CookieName
• CookiePath
• CookiesEnabled
• IDLength
• InvalidationIntervalSecs
• JDBCConnectionTimeoutSecs
• PersistentStoreCookieName
• PersistentStoreDir
• PersistentStorePool
• PersistentStoreType
• SwapIntervalSecs
• TimeoutSecs
• TrackingEnabled
• URLRewritingEnabled
<session-descriptor>
<session-pram>
<pram-name>URLRewritingEnabled</pram-name>
<pram-value>True</pram-value>
</session-pram>
<session-pram>
<pram-name>CookiesEnabled</pram-name>
<pram-value>True</pram-value>
</session-pram>
</session-descriptor>
IBM WebSphere provides the GUI where the option is there to set wether the
server wants a particular Servlets is to be invoked upon start up. This will
updated the XML as follows:
31) Could you please help me??? What is the difference between Production mode and
Development mode in WebLogic 6.1?
This is turned off in production to reduce the overhead of continually polling the
directory for updates.
Inside an EJB you may retrieve the "Caller" name, that is the login id by invoking:
sessionContext.getCallerIdentity().getName()
where sessionContext is the instance of "SessionContext" (setSessionContext)
passed to the Session Bean, or the instance of "EntityContext" (setEntityContext)
passed to the Entity Bean.
Additional info:
I am using Oracle 9ias server. I have given max-connections to 50
in data-sources.xml file. And the class i am using is
"oracle.jdbc.pool.OracleConnectionCacheImpl". I have also tried
with OracleConnectionPoolDataSource class in data-sources.xml.
But i feel that connection pool is not utilised, because in the middle
of the retrieval, the server hangs as there will no be connections left
for opening...
In entity beans, I have created connections in setEntityContext and
releasing them in unsetEntityContext...
Do not get the connection in the setEntityContext. Get the connection only when
you need it.
If you get the connection in setEntityContext with the pool of 50 connections and
you retrieve 50 different entity beans each bean will hang on to the connection
and you will hang.
So, get the connection when you need it and release the connection as soon as
you have no need for it any longer.
There is no reason to get the connection in setEntityContext.
34) Are there any tools for porting EJB Applications from one Application Server to another?
If you have developed a fully compliant J2EE application, you will be able to
deploy it on any Application Server that follows Sun J2EE Specifications. That is
one of the biggest advantages of using standards and following the
spceifications.
Maybe, then, you will probably have to spend some time in tuning and fixing the
configuration of the specific server.