Java and J2EE An Introduction
Course Companion
©2002 Ariadne Training Limited
2
An Introduction to Java and J2EE
Contents
CONTENTS
2
The Purpose of this Book
5
THE HISTORY OF JAVA
6
Background to Java Java Applets Java Applications Server Side Java Summary
6 7 8 9 9
JAVA SOFTWARE DEVELOPMENT
10
Java Variants The Java Development Kit Evolution of the SDK Java Help The Key Java Features Platform Independence The Java Virtual Machine Graphical User Interfaces The “AWT” Swing to the Rescue A Swing GUI Multi Threading Java Multithreading Multithreading Example Running the Multiple Threads The Output Error Handling Exception Handling Example Object Orientation Java Garbage Collection Java Applets Databases in Java Summary
10 10 11 12 13 13 13 14 15 16 17 18 19 19 20 20 21 22 23 23 24 24 24
JAVA VS OTHER LANGUAGES
26
Language 1: Visual Basic An Example VB Program Language 2: C / C++ Example C++ Program
26 27 27 28
© 2002 Ariadne Training Limited
3
An Introduction to Java and J2EE
Language 3: C# (C-Sharp) VB vs Java C++ vs Java C# vs Java Microsoft .NET Summary
29 29 30 30 31 31
JAVA PERFORMANCE
32
Java Performance Why Should Java be Slow? Slow Java Demo and Benchmarks Demo Benchmark Summary Native Code Compilers Summary
32 32 32 33 33 34 34 34
INTRODUCING J2EE
35
What is J2EE? Two-Tier Architecture Two-Tier Architectures: Disadvantages The Three Tier Model Application Servers The J2EE Standard J2EE Components Java Servlets Java Server Pages (JSP) Enterprise Java Beans (EJBs) The J2EE Architecture Concrete Example – A Warehouse Summary
35 35 36 37 37 38 38 38 39 39 39 40 41
SERVLETS AND JSP
42
Servlets and JSP The Static Web Making the Web Dynamic Solution: CGI The Servlet Solution An Example Servlet A Serious Problem Emerges Java Server Programming (JSP) JSP Architecture Another Dynamic Webpage Another Problem Emerges! Solution: Servlets! The MVC Architecture Java in JSP’s Custom Tags JSP Example
42 42 43 43 44 44 44 45 46 47 47 48 49 49 50 50
© 2002 Ariadne Training Limited
4
An Introduction to Java and J2EE
Using a Custom Tag Summary
51 51
ENTERPRISE JAVA BEANS (EJB’S)
53
Java Beans The Purpose of Java Beans Enterprise Java Beans EJB’s Are: EJB’s are Persistent EJB’s are Transaction Aware Place Order Example EJB’s are Distributed EJB’s are Multithreaded Types of EJB Entity Beans J2EE Design Patterns Example Design Pattern Design Problem Design Solution EJB Summary
53 53 54 54 54 55 55 56 56 57 57 58 58 59 59 60
THE JAVADOC TOOL
62
How the Tool Works Running the Tool Javadoc Demonstration Summary
62 63 63 63
COURSE SUMMARY
65
Java Problems
65
BIBLIOGRAPHY
67
© 2002 Ariadne Training Limited
5
An Introduction to Java and J2EE
Introduction The Purpose of this Book This book accompanies the course “An Introduction to Java and J2EE”. Aimed at a general audience of both technical and non-technical people, the course describes the principles of the Java language – where it came from, why it is popular and what it can offer. The second half of the course describes the Java Enterprise Edition – a framework for building large scale Enterprise applications using the standard Java language. The course does not cover the technical details behind Java and J2EE, in particular how to write programs in Java. For these details, see the in-depth Programming in Java courses.
Project Standard
To submit comments or questions, please email
[email protected], or see our website at www.ariadnetraining.co.uk.
If you’re a project manager on a new Java project, you may find some of our suggestions to be useful as possible project standards. We’ll break out these suggestions in to boxes like this one. They’re only suggestions and may not work for your project, but they are guidelines that we have found to be valuable on other projects.
© 2002 Ariadne Training Limited
6
An Introduction to Java and J2EE
Chapter 1 The History of Java
Background to Java1 Back in the very early 1990’s a team of engineers were set up at Sun Microsystems to pre-empt the “next big thing in computing”. Led by legendary Sun programmer James Gosling, the team decided to concentrate their efforts on embedded electronic devices. Given the prevalence of micro chips in TV’s, washing machines, remote controls and so on, the team attempted to build a handheld device (their prototype was called “*7”) capable of a wide variety of household tasks. Which programming language would they use to program these electronic devices? C++ could well have been the language of choice for Gosling’s team. C++ is based on the decades old C language, and C has a proud tradition in the embedded systems arena. At the time (perhaps the same is still true today), C++ was the most popular programming language2 and by adopting this language for their devices, they would be guaranteed a large and ready made community of engineers to program for their products. However (as we will see later), C++ is a very difficult language to master. It is very easy to write C++ programs that may appear to work perfectly but which are in fact bug ridden and unreliable. C++ gives the programmer a lot of power and freedom, and while this power can be harnessed by experienced programmers, in the hands of less competent engineers, disasters are commonplace.3 Gosling realised that a safer, more straightforward replacement for C++ was required – and if the replacement could look a bit like C++, then so much the better for persuading existing C++ coders to cross over to the new language.
1
See http://www.wired.com/wired/archive/3.12/java.saga.html for an excellent commentary on the inception of Java
2 Cobol is probably in heavier use, but of the “modern” languages, C++ would have been the language of choice for many software engineers 3
See reference [7] and read the details of the London Ambulance service fiasco – one source of the problem was a C++ memory leak
© 2002 Ariadne Training Limited
7
An Introduction to Java and J2EE
The new language was codenamed Oak, and was quickly put together by Gosling and his team (much of the language had already been created by Gosling, at home in his spare time!). The language was subsequently renamed Java when it was realised that another language called Oak already exists. Java isn’t an acronym by the way – it was named after the team’s favourite coffee! To cut a long story short, the “*7” venture was initially a failure. The take up of the technology was slow and the group failed to win any significant business. Meanwhile, the World Wide Web had been taking off dramatically and was causing much excitement in the industry (and beyond the industry too – at the time there was plenty of talk about the “Information Superhighway” in the media). Initially, the web was a fairly static place – lots of simple text documents linked together. Web visionaries craved interactivity – would it be possible one day to play games on the web, or to view a company’s products, and order them, via the web? The internet had never been considered relevant to Java during its design; but by accident all of the design goals of Java – the ones that Gosling had observed to make his language suitable for electronic devices - were directly applicable to the world wide web. Java programs are designed not to crash – essential for the web. Java programs are designed to run on any hardware – again, essential, given that users of many different types of hardware use the web. Gosling’s team changed tack, and in about 1995, they began to apply Java to the internet. The potential of the language was quickly recognised by the internet community and a mass of hype and excitement began to build up around Java. In 1995 and 1996, Java was definitely the hottest property in IT; the attention centred around the idea of running Java Applets inside web browsers…
Java Applets A Java Applet is a small Java application (Application-let), and is essentially a graphical Java program that can run inside a web page.
Figure 1 - A Java calendar Applet Applets have many interesting features and advantages:
© 2002 Ariadne Training Limited
8
An Introduction to Java and J2EE
•
They will run on any browser (as long as the browser supports applets; the latest versions of IE and Netscape do). They will also run on any platform, regardless of whether the user is running on a PC, Mac, Sun Workstation, whatever.
•
The biggest advantage of an applet is that they are dynamic. They can be embedded into the static text of a web page and they can do things; the user can interact with them. The example in Figure 1 is a fairly simple calendar, but technically an Applet can be as complex as the programmer’s imagination allows.
•
A serious concern in the early days of the web was safety. Given that an applet is essentially a piece of software, how do we know that an Applet isn’t malicious? For example, the calendar Applet could be secretly deleting all the files on our hard disk, or it could be sending salacious emails to everyone in our email address list. Thankfully, Java addressed these concerns very well indeed. Users can be fairly sure that an Applet is not capable of doing anything nasty or unwelcome – we will look at Java security later on in the course.
All of the above is all very well, but Applets also suffer from some serious problems: •
Firstly, Applets are very slow to download. Well, they’re not that bad – the files are relatively small, but an Applet that does anything vaguely interesting is probably going to be too big to download comfortably using a standard modem. Broadband internet wasn’t available back in 1996!
•
Secondly, Applets are inherently limited in their functionality4. We said above that Applets are not capable of deleting all of the files on a user’s hard disk – in fact Applets are not capable of even accessing a user’s hard disk! Nor can an Applet contact any web site other than the one it was downloaded from. These are serious restrictions that essentially prevent many interesting Applets from even being written.
•
Finally, many Applets look fairly shabby. This isn’t generally because the programmers of the Applet are incompetent; it is more because the graphical features supported by Applets are desperately limited.
In the early days of Java, there was a proliferation of cheap and nasty Java Applets all over the web – usually doing things like small animations. It is fair to say that many people still believe that Java is only capable of writing poor quality eye-candy on web pages…
Java Applications … but Java has always been capable of building full blown Applications running outside web browsers. Certainly, the early releases of Java lacked some of the features
4
These restrictions can be circumnavigated these days –but not when applets were becoming popular
© 2002 Ariadne Training Limited
9
An Introduction to Java and J2EE
required to build very serious applications, but by version 1.2 of Java (released in late 1998), Java is now considered to be a full blown “serious” language. Java still may not be suitable for writing real time safety critical systems (this is open to debate, we won’t comment here), and certainly Java won’t be suitable for writing low-level applications such as new Operating Systems. Other than these areas, Java should be able to compete with any other language. We will compare Java to other languages in a later chapter.
Server Side Java More recently, Java has also become recognised as a server-side language too. For example, the concept of a servlet enabled web pages to contact small Java applications running quietly on a server; the servlet could perhaps work with a database and return results back to the user viewing the webpage. We’ll look in more detail at servlets later. Server-side Java was evolving in many different directions until the whole concept was formalised by J2EE (Java Enterprise Edition), which we will explore in detail in the second half of this course.
Summary •
Java was originally designed as a language for writing small, embedded applications on electronic devices
•
Java became the first “internet” language in 1995-96; Java Applets were hot technology
•
Applets have largely failed to deliver their initial promise
•
However, Java is a very well designed language and is now being exploited to build full blown applications
•
Java reached maturity at version 1.2 (1998)
Java is also being exploited as a Server Side language
We’ll look at this in the second half of the course
© 2002 Ariadne Training Limited
10
An Introduction to Java and J2EE
Chapter 2 Java Software Development
In this session, we will look at the main features of Java Software Development, and what makes the language so well designed. We are not going to look at the “server side” Java just yet – but almost everything in this chapter is relevant when developing Java server applications as well.
Java Variants Many newcomers to Java find the different variations of Java to be very confusing. Before we set out, we’ll define the three major variants of Java. We’ll explore two of them on this course: •
J2SE stands for “Java 2, Standard Edition” and is basically classic Java. Don’t let the “Standard” phrase deceive you; J2SE is huge. It can be thought of as a combination of the programming language itself, all the tools required to build Java applications, and a set of libraries (we’ll look at these shortly).
•
J2ME stands for “Java 2 Micro Edition”. This is a heavily cut down version of Java, designed to enable Java to run on very small embedded devices such as WAP telephones. It is exactly the same language as J2SE – it is just the libraries that have been restricted in their scope. We will not discuss J2ME further on this course, but you can check www.java.sun.com/j2me for more details
•
J2EE stands for “Java 2 Enterprise Edition”, and provides the tools and libraries necessary to extend Java into the heavyweight server side technologies. Again, the language is exactly the same as J2SE and in fact J2EE is a strict superset of J2SE – there is no overlap. So if your engineers are using J2EE, they are actually using a combination of J2SE and J2EE. You cannot program J2EE applications without being a good J2SE engineer first. We will look at J2EE in the second half of the course.
The Java Development Kit The Java language is actually fairly simple; as we have mentioned, the syntax is derived from C++, but with extreme simplifications. So, the core of the language is easy to learn - however, the strength and power of Java (and also its complexity) comes from the vast class library that is supplied alongside the core Java language. In this chapter we will look at the main features of the language and the library, and see how they help a software development. © 2002 Ariadne Training Limited
11
An Introduction to Java and J2EE
The Java Development Kit (SDK) is Sun’s name for the combination of the programming language and a collection of libraries providing a rich source of prewritten functionality to the programmer. The SDK is free to download from the Sun website at www.java.sun.com. The library prevents the need to “reinvent the wheel” on our software developments. If you need to (for example) write a program that uses Networking, the networking functionality is provided as part of the class library. Similarly for Graphics, File Input/Output, Database Programming and Security. Support is even provided for areas such as Cryptography, File Compression, Multimedia – there are far too many areas to list5. With some other languages, such libraries have to be purchased from third parties – apart from the cost, this of course means vendor lock-in and your programmers writing non-standard code. With Java, it is all essentially part of the standard language.
Evolution of the SDK The first release of Java, 1.0 emerged in January 1996 (beta versions had been available before this date). Whilst interesting, the language was in its fledgling state and suffered from many flaws. Version 1.1 (Feb 1997) improved things considerably, and then with the release of 1.2 in December 1998, Java reached what can be considered as the baseline of “maturity”. Since then, subsequent versions of Java (which are released every 18 months or so) have added more and more features without fundamentally affecting the core language. Version 1.3 was released in May 2000, and the latest (at the time of writing) is 1.4 which emerged in late 2001. Java programs are backwards compatible; if you upgrade from (say) version 1.2 to version 1.4, then your programs should still compile. If the Java designers decide to remove something from the class library, then your programs will probably still compile but your engineers will receive warnings from the compiler called deprecations. These warning indicate that although the engineer can get away with using the feature in the short term, they should reengineer their code to avoid using the removed features as soon as possible. Confusingly, Versions 1.2 and onwards are referred to as “The Java 2 Platform”. This was a bit of a marketing trick by Sun to indicate that Java 1.2 was a major improvement on what had gone before.
5
The SDK comes with a complete set of documentation describing every aspect of the library. Although these documents are difficult to read for newcomers to the language, experienced Java programmers can often pick up new areas of library with little or no training.
© 2002 Ariadne Training Limited
12
An Introduction to Java and J2EE
Java Help There are thousands of Java Classes available in the standard Java Class Library (a class is basically a Java Module; all of your engineers programs will be constructed using classes). How can we deal with the complexity of thousands of classes? Thankfully, Java provides a comprehensive help system. Documentation is available for every single Java Class in the Library. This documentation can be a bit frightening for the newcomer to Java, but a programmer with a reasonable amount of experience soon becomes accustomed to the system. Interestingly (and often overlooked) is that your project can also automatically generate help files for your own custom built classes – a very valuable project resource. We’ll see how this is done later (see “The Javadoc Tool”, page 62).
Figure 2 - Example Java help file. An experienced Java programmer working with files for the first time would be able to read this help file and quickly get to grips with how the class works
© 2002 Ariadne Training Limited
13
An Introduction to Java and J2EE
The Key Java Features We’ll now examine each of the major features of Java in turn and explain how they benefit a software development project:
Platform Independence Arguably, this is the key feature of the language. Until the advent of Java, almost all programming languages would produce code that could only run on one platform (ie type of computer). A program written for Windows would definitely not run on Solaris or Macintosh, for example. To make a program run on a different platform, the program would have to be converted manually by a programmer or team of programmers – a process known as porting. This is a time consuming and difficult job to perform. Java was designed with platform independence in mind from the start, from its early days as a language for writing programs embedded into set top boxes. The team developing Java realised that each set top box manufacturer would use a different operating system, so this feature would be crucial to its success.
The Java Virtual Machine Before Java, most programs would be run through a tool called a compiler. The job of the compiler is to convert the program into platform dependent machine code. Once the code is compiled, it would only run on the machine it had been compiled for. Java takes a different approach. Instead of converting the program into a series of instructions specific to a particular machine, the compiler converts the program into a series of platform independent instructions (Sun call these Bytecodes). So, Java programs are converted into bytecodes. What happens to these bytecodes? Well, the person running the program feeds the bytecodes into a tool called a Virtual Machine6. The Virtual Machine reads the bytecodes and converts them into the native instructions that the particular platform understands. This simple trick means that the bytecodes produced by a programmer can be run on any computer, providing a Virtual Machine exists for that computer. Since Virtual Machines have been produced for most common platforms (Windows, Linux, Solaris, Macintosh OS X), we can safely say that a Java Program is truly portable.
6
Virtual machines are prewritten pieces of software provided by a vendor. Sun produce one as part of the SDK, but there are other implementations provided by other suppliers too.
© 2002 Ariadne Training Limited
14
An Introduction to Java and J2EE
Java Source
Compiler
Bytecodes
JVM
Design time Runtime
Native Machine Code
Figure 3 - How the JVM achieves platform independence Is Java really portable? Well, there are a couple of catches. Shortly we’ll look at Java’s Graphical and Multithreading capabilities – these two areas are difficult to make portable (each platform has its own way of doing graphics – compare a Macintosh user interface with a Windows one!), and problems can arise in these areas. Generally, though, everything should be ok. However, the advice is: If you are producing Java software which you intend your customers to run on different machines, make sure you extensively test your software on all target platforms.
Graphical User Interfaces Java features the capabilities to build Graphical User Interfaces (GUI’s) as part of the class libraries. There is no need to use an external library or tool as with other languages. Perhaps the biggest challenge in achieving this was the problem of platform independence. GUI’s on different machines, whilst sharing features in common, usually have marked differences…
© 2002 Ariadne Training Limited
15
An Introduction to Java and J2EE
Figure 4 - A Macintosh running Max OS X (The Aqua Look and Feel)
Figure 5 - A PC Running Windows 98 So how can we write a platform independent program that will look the same and behave in the same way on different machines?
The “AWT” Sun’s first attempt at a solution was the Abstract Windowing Toolkit, or AWT for short. Here, Sun identified a common set of Components – graphical elements that appear on all platforms, regardless of the operating system. For example, Buttons, Menu Items, Scroll Bars, Text Boxes and Labels were some of the common components.
© 2002 Ariadne Training Limited
16
An Introduction to Java and J2EE
Figure 6 - An AWT User Interface When a Java Programmer writes an application using the AWT, they construct the GUI using these AWT components. For example, they might request a button with the word “Exit” written on it. The Java Virtual Machine takes that request and asks the underlying operating system to draw a native button. This simplistic solution had many problems. First of all, it was very difficult for Sun to produce bug free implementations of the AWT for every single platform. Secondly, because the AWT could only feature components that are present in every single platform, the range of AWT was very limited indeed (components such as dividers, slides, spin buttons and like were absent). Perhaps more importantly, the look and feel of an AWT GUI is a little cheap and nasty; see the example in Figure 6 – this is a typical example of an AWT interface.
Swing to the Rescue Just before the release of Java 1.2, a new approach to building GUI’s in Java was devised, called Swing. Using the new approach, Java simply asks that the operating system is able to: •
Present a Window
•
Draw on a blank canvas (using simple pixels)
It is safe to say that all graphical operating systems should be able to fulfil the above. Now, when a programmer requests (say) a button, Swing will draw the button, from scratch, using pixels on a blank area of the window. This clever technique means that Swing is able to support almost any conceivable graphical component, even if the operating system you are running on doesn’t really support it. Swing was just the working title for this system; the real name for it is the “Java Foundation Classes” or “JFC”, but somehow the name “Swing” has stuck. Sometimes © 2002 Ariadne Training Limited
17
An Introduction to Java and J2EE
you will hear to it referred to as JFC, but Swing is the common term. By the way, as with the name Java, there is no significance in the name. It’s just another “cool” word these crazy Americans came up with. Something to do with Jazz I think…
A Swing GUI As an example, here is a screenshot from a simple Swing application (this is a horse racing game). As you can see, all of the features you would expect to see from a standard windows application are present:
Figure 7 - A Swing GUI A very interesting feature of Swing is that the way the GUI is presented can be switched by the programmer. Recall that the buttons, text boxes, lists, menus etc are not being drawn by the operating system – it is Java that is laboriously drawing all of these components itself (and as you can see from Figure 7, Swing aims to make these emulated components look like the real ones). Since it is Java that is determining what these components look like, it is a fairly simple job for Swing to draw them in a slightly different way. As such, Swing allows you to choose from a set of predefined Look and Feels. The “System Look and Feel” is a look and feel that emulates the look and feel of the operating system you are running on. In Figure 7, we are running on Windows and we are using the Windows Look and Feel. If we ran the same application on a Mac7, then the Macintosh Look and Feel would be adopted instead.
7
Remember – we can do this, because Java programs are platform independent and portable
© 2002 Ariadne Training Limited
18
An Introduction to Java and J2EE
The “Metal Look and Feel” is a look and feel provided by Sun in an attempt to produce a “platform independent” look and feel. The benefit of using this look and feel is that your application will look the same regardless of what platform you are running on. The drawback is that your users might be a bit confused, because it won’t look like a regular application. Here is Figure 7 redrawn using the Metal look and feel:
Figure 8 - The Metal Look and Feel As you can see, everything is there as before, but presented in a very different way. Only one line of code was changed to make this happen. A third look and feel, the “Open Look” look and feel, is provided – this look and feel emulates the Unix type of look and feel.
Multi Threading Every program we write is trying to solve a real world problem; whether we are trying to predict the weather using mathematical algorithms, or trying to provide an on-line shopping facility, the whole point of writing computer programs is to solve problems that exist in the real world. Unfortunately, computers are naturally and inherently (simply due to the way they were originally designed decades ago) poor at doing more than one thing at a time. Computers tend to churn through instructions, monotonously, one at a time. But the real world doesn’t work like that – things happen concurrently.
© 2002 Ariadne Training Limited
19
An Introduction to Java and J2EE
In a defence system, we must be able to fire torpedoes whilst the commander is still able to track the progress of targets on the screen (it would be a disaster otherwise). Similarly, in an on line shopping system, we must allow two customers to view the catalogue and order goods at the same time – if we could only service one customer at a time, our sales would be adversely affected. The provision of the facility to allow Multi-Tasking is woefully absent in many major modern languages. In particular, C++, a very common and popular language, has no “in built” support for doing more than one thing at the same time. Programmers in C++ have to rely on messy system calls (destroying any chance of portability), or they have to purchase non-standard third party libraries.
Java Multithreading Java, however, provides Multi-Threading as part of the standard language, and, relatively speaking, it is easy for a programmer to write a multi threaded program. However, even with Java’s excellent support for multi-tasking, it is still a minefield. It is very easy, for example, to write programs that can “dead lock” (this is when one task in the program has to wait for the other task to complete and hand over some results – but at the same time, the second task has to stop and wait for the first task to do something!). This isn’t because Java is poor at multitasking; it is a simple fact that designing multi threaded programs in any language is much harder and requires a higher skill level than single threaded programs. If you are running a project that is likely to employ multithreading, invest in a good thread analyser tool – it will save you a fortune in the long run. Multi-threading is required for Enterprise systems of course (the previous example, where we have two customers trying to order at the same time is a case in point). We will see later, however, that the multi-threading is provided behind the scenes if we are using J2EE, so thankfully your programmers are relieved of this difficult and time consuming task.
Multithreading Example Here is a simple Java program that is capable of printing out the numbers from 1 to 500. Don’t worry about the Java syntax; the code in the “run” block is the code that will run in parallel with whatever else is happening in the system; the code near the top is simple plumbing to make the threading happen:
© 2002 Ariadne Training Limited
20
An Introduction to Java and J2EE
public class NumbersThread implements Runnable { public NumbersThread() { Thread thread = new Thread(this); thread.start(); } public void run() { for (int i=1; i<=500; i++) { System.out.println (i); } } }
Figure 9 - Java Multithread Program
Running the Multiple Threads If we now ask Java to run two versions of the code in Figure 9, we will have two parts of the program outputting the numbers from 1 to 500 at the same time.
The Output Here is the output from a run of the program where two versions of the code are running concurrently:
© 2002 Ariadne Training Limited
21
An Introduction to Java and J2EE
… 118 119 120 121 122 123 124 125 1 126 2 127 3 128 4 129 5 130 6 131 7 132 …
Figure 10 - Output from the Program Interestingly, the program outputs 125 consecutive numbers, and then the second thread starts to output its numbers. From that point onwards, the two threads are interwoven – one number outputted from each thread in turn. The 125 consecutive numbers from thread 1 happened because thread 2 was busy starting itself up while thread 1 had stolen a head start. Multitasking is generally unpredictable – we could not have predicted that this would have happened, and we certainly cannot guarantee that the same thing will happen on a future run. It is entirely possible that next time around, 134 consecutive numbers are output followed by a block of 4 from thread 2, and so on. It is just this sort of problem that makes working with threads a difficult job.
Error Handling Java features a mechanism known as Exception-Handling to allow the programmers to deal with errors (and unexpected situations) in an elegant way. This mechanism first became popular in the early 80’s with the Ada programming language. Designed for defence systems, Ada required strong error trapping capabilities, so the language enforced tight controls on the programmer. Java has copied the idea behind the system (and has even strengthened it slightly). This means that your programmers are forced to deal with any errors that can arise in your system.
© 2002 Ariadne Training Limited
22
An Introduction to Java and J2EE
Exception Handling Example8 Here, the programmer is trying to connect to a database using the following line of code: DatabaseDriver.connectToDatabase ("employees");
Figure 11 - Connecting to the Employees database However, Java will refuse to even let the program run. Why? Well, in this example, the code behind connectToDatabase might raise an error – for example if the database is not available for some reason. Since this line of code might throw an error, Java insists that the programmer provides some code to handle the problem if and when it arises. Until the programmer does this, the program will not even run! The mechanism the programmer must use is called a try…catch block. The full details of this are beyond the scope of this course, but basically the programmer must indicate which line of code might throw an error (the try), and then in a separate block tell Java what to do should something go wrong (the catch). Here’s what the corrected program would look like: try { DatabaseDriver.connectToDatabase ("employees"); } catch (Exception e) { // deal with the problem, if it happens }
Figure 12 - This will now work
Project Standard
So, Java will run the “connectToDatabase” call – if all goes well, then fine. But if something goes wrong, it will run the code in the catch block. The programmer must do something sensible here – correct the error, warn the user, shut the system down, whatever.
One slight catch here – a lazy programmer could just put nothing in the catch block, and Java won’t mind. This is very poor programming practice that is justified in just a small number of cases. A good project standard would be “no empty catch blocks”.
8
This example doesn’t use 100% real Java code; it has been simplified to get a point across. For full technical details of the exception mechanism, see the full Ariadne Java Fundamentals Course.
© 2002 Ariadne Training Limited
23
An Introduction to Java and J2EE
Object Orientation Java is what is known as an Object Oriented (“OO”) programming language. Object Orientation is a different approach to the classic “functional” or “structured” method of software development which “older” languages such as C, Cobol and Fortran support. A full description of Object Orientation is beyond the scope of this single day course (see reference [1] for a downloadable e-book from Ariadne Training for a much more detailed treatment), but we’ll try to describe the “high level” view of OO. Basically, in OO, instead of creating functions and breaking the tasks our system has to perform into smaller and smaller functions, we look at the real world problem we are trying to solve, and identify the Objects that are present in the problem. For example, in an e-commerce development, the objects might be Customer, Shopping Cart and Credit Card. The designers and programmers will then represent these real world objects in the solution – and Java provides all the necessary tools to allow these objects to be represented in the code. One of the key benefits of following OO is that the “gap” between the problem and the solution (requirements and code) is much smaller; hopefully then the eventual code should be easier to understand and modify. The real problem with OO is that there is still a lack of true understanding of Object Orientation – it is certainly difficult to learn at first. Designing real OO systems is a very valuable skill and OO does not provide a “silver bullet” to solve all problems. Java is a full OO language, and if you are not writing true Object Oriented code in Java, you are essentially wasting much of the power and elegance of the language.
Java Garbage Collection A serious problem in some languages is the need for a programmer to constantly “clear up” after themselves. For example, imagine a programmer has created an “object” to hold the contents of a user’s shopping cart. When the customer logs off, the cart and its contents (in memory) are no longer required. In many languages, the programmer must remember to explicitly delete the object. If the programmer forgets, then a memory leak has been created. This means that the operating system thinks the memory is still in use by the program, and the operating system will not use that area of memory. This situation will continue even after the application has terminated. Think how serious this is if your application is running on a server. Your application will probably need to run continuously for weeks on end. If the memory is slowly being leaked by your application, eventually, the server will crash! Thankfully, Java programmers never (or rarely) need to worry about memory leaks. A process known as “Garbage Collection” regularly checks the program for unused © 2002 Ariadne Training Limited
24
An Introduction to Java and J2EE
memory; when unused memory is found, the memory is returned to the operating system. If you are cross training existing C++ programmers into Java roles, they will hate this – even though it is a very useful feature. The reason is that C++ programmers (good ones) keep the problem of memory leakage at the forefront of their minds at all times – it is difficult to “unlearn”!
Java Applets A final word on Java Applets – we have discussed them already in previous sessions. Applets can be written using any version of Java – but, the browsers only support a limited range of Java versions. Users running Internet Explorer version 5, for example (a very large percentage of the internet population, at the time of writing) will not be able run Java 1.4 applets. The solution to this problem is provided by Sun in the form of a “Java Plug In” – this can be downloaded by the user from Sun, and the functionality of the web browser is extended to cover the latest version of Java. The flaw in this idea is that the process requires operator intervention (they will have to agree to the download and plug in taking place), and worse, it will take a long time for the plug in to download. We think it is fair to say that technologies such as Flash currently have the upper hand over Java.
Databases in Java Interfacing to relational database technology is important in any language, and thankfully Java provides the necessary tools to enable this as part of the language. The technology is called JDBC, or “Java Database Connectivity”. As long as the programmer knows and understands SQL, then connecting to databases and manipulating the database is easy in Java. The database you are connecting to must support JDBC, or alternatively, Java can talk to an ODBC9 compliant database through an inbuilt Java tool called an “ODBC/JDBC bridge”.
Summary •
Java provides a wide variety of features as part of the standard language
•
The language is very well designed
9
No extra libraries, plug ins or third party tools are required
It is fully object oriented
A standard for connecting to relational databases; most databases will support it
© 2002 Ariadne Training Limited
25
An Introduction to Java and J2EE
It is platform independent
It features GUI capabilities, built in
Multithreading in an integral feature
Elegant error handling is also built in
“Garbage Collection” is automatic and requires no programmer intervention
Java is database aware
© 2002 Ariadne Training Limited
26
An Introduction to Java and J2EE
Chapter 3 Java vs Other Languages
In this chapter, we will briefly compare Java to other popular programming languages Note that we won’t explore languages such as Pascal, Cobol and Fortran in this book. Although these languages are still in very common use (and Cobol is perhaps the most widely used language of all), their use is certainly in decline and they are obsolescent. Although we promised at the outset to avoid as much code as possible, we will even force you to debug a “working” C++ application in this session! When faced with a choice of language for an application development, the major choices these days are probably: • • • •
Java C or C++ Visual Basic C#
Other languages such as ASP and JavaScript are popular, but these are niche languages lacking the general purpose uses of the languages above. JavaScript is a script language that allows some dynamic behaviour to happen inside a web browser – it has absolutely no relation to Java at all! ASP is a Microsoft language enabling server side behaviour to be programmed in a HTML-like form – we’ll be discussing the Java version of this, JSP, in a later session. First of all, we’ll look at VB, C++ and C# in turn and discuss the features of each, before we compare them with Java.
Language 1: Visual Basic It is claimed (or was once claimed) that Visual Basic is used by over 50% of the world’s programmers. A quick web search has failed to confirm this claim (we can find a few references to the claim scattered around the web, but we can’t find the source of the claim). It was a fairly bold claim, distorted by the fact that Microsoft Office uses Visual Basic as its Macro creation language – so if you have ever used a macro in MS Office, you have technically “used” Visual Basic. Whatever – VB is a very popular language indeed. It is a proprietary language, produced by Microsoft Corp. It’s goal is to enable the creation, rapidly, of graphical user interface intensive applications. Not surprisingly, the language is based on the old language BASIC (Beginners All Purpose Symbolic Instruction Code), a language that dates back decades and was originally designed for teaching purposes. VB’s heritage has lead many “serious” programmers to deride the © 2002 Ariadne Training Limited
27
An Introduction to Java and J2EE
language as being a toy language for unskilled programmers, but the truth is that as VB has evolved, it has become a serious programming language, and one that is now fully object oriented. Despite the serious nature of VB, it is still arguably much easier to learn than Java, and it is certainly easier to use than C++. The modern feel of the language is completed by its central paradigm – applications are constructed using components, small, simple and reusable modules.
An Example VB Program You lecturer will now expertly build a full blown windows application before your very eyes in just a couple of minutes…
Language 2: C / C++ C is a language that can be traced back to the 1970’s and has a long heritage as a programming language. C++ dates from the early 1980’s, and is an extension to the C language (you can write pure C programs using C++; C++ is a strict superset to C). The extensions revolve around Object Orientation (and a few other minor things); so C++ and Java can both be considered Object Oriented languages (see “Object Orientation”, page 23).
Figure 13 - Bjarne Stroustrup, the creator of C++ It is a very widely used language; most people who have used a computer have had some interaction with C++ - Windows is written in C++ and Windows 95 was 30 millions lines of it! Unlike VB, C++ is not owned by any organisation in particular, although Bjarne Stroustrop created the language at Bell Labs. Many compilers exist for C++ and in theory, an organisation implementing a C++ project are able to switch compilers at will (in practice, however, many variants of C++ have evolved, and so this theory doesn’t hold true). Visual C++ is Microsoft’s version of a C++ compiler, and while their tool allows close integration with the windows platform, it isn’t a special version of C++. It is a very popular language with programmers; it is much deeper than Visual Basic and basically, you can do anything you like in C++ - the power is in the hands of the programmer.
© 2002 Ariadne Training Limited
28
An Introduction to Java and J2EE
C and C++ are both very terse languages indeed. Code written in either language is very, very difficult to read and understand (this depends on the skill of the author, but generally speaking, this is usually true). It is also difficult to learn – an average one week C++ course could never bring a programmer to the same standard of programming as a one week Java or VB course – for example, building GUI’s would be out of the question as there would be much ground to cover first. The biggest (general) advantage to C++? It generates very fast code. It is potentially the fastest code you can get without actually writing assembler or machine code (no chance of that these days). Recall earlier on in the course we said that the Oak team, James Gosling et al (Page 6) considered C++ as their language of choice for their electronic devices. One of the reasons they rejected the idea was the potential for serious errors in C++ causing run time crashes (not desirable in an embedded device). Here’s an example:
Example C++ Program A nice, simple program. Just two lines of executable code. Don’t worry if you don’t know any C++ syntax; your lecturer will take you through it. int main (void) { // a simple program that fills an array with squares… int square_array[10]; int count; for (count = 1; count <= 10; count++) square_array[count] = count*count; // now print the results… for (count = 1; count <= 10; count++) cout << square_array[count]; }
Figure 14 - A Simple C++ Program Will the program run? Your lecturer will give a demo of the program. Your job is to give the program a thumbs up or thumbs down, based on the demo of the program, and your code inspection.
© 2002 Ariadne Training Limited
29
An Introduction to Java and J2EE
This space is provided to make your own notes about the debugging session:
Food for thought – that’s two lines of executable code. Now imagine the kinds of problems you’ll get with a couple of million!
Language 3: C# (C-Sharp) C# is another language designed by Microsoft. At the time of writing it is a fledgling language and reports of use in the field are a little thin on the ground at the moment. It is possible that there are legal rather than technical reasons for the development of this language; we will avoid discussing these reasons here, and instead look at the features of the language. It is pitched at a level somewhere between VB and C++. It aims to be more powerful and general purpose than Visual Basic, but “safer” and easier than C++ (ie avoiding the kind of mess we saw on page 28). In fact, the main feature of C# transcends the language itself. It is part of the new Microsoft .NET framework, which we will look at later. One of the main features of .NET is that any language can be used as part of the framework. Java could not be included (for legal reasons), and this is one of the reasons that C# was invented by Microsoft – as a Java replacement.
Now, let’s compare the three languages to Java.
VB vs Java Visual Basic is clearly stronger at the production of graphical user interfaces. Swing interfaces can be written using pure Java code (time consuming and difficult), or using a tool – but still the tools are a little immature and not particularly easy to use. VB has always provided the tools to build interfaces, and as we saw earlier, the tools are easy to use and stable.
© 2002 Ariadne Training Limited
30
An Introduction to Java and J2EE
Visual Basic is definitely an easier language to learn and implement than Java. The scope of VB is more restricted however; if you are building small applications on Windows platforms then VB is a leading choice. Java, whilst being more complex, is able to handle a much larger range of tasks than VB. Visual Basic is only supplied by one manufacturer, and even a basic version of the compiler is fairly expensive. The full version is very expensive indeed. Java development systems are available from a wide variety of suppliers10 at a wide variety of prices, depending on your needs. Visual Basic only runs on windows platforms11, whereas Java will run almost anywhere.
C++ vs Java The Java syntax is based heavily on the C++ syntax. They are definitely not the same language however – they both have a very different feel. As mentioned at the start of the course, many of the dangerous features of C++ have been removed – the example we worked through (Page 28) could not happen in Java. C++ was never tightly controlled; it evolved in many different directions with many people adding features in what seemed like an ad-hoc fashion. It finally became an ISO standard in the late 1990’s, but it is still a very painful exercise to move from one compiler to another. We will look at the performance of the two languages later, but C++ is definitely a much faster performer than Java; things are improving but not many people would seriously consider building a real-time 3d graphics game using Java. Perhaps the most important comparison is the relative productivity of Java and C++ programmers. The evidence from the field is that Java programmers are much more productive than C++ programmers. Less bugs emerge during the development process, and because Java has cut out many of the dangerous and abused features of C++, the programmers can spend more time concentrating on the problem at hand, rather than some obscure syntax problems.
C# vs Java C# is relatively new, and Ariadne have little experience of C# to date, so it is difficult for us to provide an objective comparison of the two. From a programming view, the two are very difficult to separate. C# has taken a few technical points in Java and improved on them, but that really would be the minimum we could expect after Java has been in the field for seven years.
10
Although Java is still stubbornly owned by Sun Microsystems
11
The new .NET Framework may change this
© 2002 Ariadne Training Limited
31
An Introduction to Java and J2EE
As a rough comparison, Java has been in the field for much longer than C#, but that situation will soon change. We shall watch the battle with a non-committal interest… Perhaps more important than the differences between Java and C# is where C# fits in with the new Microsoft .NET framework…
Microsoft .NET .NET is promising to be one of the biggest revolutions in the industry ever. .NET is essentially the pulling together of many of Microsoft’s technologies such as COM, and the languages that Microsoft have been nurturing for so long (like VB and ASP). We’ll look at the “server side” part of .NET in the second part of the course. From the programming side, the most astonishing feature of .NET is that it is language independent. Programmers essentially have the chance to work in whichever language is suitable for them. A GUI developer would probably use VB; a programmer writing complex logic may use C#. All the languages plug into the framework and work together transparently - the C# coder can call the VB code without even knowing they are working with VB code! Coders working on a Java/J2EE project have no choice – it’s Java or nothing…
Summary In this session, we compared Java to three other major languages •
VB is best for developing “small”, “simple” GUI intensive applications. It is owned by a major vendor and for many years has been proprietary
•
Java is best as a more general purpose, powerful but safe applications/server based language. It is owned by a major vendor but one who seems to be committed to a free and open use of the language
•
C++ has been popular for many years, but it is showing its age and despite its power, it is difficult and dangerous to use. It isn’t really owned by anyone in particular but has extensive tool support
•
C# looks and feels like Java; users on the .NET platform will use C# instead of Java. It is owned by a major vendor; they appear to making the language free and open to use
© 2002 Ariadne Training Limited
32
An Introduction to Java and J2EE
Chapter 4 Java Performance
Java Performance The performance of Java (or perhaps, the lack of it) is perceived to be one of Java’s greatest weaknesses. Here are two quotes we have dredged from the Java web site: • •
“86% of users expressed concern about the performance of Java based applications” “Java technology seemed to have a knack for turning a fast Pentium into a plodding 386!”
Is the performance of Java Applications really a problem?
Why Should Java be Slow? Recall from “The Java Virtual Machine” (Page 13), Java is not converted into a native executable application. Instead, the Java code is compiled into a set of platform independent bytecodes, a kind of platform independent machine code. At run time, the Java Virtual Machine (JVM) reads in these bytecodes one by one, and as they are read in, they are converted to machine code as and when required. So, as a Java program is running, a translation process is constantly going on – and this is the reason your Java programs run slow. But how slow is slow? Clearly, this is subjective and depends on your requirements and the domain you are working in….
Slow Java The first releases of Java were indeed incredibly slow. Applets in particular ran very sluggishly even on the fastest machines (again, this didn’t help Java’s reputation). However, with each release of Java, the performance has become faster and faster. There are two technologies working behind the scenes to help here. A Just In Time Compiler is part of the virtual machine; it basically caches the machine code it generates, removing the need for it to constantly compile the same code again and again. This means that the first pass through your program may be slow, but future passes speed up.
© 2002 Ariadne Training Limited
33
An Introduction to Java and J2EE
Hotspot VM’s are special Virtual Machines that contain performance evaluation code. Where the VM detects bottlenecks in the code (ie Hotspots), the VM automatically optimizes the code around the bottleneck. Both of these technologies are completely transparent to you – they are just there. Both technologies go from strength to strength, and Java’s performance improves at each release.
Demo and Benchmarks We are now going to run a simple benchmark. This small application adds a million customer records into memory, each record containing a customer id, a name and a credit rating. We have implemented the program using C++ and Java, and while our C++ skills are not first rate, we have aimed for similar implementations of the two. We are going to first of all run the Java version, using the Virtual Machine provided in release 1, back in 1996. Then, we will run the program using C++ (and we expect a much faster performance). Finally, we will run the program using the latest version of Java. The program will, at the end of the run, report how long the records took to create in memory.
Demo Your results: Language
Time
Java 1.0 C++ Latest Java
© 2002 Ariadne Training Limited
34
An Introduction to Java and J2EE
Benchmark Summary The Benchmark seems to suggest that up-to-date Java can compete in the same area of performance as C++. However, this is only one simple benchmark and should not be taken as cast iron proof. Certainly, on the computational side, Java is now running fairly quickly thanks to Just In Time and Hotspot VM’s. Having said that, the Java GUI is still a slow performer (just think of all the drawing work it has to do!!), and can give the feeling of a less responsive application. Another performance issue is that Garbage Collection (see page 23) can and will kick in at unpredictable intervals; sometimes this will pause program execution for a perceptible amount of time. A final and important point is that Java is very memory hungry; even 64Mb of Ram is not suitable for a non-trivial application.
Native Code Compilers Compilers exist that claim to be able to compile Java into true 100% native code, ie full executable programs. Obviously, this renders your programs non-portable - but for many projects this isn’t a problem. Treat these compilers with caution and ensure a full evaluation is carried out before any commitment is made to licenses. Our evaluations have proved rather frustrating when compiling non-trivial applications.
Summary •
The Java language has a reputation for being slow
•
This reputation is based on its early incarnations, and was necessary due to the platform independence
•
Java is rapidly speeding up, thanks to “Just in Time” compilers and “Hotspot VM’s”
•
Java can now cut it with the fastest languages
•
However, C++ will still outstrip it and there are plenty of outstanding issues
© 2002 Ariadne Training Limited
35
An Introduction to Java and J2EE
Chapter 5 Introducing J2EE
In this chapter, we introduce the Java 2 Enterprise Edition (J2EE), and describe its main features. In the following chapters, we will go in to some deeper detail on the main areas of J2EE.
What is J2EE? As we described earlier, the Java language was originally conceived as a language for building small programs embedded in electrical devices; its popularity was thanks to this idea being twisted into using Java as a programming language for running small applications (applets) in Web browsers. Java has certainly moved on dramatically since then. Now, Java is being used to build large enterprise systems – however, the Java language alone is not enough to meet the requirements of an Enterprise system. A platform is required to provide some of the services we need in such a system, such as12: • • • • • •
The ability to store data in a commercial database The ability to distribute our application across more than one computer The support for transactions, to prevent data from becoming corrupted Multithreading, to allow concurrent access to our services Connection Pooling, to prevent our database performance from degrading Scalability – it is all very well our application working like a dream when we test it in the factory, what happens when hundreds of people try to use it, all at the same time?
An enterprise application cannot be located on a single PC – therefore we need to employ some kind of architecture – a framework which lays down the guidelines for where each component of our system is to be located. Very early systems were monolithic – very thin clients (dumb terminals) would connect to a large database running on a server – the so-called Two-Tier (or Client-Server) Model:
Two-Tier Architecture The classic two-tier (or client-server) architecture was a move away, during the 80’s and 90’s, from monolithic mainframe applications using dumb clients.
12
All of these topics, and more, will be explained and covered in more detail shortly
© 2002 Ariadne Training Limited
36
An Introduction to Java and J2EE
In a two-tier architecture, presentation logic (ie the code that produces displays for the user and gathers input) is present on the client side of the application. In addition, the bulk of the business logic is also present on the client. The data is stored on a server, and the client would typically communicate with the database using a language such as SQL. Sometimes, some business logic may be present on the database server, perhaps in the form of stored procedures or daemon (long-running) processes.
Client (eg - PC)
Database Server
Presentation logic
Business Logic Figure 15 - The Two-Tier Model The chief advantage of the client-server model is that is fairly simple to work with the database technology is well established and easy to understand, and the programmers don’t have to worry about the complexities of more than one tier. There are serious disadvantages to the two-tier architecture, however...
Two-Tier Architectures: Disadvantages The fundamental problem with this architecture is that the business logic and presentation logic are tied together, making for a system that is difficult to understand and maintain. A classic example of the problems with the model is the problem such a system would face if the graphical user interface needed to be changed in any way (for example, changing the GUI from a Visual Basic application to a web based front end). As the business logic is so closely tied to the presentation logic, it is impossible to change the presentation code without impacting on the business code. It is probable that the business logic would need to be completely re-implemented. With the advent of the internet, it became possible to provide front ends to applications through web browsers; however, given that a particular web browser could be running on a myriad of platforms, embedding so much business logic on the client side is not necessarily feasible or desirable.
© 2002 Ariadne Training Limited
37
An Introduction to Java and J2EE
The Three Tier Model The three tier model splits the presentation logic and the business logic into two separate tiers. Client (eg - PC)
Business Server
Presentation logic
Business Logic
Database Server
Figure 16 - The Three Tier Model It is common to deploy the presentation tier on the client machines and the business tier is deployed on a server. The business and presentation tiers are as loosely coupled as possible; in other words the presentation tier simply dispatches requests off to the business tier without knowing or caring how the job is being done. Similarly, the business tier does it work and passes the results back the presentation tier without any knowledge of how the data is going to be displayed. The serious disadvantage with this model is the complexity involved in developing such an application - doing so requires a knowledge of distributed computing (for example, using RMI or Corba to call methods on objects on other tiers), multithreading (to allow the business tier to handle requests from multiple clients at the same time), security and so on. To remove the burden on the programmers, an application framework (these days commonly referred to as an application server could be purchased from a third party to provide such services...
Application Servers Third party application servers can provide the framework that we need to develop a multi-tier application, and provide the required services such as distribution, multithreading, security and persistence. In the past, each server product was developed independently, and therefore each provided different services, each service was implemented in a different way (and so the programmer would have to jump through different hoops depending on the server in use). Clearly, this would mean a project would have to choose an Application Server and stick with it - changing between application servers would be difficult, if not impossible.
© 2002 Ariadne Training Limited
38
An Introduction to Java and J2EE
However, in 1997 a group of application server vendors (including BEA, IBM, Oracle, Sybase and Sun themselves) began working together to define a standard for application servers, based on the Java language. The vision was to create a standardised set of services, and a standard API for accessing these services.
The J2EE Standard The J2EE Standard rigorously defines a set of services that application server must support, together with a standard API for accessing those services. The standard is closely tied to the Java language, so the method of writing code to access the Application Server’s services is clear. It is important to note that J2EE is not a product; you cannot download a software product called “J2EE” (as you can with J2SE). J2EE is a specification for which there are many different implementations. The implementations are provided by third-party vendors (such as IBM and BEA). These implementations must conform to the J2EE standard to be able to call themselves “J2EE Compliant”. Sun provide a free product called the reference implementation which conforms to the J2EE standard - it is free to download and use, and is ideal for learning about J2EE and also for testing or prototyping. It doesn’t do much more than the J2EE requires, however, whereas third party commercial implementations are likely to be much more suitable for live applications.
J2EE Components The J2EE defines three types of component an application programmer can develop: •
Servlets
•
JSP’s
•
Enterprise Java Beans
We will look at each of these in very brief detail for now – we’ll explore each of them as we progress through the course.
Java Servlets Servlets provide a method of writing server side Java programs. A common use for servlets is the dynamic generation of web pages. For example, it would be possible to build an interactive guestbook on a web site using a Java servlet. Servlets are a replacement for the traditional “CGI” (Common Gateway Interface) method of providing interactive webpages. The use of CGI is very popular and widespread, although CGI’s can suffer from performance and scalability problems, and are usually written using Perl – a popular niche language but certainly not to everyone’s taste! © 2002 Ariadne Training Limited
39
An Introduction to Java and J2EE
Java Server Pages (JSP) Java Server Pages allow web designers to build interactive web pages without getting into the deep details of the Java language. A JSP looks very much like standard HTML, and so should feel familiar and comfortable to existing HTML programmers. The difference is that JSP allows fragments of Java code to be embedded into the web page.
Enterprise Java Beans (EJBs) Enterprise Java Beans are perhaps the most significant of the three types of component. An EJB is a Java class that possesses several special features. Enterprise Java Beans are: •
Distributed
•
Transaction-aware
•
Multi-threaded
•
Persistent
Many of the features of an EJB are provided “for free” by the application server, relieving the programmer of the tedious job of implementing these details. Therefore, the programmer can concentrate on the important work of coding the business logic.
The J2EE Architecture The J2EE Architecture is very similar to the three tier model, although it is extended a little further to accommodate web based applications: Client (eg - PC or browser)
Web Container
EJB Container
Presentation logic
Web Application
EJB
Database Server
Figure 17 - The Full J2EE Architecture In order to accommodate the needs of building web based enterprise applications, the J2EE spec is based around 4 tiers rather than 3, although the theory and reasoning behind the separation remains the same.
© 2002 Ariadne Training Limited
40
An Introduction to Java and J2EE
A J2EE Compliant Application Server will provide a Web Container, which is a server that allows servlets to be deployed. We’ll explore this in detail in the chapter on servlets. An EJB Container will also be provided as part of the application server - this is a server that can provide our Enterprise Java Beans with all of the services that we need. Note that a J2EE based application does not need to be a web application - it supports any type of client - in an application not based on the web, the client tier talks directly to the EJB Container, and the Web Container is not used.
Concrete Example – A Warehouse Consider a warehouse running an automated stock/picking system. Orders are entered into the system using web based pages running on a small intranet. Moving around the warehouse are a collection of workers carrying Radio Data Terminals dishing out instructions on which orders to pick etc. A possible J2EE implementation of this might look as follows:
Intranet Data Entry Forms/ Queries
HTML Forms
EJB Server
Webserver Running control servlets
Orders EJB
Oracle
Stock EJB Radio Radio Data Radio Data Terminal (RDT) Radio Data Terminal (RDT) Radio Data Terminal (RDT) Data Terminal (RDT) Terminal (RDT)
Customer EJB
Running standard Java Applications
EJB’s - control and model
Figure 18 - Warehouse J2EE Architecture The Radio Data Terminals are running standard Java Applications (or possibly even J2ME applications – see page 10). The HTML forms are standard web pages. We would have some J2EE servlets running on the webserver – these provide any control logic that the web forms need. More on this in the next chapter. The EJB Server holds the bulk of our business logic. For example, the functionality to credit check all customers held on the system will be held in a component, written in Java that has been deployed on this server. These components are the Enterprise
© 2002 Ariadne Training Limited
41
An Introduction to Java and J2EE
Java Beans. These EJB’s will contain data about the customers – and these will be stored on (in this case) an Oracle database. More on this later.
Summary •
The J2EE Specification provides a standard for Application Server vendors
•
The specification enables the construction of applications built around a multi-tier architecture
•
The components defined by the specification are written by the Java programmer:
Servlets (server side Java classes accessed by browsers)
JSP (HTML-like files with embedded Java)
Enterprise Java Beans - distributed, transaction-aware, persistent, multithreaded Java components
© 2002 Ariadne Training Limited
42
An Introduction to Java and J2EE
Chapter 6 Servlets and JSP
Servlets and JSP In this session, we will look at the Java technology called servlets, and see what they can do. Although they are an interesting idea, there is a serious problem associated with servlets that you need to be aware of – we will present the solution, a technology called JSP. To build elegant, maintainable and scalable J2EE systems, it is critical that your engineers follow certain rules when writing servlets and JSP’s – we will discuss these rules at the end of the session.
The Static Web The World Wide Web, as it was originally designed, is a fairly static medium. The HyperText Transfer Protocol, or HTTP for short defines the general process for requesting web pages: The client (web browser) requests a page from the server. The server responds by sending a stream of data back to the client. 1 : get
2 : webpage
Web Browser Clients
Webserver - dishes out predefined webpages
Figure 19 - The HTTP Protocol simplified
© 2002 Ariadne Training Limited
43
An Introduction to Java and J2EE
Making the Web Dynamic As the web matured, a demand grew for the web to become more dynamic. We have seen how Java Applets attempted to provide interactivity on the client side – but what if we want to do something dynamic on the server side? Let’s say we want an interactive message board, to which users can post information. We will need to store these messages on a database on the server, and when the users want to view the information, we will need a program to query the database and build the webpage to show the up-to-the minute collection of messages. The scheme described in Figure 19 is not sufficient to achieve this.
Figure 20 - A dynamic, constantly changing, message board
Solution: CGI One solution was a technology called CGI, or Common Gateway Interface. This gave programmers the means to write server side programs that could intercept requests from clients, and to generate the response page dynamically. CGI is a very, very popular technology and although it is a bit old now, you will still see many web pages using CGI (look at the address of many web sites – if you see “cgi” or “cgi-bin” appearing somewhere in the address, you are using CGI). There were some problems associated with the approach. First of all, although any language could be used to implement CGI programs, a language called perl was considered the best. Perl is an excellent language, but rather specialist and definitely a niche language (text processing is one of its strengths). CGI is all very well if you are performing relatively simple tasks like building message boards, but moving into the realms of serious software engineering (ecommerce sites, etc) is pushing things a bit far. CGI is also renowned as being a poor performer (due to threading problems), and there are some serious security loopholes with CGI.
© 2002 Ariadne Training Limited
44
An Introduction to Java and J2EE
The Servlet Solution A more recent solution, provided by Java (and J2EE) is to build small Java programs called servlets. These small programs are deployed and run on the server. Their operation is simple, and very similar to the CGI scheme described above. The servlet sits on the server, doing nothing, until a request from a web page comes in. The request is intercepted by the servlet, the serlvet then does some work (anything the programmer wants to do), and then the servlet sends the results back, in the form of a web page. Although this is a similar scheme to CGI, the main benefits are: •
We can use Java – a more serious and deep language than perl
•
We can easily take advantage of Java’s features, such as JDBC
An Example Servlet We’ll now demo a simple servlet. The code follows below - don’t worry about all of the details, but you should notice that the program is outputting HTML, and one of the outputs is the current date and time. So this is a dynamic webpage (albeit a very dull one), rather than a prewritten static webpage. public class HelloWorld extends HttpServlet { public void doGet() { out.println (“
HelloWorld"); out.println("
Hello to everyone! The time now is " + (new java.util.Date()) + "
"); out.println(""); } }
Figure 21 - An Example Servlet (many technical details omitted for clarity)
A Serious Problem Emerges The simple servlet above is all very well, but there is a major flaw in the idea behind servlets. In any non-trivial servlet, the code very rapidly becomes a nasty tangled combination of Application logic and HTML.
© 2002 Ariadne Training Limited
45
An Introduction to Java and J2EE
out.println ("
Extension List"); out.println ("
Extension List
<pre>"); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException e) { out.println ("An error occurred loading a driver:
"); out.println ("<pre>" + e + ""); } String url = "jdbc:odbc:PERSONELL"; String user = "sysadmin"; String pass = "sysadmin"; Connection con = null
Figure 22 - A nasty combination of HTML and Java This creates a maintenance nightmare. What happens if you want the look and feel of your web page to change? You have to trawl through reams of Java code looking for those out.println() statements. Also, it is necessary for your HTML coders to have a reasonable working knowledge of Java to even know how to make the changes. This very unpleasant situation has a possible solution, called JSP – Java Server Programming…
Java Server Programming (JSP) In JSP, instead of writing a Java Servlet, we write simple text files that look very much like standard HTML. Therefore, these files (called JSP files) should be relatively understandable to HTML coders. The difference is we are able to “drop in” small blocks of Java code anywhere in the file. These areas of Java are carefully delimited using some predefined markers. Consider the following JSP file, a web page that outputs the date and time:
What What Time Time Is Is It? It? You You requested requested this this page page on on :: <%= <%= new new java.util.Date() java.util.Date() %> %>
Figure 23 - A Simple JSP © 2002 Ariadne Training Limited
46
An Introduction to Java and J2EE
Here, most of the JSP is standard HTML, but notice the block of code in bold type, between the <% and %> markers. This is standard Java code.
Figure 24 - The resulting output
JSP Architecture How does this actually work behind the scenes? It’s all a bit of a trick really. We deploy the JSP onto the server, where it is automatically converted into a servlet! So in essence, JSP is a way of creating servlets without realising you’re writing servlets, and without their inherent complexity! Here’s the process that goes on, step by step: HTML Page 6 1 Client Browser
6
6
2
JSP Eng ine
Java Servlet
5
Server 3
Source JSP File
Generated Java Servlet
4
Java Compiler
Servlet Clas sfile
Figure 25 - The JSP Architecture Step 1) the client requests a JSP page (in other words, the user types in a URL something like http://www.myhost.com/booklist.jsp) Step 2) the server catches the request for a JSP page. The server finds the JSP file, and then passes it on to a program, running on the server, called the “JSP Engine” Step 3) The JSP reads the JSP file, and from this basic information, it generates a Java Servlet (automatically!) © 2002 Ariadne Training Limited
47
An Introduction to Java and J2EE
Step 4) The generated Java Servlet is compiled using a standard Java compiler (remember - all this is happening while the user is waiting for their page!) Step 5) The new Java servlet is now executed by the JSP engine. The servlet, as in the previous chapter, generates HTML “on the fly” Step 6) We now have a HTML page - the page is passed back to the web server and then finally it is returned to the client. Note that the compilation of the servlet does indeed take some time and you will notice that the first request of a JSP page is SLOW! The JSP then stores the resulting class file, however, because subsequent accesses will be much faster.13
Another Dynamic Webpage Here’s another example of a simple JSP. Again, we are demonstrating that we can drop lines of Java code anywhere we like in the HTML:
First First 10 10 Squares Squares The The First First 10 10 Squares:
Squares:
<% <% for for (int (int i=1; i=1; i<=10; i<=10; i++) i++) {{ out.println out.println (i*i); (i*i); }} %> %>
Figure 26 - Another simple JSP
Another Problem Emerges! You might have spotted that despite the nice, fluffy feel of JSP’s (and they are certainly at first glance more friendly than servlets), we actually haven’t solved the problems we identified in “A Serious Problem Emerges” (Page 44). We still have them, albeit in a different way.
13
Some Application Servers compile the JSP when the JSP is deployed rather than first accessed. This obviously increases performance, but it isn’t mandated and the reference implementation does not do this.
© 2002 Ariadne Training Limited
48
An Introduction to Java and J2EE
If we begin to write JSP pages with Java logic scattered all over them, we have the same maintenance nightmare as before – if we need to make any changes to the way the application works, we are going to have to laboriously hunt through masses of HTML code! Conversely, the HTML is going to be scattered amongst lots of very awkward looking Java fragments. This is one of the biggest problems faced by many J2EE projects. <%@ page import="java.sql.*" %> <%@ page import="java.sql.*" %> <% <% try try { { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); } } catch (ClassNotFoundException e) catch (ClassNotFoundException e) {%> {%>
An Error Occurred Loading a Driver
An Error Occurred Loading a Driver
<% } <% } String url = "jdbc:odbc:PERSONELL"; String url = "jdbc:odbc:PERSONELL"; String user = "sysadmin"; String user = "sysadmin"; String pass = "sysadmin"; String pass = "sysadmin"; Connection con = null; Connection con = null; try try { { con = DriverManager.getConnection(url,user,pass); con = DriverManager.getConnection(url,user,pass); } } catch (SQLException e) catch (SQLException e) { {
%> %>
An error occurred connecting to the database
An error occurred connecting to the database
<% } <% }
Figure 27 - An example of some very unpleasant looking JSP - what on earth is going on here??
Solution: Servlets! We now have the situation where: •
Servlets are a good idea, they are good at doing “brain-work” (application logic), but they are poor at the presentation of the results – those nasty out.println()’s
•
JSP’s are a good idea, they are excellent at doing the presentation but degenerate into a mess if they try to do too much brainwork
© 2002 Ariadne Training Limited
49
An Introduction to Java and J2EE
Well, the answer is to get the two to work together as a team! Let the servlet handle the Java logic, then get it to send its results onto a JSP – which can then do the job of displaying the results.
The MVC Architecture What we have discussed here is one form of a system architecture known as the Model-View-Controller, or MVC. A discussion of MVC is beyond the scope of the course, but at a simple level, MVC simply says “use separate modules to handle the display, the system flow and the business logic” – which is roughly what we have done with our JSP’s and Servlets: •
The display logic is called the “View” in MVC.
•
The system flow is called the “Controller “ in MVC.
•
The business logic is called the “Module” in MVC.
Project Standard
It is imperative, to achieve success with J2EE on your project, to enforce this model.
JSP’s display results only. Servlets handle the Java logic.
The “View”
HTML or JSP
The “Controller”
servlet
The “Model”
Other Java
Figure 28 - The Model View Controller (albeit in a simplified form)
Note – this method of design is often called “Model-2” in J2EE circles.
Java in JSP’s Are there rules about what Java should be allowed in a JSP page? The general answer is “as little as possible”, and the MVC/Model-2 principle must be followed.
© 2002 Ariadne Training Limited
50
An Introduction to Java and J2EE
Generally, Java will be used: •
To display results – eg outputting the details of a product
•
Simple loops – eg running through multiple products, and displaying each one in turn
•
Minor cosmetic modifications to data – for example, turning a singular into a plural, changing a greeting depending on the time of day, etc.
The real problem is enforcement. There is nothing in Java or J2EE to prevent programmers from dropping huge blocks of code into JSP pages. We have seen this is a recipe for disaster – the only way to avoid it is to impose project standards and to carry out code inspections.
Custom Tags A Custom Tag is a new enhancement to JSP that allows the JSP coder to perform complex operations without the need for Java code. A tag is essentially a macro used by the JSP programmer – even though the tag is quite simple, it turns into complex Java “behind the scenes”.14 The concept of custom tags has been, until recently, in its infancy. No standard set of tags were available, and it was really up to projects to write their own “Tag Libraries”. This is quite a difficult process to do, and of course this means the code your project writes is non-standard. An alternative was to download third-party tag libraries, but these libraries were patchy and sometimes quite complex. At last (and only just, at the time of writing), a standard tag library has been specified. It is called the “Java Standard Tag Library” or JSTL, and this library will become part of the J2EE specification. Here’s a quick example of where tags might be useful. Again, you don’t need to understand the Java, as long as you get a flavour of what is going on:
JSP Example This JSP page is responsible for displaying all of the items in stock in a warehouse. We have some standard HTML in here as usual, but the bold code is the Java code that runs through each item of stock and extracts the details of the stock:
14
Ie – when the JSP is converted to a servlet
© 2002 Ariadne Training Limited
51
An Introduction to Java and J2EE
The The following following items items are are in in stock stock <pre> <pre> <% <%
%> %>
Collection Collection results results == (Collection)request.getAttribute("stockListResult"); (Collection)request.getAttribute("stockListResult"); Iterator Iterator it it == results.iterator(); results.iterator(); while (it.hasNext()) while (it.hasNext()) {{ String String next next == (String)it.next(); (String)it.next();
Item Item :: <%= <%= next next %> %> <% <% }} %> %>
Figure 29 - JSP to display a stock list This JSP conforms to the rules we have discussed. It doesn’t do any brain work; it is given a set of data and the Java code simply extracts each result, and the JSP displays the name of the stock on the web page. Even though we have followed the rules, it is still a bit messy, and very heavy on the Java. Here, a Tag from the JSTL will help:
Using a Custom Tag The syntax of a custom tag is beyond the scope of this book15, but the following code illustrates the benefit of replacing the heavy Java in Figure 29:
The The following following items items are are in in stock stock <pre> <pre>
items="$results"> Item Item ::
value="${item}"/>
Figure 30 - Replacing the Java with a Tag
Summary •
The J2EE specifies two type of web component that can be written in Java:
15
Servlets
Reference [8] is a good guide to the JSTL
© 2002 Ariadne Training Limited
52
An Introduction to Java and J2EE
JSP’s
•
Servlets enable the dynamic creation of web pages
•
JSP’s enable the creation of dynamic web pages as well, but rely much less on explicit Java coding
•
The MVC or Model-2 must be enforced if maintainability and understandability is a requirement
•
Custom Tags and the JSTL provide another way of hiding the Java in a JSP Page
© 2002 Ariadne Training Limited
53
An Introduction to Java and J2EE
Chapter 7 Enterprise Java Beans (EJB’s)
In this session, we will look at the concept of Enterprise Java Beans, or EJB’s. We’ll look at the different types of EJB, and find out about the features that EJB’s offer.
Java Beans Sun invented the concept of a Java Bean some years ago, in an attempt to extend Java’s reach into the area of Rapid Application Development. We saw in “Java vs Other Languages” session (Page 26) that Visual Basic allows developers to rapidly build applications by dragging and dropping prebuilt components on to the screen, and then by customising the components by changing some properties. Sun’s idea was that a Java Bean would become the equivalent of the Visual Basic Components. A Java Bean is a standard Java Class, but one that is simple and easy for programmers to reuse themselves. For example, the “Button” in Swing (see Page 16) is a Java Bean. The programmer can change the colour of the button, the behaviour of the button and so on, but most of the work has already been done for them. Java Beans are often graphical, but not necessarily. As long as the Java Class conforms to a collection of “Design Patterns”, simple guidelines as to how the class is written, then it qualifies as a Java Bean. The key aim is that regardless of what the Bean is, it has a collection of properties that can be accessed and customised by the programmer.
Figure 31 - A JavaBean (in this case, the Button from the Swing classes). The programmer has customised the bean slightly, but most of the work was already done for them
The Purpose of Java Beans By assembling these Java Bean “Components” we can theoretically build applications without reinventing the wheel. Java Beans were originally envisaged to be graphical, but a Java Bean can actually be any Java Class, as long as it conforms to the “Design Patterns”.
© 2002 Ariadne Training Limited
54
An Introduction to Java and J2EE
From a theoretical point of view, Java Beans are easy to design and build – but in reality, there are some catches that make good Beans very difficult to build well. Therefore, commercial Java Beans can be quite expensive to buy.
Enterprise Java Beans The next stage of evolution of Java Beans was the development of Enterprise Java Beans, or EJB’s. EJB’s are essentially the same as standard Java Beans – they are small components that perform some kind of job. However, EJB’s live on servers rather than inside standard desktop applications. Since they are server based, they are never graphical, unlike standard Java Beans, which often are. As an example, you might have a “Customer” EJB in an e-commerce application. This EJB would hold data about your customers, such as their credit rating and which products they are most likely to be interested in. As with any other Java Module, an EJB will be able to do things as well – for example we might be able to query the Customer EJB and find out the credit rating for each customer we are interested in. The most striking feature of EJB’s is that they provide your programmers with a whole raft of functionality that is essential when building large scale systems. All of this is done for them, so they can concentrate on the job in hand.
EJB’s Are: •
Persistent
•
Transaction Aware
•
Distributed
•
Multithreaded
We’ll look at each of these concepts in turn. All of these features are provided “for free” – the programmer of the EJB doesn’t need to manually implement any of it. The trick is that your programmer’s EJB’s are “wrapped” in a piece of software called the EJB Container, provided by the Application Server.
EJB’s are Persistent The data held inside an EJB can be made to be persistent – in other words, it can be stored on a relational database automatically. Any changes to the data in the bean will be reflected in the database, without the need for the programmer to write laborious (and error-prone) JDBC code (see “Databases in Java”, page 24). The SQL required to perform the database transactions will be generated automatically by the deployment tool supplied by your application server (this SQL
© 2002 Ariadne Training Limited
55
An Introduction to Java and J2EE
can be tailored to your own needs if required, but it is done in the tool rather than polluting the Java code). If required, persistence can be handled manually by the programmer. This would be necessary if particularly complex database persistence is required, but it does mean polluting the Java code with database/JDBC calls. The terminology for the automatic persistence is “Container Managed Persistence”, or CMP – the manual variety is BMP. Our general advice is aim for CMP if at all possible – it is much more elegant and is one of the strongest features of EJB’s. We’ll return to this topic in a short while.
EJB’s are Transaction Aware EJB’s that hold data can be made to be transaction aware fairly easily. Either the programmer manually demarks regions of code that must be considered atomic, or entire methods (Java procedures) can be set to be a single transaction, using the deployment tool. In this example, we have set a Java method called “buy” to be a single transaction. If anything goes wrong part way through the process, any changes made as part of that method will be automatically rolled back.
Place Order Example As an example, consider an EJB that is responsible for placing an order for a customer. The EJB’s task is as in the following flow chart: Place Order Use Case
Credit Check Customer
ok?
no
yes
Add order to orders list
Return Error Message
Add invoice to the invoice queue
Send "order placed" message to customer
Use Case End
Figure 32 - The Place Order Process © 2002 Ariadne Training Limited
56
An Introduction to Java and J2EE
Clearly, if the process crashed (for whatever reason) after the order had been added to the list, but before the invoice was added to the queue, we would have a fairly serious business problem. By running the procedure as an EJB, we can make the entire process a transaction. If more fine grained control is required (let’s say we wanted to start the transaction after the credit check, and end the transaction once the invoice is raised), then this can be done by the programmer using a fairly simple “start transaction” and “end transaction” process. The automatic transaction handling is called “Container Managed Transactions” (CMT); the method using programmer intervention is called “Bean Managed Transactions” (BMT)
EJB’s are Distributed As we have seen, Enterprise Java Beans are located on a server and managed by the Application Server. However, the programmer using the EJB (the client programmer) doesn’t need to know anything about where the EJB is physically located. They follow a fairly simple procedure of “looking up” the EJB to get a handle on the bean; and then they call its methods exactly as they would do with a regular Java class. All of the nasty network mechanics happens behind the scenes in complete transparency (by the way, the technique used is called RMI or Remote Method Invocation – any programmer who has used RMI by hand will testify, it is a fairly unpleasant technique!)
EJB’s are Multithreaded The Application Server manages threading automatically. As a quick example, assume a programmer has written an EJB called “Book” representing a product in an online book store. What happens if two customers try to get information about the book at the same time? The application server will automatically manage threads so that the two tasks can happen in parallel – and once again, no programmer intervention is required to make this happen. In addition, the application server will also intelligently pool resources. For example, a thousand clients might all be trying to access the same EJB at the same time; the application server will be able to share a limited number of EJB’s amongst those thousand clients, thus preserving resources and preventing excessive server load – again, all this happens without the programmer needed to code anything special to make this happen.
© 2002 Ariadne Training Limited
57
An Introduction to Java and J2EE
Types of EJB Although until now we have considered an EJB to be a single concept, in fact there are actually three different types of Enterprise Java Bean available. The three types are: •
A Session EJB
•
An Entity EJB
•
Message Driven EJB’s (MDB)
Session beans are in very common use – these are usually beans that are primarily written to do something. For example, we might have a session bean responsible for credit checking customers, or for placing orders (as on Page 55). Session Beans are not persistent – any data they hold will be lost when the system is restarted. Entity Beans are EJB’s that provide the persistence features we discussed earlier. They are usually used to represent the real world “objects” that exist in the system. Examples of Entity EJB’s would be Customer, StockRecord and PurchaseOrder. You could think of an Entity Bean as being “data storage” beans, but they are Java classes, and so can do things just as with a session bean. Message Driven Beans are Java Classes that are capable of responding to “Messages” sent to them. The benefit of an MDB is that they can work asynchronously – in other words the client asks the bean to do something, and the client can go off and carry on with some other task, while the MDB is responding to the message at the same time. This is a powerful facility, but we won’t explore it in any depth on this course.
Entity Beans The concept and implementation of Entity Beans is very controversial (at the time of writing; things change quickly in J2EE!). Many J2EE applications have studiously avoided implementing entity beans, and have been happy to settle with Servlets, JSP and Session Beans. This will work perfectly well; an entity bean can be replaced by a standard class (you will see these referred to as “Plain Old Java Classes” – POJO’s). These plain Java classes use JDBC calls to manually manipulate the underlying database. Remember, however, that this manual use of JDBC is a pollution of your Java code, it is less maintainable and perhaps less understandable. But on the other hand, many people find Entity Beans difficult to understand and use anyway. Much of the confusion about Entity Beans has been attributed to the original specification of them – it was allegedly poorly written and difficult to understand.
© 2002 Ariadne Training Limited
58
An Introduction to Java and J2EE
The choice is entirely down to your project and its senior designers. However, be aware that a new version of the Entity Bean spec has now been released – it is called EJB 2.0, and it fixes many of the original problems with Entity Beans. As long as certain design principles are maintained (more on this shortly), Entity Beans are now viable for serious developments, and they certainly are a powerful tool.
J2EE Design Patterns Designing and building J2EE systems is difficult. Or perhaps more accurately speaking, it is easy to design and build poor J2EE systems; applications that perform and scale badly. Help is at hand. A collection of good design principles, called “Design Patterns” have been formulated by the J2EE community. Sun are making a big effort to collect and publish these design patterns – they are all available on-line at the Java website. We’ll look at a quick example of a simple design pattern – our aim is not to teach design patterns, as that is beyond the scope of this course – but we do want to give the flavour of design patterns, and establish that understanding them is critical to building good systems. Our advice is to ensure that your designers and programmers are familiar with at least some of the patterns, and that your project embraces the teachings of the patterns. If you are planning to buy a J2EE Design Patterns book, ensure that the book covers EJB 2.0, as the new version of Entity Beans has made some of the design patterns redundant. An excellent design patterns book is available for free download – see reference [4].
Example Design Pattern Consider a simple system that allows the user to view a list of all customers in the database – and for each customer, their open purchase orders are also displayed. Here is our first attempt at designing the application…
© 2002 Ariadne Training Limited
59
An Introduction to Java and J2EE
getCustomerDetails
Web Page (JSP)
Customer EJB
getPODetails
Purchase Order EJB
Application Server
Client
Figure 33 - Our first design attempt This will work. Our client application (in this case it is a web page, but it could have been a standard Java application) makes calls to the Enterprise Java Beans on the server. Remember, this is possible and easy because EJB’s are distributed and the client programmer can easily locate and call the beans. Our design has the client calling the Customer EJB first to get the customer data, and then it follows with a call to the Purchase Order EJB. The information is then displayed on the web page.
Design Problem Assume that this application works. The J2EE Design Patterns tell us that it isn’t a very good design however – it will perform badly, especially as the application scales up. The reason is that the calls across to the EJB’s are slow. They are travelling across a network, or possibly even the internet. Essentially, having two separate calls is wasteful. Applying a Design Pattern will help here…
Design Solution The solution is called a Session Façade – all design patterns have recognizable names. The Session Façade guides us to remove the multiple calls across the network and replace with one single call.
© 2002 Ariadne Training Limited
60
An Introduction to Java and J2EE
We will require an extra EJB to make this work, however – usually we will use a Session Bean16. We make a single call to the session bean, and then the session bean can talk to the EJB’s on the server.
Customer EJB
getCustomerDetails
Web Page (JSP)
listCustomers
ListCustomers Session EJB getPODetails
Purchase Order EJB
Application Server
Client
Figure 34 - The new design, using a Session Façade This has cut down the network “chattiness” and will certainly have a significant effect on performance, especially when we scale the system up, or if the List Customers process becomes more complex with more calls. This is just one design pattern (it happens to be the most common and one of the most important), but as we have mentioned, there are plenty more and investing time and effort into learning them will pay off in spades for your project.
EJB Summary •
Enterprise Java Beans are similar to standard Java Classes
•
They automatically provide Distribution, Transactions, Multithreading and Persistence
•
There are three different types of EJB – Session, Entity and Message-Driven
•
Entity Beans are the persistent type of Bean and have been quite slow to gain acceptance
•
Use recognised “Design Patterns” when building your applications
16
This makes sense – recall we said that Session Beans usually do something rather than holding onto data
© 2002 Ariadne Training Limited
61
An Introduction to Java and J2EE
© 2002 Ariadne Training Limited
62
An Introduction to Java and J2EE
Chapter 8 The Javadoc Tool Before we finish, we are going to take the opportunity to introduce the (sometimes neglected) javadoc tool. This remarkable tool, provided for free as part of the Java toolset, automatically generates technical documentation for your project’s code. The documentation follows exactly the same format as the Java Help that we saw in “Java Help” (page 12) – and the files you generate integrates closely with the standard Java help. This is a tremendous benefit to your programmers and designers, and is usually worth the added development effort involved.
How the Tool Works The only requirement is that your programmers include a special kind of comment in their code, called javadoc comments. These comments are almost the same as standard comments (just a slightly different syntax). In general, everything should be given a javadoc comment, such as the classes themselves, each item of data in the class, each function in the class – as much as is required to understand and maintain the class. /** /** This This class class holds holds information information about about an an ** Employee in the company Employee in the company */ */ public public class class Employee Employee {{ protected salary; protected int int salary; private String employeeCode; private String employeeCode; private private Calendar Calendar dateOfJoining; dateOfJoining; …… }}
Figure 35 - A Java class with a javadoc comment Figure 35 shows an Employee class with a javadoc comment (the rest of class also needs to be commented – we’ve omitted this for space). The javadoc is distinctive because of the “/**” symbol.
© 2002 Ariadne Training Limited
63
An Introduction to Java and J2EE
Running the Tool When the tool is run, documentation is generated for the classes you wish to be documented (you can document your entire codebase in one single run if required). The output is a collection of indexed HTML files, in exactly the same format as the standard Java Help files (in fact, if you haven’t already guessed, javadoc is how the standard help is produced!). These files can now be browsed by your project – they can also be picked up by your Java development IDE if you are using one (eg – pressing F1 on the Employee class will bring up the Employee help file!).
Figure 36 - Javadoc help for the Employee class
Javadoc Demonstration We will now demonstrate the generation of javadoc help for a non-trivial project (more than 100 classes).
Summary •
The Javadoc is an inspired addition to the Java toolset
•
Projects that use it report higher productivity and a more maintainable product
•
Clearly, to get value from the tool, an investment of time has to be made with putting the correct comments in the code
•
A drawback is that is does rather obscure the code a little! © 2002 Ariadne Training Limited
64
An Introduction to Java and J2EE
© 2002 Ariadne Training Limited
65
An Introduction to Java and J2EE
Chapter 9 Course Summary We have explored the principle features of Java, from the “standard features” (GUI’s, Threading, JDBC, etc) through to the more recent and advanced “enterprise features” provided by J2EE. It is important to be proficient in standard Java before diving into the enterprise side of Java – but once programmers reach a reasonable standard of ability in Java, many people report it is a well designed and “Engineer Friendly” language. Certainly, reports from the field suggest that Java projects tend to turn out code faster and more reliably than those working on C++ and similar languages. As always, the IT world is changing quickly; who knows how long Java will continue to hold such an enviable position? C# and .NET are certainly going to be major competitors in the near future…
Java Problems After dozens of pages extolling Java’s virtues, what are the problems with Java? One problem (which could be considered a benefit by many) is that Java is still a cutting edge language and is riding on a wave of technologies. Check the java.sun.com website, and you will find a raft of acronyms for lots of very fancy ideas (and often it is impossible to tell what these ideas actually are – often the technical enthusiasm gets in the way of human understandable descriptions of the ideas!) Many of these technologies get trumpeted as “the next big thing”; most of them you will never hear of again. It can all be a bit overwhelming, especially when all you want is to get your product delivered on time and on budget. On the subject of Object Orientation, although it is a standard and accepted method of analysing, designing and coding software, there is still a lot of misunderstanding, suspicion and confusion about OO. J2EE is an incredibly difficult topic to get to grips with. Most of the books currently available on the topic were written by the people behind the development of J2EE itself – and in many cases these books prove to be too complex and involved to gain understanding from. At last, “Teach Yourself” books are beginning to emerge, so perhaps at last J2EE will be easier to grasp for most programmers. (see reference [5] and [6]). No matter how complex J2EE is, a grasp of the “Design Patterns” (see page 58) is essential to the success of any J2EE development. Finally, as we have touched on in many areas of this book, .NET is a serious new technology and is likely to change many things. A common view is that both .NET
© 2002 Ariadne Training Limited
66
An Introduction to Java and J2EE
and J2EE will continue to carve out their own niches, and a kind of “stalemate” will eventually occur between the two. Who would dare to predict the outcome?
© 2002 Ariadne Training Limited
67
An Introduction to Java and J2EE
Bibliography [1] : Knowles, Richard; Dundas, Kenny; Golledge John. 2001 UML Applied : Object Oriented Analysis and Design Ariadne Training A cracking guide to the UML and Object Orientation, but we would say that. Available for download at www.ariadnetraining.co.uk.
[2] : Hortstmann/Cornell. Core Java : Volume 1 Fundamentals Sun Microsystems/Prentice Hall An excellent tutorial covering a wide range of Java topics. Excellent examples and very well explained. The only drawback is a second volume is required to cover many of the advanced topics
[3] : Hortstmann/Cornell. Core Java : Volume 2 Advanced Features Sun Microsystems/Prentice Hall Another excellent volume, covering Threading, Collections and JDBC; in addition it covers Networking, Remote Objects, JavaBeans, Security, Java 2D, Internationalization, Native Methods and XML. It also goes into more detail on Swing.
[4] : Marinescu, Floyd. EJB Design Patterns John Wiley & Sons This is superb and readable book; an excellent treatment of this very difficult topic. A downloadable version is available at www.theserverside.com - but we recommend you buy it!
[5] : Deitel and Deitel. Advanced Java 2 Platform : How to Program Prentice Hall A very comprehensive and programmer friendly guide to advanced Java (such as Java 2D and 3D), but more significantly covers J2EE in astonishing detail, and avoiding the complex and unnecessary depth the appears in most J2EE books. They describe how to build full J2EE applications, and even cover J2ME.
[6] : Bond, Martin. Teach Yourself J2EE in 21 Days Sams We haven’t yet had a chance to review this book, but it is pleasing that at last programmer friendly books in the “Teach Yourself” vein are finally appearing for J2EE. As always, 21 days might be a bit optimistic though!
[7] : Collins, Tony. 1998 Crash : Learning from the World’s Worst Computer Disasters Simon&Schuster An entertaining collection of case studies exploring why so many software development projects fail; referenced on this course to prove that C++ programs can occasionally crash
[8] : Bayern, Shaun. 2002 JSTL In Action Manning Publications Co. A guide to the new JSTL
© 2002 Ariadne Training Limited