Download Migrating WebLogic Applications to WebSphere Advanced Edition

Document related concepts

Open Database Connectivity wikipedia , lookup

Microsoft SQL Server wikipedia , lookup

Object-relational impedance mismatch wikipedia , lookup

Transcript
Migrating WebLogic
Applications to WebSphere
Advanced Edition
Understanding the migration issues
and preparing a migration strategy
Guidelines for writing portable
applications
Considerations for completing
and implementing a migration
Bill Moore
Robert Janker
Benjamin Papez
Leigh Power
Robert Watkins
ibm.com/redbooks
SG24-5956-00
International Technical Support Organization
Migrating WebLogic Applications to WebSphere
Advanced Edition
January 2001
Take Note!
Before using this information and the product it supports, be sure to read the general information in
Appendix B, “Special notices” on page 237.
First Edition (January 2001)
This edition applies to Version 3.5 of WebSphere Application Server, Advanced Edition for use with
Windows NT, Windows 2000 Server, and AIX.
Comments may be addressed to:
IBM Corporation, International Technical Support Organization
Dept. HZ8 Building 678
P.O. Box 12195
Research Triangle Park, NC 27709-2195
When you send information to IBM, you grant IBM a non-exclusive right to use or distribute the
information in any way it believes appropriate without incurring any obligation to you.
© Copyright International Business Machines Corporation 2001. All rights reserved.
Note to U.S Government Users – Documentation related to restricted rights – Use, duplication or disclosure is
subject to restrictions set forth in GSA ADP Schedule Contract with IBM Corp.
Contents
Preface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .ix
The team that wrote this redbook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ix
Comments welcome . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xi
Chapter 1. Introduction . . . . . . . . . . .
1.1 Our objectives . . . . . . . . . . . . . . .
1.1.1 A practical migration guide . . .
1.1.2 More portable applications . . .
1.2 Our focus . . . . . . . . . . . . . . . . . . . .
1.2.1 Prerequisites . . . . . . . . . . . . .
1.2.2 J2EE application architecture .
1.3 Migration issues . . . . . . . . . . . . . . .
1.3.1 Types of migration issues . . . .
1.3.2 Use of examples. . . . . . . . . . .
1.3.3 Documenting migration issues
1.4 How to use this guide . . . . . . . . . . .
1.4.1 Analyze your application. . . . .
1.4.2 Incremental migration . . . . . . .
1.4.3 The basic process . . . . . . . . .
1.4.4 Plan for the future . . . . . . . . . .
1.5 Structure of this guide . . . . . . . . . .
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. .1
. .2
. .2
. .2
. .3
. .3
. .4
. .6
. .7
. .8
. .9
. 10
. 11
. 11
. 13
. 14
. 15
Chapter 2. Features comparison and migration strategy
2.1 Covered versions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.1 WebLogic Server . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1.2 WebSphere Application Server, Advanced Edition .
2.2 Feature comparison . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Core J2EE feature levels . . . . . . . . . . . . . . . . . . . .
2.2.2 Other J2EE feature levels . . . . . . . . . . . . . . . . . . . .
2.2.3 Relevant WebLogic extensions. . . . . . . . . . . . . . . .
2.3 Reasons for migrating . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4 Migration strategies . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.4.1 Big picture migration strategies . . . . . . . . . . . . . . .
2.4.2 Migrating J2EE-based applications . . . . . . . . . . . . .
2.5 More information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 17
. 17
. 17
. 18
. 19
. 19
. 21
. 23
. 26
. 26
. 26
. 27
. 30
Chapter 3. Configuration . . . . . . . . . . . . . . .
3.1 Platform . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Development machine . . . . . . . . . . .
3.1.2 WebLogic Server test configuration .
3.1.3 WebSphere test configuration. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 33
. 33
. 33
. 34
. 34
© Copyright IBM Corp. 2001
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
iii
iv
3.2 Setting up the development machine . . . . . . . . . . . . . . . . . .
3.2.1 Install JDK 1.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.2 Install and configure IBM Universal Database 7.1 . . . . .
3.2.3 Install BEA WebLogic Server 5.1 . . . . . . . . . . . . . . . . .
3.2.4 Install WebSphere . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.5 WebSphere configuration . . . . . . . . . . . . . . . . . . . . . . .
3.2.6 Database configuration. . . . . . . . . . . . . . . . . . . . . . . . .
3.2.7 Configuring IBM HTTP Server . . . . . . . . . . . . . . . . . . .
3.2.8 IBM WebSphere Studio 3.5 . . . . . . . . . . . . . . . . . . . . .
3.2.9 IBM VisualAge for Java, Enterprise Edition Version 3.5
3.2.10 Tomcat 3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Setting up the WebLogic Server lab machine . . . . . . . . . . . .
3.4 Setting up the WebSphere lab machine . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 34
. 34
. 35
. 38
. 40
. 45
. 51
. 55
. 55
. 56
. 57
. 58
. 58
Chapter 4. Development tools . . . . . . . . . . . . . . . . . . .
4.1 IBM VisualAge for Java, Enterprise Edition . . . . . . .
4.1.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.1.2 Overview of useful VisualAge for Java features
4.1.3 WebSphere Test Environment . . . . . . . . . . . . .
4.1.4 EJB Development Environment . . . . . . . . . . . .
4.1.5 Persistence access builder . . . . . . . . . . . . . . . .
4.1.6 Apache Tomcat test environment . . . . . . . . . . .
4.1.7 BEA WebLogic Server Integration Kit . . . . . . . .
4.2 jetace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3 WebSphere Studio and other JSP, HTML - Editors. .
4.4 Other tools and products . . . . . . . . . . . . . . . . . . . . .
4.4.1 J2EE Reference Implementation server . . . . . .
4.4.2 Converter and migration tools . . . . . . . . . . . . . .
4.4.3 Persistence mapping tools . . . . . . . . . . . . . . . .
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.....
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 59
. 59
. 60
. 62
. 65
. 71
. 78
. 78
. 80
. 81
. 82
. 83
. 83
. 83
. 84
Chapter 5. JavaServer Pages . . . . . . . . . . . . . . . .
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Developing JSPs . . . . . . . . . . . . . . . . . . . . . . .
5.2.1 Tag libraries . . . . . . . . . . . . . . . . . . . . . . .
5.3 Deploying JSPs . . . . . . . . . . . . . . . . . . . . . . . .
5.3.1 Deploying JSPs in WebLogic Server. . . . .
5.3.2 Deploying JSPs in WebSphere . . . . . . . . .
5.3.3 Parameter settings for JavaServer Pages.
5.3.4 Deploying JSPs in WebSphere . . . . . . . . .
5.3.5 Using tag libraries. . . . . . . . . . . . . . . . . . .
5.3.6 Securing JSPs . . . . . . . . . . . . . . . . . . . . .
5.4 Migrating JSP examples . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. . 85
. . 85
. . 86
. . 87
. . 91
. . 91
. . 92
. . 92
. . 95
. . 98
. . 99
. 100
Migrating WebLogic Applications to WebSphere Advanced Edition
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Chapter 6. Java Servlets . . . . . . . . . . . . . . . . . . . . .
6.1 Technology overview . . . . . . . . . . . . . . . . . . . . . .
6.2 Web application design . . . . . . . . . . . . . . . . . . . .
6.3 The importance of being a servlet . . . . . . . . . . . .
6.4 Migration examples . . . . . . . . . . . . . . . . . . . . . . .
6.5 Differences in implementation . . . . . . . . . . . . . . .
6.6 Deploying an unpackaged servlet In WebSphere .
6.6.1 Problems converting servlets . . . . . . . . . . . .
6.7 Migrating a J2EE Web application . . . . . . . . . . . .
6.7.1 Problems With converting Web applications .
6.8 Converting J2EE references . . . . . . . . . . . . . . . . .
6.9 Converting J2EE security . . . . . . . . . . . . . . . . . . .
6.9.1 Migrating the user database . . . . . . . . . . . . .
6.9.2 Changes required for security migration . . . .
6.10 Migrating htmlKona . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 109
. 109
. 110
. 112
. 112
. 113
. 114
. 116
. 118
. 119
. 120
. 122
. 122
. 123
. 125
Chapter 7. Enterprise JavaBeans . . . . . . . . . . . . . . . . .
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.2 Major migration issues . . . . . . . . . . . . . . . . . . . . . . . .
7.2.1 Summary of recommendations . . . . . . . . . . . . . .
7.3 EJBException replaces RemoteException in EJBs . . .
7.3.1 Revert to RemoteException . . . . . . . . . . . . . . . .
7.3.2 Use unchecked EJBExceptionMigrate . . . . . . . .
7.3.3 EJBException subclasses. . . . . . . . . . . . . . . . . .
7.4 JNDI lookups expanded . . . . . . . . . . . . . . . . . . . . . . .
7.4.1 env-entry lookups . . . . . . . . . . . . . . . . . . . . . . . .
7.4.2 ejb-ref and resource-ref lookups . . . . . . . . . . . . .
7.5 Deployment descriptors replaced . . . . . . . . . . . . . . . .
7.6 Finders expanded to Collection . . . . . . . . . . . . . . . . .
7.6.1 Convert Collection Finder to Enumeration Finder
7.7 HomeHandle added . . . . . . . . . . . . . . . . . . . . . . . . . .
7.7.1 Use JNDI names in place of HomeHandles . . . .
7.8 CMP ejbCreate change . . . . . . . . . . . . . . . . . . . . . . .
7.8.1 Revert to the EJB 1.0 CMP ejbCreate rule . . . . .
7.8.2 Use inheritance from implementation objects . . .
7.9 Transaction changes . . . . . . . . . . . . . . . . . . . . . . . . .
7.10 Authentication method changes . . . . . . . . . . . . . . . .
7.10.1 Replace Principal with Identity . . . . . . . . . . . . .
7.11 Read-only EntityBeans . . . . . . . . . . . . . . . . . . . . . . .
7.11.1 Use read-only method attributes . . . . . . . . . . . .
7.12 Non-issues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.12.1 Tightenings. . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.12.2 Clarifications. . . . . . . . . . . . . . . . . . . . . . . . . . .
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 127
. 127
. 129
. 130
. 130
. 132
. 133
. 134
. 134
. 136
. 137
. 139
. 141
. 142
. 144
. 144
. 145
. 146
. 147
. 148
. 148
. 149
. 150
. 150
. 150
. 151
. 152
v
Chapter 8. Database connectivity and persistence . . . . . .
8.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2 JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2.1 DataSource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2.2 Connection pools . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2.3 Available drivers . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.2.4 Distributed transactions . . . . . . . . . . . . . . . . . . . . . .
8.2.5 Summary: Writing portable JDBC applications . . . . .
8.3 jDriver (jdbcKona) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.4 dbKona . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.5 Business objects - persistence frameworks . . . . . . . . . . .
8.5.1 Container-managed persistence (CMP) entity beans
8.5.2 Bean-managed persistence (BMP) entity beans . . . .
8.5.3 TOPLink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.5.4 Other persistence managers. . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 155
. 155
. 156
. 157
. 163
. 164
. 168
. 173
. 174
. 175
. 176
. 177
. 178
. 178
. 179
Chapter 9. Migration example: The Java Pet Store
9.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.1.1 Why Java Pet Store? . . . . . . . . . . . . . . . . . .
9.2 Understand the application . . . . . . . . . . . . . . . . . .
9.2.1 Java Pet Store user interface . . . . . . . . . . . .
9.2.2 Java Pet Store implementation . . . . . . . . . . .
9.2.3 Java Pet Store architecture . . . . . . . . . . . . .
9.2.4 Java Pet Store database . . . . . . . . . . . . . . .
9.2.5 The migration plan . . . . . . . . . . . . . . . . . . . .
9.2.6 Migration strategy . . . . . . . . . . . . . . . . . . . . .
9.3 Migrating EJBs . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3.1 Tools and techniques . . . . . . . . . . . . . . . . . .
9.3.2 Source changes . . . . . . . . . . . . . . . . . . . . . .
9.3.3 JNDI ENC changes. . . . . . . . . . . . . . . . . . . .
9.3.4 EJBException changes . . . . . . . . . . . . . . . . .
9.3.5 Principal/Identity changes. . . . . . . . . . . . . . .
9.3.6 Collection finder changes . . . . . . . . . . . . . . .
9.3.7 DB2 database support . . . . . . . . . . . . . . . . .
9.4 Java Pet Store deployment . . . . . . . . . . . . . . . . .
9.4.1 VisualAge for Java steps . . . . . . . . . . . . . . .
9.4.2 WebSphere steps . . . . . . . . . . . . . . . . . . . . .
9.4.3 Redeployment cycle . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
. 181
. 181
. 181
. 182
. 183
. 184
. 188
. 190
. 193
. 194
. 195
. 196
. 198
. 200
. 205
. 206
. 207
. 208
. 208
. 210
. 218
. 232
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
..
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Appendix A. Using the additional material . . . . . . . . . . . . . . . . . . . . . . 235
A.1 Locating the additional material on the Internet . . . . . . . . . . . . . . . . . . . 235
A.2 Using the Web material. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
A.2.1 System requirements for downloading the Web material . . . . . . . . 235
vi
Migrating WebLogic Applications to WebSphere Advanced Edition
A.2.2 How to use the Web material . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Appendix B. Special notices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Appendix C. Related publications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
C.1 IBM Redbooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
C.2 IBM Redbooks collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
C.3 Other resources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
C.4 Referenced Web sites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
How to get IBM Redbooks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
IBM Redbooks fax order form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Abbreviations and acronyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
IBM Redbooks review . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
vii
viii
Migrating WebLogic Applications to WebSphere Advanced Edition
Preface
This redbook will help you plan the migration of an application developed for
BEA WebLogic Server, so that the application will run on WebSphere
Application Server, Advanced Edition. We explain the differences between
the implementations of WebLogic and WebSphere, provide guidance to
developers on how to deploy existing applications from WebLogic to
WebSphere, and discuss how to design portable new applications that may
be deployed on WebSphere or WebLogic.
It is not our intention to provide a feature-by-feature comparison of WebLogic
vs WebSphere, or to argue the relative merits of the products, but to produce
practical technical advice for developers who have to migrate applications
from WebLogic to WebSphere.
The team that wrote this redbook
This redbook was produced by a team of specialists from around the world
working at the International Technical Support Organization Raleigh Center.
Bill Moore is a WebSphere Specialist at the International Technical Support
Organization, Raleigh Center. He writes extensively and teaches IBM classes
on WebSphere and related topics. Before joining the ITSO, Bill was a Senior
Aim Consultant at the IBM Transarc lab in Sydney, Australia. He has 16 years
of application development experience on a wide range of computing
platforms and using many different coding languages. He holds a Master of
Arts degree in English from the University of Waikato, in Hamilton, New
Zealand. His current areas of expertise include the VisualAge family of
application development tools, object-oriented programming and design, and
e-business application development.
Robert Janker is an I/T Specialist at HypoVereinsbank AG in Munich,
Germany. He has seven years of experience in application development and
I/T architecture. He holds a degree in computer science from Fachhochschule
Muenchen. His areas of expertise center around middleware technologies.
Benjamin Papez is a Senior System Architect at UNiQUARE Financial
Solutions(formerly GENESiS Software & Consulting) based in Austria, where
he has been involved in many successful large-scale projects. He acquired
his current expertise during 10 years of application development and system
architecture with a variety of operating, database and back-end systems,
programming languages, and development tools. He has three years of
experience in Java technology in relation to network computing architectures
© Copyright IBM Corp. 2001
ix
(J2EE, CORBA, e-business) and has good practical knowledge of VisualAge
(Java and Smalltalk), WebSphere and WebLogic Server.
Leigh Power is an independent Java training consultant. He has over 30
years of experience in software research and development, specializing in
programming languages and object-oriented systems. He has been a
research staff member at both the T.J. Watson Research Center and the MCC
Research Consortium. He currently runs his own company, Power Assist, Inc.
in Coupeville, WA, USA.
Robert Watkins is a Software Engineer in Australia. He has six years of
experience in the IT industry, and two years within the J2EE enterprise
computing field. He holds a degree in Computer Science from the Northern
Territory University. His areas of expertise include J2EE design and
development.
Figure 1. The authors: Robert Watkins, Benjamin Papez, Robert Janker, Leigh Power, and Bill Moore
Thanks to the following people for their invaluable contributions to this project:
Margaret Ticknor
Linda Robinson
International Technical Support Organization, Raleigh Center
Wayne Beaton
IBM Toronto
x
Migrating WebLogic Applications to WebSphere Advanced Edition
Adam Matz
Jim Van Oosten
Pete Schommer
IBM Rochester
Leigh Williamson
IBM Austin
Harald Murgas
IBM Germany
Roman Kharkovski
IBM Pittsburgh
Juergen Wakonig
Senior System Architect, UNiQUARE Financial Solutions, Austria
Ralf Pichler
System Specialist, UNiQUARE Financial Solutions, Austria
Comments welcome
Your comments are important to us!
We want our Redbooks to be as helpful as possible. Please send us your
comments about this or other Redbooks in one of the following ways:
• Fax the evaluation form found in “IBM Redbooks review” on page 255 to
the fax number shown on the form.
• Use the online evaluation form found at ibm.com/redbooks
• Send your comments in an Internet note to [email protected]
xi
xii
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 1. Introduction
In today’s high-end, Java-based, enterprise application server market, the
two leading products are WebSphere Application Server, Advanced Edition
from International Business Machines Corporation, and BEA WebLogic
Server from BEA. Both of these products offer robust support for complex
Web-based enterprise applications. Moreover, by adhering to Java standards,
they offer a level of portability far beyond that attained by earlier transaction
monitor technologies. In addition to exploiting the write-once feature of the
Java language, these products closely adhere to the Java 2 Platform,
Enterprise Edition (J2EE) specification and associated reference
implementation from Sun Microsystems. J2EE promotes an architecture for
building and deploying Web-based enterprise applications based, in part, on
the following standards:
• Java Development Kit (JDK)
• JavaServer Pages (JSP)
• Java Servlets
• Enterprise JavaBeans
• Java Database Connectivity (JDBC)
• Java Naming and Directory Interface (JNDI)
• HyperText Markup Language (HTML)
• eXtensible Markup Language (XML)
Portability and adaptability are key properties of enterprise applications. By
adhering to the J2EE standard, application developers automatically gain a
high degree of portability. Given the J2EE support in BEA WebLogic Server
and WebSphere Application Server, Advanced Edition, it should be, at least in
theory, a trivial task to take an application written for a WebLogic system, and
move it over to run on a WebSphere system. In practice, however, there are
various reasons why this migration can be non-trivial. As a practical guide,
this book identifies the potential trouble spots in such a migration, and guides
the reader through this migration task. One word of caution — although
WebLogic supports J2EE, its use is optional. The primary focus of this book
is on migrating J2EE-compliant applications to WebSphere. Common noncompliant features of WebLogic are also mentioned.
© Copyright IBM Corp. 2001
1
1.1 Our objectives
In this book, we present our findings on how to migrate J2EE enterprise
applications from BEA WebLogic Server to WebSphere Application Server,
Advanced Edition. We offer a practical guide on how to accomplish this task
with the current release levels of these products — BEA WebLogic Server
Version 5.1 and WebSphere Application Server, Advanced Edition Version
3.5. We identify the specific differences in these products that must be
addressed during the migration task, and offer detailed solutions to these
differences. We also offer guidance for the future. Since an enterprise
application tends to have a very long life cycle, it is likely to be migrated again
in the future. By relying on good design practice and standard system
architectures, we outline how to reduce the effort of future migrations and
general application upgrades.
1.1.1 A practical migration guide
Our primary goal is a practical migration guide. To this end, we have
cataloged a detailed list of migration issues that must be resolved during the
migration process.
To the extent that your application follows the standards for J2EE
applications, migration issues are relatively easy to identify, describe, and
resolve. In some cases, it is simply a matter of performing a similar step with
slightly different tools. Other cases require minor source code changes. To
the extent that your application exploits vendor-specific features, the
migration effort can become more complex. The good news is that the
majority of your application will require only minor changes, and possibly
none at all.
As a practical guide, we have attempted to be comprehensive, but not
exhaustive. There are certainly applications that have subtle dependencies
that we have not anticipated — these cases are obviously not covered. Our
goal has been to include the major migration issues that we expect most
clients will encounter.
1.1.2 More portable applications
Our secondary goal is to encourage the production of more standard and
more portable code. This topic is addressed when there is a clear trade-off in
resolving a particular migration issue. We do not, however, intend to provide a
general guide for best practices and portable code.
2
Migrating WebLogic Applications to WebSphere Advanced Edition
Some migration issues are simple and straightforward to resolve. For these,
you will find a single, simple recommendation. More complex migration issues
can often be resolved in more than one way. When the easiest solution is not
necessarily the best one, we outline the alternatives and make a
recommendation. This recommendation is based on good practice and likely
future system changes. By investing effort to make code more standard and
portable, future migration and maintenance effort should be reduced.
Ultimately, reducing the effort of future migration and maintenance requires
the impossible skill of being able to tell the future. Fortunately, the Java and
J2EE standards efforts provide guidance about future developments. Where
appropriate, we encourage your current migration task to prepare for these
likely future developments. In this context, you should also consider the likely
evolution of your enterprise applications.
1.2 Our focus
This book is narrowly focused on two specific products and is primarily
intended for application developers.
• Migration from BEA WebLogic Server 5.1 to WebSphere Application
Server, Advanced Edition 3.5.
• As stated already, this is not a general-purpose migration guide. It is
focused on the task of migrating J2EE and other Java applications from
WebLogic to WebSphere. J2EE issues form the core of our migration
recommendations, but common non-J2EE components are also covered.
Given the rapid pace with which these server products and associated
specifications change, we expect this guide to be of practical value for a
relatively short period of time. It may, however, have some value for other
more general migration tasks.
• Targeted at application developers and system administrators.
We assume that our audience is familiar with the specifications and tools
used to build J2EE applications. That is, they are primarily Java
application developers and application server system administrators. This
guide may also be useful for other technical professionals who wish to
evaluate, plan, and manage migration projects in the near future.
1.2.1 Prerequisites
We assume that the reader is familiar with the relevant Java and J2EE
specifications. This does not mean that you have to know all the subtle
details of these specifications; a general familiarity is all that is required. We
point out any special details that you need to know.
Chapter 1. Introduction
3
These specifications correspond roughly to chapters in this book. If you are
not familiar with a particular specification, you may choose to skip that
chapter.
We also assume the reader is familiar with the BEA WebLogic Server 5.1
product, but less familiar with the WebSphere Application Server, Advanced
Edition 3.5 product and associated development tools. We do not provide
tutorials for the use of these products. Instead, we document how we used
the tools and identify problems that we experienced during migration
exercises.
1.2.2 J2EE application architecture
Although the term enterprise application covers a broad spectrum of
architectural possibilities, we focused our attention on the general Web-based
e-business architecture depicted in Figure 2 on page 5. This is the style of
architecture recommended by the J2EE specification and vendors of J2EE
server products. Some of our recommendations may also benefit variations
on this architecture.
4
Migrating WebLogic Applications to WebSphere Advanced Edition
EAR
WAR
HTML
Servlet
JSP
JAR
EJB
Home
Remote
J2EE Application
Server
Client
Tier 1
Browser
Applet
Deployment
Tools
Web
Container
HTML/XML
Enterprise
Info Tier 4
2
JDBC DataSource
Tag
Lib
JSP
Servlet
R
M
I
I
I
O
P
T
r
a
n
s
a
c
t
i
o
n
EJB
Container
M
o
n
i
t
o
r
Database
System
3
Legacy
Java
Application
RMI-IIOP
Session
Bean
Entity
Bean
JDBC DataSource
Lookup properties, resources,
EJBs
env
Context
JNDI
DataSource
Server
EJB Home
Figure 2. J2EE application server architecture
This style of enterprise application has the following identifiable components:
• A browser-based user interface using HTTP protocol.
• A server-side front end that manages user sessions and translates HTTP
requests into method calls on business objects in the enterprise server.
Java Servlets and JavaServer Pages are used to implement this
component in conjunction with a traditional Web server.
Chapter 1. Introduction
5
• An object-oriented business logic server is implemented using Enterprise
JavaBeans. The Enterprise JavaBeans are mapped onto the underlying
database and legacy systems.
• Multiple Enterprise JavaBeans servers may be interconnected, both
locally or remotely, to form complex distributed object-oriented systems.
These servers support distributed transactions to maintain data integrity
across remote databases.
• Java applications can also interact directly with the Enterprise JavaBeans
server.
• One or more firewalls are typically present for system security.
By encouraging a general architecture for e-business applications, the J2EE
approach promotes portability. The business logic is restricted to the
Enterprise JavaBeans, while issues such as security, database mapping,
transactions, load balancing, and communications are handled by the vendorprovided J2EE platform. Migrating from one vendor’s platform to another is
reduced to migrating the business-provided Enterprise JavaBeans, Java
Servlets, JavaServer Pages, and Web pages. Moreover, if these components
have been written in a vendor-neutral way, it is possible to migrate one
component at a time. For example, an underlying database can be migrated
independently of the Enterprise JavaBeans that access it.
1.3 Migration issues
The technical content of this guide is a set of migration issues specific to BEA
WebLogic Server 5.1 and WebSphere Application Server, Advanced
Edition3.5. Each migration issue describes a problem that you are likely to
encounter during the migration of an application from WebLogic to
WebSphere. For each problem, we provide one or more solutions designed to
resolve the issue. In most cases, you will have to do one of the following
things to get your application installed and running under WebSphere:
• Make a change to the original WebLogic application.
• Use a different process, or a different tool to get your application installed
and running on WebSphere.
We employed a combination of techniques to discover these migration issues:
• Review and compare relevant product documentation and J2EE
specifications.
• Perform actual migrations of simple examples.
6
Migrating WebLogic Applications to WebSphere Advanced Edition
The value of each technique depends largely on details of the kind of
component being migrated. In some cases, the documentation was the most
fruitful source of migration issues. For example, the Enterprise JavaBeans
specifications provided most of the clues for Enterprise JavaBeans migration
issues. This is because WebLogic 5.1 requires Enterprise JavaBeans 1.1,
while WebSphere 3.5 requires Enterprise JavaBeans 1.0. A careful reading of
the changes to the specifications provided most of the clues. In other cases,
where documentation was minimal, we had to rely more heavily on
experimentation and hands-on experience. An example of this is the way we
discovered the differences in the way you define DataSource and JDBC driver
objects for the two servers.
Regardless of how a migration issue was discovered, we verified the issue
and the solution by means of examples. Examples were run on both
WebLogic and WebSphere servers.
1.3.1 Types of migration issues
There are several possible causes of migration problems. From the viewpoint
of just getting your code to run, these reasons may seem irrelevant. However,
understanding the underlying reason for a change helps you choose the most
appropriate solution. Here are some of the types of problems we found:
• Application uses vendor-specific services.
Although use of a vendor-specific service will generally lead to nonportable code, try to determine the deeper reason for its use.
Some vendor-specific services provide proprietary features that may be
critical to your application. In this case, you will probably have to do some
redesign to obtain the desired result, possibly becoming dependent on
another vendor’s services. We do not cover this case in general. Our
recommendation is to use a standard service whenever possible so your
application becomes more portable in the future.
Older applications may be using vendor-specific services simply because
that was the only service available when the application was written. As
the J2EE specification evolves, some of these cases have become
standardized. A migration project is a good time to upgrade to the newer
specification. Since you will have to make a change anyway, why not move
toward the current J2EE standard?
• Application uses J2EE standards, but still contains non-portable code.
It is possible to use the J2EE standard and still write non-portable code.
For example, the JDBC APIs provide many opportunities to embed
vendor-specific strings, for example, table names and database types. An
Chapter 1. Introduction
7
EntityBean with bean managed persistence could therefore easily be nonportable. For this case, we may recommend the use of the Enterprise
JavaBeans environment services in conjunction with more portable JDBC
APIs. Use good judgment and good programming practice to make these
decisions.
• J2EE support is partial or differs between server products.
The J2EE specification is a moving target and vendor support is bound to
lag behind the latest standard. Although your application may be running
on a J2EE-compliant server, loopholes in the J2EE implementation may
expose migration issues. In some cases, the J2EE specification has been
interpreted differently. Since it is difficult to predict these migration issues,
we rely on experimentation to identify them. In these cases, we try to
guide you in the direction of the latest J2EE specifications to avoid future
problems.
• Vendors support different versions of the J2EE specification.
It is relatively easy to identify these migration issues by reviewing the
relevant J2EE specifications. We are faced with the fact that the WebLogic
5.1 supports Enterprise JavaBeans 1.1 while WebSphere 3.5 supports
Enterprise JavaBeans 1.0. This impacts both Java code and deployment
descriptors. For each of these migration issues, we try to preserve as
much of the Enterprise JavaBeans 1.1 code as possible, to facilitate future
updates to Enterprise JavaBeans 1.1. These migration issues are
generally localized and well-defined, making the use of automation
attractive.
• Vendors provide needed services that are not yet covered by the J2EE
specification.
The J2EE specification does not cover all situations. The J2EE 1.3 and
Enterprise JavaBeans 2.0 draft specifications provide clues for future
directions, but covering these specifications is beyond the scope of this
guide. For now, you may simply have to ignore these portability issues.
Instead, just focus on getting your application running on WebSphere
Application Server, Advanced Edition.
1.3.2 Use of examples
Given our limited resources and time schedule, we were not able to perform a
realistic full-fledged migration. Instead we used small, focused examples
geared to test particular language and tool features. In addition to these small
examples, we used the Java Pet Store example available from Sun
Microsystems. It is considerably larger and it is also well-known in the
industry. These examples serve the following purposes:
8
Migrating WebLogic Applications to WebSphere Advanced Edition
• Help uncover migration issues.
In this book, we use small examples adapted from the WebLogic
distribution. We also use short examples that we wrote ourselves. In
general, we preferred to use existing examples rather than spend
resources writing new ones. We have published most of the examples we
used. If an example failed to uncover a migration issue, then it had served
its purpose and was ignored.
• Help resolve migration issues.
Two versions of an example are needed — the before case and the after
case. A comparison of the two highlights a solution to the migration issue.
In some cases, we may develop multiple solutions for the same example.
• Help document our recommendations.
It is often easiest to understand a migration issue by examining the before
and after code. You will see many short examples used for this purpose.
Since these examples highlight detailed migration issues with specific
J2EE components, they will be found in their respective chapters.
- Chapter 5, “JavaServer Pages” on page 85
- Chapter 6, “Java Servlets” on page 109
- Chapter 7, “Enterprise JavaBeans” on page 127
- Chapter 8, “Database connectivity and persistence” on page 155
• Demonstrate a mini-migration effort.
A migration effort is more than just resolving a set of migration issues. It is
important to follow some sort of process. To this end, we have used the
Java Pet Store example as a mini-migration project. Although this example
only exercises some of the identified migration issues, it demonstrates a
complete migration process for a non-trivial application. Moreover, this
example was designed to be a highly portable J2EE application. Our minimigration project is documented in Chapter 9, “Migration example: The
Java Pet Store” on page 181. Of course, being a very small project, we do
not address important process issues such as planning, risk assessment,
scheduling, and quality control.
1.3.3 Documenting migration issues
In general, you want to know the following sorts of things about any particular
migration issue:
• Do you have the problem?
Chapter 1. Introduction
9
You need an easy way to determine if your application has the problem.
Some issues apply to most applications. Conversion of Enterprise
JavaBeans deployment descriptors is an example of this. Other issues are
seen rarely and will not be a problem for most applications. The presence
of a particular class name may be the clue for such an issue.
• Why is it a problem?
You need some background information on why this problem exists. This
may be an elaboration on the items listed in 1.3.1, “Types of migration
issues” on page 7. For example, the definition for EJBException changed
between Versions 1.0 and 1.1 of the Enterprise JavaBeans specification.
• Can you ignore the problem?
What happens if you do not address this issue? The answer to this
question may be anything from nothing to your application will not compile.
If an issue can be ignored, this is the place to describe why you might
want to address the issue anyway.
• Show an example of the problem.
This may be a small piece of code or an option on a menu that has
changed. An example should be included only if it helps understand the
solution.
• Show an example of the solution.
Again, either code or a command option may be sufficient. If there are
alternative solutions, this is the place to mention the trade-offs and make a
recommendation.
Where appropriate, we have documented migration issues according to this
prescription.
1.4 How to use this guide
The primary technical content of this guide is a set of migration issues. Each
issue identifies a problem you may encounter, and a solution that you may
need in a real migration effort. This is a good start, but by itself, it is not
enough for a complete migration effort. You should also consider the
migration process itself.
1.3, “Migration issues” on page 6 outlines the process we used to create this
migration guide. This section describes how you can use our results to guide
your own migration process. Since no single process works for any two
projects, you must adapt this advice to suit your own situation. Large
migration efforts are likely to need a more formal process while small efforts
10
Migrating WebLogic Applications to WebSphere Advanced Edition
can do nicely with little or no formal process. In either case, the basic steps
are the same.
1.4.1 Analyze your application
First, you must understand the application you plan to migrate. This goes
beyond just understanding the application domain and what the application is
actually supposed to be doing. It also includes understanding technical
details about:
• The overall application software architecture
• Its use of major tools, server components, databases, and third-party
components
• Implementation languages, APIs, and other dependencies of the various
software components
• What pieces will need to be changed, reconfigured, and redeployed into
WebSphere Application Server, Advanced Edition
This guide is intended to help with the details of migrating the J2EE-compliant
pieces of your application -- that is, the last of the above bullets. If your
application follows the J2EE architecture, understanding the other three
bullets is straightforward. To the extent that your application depends heavily
on non-J2EE APIs or services, or on vendor-specific components, this should
be factored into your overall migration strategy. You may want to partition your
migration to first make your application more compliant with J2EE, and then
migrate from WebLogic to WebSphere.
In particular, you should determine just how compliant your application is with
the J2EE specification. It is possible to write an application in WebLogic that
uses none of the J2EE APIs. Other than possibly helping you discover this
fact, this guide will be of little immediate help in migrating an application that
is completely non-compliant with the J2EE specification. If you do not know if
your WebLogic application is J2EE compliant, take a quick look at Chapter 2,
“Features comparison and migration strategy” on page 17 for some clues and
general advice.
1.4.2 Incremental migration
After understanding your application from the perspective of a J2EE
migration, you are in a position to plan the migration itself. If you are dealing
with a large, potentially high-risk migration, you should consider breaking up
the migration into a sequence of smaller stages. This is even a good strategy
for many small migrations. Any migration can be risky because of the
potential for global effects from some of the changes. By proceeding in
Chapter 1. Introduction
11
relatively small steps, you have better control over quality, and can more
easily isolate unexpected problems. At the end of each stage you should have
a stable, operational application whose behavior can be compared with the
original application. Although each stage requires additional setup, and
regression testing, this extra cost is generally worth the added benefits of
better quality control and risk management.
It is possible to partition a J2EE application in many different ways to
accomplish an incremental migration. Indeed, this is one of the salient
features of a component’s application. For example, you can select several
Enterprise JavaBeans for migration now while leaving the others for a later
time. Or you can choose to migrate your Enterprise JavaBeans now and Java
Servlets later. 2.4, “Migration strategies” on page 26 outlines techniques to
partition your application into more manageable migration pieces. It is even
possible to migrate independent components in parallel.
Just how you choose to partition your application depends on many factors.
We mention a few.
• Homogeneous changes.
There is generally a benefit to making all of the same kinds of changes at
one time. Practice makes perfect, and sometimes leads to efficiencies
through automation. For example, consider migrating Java Servlets
independently of Enterprise JavaBeans.
• Application subcomponent.
Identify major application subcomponents as potential independently
migratable pieces.
• Database migration.
It is generally a good idea to do any necessary database migration
independently of J2EE enterprise server migration. This is because
database migrations are very likely to involve vendor-specific changes that
have nothing to do with J2EE server differences. A database migration
may be done either before or after the enterprise server migration.
• Some redesign needed.
Generally, the closer your code conforms to the J2EE standards, the
easier it will be to migrate. Minor redesign is sometimes needed to get
closer to the standard. For example, moving embedded vendor-specific
strings to environment variables is a small but non-trivial design change. It
is usually better to make these kinds of design changes before migrating
the enterprise server.
12
Migrating WebLogic Applications to WebSphere Advanced Edition
If more extensive application redesign is contemplated, you may prefer to
do a quick and dirty migration first and address more serious redesign
later. However, if the goal of the redesign is improved portability, it may pay
to do it first.
• Availability of source code.
Unfortunately, the current state of the art frequently requires source code
changes. Fortunately, this is becoming less of a problem over time. If your
application uses third-party components, you may not have control over
the source code. This can significantly impact a migration. Alternatives
include rewriting code, obtaining upgrades, or deferring a portion of the
migration.
• Costs and priorities.
Cost and priorities are always important. Maintaining licenses for multiple
enterprise servers can be expensive. Business and resource
considerations may dictate priorities. The good news is that a J2EE
component’s application can be migrated piecemeal in a variety of ways.
1.4.3 The basic process
Whether you have one or several migration stages, each stage of the
migration will proceed through a variation of the following steps:
• Assess the kinds of changes needed.
Much of this will have been done earlier, but you will revisit this topic in
detail when the migration actually begins.
• Install the tools you need.
The first time around, this will involve the installation of WebSphere
Application Server, Advanced Edition 3.5 and associated tools. Since
much of this will be new to you, make sure to allocate sufficient learning
time. Based on our experience, we provide some helpful hints in
Chapter 3, “Configuration” on page 33.
• Establish a migration environment.
Expanding a bit on the value of incremental migration, we recommend that
you perform each migration stage in a non-production migration
environment. This should be obvious, but deserves mentioning. This
includes building small migration databases and networks.
• Make required changes.
Follow the guidance provided in the remainder of this book. It should cover
most of the issues you will have to deal with. No doubt, you will also find a
few of your own.
Chapter 1. Introduction
13
• Verify migrated results.
• Convert to production environment.
1.4.4 Plan for the future
As a large application evolves, its original architecture tends to become
obscured and outdated. Applications become brittle and harder to modify. A
migration effort is an excellent opportunity to reassess your application’s
architecture. Indeed, many of the issues addressed during a migration, point
to the overall quality and flexibility of your architecture and design. An easy
migration is a sign of a flexible design. A tutorial on modern e-business
architectures and design guidelines is beyond the scope of the book.
However, you are encouraged to take this opportunity to consider the future of
your application in the light of industry standards and modern tools and
practices. What you learn may well change the course of your current
migration effort, making future upgrades proceed more smoothly. For
example, taking the time to restructure your application into independent
components can help with your current migration effort and the future
scalability of your application.
International Business Machines Corporation provides excellent source
materials to help architect and design e-business application. For basic
architectural advice, look at the IBM Application Framework for e-business at
http://www.ibm.com/software/ebusiness. This work closely parallels the J2EE
architectural work. For more in-depth advice on application design within the
IBM Application Framework for e-business, take a look at the Patterns for ebusiness site http://www.ibm.com/software/developer/web/patterns/.
1.4.4.1 Framework for e-business
The advent of e-business, with the requirement for interoperability that it
brings, has been a major catalyst for the more rapid adoption of standards by
the industry. The IBM Application Framework for e-business establishes:
• A recommended approach for building systems.
• Innovative technology delivered in a rich product portfolio.
• Cross-platform standards, including Java and XML.
The Framework, with the standards it proscribes for e-business systems and
their components, can be applied to:
• Custom application code
• Application packages
• Software products
14
Migrating WebLogic Applications to WebSphere Advanced Edition
1.4.4.2 Patterns for e-business
The Patterns for e-business are an integral part of the IBM Application
Framework for e-business. The Patterns make it easy to apply the
technologies, standards, and products of the Application Framework to
provide an e-business solution.The Patterns for e-business describe different
scenarios, such as Business-to-Business and User-to-Business, that result in
different infrastructure requirements. These considerations, for example,
affect the positioning of firewalls and the specific needs of Web application
servers.
The Patterns for e-business aim to communicate in a highly accessible
fashion the business pattern, systems architecture (application and runtime
topologies), product mappings, and guidelines required for different classes
of applications. For the User-to-Business Patterns there is also an associated
Pattern Development Kit, which provides sample application code to illustrate
effective use of those patterns.
The Patterns for e-business are published on IBM developerWorks, a portal
for developers, located at:
http://www.ibm.com/software/developer/web/patterns
You can also register at this site for pattern-related updates, which will include
the Pattern Development Kit for user-to-business when it is available.
1.5 Structure of this guide
This guide has a chapter for each of the major technical areas that affect your
migration effort. Each chapter contains specific migration advice and
examples for its corresponding APIs and tools.
• Chapter 2, “Features comparison and migration strategy” on page 17
This chapter contains details of the different tools and API specification
levels supported by the BEA WebLogic Server and WebSphere
Application Server, Advanced Edition servers. It sets the context for the
chapters that address specific APIs. It also provides details on how to
partition your application for incremental migration.
• Chapter 3, “Configuration” on page 33
This is where we document how we set up our migration environment for
BEA WebLogic Server and WebSphere Application Server, Advanced
Edition.
• Chapter 4, “Development tools” on page 59
Chapter 1. Introduction
15
BEA WebLogic Server and WebSphere Application Server, Advanced
Edition rely on different tools sets. This chapter explains what we learned
about these tools and how we used them in our migration examples.
• Chapter 5, “JavaServer Pages” on page 85
• Chapter 6, “Java Servlets” on page 109
• Chapter 7, “Enterprise JavaBeans” on page 127
• Chapter 8, “Database connectivity and persistence” on page 155
• Chapter 9, “Migration example: The Java Pet Store” on page 181
This chapter brings it all together with a complete mini-migration example
of the Java Pet Store. We follow our own migration process to migrate this
application to WebSphere. In the process we have to deal with many of the
common migration issues described elsewhere in this guide.
16
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 2. Features comparison and migration strategy
In this chapter we give a brief outline of the features of BEA WebLogic Server
and of WebSphere Application Server, Advanced Edition. We then discuss a
strategy for migrating applications from WebLogic to WebSphere.
2.1 Covered versions
This book deals with issues in migrating Java 2 Platform, Enterprise Edition
(J2EE) applications (possibly with extensions) from WebLogic Server 5.1
(Service Pack 6) to WebSphere 3.5 (Fix Pack 2), using Sun’s JDK 1.2.2
Specification level.
2.1.1 WebLogic Server
WebLogic Server started life as the Tengah Application Server. It was
acquired by BEA Systems, and renamed to WebLogic Server. As of Version
3.1, it has been adopting many aspects of the various specifications that
comprise Sun’s Java 2 Platform, Enterprise Edition, largely by converting
existing services provided by WebLogic Server to conform with the
appropriate J2EE specification. For example, the dynamic Web page
technology implemented in WebLogic Server 3.1, known as JHTML, evolved
to conform to the JavaServer Pages specification.
WebLogic Server 5.1 is a J2EE-based server, but not yet a fully J2EEcompliant server. It does not fully implement all of the J2EE specifications,
but it does provide support for most of them. In addition, it has a rich API of its
own, which provides additional functionality not covered by the J2EE
specifications.
WebLogic Server should not be confused with WebLogic Enterprise.
WebLogic Enterprise is a separate product, with a very different feature set.
A Java-based server, WebLogic Server is available on many platforms. In its
current version, it supports Java 1.1 through to Java 1.3 (not all features are
fully available in Java 1.1).
For further information about WebLogic Server, visit the BEA WebLogic
Server 5.1 Documentation Center, at http://www.weblogic.com/docs51/
resources.html.
© Copyright IBM Corp. 2001
17
2.1.2 WebSphere Application Server, Advanced Edition
WebSphere Application Server, Advanced Edition is one of the foundation
products in the IBM WebSphere software platform, which is shown in
Figure 3. WebSphere Application Server, Advanced Edition is an extension to
WebSphere Application Server, Standard Edition and adds support for
Enterprise JavaBeans, enhanced security management and distributed
processing. The Standard Edition provides support for JavaServer Pages,
Java Servlets, JDBC Connection Pooling, and more.
WebSphere Software Platform
B2C
B2E
Process
Automation
e-Markets
B2B
WebSphere
Commerce Suite
WebSphere
Homepage
Builder
VisualAge
for Java
Versata
Studio
Lotus
Domino
WebSphere
Studio
WebSphere
Transcoding
Publisher
WebSphere
Business
Components
WebSphere
WebSphere
Voice Server Personalization
VisualAge
Generator
WebSphere
Portal Server
WebSphere
B2B
Integrator
MQSeries
Workflow
WebSphere
Everyplace
Suite
Web Content
Management
WebSphere Site
Analyzer
WebSphere
Edge Server
MQSeries
Integrator
Tivoli
Policy
Director
WebSphere
Host
Integration
i2
Ariba
Siebel
Razorfish
Extricity
marchFIRST
E&Y
Macromedia
Mercury
Interactive
Versant
Rational
WebSphere Application Servers
MQSeries
Red Hat
Novell
Caldera
Figure 3. The WebSphere software platform
WebSphere was developed by IBM in order to implement the Java Servlets
1.0 Specification, and the original focus of WebSphere was on providing
servlet support. WebSphere has always been focused on the various Java
APIs and specifications.
18
Migrating WebLogic Applications to WebSphere Advanced Edition
WebSphere Application Server, Advanced Edition 3.5.2 is a J2EE-based
server. However, it is not yet a J2EE-compliant server, as it does not fully
implement the J2EE specifications. Support for most of various APIs is
available, either as part of WebSphere, or through integrations with other IBM
products (for example, MQSeries for Java Message Services). However, in
some cases, the support is not for the current version of the specification. As
an example, WebSphere only supports Enterprise JavaBeans V1.0, not the
current version of V1.1. Historically, IBM has not been as rapid an adopter of
the Java specifications as BEA, preferring to wait until the specifications have
stabilized before releasing their implementations. However, IBM is fully
committed to supporting the J2EE platform, and to making WebSphere the
leading J2EE server.
A mostly Java-based server, WebSphere Application Server, Advanced
Edition is available on several platforms. It supports Java 1.2.2.
For further information about WebSphere Application Server, Advanced
Edition, visit the WebSphere Application Server Web site at http://www4.ibm.com/software/webservers/appserv/.
2.2 Feature comparison
Below is a partial feature comparison of WebLogic Server 5.1 to WebSphere
Application Server, Advanced Edition 3.5. It is not intended to be a complete
comparison, but focuses on the technical differences, in terms of the J2EE
specification levels, between the two products, with a view to migrating from
WebLogic to WebSphere. The information used for this comparison was
obtained from the public documentation that both BEA Systems and IBM
provide for their respective products.
2.2.1 Core J2EE feature levels
In this section we compare the core Java 2 Platform, Enterprise Edition
feature levels supported by WebLogic and WebSphere.
Table 1. Comparison of J2EE specification levels
J2EE Feature
WebLogic
WebSphere
Enterprise JavaBeans (EJB)
1.1
1.0+
JavaServer Pages (JSP)
1.1
1.1
Servlet and Web applications
2.2
2.2
Chapter 2. Features comparison and migration strategy
19
2.2.1.1 Differences for Enterprise JavaBeans
The two major areas of difference for Enterprise JavaBeans revolve around
the specification level difference and the differences in deployment.
WebLogic Server fully supports the EJB 1.1 specification, with a beta
available for EJB 2.0. For the purposes of this document, we will ignore the
EJB 2.0 support, since it is not (at the time of writing) fully available. In
addition to the specification support, WebLogic has some good extensions for
Enterprise JavaBeans which are very valuable and widely used.
WebSphere Application Server, Advanced Edition supports what it denotes
as EJB 1.0+, indicating that it has full support for EJB 1.0, and has numerous
extensions.
A detailed synopsis of what changes were made between EJB 1.0 and EJB
1.1 is available in Appendix C: “Revision History” of the Enterprise JavaBeans
Specification, V1.1 which is available from http://java.sun.com/products/ejb/
docs.html.
While this focuses on efforts needed to upgrade existing EJBs, it also
provides information on what rules were relaxed or tightened, allowing them
to be used as a guide for devolving EJBs from the 1.1 Specification to the 1.0
Specification supported by WebSphere.
In addition to the API changes, there are different deployment requirements.
Although both WebLogic and WebSphere use XML-based deployment
descriptors, they do so in different ways. WebLogic uses the EJB 1.1 style of
having two descriptors, one for generic information, and one for the
WebLogic-specific and localized information. WebSphere uses the EJB 1.0
style of having a single deployment descriptor, with localized information.
Translating the deployment descriptors will form a large part of any migration
project to move Enterprise JavaBeans from WebLogic to WebSphere. In
addition to the task of moving from one format to another, there will be a need
to translate WebLogic specific data (such as CMP-related information) into
WebSphere.
For further information on the differences between WebLogic and
WebSphere, with regards to Enterprise JavaBeans, see Chapter 7,
“Enterprise JavaBeans” on page 127.
20
Migrating WebLogic Applications to WebSphere Advanced Edition
2.2.1.2 Differences for JavaServer Pages
Both WebLogic Server 5.1 and WebSphere Application Server, Advanced
Edition 3.5.2, provide a complete implementation of the JavaServer Pages
1.1 Specification.
Migrating JSPs from WebLogic to WebSphere is therefore a fairly painless
task, consisting largely of configuring WebSphere to match the WebLogic
settings.
For further information on the differences between WebLogic and
WebSphere, with regards to Java Server Pages, see Chapter 5, “JavaServer
Pages” on page 85.
2.2.1.3 Differences for servlets
Both WebLogic Server 5.1 and WebSphere Application Server, Advanced
Edition 3.5.2 provide an implementation of the Java Servlets 2.2
Specification. Migrating Java Servlets from WebLogic to WebSphere is a
fairly painless task, largely consisting of transferring the configuration used in
WebLogic to WebSphere.
However, WebSphere Application Server, Advanced Edition does not provide
support for the J2EE Web application component of the Java Servlets 2.2
Specification. This is an optional part of the specification, and causes some
difficulties. It is possible to import Web application archives, but there are
some programmatic differences, especially in regards to the security API, and
J2EE references.
For further information on the differences between WebLogic and
WebSphere, with regards to servlets and Web Applications, see Chapter 6,
“Java Servlets” on page 109.
2.2.2 Other J2EE feature levels
This section compares other Java 2 Platform, Enterprise Edition feature
levels supported by WebLogic and WebSphere.
Table 2. Other J2EE features
J2EE Feature
WebLogic Spec Level
WebSphere Spec Level
JDBC
2.0
2.0
JMS
1.0.1
JMS interface to MQ
Series
Full J2EE Specification
Partial
Partial
Chapter 2. Features comparison and migration strategy
21
2.2.2.1 JDBC
Both WebLogic Server and WebSphere Application Server, Advanced Edition
provide support for JDBC 2.0. WebLogic ships with JDBC drivers for several
databases, whereas WebSphere requires you to obtain the JDBC drivers
appropriate for your database from the database vendor. As a rule, this
requirement is not a problem, since most major database vendors provide
JDBC drivers for their product (Microsoft, with SQL Server, is the major
exception).
For further information on the differences between WebLogic and
WebSphere, with regards to JDBC and other persistence technologies, see
Chapter 8, “Database connectivity and persistence” on page 155.
2.2.2.2 Java Message Service (JMS)
WebLogic Server provides, as part of the base product, an implementation of
the Java Message Service 1.0.1 API. However, it is not clear that the JMS
implementation is a robust and scalable solution.
WebSphere Application Server, Advanced Edition, by contrast, does not
provide an implementation of JMS. However, if you have the IBM MQSeries
messaging software (which sets the industry standard for messaging
software), IBM provides a free plug-in that integrates MQSeries with
WebSphere, providing full and robust JMS support to WebSphere-based
applications.
2.2.2.3 Java 2 Platform, Enterprise Edition (J2EE) specification
Neither WebLogic nor WebSphere fully support the J2EE 1.2 Specification.
The main common area of non-compliance is the inability to deploy enterprise
archives, also known as EAR files. This also has implications for deployment.
In WebLogic, to deploy multiple applications that are not required to share
resources (such as class files and configuration data) with each other (which
is the goal of the enterprise archive), it is necessary to configure multiple
servers. Each server would represent one enterprise application.
In WebSphere, it is possible to create enterprise applications that are
analogous to, but not identical to, the enterprise archives. Enterprise
applications in WebSphere are an administrative tool. They allow groups of
EJBs and Web resources to be administered collectively, but do not enforce
the separation and demarcation represented in the J2EE 1.2 Specification.
The other main difference between WebLogic and WebSphere has to do with
the JNDI name space and with resources.
22
Migrating WebLogic Applications to WebSphere Advanced Edition
As per the J2EE 1.2 Specification (and parts of the EJB 1.1 and Java Servlets
2.2 Specifications), in WebLogic, EJBs (and servlets and JSPs deployed as
part of a Web application) can have resource references defined in their
respective deployment descriptors. This allows the EJB developer to specify
a local JNDI name for a resource (such as a JDBC DataSource or an EJB
Home reference) confidently, while also allowing the deployer to assign JNDI
names that suit its own particular requirements. The mapping from the
developer-assigned local name to the deployer-assigned global name is
handled in the deployment descriptor.
Retrieving such a resource is a simple routine:
javax.naming.Context ctx = new javax.naming.InitialContext();
Object homeObject = ctx.lookup(“java:comp/env/ejb/MyEjbHome”);
MyEjbHome ejbHome =
(MyEjbHome)javax.rmi.PortableRemoteObject.narrow(homeObject,
MyEjbHome.class);
The java:comp/env name space is set up by the WebLogic container, and is
read-only.
By contrast, WebSphere does not support this feature, even for the Web
application part of the Java Servlets 2.2 Specification. One possible
workaround is to have a JNDI prefix string that is maintained as an
environment variable, or in a configuration file.
javax.naming.Context ctx = new javax.naming.InitialContext();
Object homeObject = ctx.lookup(theJNDIPrefixString + “ejb/MyEjbHome”);
MyEjbHome ejbHome =
(MyEjbHome)javax.rmi.PortableRemoteObject.narrow(homeObject,
MyEjbHome.class);
This would allow the same code to work correctly under WebLogic and
WebSphere, with the difference in the implementation being stored as metadata. (Retrieving the meta-data is not shown.) SInce a different JDBC prefix
could be provided at any desired level of granularity, an overall effect
equivalent to the java:comp/env name space is achieved.
2.2.3 Relevant WebLogic extensions
Extensive use of non-standard API sets, such as the WebLogic extensions, is
something guaranteed to make for problems during migration. It is beyond the
scope of this document to provide explicit and detailed information on how to
Chapter 2. Features comparison and migration strategy
23
solve these problems, but we will give some general background information
to help you out.
Table 3. Mapping of WebLogic extensions to WebSphere extensions
WebLogic Feature
WebSphere Feature
COM Support
None - available from third party
Jolt for WebLogic
CICS Support
WebLogic Events
None
TOPLink For WebLogic
TOPLink For WebSphere
2.2.3.1 How do I migrate COM support?
The short answer is that you don’t. WebLogic Server has very good support
for COM, and, depending on the nature of your application, it is possible that
you have made extensive use of this. WebSphere Application Server,
Advanced Edition, however, provides no direct support for COM.
There are some high-quality COM-to-Java and Java-to-COM bridges out
there. Two examples are JIntegra, by Linar Ltd, and the J2EE CAS COM
Bridge, available from Sun Microsystems. If you have a need for Java/COM
inter operability, we suggest that you investigate one of these. Having decided
on the technology to use, you should then migrate to that technology while
still running under WebLogic, before proceeding to migrate to WebSphere.
2.2.3.2 How do I migrate Jolt support?
Jolt for WebLogic is a Java-based interface to BEA Tuxedo, a transaction
processing system. Migrating from Jolt for WebLogic to another transaction
processing system is not a trivial task. It may not even be required.
If you are retaining a Tuxedo-based transaction processor, you will have to
obtain a license for BEA Jolt, to allow you to retain the Java-based interface
to Tuxedo. It is relatively simple to migrate from Jolt for WebLogic to Jolt,
since it is essentially the same product. BEA Jolt is a pure Java-based
product, and should work well within WebSphere.
If you are not retaining BEA Tuxedo, you would be well-advised to replace
your Jolt-dependent code with the appropriate API for your new transaction
processor in parallel with the migration from WebLogic to WebSphere. This
would allow you to avoid the unnecessary expense of purchasing a BEA Jolt
license for a temporary solution.
24
Migrating WebLogic Applications to WebSphere Advanced Edition
WebSphere Application Server, Advanced Edition provides similar integration
to CICS, the IBM transaction processor that WebLogic Server offers with Jolt
to connect to TUXEDO.
The biggest problem with such a migration will, most likely, be migrating off
Tuxedo to your new transaction processor. This will be a full-scale migration
project in its own right, quite possibly much larger than the migration from
WebLogic to WebSphere.
2.2.3.3 How do I migrate WebLogic Events?
WebLogic Events is a hangover from the days when WebLogic Server did not
support the J2EE specifications. It is being phased out in favor of Java
Messaging Service (JMS). If your J2EE application makes use of WebLogic
Events, we suggest that you bite the bullet and upgrade to Java Messaging
Service.
WebSphere Application Server, Advanced Edition does not support Java
Messaging Service directly. However, it integrates very well with IBM
MQSeries, to provide a full and flexible JMS implementation.
2.2.3.4 How do I migrate TOPLink for WebLogic?
TOPLink for WebLogic is a tool to aid in mapping complex EJB data
structures to relational databases, while allowing the ease-of-development
permitted by Container-Managed Persistence techniques. It is a very popular
third-party product used with WebLogic Server. It is currently sold by
WebGain Inc.
In October, 2000, WebGain announced that they intended to release TOPLink
for WebSphere. The target release time was fourth quarter, 2000. At the time
of writing, we were not able to evaluate this product for ourselves, so we can
not comment on how easy or difficult it would be to migrate from TOPLink for
WebLogic to TOPLink for WebSphere.
For further information on TOPLink for WebSphere, consult WebGain’s Web
site at http://www.webgain.com/. This is also covered in more detail in 8.5.3,
“TOPLink” on page 178
2.2.3.5 How do I migrate this third-party API?
In general, migrating a third-party API from WebLogic to WebSphere should
be a simple procedure. All that should need to be done is modification of the
classpath used for WebSphere. For information on how to do this, please
consult the WebSphere administration documentation.
Chapter 2. Features comparison and migration strategy
25
2.3 Reasons for migrating
This book is intended as an aid in a migration process, from WebLogic Server
to WebSphere Application Server, Advanced Edition. It is technically oriented
around this task, and is not intended to be a marketing document. We
assume that you have already made the decision to migrate your J2EE-based
application from WebLogic to WebSphere. That said, it is worthwhile to
review briefly common reasons for migrating, and then to discuss the
migration strategy. Some of the more common reasons for migrating are:
• Cost of server licenses.
• Consolidation of existing servers into one.
• Scalability.
• The added value of the WebSphere family of products.
• Political.
• Ease of development, and integration with development tools.
This is far from a comprehensive list, and in many cases more than one
reason would apply. The key issue is to determine the reason why you are
migrating, as this has an impact on the strategy you should follow during the
migration process.
2.4 Migration strategies
This section discusses a number of possible migration strategies that you
should consider.
2.4.1 Big picture migration strategies
Migration of a J2EE-based application would rarely take place in a vacuum.
There would be likely to be other, perhaps even many, migration projects
occurring, either in sequence or in parallel to the WebLogic to WebSphere
migration. Some examples would be:
• Moving from one database to another (for example, from Oracle 8i to
DB2).
• Changing the operating system or hardware platform (for example, from
Microsoft Windows NT 4 on an Intel-based processor to Sun Solaris on a
Sun Enterprise Server).
• Re-designing the application to remove bottlenecks or add new features.
• Moving from a fat client system to a Web-based thin client system.
26
Migrating WebLogic Applications to WebSphere Advanced Edition
The most important piece of advice that we can give you for this sort of bigpicture migration is to take it one step at a time. Migration projects are large
and complex, and it is important to reduce that complexity down to a
manageable level. It is true that taking a piecemeal approach will generate
more work (or seem to, at least). After all, if you migrate your database over,
you’ll have to update the clients to that database, so why not migrate those
clients (including the J2EE application) at the same time? The answer to this
is that if you increase the complexity, you increase the chance of failure.
The advantages of taking a slower piecemeal approach are manyfold. The
bigger advantages are:
• Reduced complexity. With each step being more focused, the tasks are
simpler and more manageable. This dramatically increases the chances of
success.
• Earlier payback. If there is a serious bottleneck in your current system that
you are trying to overcome, a piecemeal approach may assist you here,
for immediate benefits. For example, if the application you are using has
database-related performance problems, the database can be migrated
first, giving an immediate performance improvement while the rest of the
application system is migrated.
Identifying exactly where in the big-picture migration the WebLogic-toWebSphere migration fits in is crucial to the success of the migration project.
2.4.2 Migrating J2EE-based applications
Just as a big-picture migration is more likely to succeed if broken down into
smaller steps, this is also true for a J2EE application. Although there are as
many ways to break down a J2EE-based application as there are to build
them, we will be focusing on the classic J2EE-based architecture, consisting
of a Web tier comprised of servlets and JavaServer Pages, communicating to
an application tier comprised of Enterprise JavaBeans.
Chapter 2. Features comparison and migration strategy
27
1
Web Browser
Servlet
EJB
Database
.
EJB
JSP
2
3
Client Tier
J2EE Layer
Back End
Figure 4. Decomposing a J2EE-based application
The servlets and JSP pages can be migrated separately to the EJBs. The
EJBs themselves can be migrated one step at a time, as well.
J2EE application clients (as defined in the J2EE 1.2 Specification, Chapter 9)
are ignored in this scenario, since neither WebLogic nor WebSphere
implement support for application clients at this time.
The strategy we chose in migrating our sample application was to migrate
each of the Enterprise JavaBeans one at a time, starting with the foundation
entity beans and working upwards. Having migrated the EJBs over, the Web
tier was migrated over as a block, using WebSphere’s ability to convert WAR
files.
2.4.2.1 Resolving JNDI names
One problem with writing generic applications is locating resources in the
JNDI name space. The developer needs to know the location of the desired
resource, but, at the same time, the administrators of the system want the
flexibility to name objects according to local policies, and to resolve naming
conflicts.
In the Enterprise JavaBeans 1.1 Specification, and the Web application
portion of the Java Servlets 2.2 Specification, support is provided for
resolving JNDI names indirectly, via mappings specified in the deployment
descriptor. As an example, the deployment descriptor for an EJB could look
like this:
<session>
<description>My EJB</description>
28
Migrating WebLogic Applications to WebSphere Advanced Edition
<display-name>MyEJB</display-name>
<ejb-name>MyEJB</ejb-name>
<home>itso.examples.MyEJBHome</home>
<remote>itso.examples.MyEJB</remote>
<ejb-class>itso.examples.MyEJBImpl</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<ejb-ref>
<ejb-ref-name>ejb/MyOtherEJB</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>itso.examples.MyOtherEJBHome</home>
<remote>itso.examples.MyOtherEJB</remote>
</ejb-ref>
</session>
In order for the itso.examples.MyEJBImpl class to locate MyOtherEJB, it
would perform a JNDI lookup similar to this:
javax.naming.Context ctx = new javax.naming.InitialContext();
itso.exaples.MyOtherEJBHome otherEJBHome =
(itso.examples.MyOtherEJBHome)javax.rmi.PortableRemoteObject.narrow(ctx.lo
okup(“java:comp/env/ejb/MyOtherEJB”), itso.examples.MyOtherEJBHome.class);
The mapping from the indirect reference of java:comp/env/ejb/MyOtherEJB
would be defined by an ejb-link element, or by another deployment descriptor
that is specific to the EJB container being used.
In addition to EJB references, other items, such as DataSources and
environment variables, can be bound indirectly in this fashion.
However, for EJB 1.0 implementations, and servlets that are not deployed as
part of a J2EE Web application, this feature does not exist. Instead, the
absolute location must be used to retrieve values from the JNDI name space.
One solution is to implement a helper class to perform the JNDI lookups. This
would provide a possibility to map the java:comp/env JNDI names to absolute
locations, possibly in a different server. For example, the following method
performs a mapping so that all the EJB references are retrieved from a
running WebLogic server, while other references are retrieved from a running
WebSphere server.
public java.lang.Object lookup(java.lang.String name) throws
NamingException {
String newName = name;
Context ctx;
if (name.startsWith(“java:/comp/env”)) {
Chapter 2. Features comparison and migration strategy
29
newName = name.substring(“java:/comp/env”.length());
}
if (name.startsWith(“java:/comp/env/ejb”)) {
ctx = getWebLogicContext();
}
else {
ctx = getWebSphereContext();
}
return ctx.lookup(newName);
}
Retrieving the WebSphere and WebLogic JNDI naming contexts is not
shown, but is covered in their respective developer documentation.
2.4.2.2 Separate test system
Do not try to migrate a J2EE-application, or any other application, that is fully
in production. The development needs during migration conflict with the
needs of a production system (mainly stability and reliability). We strongly
recommend that you establish a separate copy of the application, running on
its own servers and with its own database, and migrate that. As the migration
process moves forward, you can then copy the migrated parts of the test
system back to the production system as the situation warrants.
2.4.2.3 Use automated tests for verification
In any migration project, it is vitally important that the system being migrated
does not have any strange bugs introduced into it. We strongly recommended
that, as part of the migration project, that you construct automated tests and
run them regularly during the migration. These tests should confirm that the
output of the application is still the same on the new platform, and verify that
the behavior of the application has not altered.
The ideal goal of a such a test suite is to be able to test each and every
component of your system independently, and to test the integration between
the components.
2.5 More information
For more information about WebLogic, see http://www.bea.com/products/
weblogic/server/.
For more information about WebSphere, see http://www.ibm.com/software/
webservers/appserv/
30
Migrating WebLogic Applications to WebSphere Advanced Edition
For more information about Java 2 Platform, Enterprise Edition, see http://
java.sun.com/j2ee/.
There is a good informative comparison of WebLogic and WebSphere, along
with other J2EE-based application servers, at http://www.theserverside.com.
Chapter 2. Features comparison and migration strategy
31
32
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 3. Configuration
In this chapter we describe the installation and configuration of the products
used to test the migration examples discussed in this redbook. We do not
provide detailed documentation of how to do the base installation of all the
products, but give you overview information about additional steps to the
standard product installation. Our aim is to describe the development and test
environments we used for migration, so that you will be able to reproduce our
examples and to use this configuration as a basis for your own migration
efforts.
When writing this redbook we set up a development environment and a
migration testing environment. For migration testing we set up two lab
machines, one with WebLogic Server and the other with WebSphere
Application Server, Advanced Edition. On our development workstations we
installed both WebLogic and WebSphere.
3.1 Platform
This section summarizes the configuration of our development and test
environments.
3.1.1 Development machine
We used the following environment:
• PCs with Pentium III 700 MHz processors, 512 MB RAM and 20 GB HDD
(2 GB C: partition and 18 GB D: partition)
• Microsoft Windows NT 4.0 with SP6
• Netscape Communicator 4.7 and Microsoft Internet Explorer 5.0
We installed the following products:
• Sun JDK 1.2.2
• IBM Universal Database Enterprise Edition 7.1 FP1
• BEA WebLogic Server 5.1 SP6
• IBM WebSphere Application Server 3.5, Advanced Edition PTF2
• IBM WebSphere Studio 3.5 FP1
• IBM VisualAge for Java, Enterprise Edition 3.5
• Tomcat 3.1
© Copyright IBM Corp. 2001
33
3.1.2 WebLogic Server test configuration
We used the following environment:
• PC with Pentium III 700 MHz processor, 512 MB RAM and 20 GB HDD (2
GB C: partition and 18 GB D: partition)
• Microsoft Windows NT 4.0 with SP6
• Netscape Communicator 4.7 and Microsoft Internet Explorer 5.0
We installed the following products:
• Sun JDK 1.2.2
• IBM Universal Database Enterprise Edition 7.1 FP1
• BEA WebLogic Server 5.1 SP6
3.1.3 WebSphere test configuration
We used the following environment:
• PC with Pentium III 700 MHz processor, 512 MB RAM and 20 GB HDD (2
GB C: partition and 18 GB D: partition)
• Microsoft Windows NT 4.0 with SP6
• Netscape Communicator 4.7 and Microsoft Internet Explorer 5.0
We installed the following products:
• IBM Universal Database Enterprise Edition 7.1 FP1
• IBM WebSphere Application Server 3.5, Advanced Edition PTF2
3.2 Setting up the development machine
This section describes the installation and basic configuration of the desktop
development machines.
3.2.1 Install JDK 1.2.2
We installed Sun JDK 1.2.2 for use with WebLogic Server. Sun JDK 1.2.2 is
available at http://java.sun.com/products/jdk/1.2. We installed it manually
using D:\JDK1.2.2 as the directory name.
For use with WebSphere Application Server, Advanced Edition we used the
IBM JDK that comes with the WebSphere 3.5 install. It was automatically
installed with the WebSphere full installation option. So you have nothing to
34
Migrating WebLogic Applications to WebSphere Advanced Edition
do here. The exact level was (you can test with “java -version” at a command
prompt)
Classic VM (J2RE 1.2.2 IBM build cn122-20000725a (JIT enabled: jitc))
Make sure that you use the same JDK.
3.2.2 Install and configure IBM Universal Database 7.1
1. Make sure that you have sufficient rights for the installation. As described
in the installation documentation, you need a local administrator’s account
with the following advanced user rights:
- Act as part of the operating system
- Create token object
- Increase quotas
- Replace a process level token
2. We installed UDB 7.1 with the typical installation options as shown in
Figure 5.
Figure 5. UDB installation option
Chapter 3. Configuration
35
Without rebooting we added the latest fixpack (FP1). After rebooting, the
window shown in Figure 6 should appear:
Figure 6. DB2 welcome window
3. Now you should create the sample database. Just click Create Sample
Database.
4. Open the DB2 Command Center and execute the script shown in Figure 7.
36
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 7. Script for testing DB2 installation
If the list of projects appears, then the installation was successful.
5. We then created a new database with the DB2 Control Center. You can
start the DB2 Control Center with Start->Programs->IBM DB2->Control
Center. Select Database->Create->Database Using Wizard as shown
in Figure 8. In the resulting window type the database name ITSO and and
click Finish. The database ITSO is created.
Chapter 3. Configuration
37
Figure 8. Create a new database
For more information about IBM Universal Database, look at the product
documentation and visit the IBM Universal Database Web site: http://
www.ibm.com/software/data/db2/udb/
3.2.3 Install BEA WebLogic Server 5.1
1. Basic installation
The basic installation is quite easy. You have only to choose an installation
directory and nearly at the end of the installation you have to enter a
system password. We installed WebLogic Server in the directory
d:\weblogic . To get Service Pack 6 installed you have to do some things
manually. This is described in the first readme file that comes with SP6. If
WebLogic Server is not starting afterwards correctly, look if you changed
both the JAVA_CLASSPATH and WEBLOGIC_CLASSPATH to the new
JAR files that come with SP6.
For the configuration of WebLogic Server you have to edit the
weblogic.properties file. It is located in the weblogic root directory. If you
38
Migrating WebLogic Applications to WebSphere Advanced Edition
need more information about the weblogic.properties file you should have
a look at http://www.weblogic.com/docs51/admindocs/properties.html. More
Information about WebLogic Server 5.1 is available at http://
www.weblogic.com/docs51/resources.html.
2. Database configuration
To setup the database connection to DB2 you have to edit the WebLogic
properties for setting the connection pool
weblogic.jdbc.connectionPool.ITSOPool=\
url=jdbc:db2:ITSO,\
driver=COM.ibm.db2.jdbc.app.DB2Driver,\
initialCapacity=1,\
maxCapacity=2,\
capacityIncrement=1,\
props=user=administrator;password=password;server=localhost
and the DataSource:
weblogic.jdbc.DataSource.jdbc.ITSODB=ITSOPool
To add an ACL for the connection pool:
weblogic.allow.reserve.weblogic.jdbc.connectionPool.ITSOPool=everyon
e
To enable WebLogic Server finding all the necessary classes and
resources for accessing DB2 you have to append the following directories
to the JAVA_CLASSPATH and the WEBLOGIC_CLASSPATH in
startWebLogic.cmd (we installed the DB2 Sqllib in d:\program files\sqllib):
d:\program files\sqllib\Java\db2java.zip;d:\program
files\sqllib\Java\sqlj.zip;d:\program files\sqllib\java\runtime.zip
3. JSP servlet configuration
To enable WebLogic to serve JSPs configure a JSP servlet in the
weblogic.properties file. Change the compileCommand to that directory
where you installed the JDK (we assume D:\jdk1.2.2) and set the
workingDir, it’s the directory where the compiled classes are put into.
weblogic.httpd.register.*.jsp=\
weblogic.servlet.JSPServlet
weblogic.httpd.initArgs.*.jsp=\
pageCheckSeconds=1,\
compileCommand=D:/jdk1.2.2/bin/javac.exe,\
workingDir=d:/weblogic/myserver/classfiles,\
verbose=true,\
keepgenerated=true
4. Start WebLogic Server.
Chapter 3. Configuration
39
That is all you have to do to get our default WebLogic Server configuredn.
You can now start WebLogic Server with the command
d:\weblogic\startWebLogic.cmd. After a few seconds you should see a
window similar to the one shown in Figure 9.
Figure 9. Starting WebLogic Server
The last line is important.
Fri Nov 10 16:03:24 EST 2000:<I> <WebLogicServer> WebLogic Server
started
5. Test WebLogic Server.
Now you can open a browser and try the URL http://localhost:7001/
index.html.
WebLogic Server uses 7001 as default HTTP port. Every HTTP request
that uses port 7001 is directed to WebLogic Server. The browser should
now show the WebLogic Server documentation and consult it for further
information about WebLogic Server.
3.2.4 Install WebSphere
In order to get an easy installation of WebSphere make sure, that DB2 is
installed properly. For the installation follow these steps:
1. Base installation:
a. Start installation.
40
Migrating WebLogic Applications to WebSphere Advanced Edition
b. Choose Full Installation as shown in Figure 10. This includes the IBM
HTTP Server, JDK1.2.2 and DB2-Configuration. Choosing Quick
Installation would install InstantDB and that will not work properly with
the samples we provide.
Figure 10. WebSphere installation options
c. In the Database Options Dialog, as shown in Figure 11, insert the
correct DB2 user ID and password; otherwise WebSphere will not start.
If you want to alter this information later you can edit
<websphere>\appserver\bin\admin.config and change the dbUser and
dbPassword fields.
Chapter 3. Configuration
41
Figure 11. Setting up WebSphere data options
Before rebooting the system as prompted, you can save time when you
install PTF2 at this time.
2. Install PTF2.
Note that the prompted WebSphere installation path is
<websphere>\appserver and the WebServer's doc root is <IBM HTTP
Server>\htdocs. Confirm all suggested upgrades.
3. Reboot the machine.
The DB install script <websphere>\appserver\bin\createdb2.bat creates
automatically the WAS Database in DB2 after rebooting. If this fails you
can run the script manual. The wasdb2.log file shows the results.
Now the installation of WebSphere is complete.
4. Test the installation.
To test the installation start the Admin Server by clicking Programs -> IBM
WebSphere -> Application Server V3.5 -> Start Admin Server or by
clicking Control Panel -> Services. Set the Service Startup Type to
Automatic if you don’t like to start it manually after rebooting. Now it is
possible to start the WebSphere Administrative Console by clicking
Programs -> IBM WebSphere -> Application Server V3.5 -> Start
Administrators Console. This is shown in Figure 12.
42
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 12. WebSphere Administrative Console
By expanding the Administrative Domain, you will find your machine name.
This node includes the Default Server, as shown in Figure 13. If it is not
started, you can start it through the context menu or the Start icon.
Chapter 3. Configuration
43
Figure 13. Starting default host
Now you can start a browser and try one of the example applications:
http://localhost/WebSphereSamples/BeanScripting/BeanScripting_java.jsp
If your installation was successful there should be the output shown in
Figure 14.
44
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 14. Output of the Beanscripting JSP
3.2.5 WebSphere configuration
1. Create an application server
We created the new application server ITSO Server with the following
steps:
a. From the administrative console select View->Topology.
b. Expand the WebSphere Administrative Domain.
c. Select your Node (your computer’s name).
d. Select Create->Application Server from the context menu.
e. Type ITSO Server as the Application Server Name and d:\itso as the
working directory. See Figure 15 for an example.
Chapter 3. Configuration
45
Figure 15. Create Application Server
2. Create an EJB container
Next we added an EJB container to our new application server. Figure 16
shows the Create EJBContainer window.
a. Select the ITSO Server.
b. Click Create->EJBContainer from the context menu.
c. As EJBContainer Name, type ITSO Container and click OK to create the
new EJB Container.
46
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 16. Create EJB container
3. Create a servlet engine
Next we created a servlet engine with values as shown in Figure 17.
a. Select the ITSO Server.
b. Click Create->Servlet Engine from the context menu.
c. Type ITSO Servlet Engine as Servlet Engine Name.
d. Select Servlet 2.2/JSP 1.1 Full Compliance Mode.
e. Click OK to create the new servlet engine.
Chapter 3. Configuration
47
Figure 17. Creating a servlet engine
4. Create a Web application
In WebSphere terms, a Web application consists of JSPs and servlets.
These components can be managed as a group. You can disable and
enable them together, and assign security permission to the whole Web
application or only parts of it. On the file level Web applications are
separated from each other by setting a specific document root and
classpath for every Web application. To create a Web application:
a. Select Console->Tasks->Create a Web Application. See Figure 18
for an example.
b. Type ITSO Web Application as the Web Application Name.
c. Check Serve Servlets by Classname.
d. Select Enable JSP 1.1.
48
Migrating WebLogic Applications to WebSphere Advanced Edition
e. Click Next.
Figure 18. Create Web application
f. Select ITSO Servlet Engine as the parent servlet engine as shown in
Figure 19.
Chapter 3. Configuration
49
Figure 19. Choosing the servlet engine
g. Click Next.
h. Enter /itso as Web Application Web Path.
i. Click Finish to create the Web application. See Figure 20 for an
example.
50
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 20. Setting Web application Web path
j. At this time you have to create subdirectories under the directory
D:\WebSphere\AppServer\hosts\default_host\. Create a subdirectory
\ITSO Web Application and in this subdirectory the two subdirectories
\servlets and \web.
3.2.6 Database configuration
1. Introducing a new JDBC driver in the WebSphere runtime
There are many different ways to configure new JDBC drivers and
DataSources in WebSphere. You can use the the Java-based WebSphere
Administrative Console, the browser-based XML Web Administration tool,
or the XMLConfig utility. Instructions and information about how each of
these tools can be used to fulfill these tasks can be found in the
WebSphere InfoCenter. For the sake of demonstration we describe how
we introduced the Cloudscape driver in the WebSphere runtime
environment via the Java-based administrative console.
a. Select the Type View and click the resource description JDBC Drivers.
b. Click Create from the pop-up menu.
c. Complete the Create a JDBC Driver window, as shown in Figure 21.
Chapter 3. Configuration
51
Figure 21. Create a JDBC driver
d. Enter any name in the Name entry field. We suggest that you use a
name that indicates the database product you are using. For example,
we used Cloudscape JDBC Driver.
e. In the combobox Class Name enter or select the full package name of
the Java class that implements the driver. Here we entered
COM.cloudscape.core.JDBCDriver.
f. In the URL prefix field, do not enter the whole URL to the required
database as done in the WebSphere Test Environment. The URL prefix
consists only of the protocol and the subprotocol, separated by a colon
(“:”), such as jdbc:db2 or in our case jdbc:cloudscape. You have to use
the subprotocol name that has been defined by the vendor of your
JDBC driver (refer to the vendor documentation). To get the full URL,
WebSphere automatically appends the database name of the
DataSource, which will be configured in the next steps.
g. The JTA Enabled combobox corresponds to the database type in the
WebSphere Test Environment setup. If you want to perform distributed
transactions (two-phase commit) via the driver, select True. Specify
52
Migrating WebLogic Applications to WebSphere Advanced Edition
False if you don’t want to use the Java transaction services or the
driver does not support them.
h. After you have completed the fields, click OK.
i. Now change to the Topology view and select the just created JDBC
driver. Click the right mouse button and select Install.
j. In the Install Driver panel select your server node, enter the JAR file
containing your JDBC driver (or find it via Browse). When entered click
Install. This will install the driver and add the location to the classpath.
You do not have to set it on your own.
2. Creating a DataSource
a. Next we have to configure the DataSource. Change back to the Type
view and select the DataSources resource from the tree.
b. Click the right mouse button and select Create from the pop-up menu.
c. Complete the Create a DataSource panel:
1. The DataSource name is the logical name for the DataSource
(“jdbc/” will be prepended automatically).
2. The database name is the name of the database or the DataSource.
This name will be appended to the URL prefix configured with the
JDBC driver. Be aware that the DataSource name and sometimes
also the database name (on AIX,and Solaris) are case-sensitive. In
both fields we used the name petStoreDB for our cloudscape test
application.
3. From the driver combobox select the JDBC driver you want to use.
We selected the Cloudscape JDBC driver we have just configured
before.
d. On completion click OK to create the DataSource.
Now you should be able to use the new JDBC driver in the runtime
WebSphere Application Server. In our case, the console messages
displayed the following warnings:
10/31/00 5:40 PM : WARNING [m23caatk/Default Server]: CONM0002W:
Unrecognized database or driver "COM.cloudscape.core.JDBCDriver"; using
generic settings
10/31/00 5:40 PM : WARNING [m23caatk/Default Server]: CONM0002W:
Unrecognized database or driver "DBMS:cloudscape"; using generic
settings
Despite these warnings we were able to successfully use the Cloudscape
DataSource, but it is possible that other drivers will not be able to run the
way you would like, with just the generic settings. Sometimes a driver
Chapter 3. Configuration
53
vendor allows users to supply the properties in the database connection
URL; other rare drivers require the attributes to be set only in the
Properties object passed to the DriverManager.getConnection(url, prop)
method. For instance the Weblogic JDBC/RMI driver, which is a Type 3
driver, needs such driver-specific properties on connection creation.
3. Configuring a JTA-enabled driver
Next we installed the JTA enabled driver for IBM Universal Database
Enterprise Edition 7.1. In order for this to work, UDB must first be
configured to use JDBC 2.0. The steps to do this are:
a. Stop the IBM WebSphere Application Server administrative service
b. Stop any other processes that use db2java.zip
c. Stop all DB2 services
d. Run the batch file <db2home>/sqllib/java12/usejdbc2.bat
e. Start the DB2 services again
f. Configure DB2 to use the JTS as the TP monitor:
• Start the Control Center.
• Select the DB2 Instance that contains the database being enabled
for JTA.
• Right-click and choose Multisite Update -> Configure from the
context menu item.
• In the Configure Multisite Update Wizard activate the Use the TP
monitor named below radio button and select JTS as the TP
monitor from the combobox.
• Click the Finish button.
• Bind the necessary packages to the database.
• Start the DB2 Command Line Processor window.
• Enter the following commands, replacing <db2home> with the home
directory, where you installed DB2 (for example, D:\Program Files)
and replacing mydb2jta with the database name that you wish to
enable for JTA:
db2
db2
db2
db2
=>
=>
=>
=>
connect to mydb2jta
bind <db2home>\bnd\@db2cli.lst
bind <db2home>\bnd\@db2ubind.lst
disconnect mydb2jta
g. To configure the JDBC driver in WebSphere, follow step 1. on page 51
and specify the following settings:
54
Migrating WebLogic Applications to WebSphere Advanced Edition
• Class name = COM.ibm.db2.jdbc.app.DB2Driver
• URL prefix = jdbc:db2
• JTA enabled = True
3.2.7 Configuring IBM HTTP Server
The installation of IBM HTTP Server is part of the WebSphere full installation.
No special configuration was required for our migration environment.
For more information about IBM HTTP Server, look at the documentation and
visit the IBM HTTP Server site:
http://www.ibm.com/software/webservers/httpservers/
3.2.8 IBM WebSphere Studio 3.5
We installed WebSphere Studio 3.5 with fix pack 1. We used the installation
options shown in Figure 22.
Figure 22. WebSphere Studio installation
For more information about IBM WebSphere Studio, refer to 4.3, “WebSphere
Studio and other JSP, HTML - Editors” on page 82 and visit the IBM
WebSphere Studio site: http://www.ibm.com/software/webservers/studio/.
Chapter 3. Configuration
55
3.2.9 IBM VisualAge for Java, Enterprise Edition Version 3.5
We installed VisualAge for Java with the full installation option. For the
location of our repository we selected local. As workspace owner we took our
normal NT account. After finishing the installation we started VisualAge for
Java and and added the extra features needed for our migration environment.
To add these features:
1. From the VisualAge for Java workbench, select File -> QuickStart .
2. From the Quick Start window shown in Figure 23, select Features ->Add
Feature.
Figure 23. VisualAge Quick Start
3. Select the features shown in Figure 24.
56
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 24. VisualAge adding features
For more information about using IBM VisualAge for Java, Enterprise
Edition, refer to 4.1, “IBM VisualAge for Java, Enterprise Edition” on page 59
and visit the IBM VAJava site at:
http://www.ibm.com/software/ad/vajava/
3.2.10 Tomcat 3.1
At the time we wrote this redbook, WebSphere Application Server, Advanced
Edition V3.5 supported Java Servlets 2.2 and JavaServer Pages 1.1, but the
WebSphere test environment that is part of VisualAge for Java had support
for Java Servlets 2.1 and JavaServer Pages 1.0. To overcome this
Chapter 3. Configuration
57
incompatibilty we installed the Tomcat 3.1 reference implementation of Java
Servlets 2.2 and JavaServer Pages 1.1, from the Apache Software
Foundation, into VisualAge for Java. This was an interim solution that allowed
us to test servlets and JSP within VisualAge for Java, but still deploy to
WebSphere.
For a detailed description of the installation process refer to 4.1.6, “Apache
Tomcat test environment” on page 78.
3.3 Setting up the WebLogic Server lab machine
For a description of setting up the following products, refer to 3.2, “Setting up
the development machine” on page 34:
• Sun JDK 1.2.2
• IBM Universal Database Enterprise Edition 7.1 FP1
• BEA WebLogic Server 5.1 SP6
3.4 Setting up the WebSphere lab machine
For a description of setting up the following products, refer to 3.2, “Setting up
the development machine” on page 34
• IBM Universal Database Enterprise Edition 7.1 FP1
• IBM WebSphere Application Server 3.5, Advanced Edition PTF2
(we did notconfigure the cloudscape database here)
• IBM WebSphere Studio 3.5 FP1
• IBM VisualAge for Java, Enterprise Edition Version 3.5
• Tomcat 3.1
58
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 4. Development tools
This chapter is about the tools we used to support the migration of a
WebLogic Server application to WebSphere Application Server, Advanced
Edition. This chapter is not intended as a detailed guide to these development
tools and we do not cover all details for the installation, configuration and
handling of the tools. We coveronly the topics that are relevant to our
migration activities.
4.1 IBM VisualAge for Java, Enterprise Edition
VisualAge for Java is a fully featured Integrated Development Environment
(IDE) for development of professional Java code. Some of the general
features of VisualAge for Java are:
• The accomplished Visual Composition Editor (GUI builder)
• Source code browsers and editors with coding tools (formatting, automatic
code completion, fix errors on save)
• A collaborative team development environment based on a shared
repository
• Incremental compilation
• A scrapbook to experiment with Java code fragments
• A powerful integrated debugger, with object inspectors and the ability to
set regular or conditional breakpoints
Features of VisualAge for Java that make it particularly useful for application
migration projects aimed towards the WebSphere Application Server,
Advanced Edition are:
• WebSphere Test Environment
• JSP/Servlet Development Environment
• EJB Development Environment
• Persistence Access Builder
These environments offer smart wizards, development environments
(browsers, tools), execution environments (servlet engine, EJB server,
Persistent Naming server) and code generators (EJB, access beans),
deployment tools and special execution monitors (JSPs).
One feature that we appreciated very much is the ability to change code
instantly while debugging, without having to restart the server. This is useful
© Copyright IBM Corp. 2001
59
and increases productivity, because it avoids server startup times. Another
advantage of VisualAge for Java is the ability to simulate multiple virtual
machine instances.
The disadvantages of VisualAge for Java in comparison with similar tools is
the rigid association with a specific JDK version and that you are not able to
use different versions of the same package simultaneously. An example is
XML parser versions. If the installed application server uses a particular XML
parser version, you can’t use an XML parser based on a newer specification
level for your own server applications at the same time. Different versions of
packages, such as “org.xml.sax”, “org.w3c.dom” or within the BEA integration
kit “com.sun.xml.parser”, cannot be in the workspace at the same time. If you
need this for your migration project, you might have problems importing the
code.
The VisualAge virtual machine is relatively slow when compared to other
JVMs, but it is designed to provide development and debugging abilities, and
should not be used to test production performance.
For more information on VisualAge for Java, see the IBM VisualAge for Java
online help and the product Web site:
• Online help: http://localhost:49213/vajdoc/vahwebx.exe/en_US/vj32/
Extract/0/index.htm
• Product home page: http://www.ibm.com/software/ad/vajava/
4.1.1 Installation
We installed VisualAge for Java, Enterprise Edition Version 3.5 with the
complete setup option, which installs all features to the repository. It was not
necessary for our redbook team to centralize Java code development, so we
installed VisualAge for Java with each team member using an individual local
repository on their workstation. In a professional development project we
recommend that you use the VisualAge team development environment and
install the EMSRV repository server on that shared server.
The steps to complete the configuration of VisualAge for Java are:
1. After finishing installation and rebooting the machine, start VisualAge for
Java.
2. Enter your normal Windows NT logon as the network name of the
Administrator, who will be the workspace owner.
3. At the Welcome window choose Go to the workbench.
60
Migrating WebLogic Applications to WebSphere Advanced Edition
4. A recommended practice is to exit from VisualAge for Java again and
make a copy of your initial workspace file, which is the <VAJavaHome>\ide\program\ide.icx file. You may need it if you want to work with a
different feature setup. For example, if you would like to work with other
products or such features as the BEA WebLogic Server Integration Kit for
VisualAge for Java, you may have to start with a fresh workspace file. If
you keep a copy of your initial workspace file, you won’t need to run the
whole installation process again. After you copied the file, you can start
VisualAge for Java once more.
To load the necessary features used for our project, we performed these
steps:
1. Open the Quick Start panel either by pressing F2 or clicking File -> Quick
Start.
2. Select Feature in the left pane and double-click the Add Feature
command in the right pane.
3. Select the following features from the listto add them to the workspace
(other dependent features will be loaded automatically):
- IBM EJB Development Environment
- IBM WebSphere Test Environment
- Persistence Access Builder
Now the setup is done and you should be ready to work with VisualAge for
Java. At the time this book was written, IBM already offered fix pack 2, which
enabled Java Servlets 2.2 and JSP 1.1 support for the WebSphere
Application Server, Advanced Edition runtime. Since WebLogic also supports
that implementation level, we installed the fix pack for WebSphere.
Unfortunately the fix pack for the WebSphere Test Environment was not
available at that time, so we could not test Java Servlets 2.2 and JSP 1.1based applications with the WebSphere Test Environment.
We decided to use the already available Apache Tomcat test environment as
our Java Servlets and JSP container. For more details about that interim
solution refer to 4.1.6, “Apache Tomcat test environment” on page 78.
An alternative used by our team was to import the new <WebSphereAppServer-home>\lib\servlet.jar file into VisualAge for Java. This file came
with fix pack 2 for the WebSphere runtime and replaces the packages in the
Servlet API Classes project within VisualAge for Java. A general instruction
for importing JAR files can be found in the following section.
Chapter 4. Development tools
61
4.1.2 Overview of useful VisualAge for Java features
If you have installed the complete VisualAge for Java, Enterprise Edition V3.5
product you can see that VisualAge for Java offers a number of different
features. Many are connectors to access data on a back-end system or to
create beans that can access data from other applications or components (for
example CORBA-IDE, C++, etc.).
Figure 25 shows the features that are relevant to our migration project. These
are the major components you will encounter when using VisualAge for Java
to migrate or create J2EE-based applications.
Weblogic_development
VisualAge for Java
Debugger
Import
Workbench
Console
Browsers/Editors
sources.jar
sources.jar
classes
classes.jar
Webapp
jsp
html
Export
Copy
WebSphere
WebSphere Test
Environment
EJB Development
Environment
EJB
Tools
Persistency
Tools
JSP
Execution
Monitor
Persistent
Name
Server
Data
Source
Configuration
Web Application
EJB Server(s)
Servlet
Servlet
EJBs
Servlet
Engine
Servlet
Access
Servlet
Beans
Servlet
Servlet
Servlet
DB2
...
Servlets
IBMVJava
ide
project_res.
...
myProject
WTE
hosts
default_host
default_app
myWebApp
servlets
package
Servlet
Object
Servlet
Models
Repository
JSP
JSP
AppServer
JSP Compiler
CICS
MQ
web
jsp
html
Other
Figure 25. Overview of features in VisualAge for Java
The main window in VisualAge for Java is the Workbench window. Here you
can browse and edit all loaded projects, packages, resources, classes, and
interfaces. You can also open a separate window to browse one project, one
62
Migrating WebLogic Applications to WebSphere Advanced Edition
package, or one type (class or interface). New pages may be inserted into the
Workbench notebook; for example when you load the EJB Development
Environment, an EJB page will be added. The Managing page is used by the
owner of packages or projects to work with the versioning tools provided by
VisualAge. The All Problems page shows all current errors and warnings in
the code.
When you set a breakpoint in your source code, the Debugger window will
appear as soon as the line of code is about to be executed.
The Console displays standard output.
The WebSphere Test Environment enables testing of J2EE-based server
applications for the WebSphere Application Server, Advanced Edition.
• A servlet engine runs the Java Servlets.
• A JSP compiler compiles JSPs to Java Servlets and a JSP Execution
Monitor supports debugging of JSPs.
• The persistent name server is a JNDI naming server to bind the EJB home
interfaces, DataSources, the UserTransaction object, etc.
• The DataSource configuration is used to create connection pools to
particular DataSources.
The EJB Development Environment is used to create EJBs and map the
entity beans to a persistent data store. EJBs can be grouped together and
assigned to EJB servers, which would mimic the EJB container of
WebSphere and run the EJB components. The Persistence Builder feature
can be used to create finer grained object models, which could be used by the
EJBs.
VisualAge for Java provides features to access enterprise resources, such as
related databases (via JDBC), CICS, MQSeries, IMS, SAP, and others. This is
done with a Connector framework and DataSources.
All the code is stored in a local (stand-alone) or central (team-development)
repository and all editions are seamlessly saved and can be restored down to
the method level. The editions can be versioned.
VisualAge for Java interacts with the file system in that you can import and
export source, class and resource files from and to the file system. In our
case we would import files from a WebLogic development directory or JAR
file, and export them to a WebSphere-related directory.
Chapter 4. Development tools
63
In order to import the packages and files from a WebLogic application, you
must create a project in VisualAge for Java, as follows:
1. Select the Projects page in the Workbench notebook.
2. Either use the tool bar button with the folder sign or choose Selected ->
Add -> Project.
3. Enter an arbitrary name for your project and confirm by clicking Finish.
To import the files from your WebLogic application:
1. Ensure that the project is selected in the All Projects tree.
2. Right-click to open the context menu, and select Import from the menu.
3. Choose whether you want to import your WebLogic application from a
directory or from a JAR file. Click Next.
4. In the next panel you enter the name of the directory or JAR file and you
choose which file types you want to import. Whenever you have *.java
source files, import them; otherwise you can also import *.class files only.
Resources will be copied into the <VAJava-home>\ide\project_resources
directory under your specific project. If you enter a new project, it will be
created for you. Click the Finish button to begin the import.
We did this for the Java Pet Store V1.0.1 example that we downloaded from
Sun’s Java site at: http:/java.sun.com/j2ee/download.html. A very good
feature of VisualAge for Java is that you can immediately see how many code
incompatibilities or errors you will have to fix to get the application running
under the WebSphere Application Server, Advanced Edition.
1. Double-click your imported project (in our example: PetStore) in the All
Projects container.
2. A new window opens, containing just the packages of your project. Now
click the Problems tab and you will see all errors and warnings VisualAge
for Java has encountered that will need to be resolved to get everything
running in the WebSphere Test Environment.
For example Figure 26 shows all the problems resulting from importing the
Java Pet Store sample into VisualAge.
64
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 26. Problems overview of the PetStore project in VisualAge for Java
4.1.3 WebSphere Test Environment
The WebSphere Test Environment (WTE) is a smooth integration of the
WebSphere Application Server, Advanced Edition with the VisualAge for Java
IDE. It provides support for developing, testing and debugging of Java
Servlets, JavaServer Pages, Enterprise JavaBeans and other server
components and classes.
Unit tested components that run successfully in the WTE will also run
successfully in a WebSphere Application Server, Advanced Edition
production environment. Note, however, that the WTE does not contain the
entire WebSphere Advanced runtime. The Differences page in the IBM
VisualAge for Java online help lists all the differences between WebSphere
Test Environment and WebSphere Application Server. Here is the URL:
Chapter 4. Development tools
65
http://localhost:49213/vajdoc/vahwebx.exe/en_US/vj32/Extract/0/wte/
concepts/c5xdiffs.htm
To test whether your server application will run on the WebSphere Application
Server, Advanced Edition, we recommend using the WTE to track down any
code problems. This will be faster and more efficient than only deploying code
straight into the WebSphere runtime.
To start the WTE in VisualAge for Java choose Workspace -> Tools ->
WebSphere Test Environment.
This will launch the WebSphere Test Environment Control Center window
which allows you to start two servers, the servlet engine and the persistent
name server. The Control Center also provides a way to configure the JSP
monitor options and DataSources. Figure 27 shows the Control Center.
Figure 27. WebSphere Test Environment Control Center with servlet engine configuration pane
4.1.3.1 Servlet engine and JSP Execution Monitor
The WTE provides you with a servlet engine and a JSP Execution Monitor
and allows you to use all available Java APIs, JavaBeans or EJBs. As already
mentioned, the WTE does not support the same JSP and Java Servlets
standard as the WebSphere runtime. That is why we didn’t use the Servlet
and JSP features of the WTE, but rather we used an interim solution with the
66
Migrating WebLogic Applications to WebSphere Advanced Edition
Apache Tomcat test environment described in 4.1.6, “Apache Tomcat test
environment” on page 78.
The features of the WebSphere Test Environment include:
1. Servlet engine
If you are going to use the servlet engine feature launch the WebSphere
servlet engine by invoking the servlet engine from the WebSphere Test
Environment Control Center.
More information about the servlet engine can be found in VisualAge for
Java online help.
2. JSP Execution Monitor
The JSP Execution Monitor is an efficient tool to simultaneously monitor
the JSP source, the JSP-generated Java Servlets source, and the
dynamically generated HTML content. You can see the mapping between
the JSP and the associated Java source code, and it allows you to set
breakpoints.
Figure 28 shows an example of the JSP Execution Monitor in use.
Figure 28. JSP Execution Monitor
Chapter 4. Development tools
67
More information about the setup and the handling of this tool can be
found in the VisualAge for Java online help at:
http://localhost:49213/vajdoc/vahwebx.exe/en_US/vj32/Extract/0/jsp/
concepts/c5qjspem.htm
Further details about using VisualAge for Java to write Java Servlets and
JavaServer Pages can be found in the redbook Servlet and JSP
Programming with IBM WebSphere Studio and VisualAge for Java, SG245755.
4.1.3.2 Persistent name server
The persistent name server is the JNDI naming service in the WTE. The
name server keeps the references to bound EJB home interfaces, registered
DataSources, the UserTransaction interface implementation and any other
objects bound to the name space.
As the name implies the entries in the name space are persistent, so you do
not have to add the DataSources at every server startup. The configuration
from the last server shutdown is made persistent. The settings for the
database of the configuration repository can be set in the WTE Control
Center. Click Servers -> Persistent Name Server in the left pane and enter a
database driver, database URL, database ID and password in the right pane
(see Figure 29). Confirm the settings by clicking Apply.
Figure 29. Persistent name server configuration in the WTE Control Center
68
Migrating WebLogic Applications to WebSphere Advanced Edition
If you want to have the WebSphere Application Server, Advanced Edition runtime and the WTE persistent name server running at the same time, you will
need to change the Bootstrap port. This can be done in the WTE Control
Center, too. Both servers have port 900 as default. We changed the port in
the development environment to 902.
If you do this, then you need to change the PROVIDER_URL when creating
the InitialContext. While the code is tested inside VisualAge for Java, you take
iiop://localhost:902 and when the code runs outside in the real Application
server, you have to take iiop://localhost:900.
Starting and stopping of the persistent name server should be done via the
WTE Control Center. Click Start Name Server or Stop Name Server on the
right pane to do this. The server must be started before you start any EJB
servers and before you configure or use any DataSources.
4.1.3.3 DataSource configuration
A detailed discussion of DataSources can be found in 8.2.1, “DataSource” on
page 157.
To create or configure your DataSources In VisualAge for Java, use the WTE
Control Center.
Follow these steps to introduce a new DataSource:
1. Ensure that the persistent name server is started.
1. In the WebSphere Test Environment Control Center select the tree node
DataSource Configuration from the tree on the left-hand side.
2. Click Add.
3. Complete the Add DataSource panel as shown in Figure 30.
Chapter 4. Development tools
69
Figure 30. Adding a DataSource
The DataSource name is the logical name for the DataSource (“jdbc/” will
be prepended automatically).
Select the driver from the list. If you want to introduce a new driver, refer to
8.2.3.1, “Introducing a JDBC driver in VisualAge for Java” on page 165.
The syntax for the URL in the Database URL entry field is specific to the
vendor of the JDBC driver (refer to their documentation). It is used to
specify the location and name of the database in the database server.
With the Database type combobox you can select whether the driver can
handle Java-based two-phase commit transactions. If you are not
performing distributed transactions select JDBC; if the driver can handle
it, select JTA.
The other fields are not relevant to our discussion.
4. Click OK to add the DataSource, but not until you check that everything
was entered correctly (especially the DataSource name, which is casedependent, and the database URL). If you made a mistake, the system
won’t allow you to update your confirmed DataSource settings at a later
time. You will only be able to remove your settings and add a new
DataSource.
70
Migrating WebLogic Applications to WebSphere Advanced Edition
Before you can run and test your Java Servlets, JSPs or EJBs with the
DataSource, you shouldn’t forget to add the external JAR file containing the
JDBC driver to the classpath. As you may access the database from several
processes (servlet engine, EJB servers, Tomcat server) the best practice is to
modify the Workspace class path instead of modifying the class path of each
server program.
1. In the Workbench select Window -> Options...
2. In the Options dialog, select Resources from the left tree view.
3. Insert the JAR file or the directory containing the JDBC driver class in the
Workspace class path entry field either by typing or by clicking the Edit
push button and the further navigation and selection aids. For our DB2
driver we added: D:\Program Files\sqllib\java\db2java.zip.
Now you should be able to use the DataSource.
4.1.4 EJB Development Environment
The EJB Development Environment is a specialized environment to develop
and test EJBs that conform to the EJB component architecture 1.0 defined by
Sun Microsystems. It supports some additions to the 1.0 standard which
cover part of the functionality defined in the EJB 1.1 standard, and provides
IBM enhancements to the EJB programming model (inheritance and
associations), which foreshadow functions that will be introduced in the EJB
2.0 Specification.
All EJB Development Environment tools are accessible from the EJB page in
the Workbench. Figure 31 shows this page.
Chapter 4. Development tools
71
Figure 31. EJB Development Environment in VisualAge for Java
From here you are able to write and edit your business logic or import
Enterprise JavaBeans from a JAR file. You can develop session beans,
container-managed persistence (CMP) entity beans, and bean-managed
persistence (BMP) entity beans.
A SmartGuide (see Figure 32 on page 75) will automatically create the EJB
home and remote interfaces and the bean class. You don’t need that for
migration projects, since these classes will be taken over, but the same
SmartGuide aids you in creating the deployment descriptor for WebSphere. In
addition you can generate access beans that serve as JavaBean wrappers for
communicating with EJBs. Access beans hide the home and remote
interfaces of Enterprise JavaBeans and introduce advanced local caching of
Enterprise JavaBeans attributes.
Then there are tools for building data persistence into Enterprise JavaBeans.
Entity beans can be mapped to back-end data stores, such as relational
databases. You can create EJB groups from existing database schemas or
from Persistence Builder models, or vice versa. You can create or edit an
association between two CMP entity beans. This is currently IBM-proprietary
72
Migrating WebLogic Applications to WebSphere Advanced Edition
functionality, but similar functions will be mandated by the EJB 2.0
Specification.
You can use internal deployment tools to automatically generate the
implementation classes for your Enterprise JavaBeans that will run in the
WebSphere server. These tools provide a means to set the deployment
descriptor for your Enterprise JavaBeans.
There is an integrated feature that checks and verifies that your Enterprise
JavaBeans code is consistent and conforms to the rules defined by the Sun
Microsystems Enterprise JavaBeans specification.
Finally you can test and debug your Enterprise JavaBeans in the WebSphere
Test Environment before exporting them for installation on a remote
production server. Simply start the persistent name server, set up the
DataSources and configure and start the EJB servers. Now you should be
able to set breakpoints and debug your EJB code. You can automatically
generate and run a test client program for each enterprise bean that is
running in the EJB server.
The EJB source code and the generated code can be versioned and you can
create individual editions of each EJB.
For more detailed information, refer to the following redbooks:
• Developing Enterprise JavaBeans with VisualAge for Java, SG24-5429
• Design and Implement Servlets, JSPs, and EJBs for IBM WebSphere
Application Server, SG24-5754
There is also a lot of information in the IBM VisualAge for Java online help:
• Overview of the EJB Development: http://localhost:49213/vajdoc/
vahwebx.exe/en_US/vj32/Extract/0/ejb/concepts/c5rover.htm
• Using the EJB Development Environment overview: http://
localhost:49213/vajdoc/vahwebx.exe/en_US/vj32/Extract/0/ejb/tasks/
t5rusing.htm
In the next sections you will find the major EJB development steps you will
face when migrating EJBs. However, if you need more details, refer to the
URLs listed above.
4.1.4.1 Creating Enterprise JavaBeans
For migration projects you won’t use the EJB page to develop Enterprise
JavaBeans from scratch, but you will rather take the existing bean class and
the home and remote interface and just generate the deployed code for the
Chapter 4. Development tools
73
WebSphere server and adapt the deployment descriptor. Unfortunately
WebSphere still uses the old (EJB 1.0) deployment descriptor approach, with
the uneditable serialized object stored in a file (.ser). There are two ways to
migrate XML descriptors, which were introduced with EJB 1.1:
• You can retype the information
• You use an automated tool
VisualAge for Java has SmartGuides for the manual process:
1. After you have imported your application code and resolved all
encountered errors and major warnings, switch to the EJB page in the
Workbench window.
2. Create a new EJB group by selecting EJB -> Add -> EJB Group from the
menu bar. To be faster you can also use the context menu of the
Enterprise Beans pane.
3. Select the project for which you want to create the EJBs. VisualAge for
Java will create an EJB reserved package in that project. Leave the option
Create a new EJB group named selected and enter an arbitrary name for
the EJB group. Add the new groupby clicking Finish.
4. Right-click the new group and select Add -> Enterprise Bean.
Create a new enterprise bean by using the SmartGuide displayed in
Figure 32:
74
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 32. SmartGuide for creating an Enterprise Bean in VisualAge for Java
Enter the Bean name and the Bean type.
Because we already have a bean, which we only need to migrate, select
Use an existing bean class. Identify the bean by specifying the project,
package and class name of the bean class. After you have done that, click
Next.
5. On the second page select the existing full package type name of the
home and the remote interface. Depending on the bean type, you will have
to fill in other information, such as the key type for entity beans. Start the
automatic creation by clicking Finish.
6. Now you are able to see all types and their members for the particular
bean in the EJB page. Right-click the bean and select Properties. Enter
the JNDI name, the transaction and security attributes and any necessary
environment entries. Confirm your data input with OK.
7. This completes the creation of the bean in VisualAge for Java. Now you
are able to generate the deployed code and to create the JAR file for
deployment into WebSphere, which will contain the generated deployment
descriptor.
Chapter 4. Development tools
75
4.1.4.2 Importing Enterprise JavaBeans
If you want to bypass the manual creation and the retyping of the deployment
descriptor information, there is a way to do it automatically by converting the
information you already have and then importing it to VisualAge for Java. For
that you will need the jetace tool, which is described in 4.2, “jetace” on
page 81.
These are the steps to bypass the manual creation of Enterprise JavaBeans:
1. After you have imported your application code and resolved all
encountered errors and major warnings, export the JAR file(s) containing
the enterprise beans classes (bean classes, home and remote interfaces).
You also have to export the dependent classes, so you either include it in
the same JAR file or make a separate one.
2. Use the jetace tool according to the instructions in 4.2, “jetace” on
page 81.
3. To import the jetace output JAR file back into VisualAge for Java, you
should not do it with the ordinary Import in the Workbench, but since you
want to import only the beans, switch to the EJB page.
4. Create a new EJB group by selecting EJB -> Add -> EJB Group from the
menu bar. To be faster you can also use the context menu of the
Enterprise Beans pane.
5. Select the project for which you want to create the EJBs. VisualAge for
Java will create an EJB reserved package in that project. Leave the option
Create a new EJB group named selected and enter an arbitrary name for
the EJB group. Add the new group by clicking Finish.
6. Right-click the new group and select Import Enterprise Beans.
7. In the SmartGuide you select the output JAR file using jetace and check
the beans check box. When you click Details, you should see all beans
that will be imported. Deselect the .class, .java and resource check
boxes, since jetace didn’t make any changes there. Unfortunately you
have to import at least one .class, .java or resource file, so you must select
one check box. Choosing a resource file might be best; otherwise the
Finish button would stay disabled. Click Finish and all beans with their
deployment descriptors will be imported.
4.1.4.3 Generating deployed code
Normally you can generate the deployed code within VisualAge for Java. To
do that make sure that there are no problems (errors, warnings) with your
EJBs. In the EJB page there should be no superscript red X on any of the
items for which you want to generate deployed code. To be on the safe side
76
Migrating WebLogic Applications to WebSphere Advanced Edition
verify the beans before you start the generation process. Select the EJB
group(s) or the individual beans and click the right mouse button. The context
menu for the selection should have a Verify option, which you should select
to verify enterprise bean consistency. If you get a message No problems found,
then you are ready to generate the deployed code for WebSphere. Right-click
again and select Generate Deployed Code. VisualAge will generate the
server classes, the stubs and the ties into the same package where the bean
class is.
Unfortunately we had a major problem when we tried that. The progress
indicator in VisualAge for Java 3.5 suddenly disappeared and VisualAge
hung. There was no way to continue other than to kill and restart VisualAge. A
document in the VisualAge Developer Domain (VADD) assured us that this
was a known bug and that it should be fixed with Patch 2, which was not
available by the time we were writing this book.
As soon as the problem is solved, you will be able to run and debug the
deployed EJBs within the WebSphere Test Environment in VisualAge.
VisualAge for Java also offers utilities to generate special JAR files. If you
select the EJB group(s) or bean(s) and right-click the mouse button, you will
find more options under the menu item Export. You can generate an EJB JAR
file, a Deployed JAR file and a Client JAR file.
The other way to generate the deployed code is to use the WebSphere
runtime directly. This step is described in the WebSphere InfoCenter and also
in our Pet Store migration example in 9.4, “Java Pet Store deployment” on
page 208.
4.1.4.4 Configuring an EJB server
To test the generated beans within VisualAge for Java you have to set up an
EJB server.
1. Select the EJB group(s) you want to run in your EJB server, open the popup menu by clicking the right mouse button, and select Add To -> Server
Configuration.
2. The EJB server configuration window opens. Right-click on the EJB server
container containing your EJB group(s) and select Properties.
3. In the properties for EJB server dialogbox, you can set a DataSource for
your CMP entity beans. When you use use a DataSource, it must be
added to the persistent name server. Enter the logical name of the
DataSource (“jdbc/” will be prepended automatically) and select
<DataSource> in the combobox.
Chapter 4. Development tools
77
As an alternative to using a DataSource you can enter a database URL
and the JDBC driver name. Notice that this combobox allows you to enter
any JDBC driver class name and does not force you to select one from the
list.
WebSphere officially supports DB2, Oracle, and Sybase for EJB CMP, so
while you can type a driver from another vendor here, there is no
guarantee that it will work.
4. Click the OK button to complete the EJB server properties dialog.
5. Before you start the server you should start the persistent name server
and configure the DataSources in the WebSphere Test Environment
Control Center (see 4.1.3, “WebSphere Test Environment” on page 65).
6. To start the EJB server right-click the server and select Start Server. In
the VisualAge Console window you should see the message Server open
for business when the EJB server has started.
4.1.5 Persistence access builder
The persistence access builder is not part of the J2EE architecture. It is an
IBM proprietary tool and framework for building robust, scalable persistence
support for object models. Entity beans are not suitable for fine-grained object
models. This is also considered in the new EJB 2.0 Specification (see 8.5,
“Business objects - persistence frameworks” on page 176). The specification
guides the future of entity beans, which will be combined with finer grained
dependent objects. Both will be served by a common persistence manager.
For now, VisualAge for Java already offers a framework to build complex
persistence mapping (including inheritance and associations) for fine-grained
object models that are not entity beans. This is done with the Persistence
Builder.
More information about this feature and manuals on how to use it can be
found in the IBM VisualAge for Java online help documentation:
http://localhost:49213/vajdoc/vahwebx.exe/en_US/vj32/Extract/0/vap/html/
c5ejieta.htm
4.1.6 Apache Tomcat test environment
We had to use the Apache Tomcat test environment in VisualAge, because
the currently available WebSphere Test Environment did not support Java
Servlets 2.2 and JSP 1.1, whereas with the fix pack PTF2 the WebSphere
runtime does support the Java Servlets 2.2 and JSP 1.1 implementation
levels.
78
Migrating WebLogic Applications to WebSphere Advanced Edition
The Apache Tomcat test environment is an open source reference
implementation of Java Servlets 2.2 and JSP 1.1. The integration with
VisualAge for Java has been offered as a free download at the VisualAge
Developer Domain (VADD) home page:
http://www.software.ibm.com/vadd
From this site we followed the hyperlinks Download -> VisualAge for Java,
Version 3.5 -> Apache Tomcat Test Environment 3.1 and downloaded the
ZIP file Tomcat3_1.zip.
To install Tomcat in VisualAge, follow these steps:
1. Extract Tomcat3_1.zip to a temporary directory and start the extracted
Setup.exe.
2. Follow the straightforward installation by doing what the Setup wizard tells
you to do.
3. Start or restart VisualAge for Java.
4. If you have previously loaded the WebSphere Test Environment into
VisualAge you will have to remove the existing Servlet API Classes from
VisualAge before loading the new feature Apache Tomcat Test
Environment. To do this VisualAge click F2 (File -> Quick Start), select
Features on the left side and double click on Delete Feature in the right
list. Select Sun Servlet API 2.1 to remove this feature. This will generate
many code errors, but these will all be resolved in the next steps.
5. To load the new feature press F2 (or click File -> Quick Start), select
Features on the left pane and double-click Add Feature in the right pane.
Now select Apache Tomcat Test Environment 1.0 to add this feature.
At this point trying to run the WebSphere servlet engine will fail because
the API is not compatible, but you will be able to start Tomcat instead.
We recommend that you read the article “Apache Tomcat 3.1 Final Release
Servlet and JSP Development with VisualAge for Java”, which is available at
the VADD site under http://www7.software.ibm.com/vad.nsf/Data/
Document2390?OpenDocument&p=1 for details on how to work with Tomcat and
VisualAge for Java.
Now instead of using the servlet engine in the WebSphere Test Environment
you can use Tomcat, but still continue to use all the other functions of the
WebSphere Test Environment such as the persistent name server, EJB
servers, access beans, and EJB test clients because running these servers is
independent from the running of a servlet container.
Chapter 4. Development tools
79
You will have to add any projects and external libraries you might need to the
classpath for the Tomcat Runner (for example your servlet code, your Java
server classes, and your access beans).
4.1.7 BEA WebLogic Server Integration Kit
BEA offers a VisualAge Integration Kit for WebLogic Server 5.1 (in beta and
for VisualAge for Java V3.02 only), which enables the development and
debugging of WebLogic Server applications within VisualAge for Java. This
also strengthens the position of VisualAge for Java to be the development
environment of choice for the development of portable J2EE applications.
Inside VisualAge for Java you can test your application with both major
servers in the market, WebLogic and WebSphere.
The Integration Kit is offered for VisualAge for Java 3.02 and is a beta release
only, but it is fairly stable and we were able to run it also under VisualAge for
Java, Enterprise Edition V3.5. There were some conflicts with the javax.rmi.*
and javax.transaction.* packages of the Java class libraries in VisualAge for
Java, so we had to load the WebLogic projects from the repository by hand
and not with the Add feature command in the Quick Start panel. For the
classes that clashed with the ones in the Java class libraries project, we took
the ones provided by the Integration Kit.
You can obtain the download and all other installation instructions from BEA
at:
http://commerce.bea.com/downloads/weblogic_server.jsp#wls
After downloading the package follow these steps to install the Integration Kit
into VisualAge for Java v3.5:
1. Read the BEA document Installing the Integration Kit for VisualAge (found
in the downloaded package under install_va.html). Carry out step 1 to step
4 of that document.
2. Open the Repository Explorer in VisualAge for Java by clicking Window ->
Repository Explorer. In the opened window select the Projects tab of the
notebook.
3. Scroll down to the WebLogic projects and select WebLogic Server. Rightclick the latest edition in the Editions list and select Add to Workspace
from the context menu. Do the same for the projects WebLogic Server
Classes, WebLogic Java 2 Classes, and WebLogic Support Libraries.
4. Switch to the Workbench Window, select the Projects page of the
notebook and add a project by clicking Selected -> Add -> Project. In the
dialog select Create a new project named and enter the case-sensitive
80
Migrating WebLogic Applications to WebSphere Advanced Edition
name WebLogic Java Enterprise Libraries. If you entered the name
correctly, a message will warn you that the project already exists and asks
whether you want to create a new edition. Since we want to do that, click
on OK.
5. Go back to the Repository Explorer, select the project WebLogic Java
Enterprise Libraries, and click the uppermost edition and select all
packages in the Packages list. Right-click over the entire selection and
choose Add to Workspace. Now the packages are loaded into the
WebLogic Java Enterprise Libraries project; only javax.rmi and
javax.transaction will be loaded into the project Java class libraries. After
you have done that, you should version the open edition of WebLogic Java
Enterprise Libraries and the scratch edition of Java class libraries.
6. Continue with the remaining steps after step 9 in the BEA document
Installing the Integration Kit for VisualAge.
7. Read the document Using the Integration Kit for VisualAge (either in the
downloaded package or online at http://www.weblogic.com/docs51/
classdocs/visualAge.html). There is a subheading called Installing service
packs. Install the latest service pack according to the instructions there.
We installed service pack 6.
4.2 jetace
jetace is a tool shipped with the WebSphere Application Server, Advanced
Edition and is used to set up the deployment descriptor for Enterprise
JavaBeans and to create a deployable EJB JAR file.
Detailed information about the use of jetace can be found in the redbook
WebSphere V3.5 Handbook, SG24-6161.
What is not described there but particularly useful in the context of migrating
a large number of EJBs is the XML feature. Instead of capturing the
deployment descriptor for each individual EJB manually in different dialogs,
you can create an XML file automatically or in an editor and read the XML file
in jetace (by clicking File -> Read XML).
You can write a job that converts EJB 1.1 deployment descriptors into the
XML data format, which is expected by the jetace tool. The WebSphere
InfoCenter has an appendix where the tags of the XML file are described. You
can either look in your local InfoCenter copy or online at:
http://www-4.ibm.com/software/webservers/appserv/doc/v35/ae/infocenter/
was/atswpgax.htm
Chapter 4. Development tools
81
These are the suggested steps:
1. Import your application into VisualAge for Java and resolve all
encountered problems (error and warnings).
2. Export all EJB-related classes, that is bean class(es), home and remote
interface(s) to one or more JAR files. It is recommended that you keep the
EJBs separate and make one or more JAR files for all the dependent
classes.
3. Before starting jetace make sure that the dependent classes are included
in the classpath.
4. Start <WebSphere-AppServer-home>\bin\jetace.bat.
5. Load the JAR file containing your EJB classes (bean class, home and
remote interfaces) by clicking File -> Load and specifying the JAR file
name in the Load From File dialog.
6. If the file was loaded without errors (no message box appears, just a line
saying Finished reading the input file <filename>), you should get your
converted XML file. Read it by clicking File -> Read XML. In the Read
XML file dialog select your XML file, but you should change the Files of
type selection to All files (*.*) in order to list the .xml files.
7. jetace will read the XML file and automatically create the serialized
deployment descriptor. You can click a created enterprise bean and verify
by clicking the Edit button if everything is allright and you can still do any
changes you want.
8. When you are finished, you should create an EJB JAR file by clicking File
-> Save As (we recommend that you use a filename different from the
input-file). The output file contains the necessary deployment descriptors
and is ready for the generation of the server-specific deployed code. You
can either import the beans back to VisualAge for Java and generate the
deployed code there (see 4.1.4.3, “Generating deployed code” on
page 76) or use the tool in the WebSphere admin console.
If it doesn’t pay to write an automated job for creating the jetace XML file, you
can use jetace to capture the deployment descriptor information as described
in the WebSphere V3.5 Handbook and save it into the XML file (by clicking
File -> Write XML). If you want to recreate the EJB JAR file at a later time,
you can read the XML file again.
4.3 WebSphere Studio and other JSP, HTML - Editors
There are tools that can assist with the development of dynamic Web pages,
but for our migration project we did not use any of these tools, since we took
82
Migrating WebLogic Applications to WebSphere Advanced Edition
existing JSP files and used plain editors to make minor changes for the
migration. To write portable JSP files you are free to use any tool that
supports JSP 1.0 or 1.1.
WebSphere Studio is highly integrated with VisualAge for Java and is a
powerful solution for managing team-based development. At the time we
wrote this redbook, WebSphere Studio supported JSP Versions 0.91 and 1.0,
but not version 1.1.
For more detailed information about WebSphere Studio, please read the
redbook Servlet and JSP Programming with IBM WebSphere Studio and
VisualAge for Java, SG24-5755.
WebLogic JSP applications will probably be developed with WebGain Studio,
which contains Macromedia Dreamweaver for the editing of HTML and
JavaServer Pages.
Dreamweaver UltraDev and Allaire HomeSite are two often-used HTML
editors with JSP support and you can use them to produce Web applications
that will run on WebLogic and WebSphere.
4.4 Other tools and products
4.4.1 J2EE Reference Implementation server
Both WebLogic Server and WebSphere Application Server, Advanced Edition
are committed to implement the J2EE standards. They both also offer specific
products and technologies you can use to develop your applications. In order
to check whether your developed application is still J2EE compliant, you
could use the J2EE Reference Implementation server from Sun
Microsystems, which is available for free. The J2EE Reference
Implementation server is not designed to be used in production
environments.
4.4.2 Converter and migration tools
You may obtain converter and migration tools that automate some of the
changes you have to do when migrating applications from WebLogic to
WebSphere. While writing this book we developed some tools on our own or
we have tried some that we got from other developers, such as a tool to
convert XML-based deployment descriptors from the EJB 1.1 standard to
jetace XML.
Chapter 4. Development tools
83
In Chapter 9, “Migration example: The Java Pet Store” on page 181 you will
find some utilities which we developed when writing this book. The utilities
may be downloaded as additional material. See Appendix A.2, “Using the
Web material” on page 235 for instructions on how to obtain this code. .
4.4.3 Persistence mapping tools
In the currently available J2EE standards, business object modeling is not
covered in detail. The Enterprise JavaBeans v2.0 and the Java Data Objects
(JDO) V0.8 Specifications attempt to address this issue, but we have to wait a
while to see the first implementations.
The current J2EE based frameworks rely on third-party tools. Some of the
well-known tools are WebGains TOPLink (bought from The Object People),
Thought Inc.’s CocoBase, and Versant Corporation’s Versant Object
Container. These and other vendors offer specific integrations in both
WebLogic Server and the WebSphere Application Server, Advanced Edition.
Applications developed with their development tools should be easily
portable, but we have not tried any of these during the work for our book.
84
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 5. JavaServer Pages
This chapter describes how to migrate JavaServer Pages from WebLogic
Server to WebSphere Application Server, Advanced Edition. It starts with a
short overview of JavaServer Pages. Then we discuss the different levels of
JavaServer Pages. After that we talk about tag libraries and JSP deployment.
Finally we describe how we migrated a few JSP samples.
5.1 Introduction
JavaServer Pages is the Java platform technology that supports dynamic
content within Web pages. It is based on HTML and enables a Web designer
to include dynamic content through JavaScript or Java. The separation of
HTML presentation and the dynamic content is a big advantage. It reduces
the complexibility of Web pages and enables the common work of a Web
page designer and a software developer on a single Web page. This would
be much more complicated when using servlets that produce HTML. JSP is
Java-based, so unlike other possibilities for dynamic output it is supported by
nearly every Web application server. JSPs are compiled into servlets and
produce plain HTML output. Therefore any browser can be used for viewing
JSPs. JSPs consist of the following:
• HTML tags
• Scriplets
• Directives
• Expressions
• Actions
• Declarations
Custom tags (since JSP Level 1.1)
For more information about JSPs see:
• The Sun web site http://java.sun.com/products/jsp/
• The redbook Design and Implement Servlets, JSPs, and EJBs for IBM
WebSphere Application Server, SG24-5754
• The redbook Servlet and JSP Programming with IBM WebSphere Studio
and VisualAge for Java , SG24-5755
© Copyright IBM Corp. 2001
85
5.2 Developing JSPs
The current specification level of JSP is 1.1. At the time of writing the JSP 1.2
Specification was available as the proposed final draft at http://java.sun.com/
products/jsp/. The specifications levels most relevant to this book are 1.0 and
1.1, because almost all JSPs used by WebLogic Server applications should
meet one of the above-named specifications. The main difference between
1.0 and 1.1 is that JSP 1.1 includes a standard mechanism for the creation of
tag libraries. Tag libraries reduce the use of embedded Java code in JSP
pages. Tag libraries are designed to be portable between JSP 1.1 compliant
servers.
If you want to use JSP 1.1 pages with WebSphere then make sure you are
using PTF2. Figure 4 shows the different JSP levels supported by
WebSphere 3.5 and WebSphere 3.5.2:
Table 4. JSP level s within WebSphere 3.5
JSP Level
WebSphere 3.5
WebSphere 3.5 PTF2
1.0
full support
full support
1.1
not supported:
- portable tag extension
mechanism
- Servlet 2.2
- Few APIs
- tag changes
- parameters used
full support
WebLogic Server 4.5 came with JSP 1.0, and WebLogic Server 5.1 meets
JSP 1.1 Specifications.
There should be no major problems migrating JSPs between WebLogic and
WebSphere. The commonly used JSP levels 1.0 and 1.1 are fully supported
by WebSphere 3.5.2. As described in step 3. on page 47, you should use
Servlet 2.2/JSP 1.1 Full Compliance Mode and add the JSP 1.1 Processor to
your Web application. It is not possible to use a 1.0 JSP engine and a 1.1 JSP
engine in one Web application. If you have JSP 1.0 and JSP 1.1, then you
should use the JSP 1.1 engine. There will be only minor changes necessary,
if any. The JSP specification has only four changes from JSP 1.0 to JSP 1.1
and some additions to JSP 1.0.
Changes from JSP 1.0 to JSP 1.1 include:
86
Migrating WebLogic Applications to WebSphere Advanced Edition
• Use of Servlet 2.2 instead of Servlet 2.1, including distributable JSP pages
(for more information about servlets refer to Chapter 6, “Java Servlets” on
page 109).
• jsp:plugin can no longer be implemented by just sending the contents of
jsp:fallback to the client.
• XML equivalents for tags.
• Reserved all request parameters starting with jsp.
Note on XML tag format
The XML tag format for JSP is not a required feature of the JSP 1.1
Specification. It becomes mandatory with JSP 1.2. The JavaServer
Pages Specification Version 1.1, found at http://java.sun.com/
products/jsp/download.html says that “The JSP page to XML document
mapping is not visible to JSP 1.1 containers; it will receive substantial
emphasis in the next releases of the JSP specification. Since the
mapping has not received great usage, we particularly encourage
feedback in this area.”
5.2.1 Tag libraries
Tag libraries are designed to be portable. The goal is to make it easier to
separate presentation from logic, allowing JSP developers to access complex
Java logic from the presentation layer by using the simple custom taqs.
WebSphere comes with some tag extensions for database access and
supports the implementation of custom tags. WebLogic Server 5.1 provides a
custom tag library as part of Service Pack 5 (SP5). We investigated whether
this could be ported to WebSphere.
The WebLogic Server tag library comes with Version 5.1 SP5 and SP6. We
used the tag library from Service Pack 6. Although the documentation names
the file weblogic-tags-server.JAR it is shipped as lib/weblogic-tags-510.jar. If
you want to use it with WebLogic Server you must have this file in the
WEBLOGIC_CLASSPATH. This tag library adds three additional tags:
1. cache
The cache tag caches the statements between the <wl:cache> and the </
wl:cache> tag. The output is only updated when the cache time-out is
reached.
Chapter 5. JavaServer Pages
87
2. repeat
The repeat tag enables you to iterate over Enumerations, Iterators,
Collections, Arrays of Objects, Vectors, ResultSets, ResultSetMetaData,
keys of a Hashtable or simply a count attribute.
3. process
The process tag allows you to selectively execute code by querying
parameters.
More information about how to use these tags can be found at http://
www.weblogic.com/docs51/classdocs/API_jsp.html.
We developed the following small sample JSP (testbeatags.jsp) to use these
three tags:
<!doctype html public "-//w3c/dtd/HTML 4.0//en">
<html>
<!-- no Copyright -->
<head>
<title>Use of BEA Tags Example</title>
<%@ page import="java.util.Date" %>
</head>
<%@ taglib uri="/taglib.tld" prefix="wl" %>
<body bgcolor=#ffffff>
<font color=#DB1260>
<h1>CACHE TAG</h1>
<h2>
The current date is <%= new Date() %>.
<h3>
<wl:cache timeout ="5s">
The 5 seconds cached date is <%= new Date() %>.
</wl:cache>
<wl:cache timeout ="10s">
<p> The 10 seconds cached date is <%= new Date() %>.
</wl:cache>
<h1>REPEAT TAG</h1>
<% Vector v = new Vector(5);
for (int i = 0; i < 5; i++)
v.addElement(new Integer(i));%>
<wl:repeat id="item" set="<%= v.elements() %>">
<p> Repeat NR. <%=item%>
</wl:repeat>
</h3>
<h1>PROCESS TAG</h1>
<wl:process notname="1">
88
Migrating WebLogic Applications to WebSphere Advanced Edition
<wl:process notname="2">
<form action="<%= request.getRequestURI() %>">
<input type="submit" name=" 1 " value="1"/>
<input type="submit" name=" 2 " value="2"/>
</form>
</wl:process>
</wl:process>
<wl:process name=" 1 ">
<p> you selected 1
</wl:process>
<wl:process name=" 2 ">
<p> you selected 2
</wl:process>
</h2>
<p> <a href="./testbeatags.jsp">Click Here</a> to start again!
</BODY>
</HTML>
This file is included in the additional materials for our redbook. For
instructions on obtaining these materials refer to Appendix A, “Using the
additional material” on page 235.
The deployment of the tag library to WebSphere was quite easy:
1. We put the tag library descriptor taglib.tld from the lib/weblogic-tags510.jar file (included in weblogic510sp6.zip) into the ITSO Web application
directory (D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\web).
2. Then we put all the class files from the lib/weblogic-tags-510.jar file into
the Web applications servlet directory. Ensure that the class files are
extracted to a subdirectory called weblogicx/jsp/tags as in the JAR, so that
all the class files are in the directory
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\servlets\weblogicx\jsp\tags\.
3. We put our JSP file testbeatags.jsp to
D:\WebSphere\AppServer\hosts\default_host\ITSO Web Application\web
When we started our sample JSP in a browser with http://localhost/itso/
testbeatags.jsp, we expected it would run without problems. But we got
several errors from the JIT-Compiler, because the WebLogic Server tag
library uses additional class files from the WebLogic Server standard lib path.
We had to copy these files into the Web applications servlet directory. They
Chapter 5. JavaServer Pages
89
were the weblogic\cluster\groupmessage.class and the
weblogic\common\WLSerializable.class. You can find these files in the
classes directory of the WebLogic Server root directory. Make sure to use the
correct subdirectories. So we now have the following files:
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\servlets\weblogic\cluster\GroupMessage.class
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\servlets\weblogic\common\WLSerializable.class
As we started our samples again the compiler told us that the process Tag
Attribute notname was not recognized as an attribute of the process bean. So
we had a look at the process class and noticed that the tag attributes
notname and notvalue are specified as notName and notValue. With
WebLogic Server and the Sun JDK this error was tolerated. For WebSphere,
we had to correct this in our testbeatags.jsp. When we reloaded the test JSP,
we were told that notName was not included in the tag library descriptor
taglib.tld. So we corrected the two entries for notname and notvalue to
notName and notValue in the taglib.tld and the sample JSP produced the
same output on WebSphere as on WebLogic Server. In the first third of the
output our sample shows the work of the cache tag. If you reload the page the
first date line is reloaded every time, the second date every 5 seconds and
the third line every 10 seconds. In the second third of the output there is a
simple repeat. In the last third of the output you can test the process tag. You
can click the buttons 1 or 2 to decide which lines are executed by the process
tag: the JSP displays either you selected 1 or the line you selected 2.
So it is possible to use the WebLogic Server tag library with WebSphere. We
had a few problems with the classes behind the JSP, but not with the JSP
itself. Nevertheless we would not recommend you use the WebLogic Server
tag library with WebSphere for several reasons. First we had to use additional
class files from WebLogic Server. There is no source code supplied with the
tag libraries nor with the additional WebLogic Server class files. We made
some minor errors when using the additional tags and using the supplied
documentation it was quite hard to find the bugs. Also it is not clear that the
use of the BEA code in WebSphere is license free or supported by BEA.
Should you require similar tags in WebSphere we recommend that you
develop your own tag libraries or use open software taglibs. For examples of
the open source tag libraries that are available, see http://java.sun.com/
products/jsp/taglibraries.html or http://jsptags.com/tags.
Migrating JSPs from WebLogic Server to WebSphere should not cause major
problems. We expect that it will involve minor activities such as importing
additional class libraries or replacing XML syntax with short-hand tags. Some
90
Migrating WebLogic Applications to WebSphere Advanced Edition
more examples of this can be found in 5.4, “Migrating JSP examples” on
page 100.
5.3 Deploying JSPs
Now let’s have a look at the differences between WebLogic Server and
WebSphere concerning deploying JSPs.
5.3.1 Deploying JSPs in WebLogic Server
For WebLogic Server there are two possibilities:
1. Deploy as a Web application:
To configure Web applications, you have to insert a line of the following
format into the weblogic.properties file:
weblogic.httpd.webApp.<ContextName>=<location>
The Web application can be specified as an expanded directory hierarchy,
for example:
weblogic.httpd.webApp.estore=d:/weblogic/petStore/petStoreServer/
estore
Or as an archived format (.war file):
weblogic.httpd.webApp.estore=d:/weblogic/petStore/petStoreServer/
estore.war
For more information about Web applications refer to Chapter 6, “Java
Servlets” on page 109.
2. Deploy as single JSPs into the document directory:
The following line from the weblogic.properties file shows the default
document root directory:
weblogic.httpd.documentRoot=public_html/
You can simply copy your JSPs to the directory:
D:/weblogic/myserver/public_html
If you use tag libraries you should put them into the web-inf subdirectory.
In order to handle JSPs properly you have to configure the JSP servlet first. It
is configured in weblogic.properties. The syntax is:
weblogic.httpd.register.*.jsp=\
weblogic.servlet.JSPServlet
weblogic.httpd.initArgs.*.jsp=\
pageCheckSeconds=<seconds>,\
Chapter 5. JavaServer Pages
91
compileCommand=<path to javac>,\
workingDir=<path to output directory>,\
verbose=<boolean>,\
keepgenerated=<boolean>
The concrete property settings for our default configuration are listed in step
3. on page 39. For detailed information about these properties refer to the
WebLogic Server documentation.
5.3.2 Deploying JSPs in WebSphere
To set up JSPs from WebLogic Server in WebSphere follow these steps:
1. Set up a Web application as described in step 4. on page 48.
2. Add a JSP enabler with the needed JSP level as described in 3.4, “Setting
up the WebSphere lab machine” on page 58.
3. Transfer the JSPServlet settings from WebLogic Server to WebSphere.
5.3.3 Parameter settings for JavaServer Pages
This section details the differences between the WebLogic JSP servlet
settings and the parameters understood by the WebSphere JSP processors.
5.3.3.1 Choosing the JSP processing servlet
The WebLogic settings weblogic.httpd.register.*.jsp=\ and
weblogic.servlet.JSPServlet can be set as the Servlet Web Path List of the
JSP servlet for a Web application using the WebSphere Administrative
Console as shown in Figure 33.
92
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 33. JSP servlet settings in a WebSphere application
5.3.3.2 The pageCheckSeconds parameter
The parameter pageCheckSeconds describes how often the WebLogic
Server will look for revised JSP files that need to be recompiled. To get better
performance you can set the amount of time between checks. It ls also
possible to set the parameter so that the server never checks for revised
JSPfiles. If you do this you must ensure that the class file for the JSP is
already available before the server executes the JSP.
pageCheckSeconds=<seconds> has the following possible values:
0
Every request
-1
Never
<seconds>
Amount of time in seconds before next check
Chapter 5. JavaServer Pages
93
The WebSphere Version 3.5.2 documentation says that you can set similar
properties for a Web application to control how often the server checks for the
presence of a class file when a JSP is executed.
The parameter checkjspfiles can be set to:
true
The check is made each time the JSP is called or at the
reloadinterval below.
firsttime Check only when the JSP is called for the first time.
false
The check is never done.
The parameter reloadinterval can be set to the amount of time in milliseconds
before the next check. This works only when you have selected true as the
value for checkjspfiles.
When testing this feature we found that it did not work when the checkjspfiles
parameter was specified as a Web application attribute. We found that
regardless of the setting used, WebSphere always checked for the presence
of a class file every time a JSP was called, and the class file was compiled if
the JSP source had changed.
However, we were able to get this to work as documented when checkjspfiles
was specified as an init parameter to the JSP 1.0 servlet. This did not work
with the JSP 0.91 servlet or the JSP 1.1 servlet.
5.3.3.3 The compileCommand parameter
The WebLogic parameter compileCommand has no equivalent in
WebSphere.
5.3.3.4 The workingDir parameter
The parameter workingDir has no equivalent in WebSphere. WebSphere puts
the .java and the .class files created when a JSP is accessed in a temporary
directory. This location varies according to the JSP processor that is being
used. The locations used are shown in Table 5.
Table 5. WebSphere JSP processor output locations
JSP
processor
Servlet name
Location of Java and class files produced
JSP 1.1
JspServlet
<was-root>\temp\<servlet-host-name>\<app-name>
JSP 1.0
JspServlet
<was-root>\temp\<servlet-host-name>\<app-name>
JSP 0.91
PageCompileServlet
<app-document-root>\pagecompile
94
Migrating WebLogic Applications to WebSphere Advanced Edition
5.3.3.5 The verbose property
The verbose property decides whether a detailed error message is sent to the
browser by WebLogic. For example if you try to import a Java class to a JSP
and the class is not in the class path, then if the property is true you get
information about which class could not be loaded and in which line of the
JSP code the error occurs. If the property is set to false you received only an
Error 500--Internal Server Error.
In WebSphere there is no equivalent of the verbose parameter. Detailed JSP
error information is written to the stdout log of the Web application.
5.3.3.6 The keepgenerated property
With the keepgenerated property you control whether the generated Java
files were kept. In WebSphere you can set keepgenerated as an init
parameter to the JSP servlet. This applies to the JSP servlet for JSP 1.0. This
servlet will keep generated Java code only if it is supplied with the
keepgenerated init parameter set to a value of true. However, the JSP 0.91
and 1.1 servlets have a different behavior: generated code is always kept and
a keepgenerated init parameter is not accepted.
5.3.4 Deploying JSPs in WebSphere
In WebSphere there are different ways to deploy JSPs:
1. If you have a Web application archive you can import the WAR file into
WebSphere. The import of Web applications is described in 6.7, “Migrating
a J2EE Web application” on page 118. Note that security information from
the web.xml file is not yet used, so you have to set up security separately.
2. If you have your JSPs as single files you can copy them from the
WebLogic Servers document root to your WebSphere Web applications
document root or a subdirectory of it.
3. As an alternative to option 2 you can use the Add a JSP File or Web
Resource task of the WebSphere Administrative Console. The steps to
follow are:
a. In the first window, select Yes to copy a Web Resource to a predefined
Web application. This is shown in Figure 34.
Chapter 5. JavaServer Pages
95
Figure 34. Adding a JSP
b. In the next window, Figure 35, you have to select the Web application.
For our example, it is the ITSO Web Application.
96
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 35. Selecting a Web application
c. Then you are asked to specify a JSP file as shown in Figure 36. You
can only add one JSP at a time. Additionally you can add a relative
path structure (relative to the Web application’s document root
directory). With our sample path JSPExamples, the JSP testbeatags
would be copied to the path
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\web\JSPExamples.
Chapter 5. JavaServer Pages
97
Figure 36. Selecting a JSP file
d. After clicking Finish your selected JSP file will be added. This will copy
the JSP file and add a Web resource to the default host. If you plan to
set security for a JSP it must be added as a Web resource.
5.3.5 Using tag libraries
If you use tag libraries, deployment is automatic if you import from a Web
application archive. If you copy the individual JSP files to WebSphere or use
the WebSphere Administrative Console JSP wizard, you must take additional
steps to deploy the tag libraries. You must copy the .tld files to your Web
application’s document directory or subdirectory and the necessary class files
into the Web application’s classes directory. In your JSP you can refer to the
.tld file directly, relative to the root of the Web application, or preferably use
an indirection by setting the tag library property of the Web application. This
property consists of two parts:
• URI - Tag library name for use in the Web application
• Location - Where to find the tag library description file for the tag library,
identified relative to the root of the Web application
98
Migrating WebLogic Applications to WebSphere Advanced Edition
This makes the TLD configurable at deployment time. Figure 37 shows how to
set the tag libraries property:
Figure 37. Tag library property
5.3.6 Securing JSPs
In WebSphere please note that servlets, JSP files, and Web pages are not
represented directly, but can be selected according to their Web resource
configurations. Web resources specify Web paths to these resources. If
configuring resource security for a servlet, JSP file, or Web page, select the
appropriate Web resource.
The WebSphere documentation for adding a JSP URI to a Web application
suggests using the Add JSP or Web resource task from the WebSphere
Administrative Console. This task adds the JSP URI but does not add the JSP
to the Web application. This can cause problems when using WebSphere
security to protect the JSP Web paths (URIs). The Web paths (URIs) are
treated as Web server resources because they are not part of a Web
application. Therefore, security doesn't work as intended.
Chapter 5. JavaServer Pages
99
Do not use the Add a JSP or Web resource task to introduce new JSP Web
paths (URIs) and to associate with Web applications. If you have already
done so, first remove all the Web paths (URIs) and then follow these steps in
the WebSphere Administrative Console:
1. Select the Topology View
2. Expand Node->App Server->Servlet Engine to view the Web application
3. Select the JSP file processor servlet in that application
4. In the configuration panel for that JSP file, there is a list of Web paths; it
should contain /default_host/<:webapp-path>/*.jsp
5. Click Add (to add to the Web path list)
6. Enter the Web paths (URIs) you want to protect (for example, /
default_host/<:webap-path>/toBeProtected.jsp)
7. Repeat step 6 for all the JSP files you want to protect
8. Apply and complete this task
9. Follow standard security configuration steps to protect these newly added
JSP files
10.Restart the application server
5.4 Migrating JSP examples
We migrated some of the WebLogic Server JSP examples to WebSphere. If
you want to try the examples make sure that you did the WebSphere
configuration as described in Chapter 3, “Configuration” on page 33.
1. Create a subdirectory \JSPExamples in the ITSO Web Application Web
Path (D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\web\).
2. Copy all the files from D:\weblogic\examples\jsp\ to the JSPExamples
directory.
3. Create a directory D:\WebSphere\AppServer\hosts\default_host\ITSO
Web Application\web\images
4. Copy the files from the directory D:\weblogic\examples\images to
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\web\images
5. Now open a browser and try the following URL http://localhost/itso/
JSPExamples/index.html
6. Select HelloWorld.jsp and choose the run link
100
Migrating WebLogic Applications to WebSphere Advanced Edition
You now should see the output from the simple HelloWorld JSP.
We also tried some of the other examples:
• Showdate.jsp
This sample works without modification.
• ErrorPage.jsp and ThrowException.jsp
You have to import the Java class java.io.PrintStream in ErrorPage.jsp. Do
so by changing the line:
<%@ page isErrorPage="true" %>
to:
<%@ page isErrorPage="true" import="java.io.PrintStream" %>.
Then the sample works. Start it with the URL http://localhost/itso/
JSPExamples/ThrowException.jsp
• SnoopServlet.jsp
After you add the line <%@ import="java.util.Enumeration" %> in the file
SnoopServlet.jsp and remove the following block (because of using
weblogic.security.X509 classes), the sample works fine:
<h3>Certificate Information</h3>
<pre>
.
.
.
</pre>
Start the sample with the URL
http://localhost/itso/JSPExamples/SnoopServlet.jsp
• SessionServlet
Add the line <%@ import="java.util.Enumeration" %> to the file. The URL to
start the sample is:
http://localhost/itso/JSPExamples/SessionServlet.jsp.
Finally we migrated three Tag Extension Examples:
• Counter Example:
a. Open a command window and change the directory to D:\weblogic
b. Start the command setenv.cmd
c. Change directory to D:\weblogic\examples\jsp\tagext\counter
d. Compile the Java files in the directory with the command javac *.java
Chapter 5. JavaServer Pages
101
e. Create a new directory:
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\servlets\weblogic\taglib\counter
f. Copy all the class files from the directory:
D:\weblogic\examples\jsp\tagext\counter to the new directory
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\servlets\weblogic\taglib\counter
g. Copy pagehits.jsp from D:\weblogic\examples\jsp\tagext\counter to
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\web\JSPexamples
h. Copy counter.tld from D:\weblogic\examples\jsp\tagext\counter to
D:\WebSphere\AppServer\hosts\default_host\ITSO Web
Application\web
i. Run the example from your browser with the URL http://localhost/
itso/jspexamples/pagehits.jsp
• Quote Sample:
a. In the file D:\weblogic\examples\jsp\tagext\quote\WEB-INF\web.xml
change the first line from:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 1.2//EN" "http://java.sun.com/j2ee/dtds/webapp_2_2.dtd">
to:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.2//EN" "http://java.sun.com/j2ee/dtds/webapp_2_2.dtd">
This is because only Servlet 2.2-compliant web.xml files can be
imported into WebSphere.
b. Change to the directory D:\weblogic\examples\jsp\tagext\quote.
c. Create a new directory classes.
d. Compile the Java file CodeTag.java with the command:
javac -d ./classes CodeTag.java
e. Create a WAR file: jar cf quote.war *.
f. Import the WAR file into WebSphere at the administrative console with
Console ->Tasks->Convert a War File.
g. Select ITSO Servlet Engine as shown in Figure 38.
102
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 38. import quote.war - select Servlet Engine
h. Select default Host. as shown in Figure 39.
Figure 39. import quote.war - select Virtual Host
i. Select the quote war file as shown in Figure 40.
Chapter 5. JavaServer Pages
103
Figure 40. import quote.war - select WAR file
Select the destination directory C:\WebSphere\AppServer\hosts\default_host
as shown in Figure 41.
Figure 41. Import quote.war - select Destination Directory
j. Enter /quote as the Web Application Web Path and quote as the Web
Application Name as shown in Figure 42.
104
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 42. import quote.war - enter Web Application path and name
k. Stop and Start the ITSO Server at the administrative console.
l. Copy the file
D:\WebSphere\AppServer\hosts\default_host\quote\web\CodeTag.java
to
D:\WebSphere\AppServer\hosts\default_host\quote\web\CodeTag2.jav
a.
m. In the file
D:\WebSphere\AppServer\hosts\default_host\quote\web\showcode.jsp
change the first appearance of:
<%@ include file="CodeTag.java" %>
to:
<%@ include file="CodeTag2.java" %>
This is because the include of the CodeTag.java file is twice in
showcode.jsp and this is intended. The WebLogic JSP Compiler has no
problem with this. But when we wrote this book the WebSphere JSP
1.1 Compiler had a bug so that it assumed a loop had occurred when it
encountered multiple includes in a JSP file, so a compile error was
produced. To work around this problem, we duplicated the include file
and changed one of the includes.
n. Run the example http://localhost/quote/showcode.jsp.
Chapter 5. JavaServer Pages
105
• Session Sample
a. In the file D:\weblogic\examples\jsp\tagext\session\WEB-INF\web.xml
change the first line from:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 1.2//EN" "http://java.sun.com/j2ee/dtds/webapp_2_2.dtd">
to:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.2//EN" "http://java.sun.com/j2ee/dtds/webapp_2_2.dtd">
b. Change to the directory D:\weblogic\examples\jsp\tagext\session\webinf.
c. Create new directory classes.
d. Compile the Java files in this directory with the command javac -d ./
classes *.
e. Create a WAR file: jar cf session.war *.
f. Import the WAR file into WebSphere similar to the import of the quote
example mentioned before. Use session as the Web application name
and /session as the Web applications document root.
g. Run the example http://localhost/session/SessionList.jsp.
• UseXMLSyntax
This example uses XML syntax instead of short-hand tags. We did not get
this example to work in WebSphere, but we do not regard this as a major
migration issue. As we discussed on page 87, XML format is not required
in JSP 1.1 and we do not believe it has been widely used in current
WebLogic applications. Also it is likely that any XML-formatted JSPs
written for WebLogic V5.1 will still have to be migrated to the JSP 1.2 level
because the current WebLogic support does not enforce key parts of the
JSP 1.2 Specification.
<!doctype html public "-//w3c/dtd/HTML 4.0//en">
<html>
<head>
<title>JSP DATE EXAMPLE</title>
<jsp:directive.page import="java.util.Date" />
</head>
<body bgcolor=#ffffff>
<font color=#DB1260>
106
Migrating WebLogic Applications to WebSphere Advanced Edition
<h1>JSP DATE</h1>
<h2>
The date is <jsp:expression> new Date() </jsp:expression>.
</h2>
</BODY>
</HTML>
Chapter 5. JavaServer Pages
107
108
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 6. Java Servlets
This chapter discusses the issues you may encounter when migrating Java
Servlets from BEA WebLogic Server to WebSphere Application Server,
Advanced Edition.
6.1 Technology overview
Java Servlets were developed by Sun Microsystems as a replacement
technology for Common Gateway Interface (CGI) scripts and applications.
Both CGI and Java Servlets address the same problem; they provide a means
for dynamically responding to HTTP requests, allowing for dynamically
generated content to be returned to the HTTP client (usually a Web browser),
and permitting server-side actions to be taken in response to HTTP requests.
The problems with CGI include:
• CGI applications are launched in response to a single HTTP request, and
then terminated when the request was handled. Because launching an
application is an expensive operation, this is a very inefficient means of
responding to requests.
• CGI applications do not have a readily usable abstraction layer for
handling HTTP requests. Developing CGI applications (especially those
that need to provide statefulness) requires a great deal of detailed
knowledge about the (stateless) HTTP protocol.
• CGI applications are native applications. They represent a large migration
problem if the hardware platform changes, which can be a common
occurrence when Web sites are scaled up to deal with increased load (a
problem compounded by the heavyweight nature of the CGI applications).
• Depending on the language used to develop CGI applications (the most
common language for developing CGI applications is C), memory leaks
are quite common. This in turn is compounded by the fact that many CGI
applications are written by relatively inexperienced developers.
By contrast, Java Servlets, running inside a Java servlet engine (a type of
HTTP server), solves these problems.
• Java Servlets run as a lightweight thread within the Java servlet engine.
This dramatically reduces the overhead cost of handling an HTTP request.
• The Java Servlets API provides a rich and useful abstraction layer for
examining HTTP requests and generating responses. Many common
problems, such as dealing with session state and handling the differences
© Copyright IBM Corp. 2001
109
in parameters from HTTP GET and POST operations, are solved easily
within the Java Servlets API. In addition to the servlet API, the developer
gets full access to the rest of the Java APIs.
• Java Servlets are written in Java. Because of this, they can be readily
moved from one hardware platform to another, as long as the servlet
engine is also available on that platform. Indeed, due to the
standardization of the API, it is usually very easy to migrate from one
servlet engine to another.
• Java’s memory protection and garbage collection prevents most common
forms of memory leaks.
The most significant problem with Java Servlets is that they do not provide for
a clean separation of code from the HTML content that they are intended to
generate. To solve this problem, Sun Microsystems introduced the
JavaServer Pages (JSP) API. JSP is a technology built on top of Java
Servlets, and allows for a content-focused means of generating dynamic
content. This allows for a cleaner separation of the decision-making dynamic
data generation from the task of generating dynamic content to present that
data.
JavaServer Pages are covered in Chapter 5, “JavaServer Pages” on page 85.
6.2 Web application design
The increasingly more common method of designing Web-based applications
is based on the Model 2 architecture, as illustrated in Figure 43 on page 110.
Client
Server
HTTP
Web
Browser
Command
Servlet
HTML
JSP
ResultBean
Business
Logic Bean
Web
Browser,
Java Applet
Command
Client
(Proxy)
RMI over IIOP
Command
Server Bean
Figure 43. Model 2 architecture
110
Migrating WebLogic Applications to WebSphere Advanced Edition
In this architecture, HTTP requests (usually generated by a Web browser) are
submitted to a controlling servlet. This servlet examines the parameters
submitted with the request to determine what actions need to be performed.
The servlet will then call methods on one or more Java classes (the Business
Logic Bean(s) in the diagram, which would include normal Java classes and
Enterprise JavaBeans), and the results will be stored in other Java classes
(the Result Beans). After this, the servlet will forward the request to a JSP,
which will examine the Result Beans in order to generate the content that is
returned to the client.
Those readers familiar with object-oriented design patterns will recognize that
the Model 2 architecture is analogous to the more common Model-ViewController (MVC) architecture.
In this architecture, the role of the servlet is as a traffic cop. The values of
parameters coming into the servlet via the HTTP request determine the
actions to be taken, and the servlet directs the flow-of-control during the
request processing. A common means of doing this is to implement a statemachine, and use the HTTP request parameters to identify the current state
and the triggered event. This approach is illustrated in Sun Microsystems’
sample application, the Java Pet Store.
Other suitable uses of servlets would include any situation where there is
significant code and business logic to be processed in response to an HTTP
request. This code and business logic would ideally be encapsulated in a
Java class of its own, leaving the servlet as a wrapper (with a URL) that
accepts the HTTP request and passes the parameters to the Java class.
Writing extensive code into a servlet, while certainly possible, is not normally
a good idea. Thus, servlets are best used as a facade to another Java class,
where it is necessary to respond to an HTTP request, and where finer control
over the HTTP request and response is needed than provided by JavaServer
Pages.
6.3 The importance of being a servlet
Because servlets serve as the entry point for Web clients into your
application, they play a very prominent role in a migration project. Along with
JSPs and static HTML pages, servlets are the visible part of the application,
and thus provide the area where you can hide the effects of the migration as
long as possible.
Chapter 6. Java Servlets
111
6.4 Migration examples
For the purposes of this project, we migrated several of the example servlets
that are provided with WebLogic Server 5.1. Some were not attempted; for
example, we did not migrate the PageEvent servlet since WebLogic Events
are not supported in WebSphere. We also did not migrate the servlets that
used the htmlKona extensions, for reasons discussed later in 6.10, “Migrating
htmlKona” on page 125.
The example servlets we migrated are:
•
•
•
•
•
•
•
examples.servlets.CookieCounter
examples.servlets.HelloWorldServet
examples.servlets.HelloWorld2
examples.servlets.HelloWorld3
examples.servlets.SessionServlet
examples.servlets.SimpleServlet
examples.servlets.SnoopServlet
These examples were migrated with no code changes.
The examples that were not migrated are:
•
•
•
•
•
•
•
examples.servlets.AppletServlet
examples.servlets.ErrorServlet
examples.servlets.HelloKonaServlet
examples.servlets.PageEvent
examples.servlets.PhoneServlet
examples.servlets.SimpleFormServlet
examples.servlets.SurveyServlet
As mentioned earlier, the PageEvent servlet was not migrated due to lack of
support for WebLogic Events. The other servlets were not migrated due to the
use of htmlKona. In all of those cases, however, migration would have
consisted of replacing the htmlKona code with some other means of
preparing the HTML output.
The steps taken to migrate the HelloWorldServlet are listed in 6.6, “Deploying
an unpackaged servlet In WebSphere” on page 113. The other servlets all
followed the same procedure, and so are not discussed specifically.
In addition to these examples, we migrated the example Web application that
is shipped with WebLogic Server 5.1. This is documented in 6.7, “Migrating a
J2EE Web application” on page 118.
112
Migrating WebLogic Applications to WebSphere Advanced Edition
Finally, as discussed in Chapter 9, “Migration example: The Java Pet Store”
on page 181, we migrated the Java Pet Store, including the Web application
component.
The lessons learned during these migrations are documented within this
chapter.
6.5 Differences in implementation
WebLogic Server 5.1 is a fully compliant implementation of the Java Servlets
2.2 Specification from Sun Microsystems. As such, standard Java Servlets
2.2 code will work correctly.
WebSphere Application Server, Advanced Edition 3.5, with fix pack 2
installed, has partial support for the Java Servlets 2.2 Specification. Support
is provided for all of the Java Servlet 2.2 Specification, with the exception of
the J2EE extensions. In particular, the security support remains at the servlet
2.1 level, and there is no support for J2EE references that would normally be
defined in the web.xml file associated with the Web application. There is also
no direct support for Web application, but support is provided to convert a
Web application archive, or WAR file, subject to the API restrictions described
above.
For further information on the servlet 2.2 limitations in WebSphere, see the
release notes for fix pack 2 to WebSphere Application Server, Advanced
Edition. We address the major issues outlined in the fix pack later on in this
chapter.
6.6 Deploying an unpackaged servlet In WebSphere
An unpackaged servlet is the term we have decided to use to describe a Java
servlet that is not part of a Web application archive. It may be available in a
directory or a JAR file, or available as part of the classpath for WebSphere in
some other mechanism. Unpackaged servlets are deployed individually,
whereas packaged servlets are deployed en masse, as part of a Web
application archive.
In order to deploy a servlet, you need to have several things available.
• You need to have access to the class file of the servlet, as well as any
supporting classes. Note that WebSphere has available to it the standard
Java classes, as well as the Java Servlets API.
• You need to determine what URLs the servlet will be mapped to.
Chapter 6. Java Servlets
113
• You need to determine the initialization parameters that the servlet will
use.
The last two items can be determined by examining your weblogic.properties
file. Consider the following entry:
weblogic.httpd.register.itso/
helloWorld=examples.servlets.HelloWorldServlet
weblogic.httpd.initArgs.helloWorld=\
message=Hello World!
This entry registers the servlet, examples.servlets.HelloWorldServlet, to a
URI of itso/helloWorld (relative to the base URL of the WebLogic Server). If
WebLogic Server was running on http://localhost:7001/, then the above
servlet would be accessible at http://localhost:7001/itso/helloWorld.
In addition, the entry above specifies that the servlet will be passed one
initialization parameter, with the name of message and the value of Hello
World!. The servlet does not actually use these initialization parameters; they
are included for demonstration only.
For the purposes of this example, we shall assume that the classpath
required to locate the examples.servlets.HelloWorldServlet is
D:\WeblogicExamples. We are also assuming that, at this point, no code
changes need to be made to the servlet. This is a likely scenario, assuming
that no WebLogic-specific code has been used, since unpackaged servlets
cannot take advantage of the J2EE extensions that WebSphere does not
support.
The steps to deploy this unpackaged servlet are straightforward.
1. In the WebSphere Administrative Console select the Web application to
deploy the servlet into. This will display the properties for the Web
application. Creating a Web application is covered in step 4. on page 48.
2. Add the classpath for the servlet to the classpath of the Web application.
This is illustrated in Figure 44 on page 115. If there is a need to use any
third-party classes, ensure that the classpath entries include them.
114
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 44. Setting the classpath for a Web application
3. Right-click on the Web application, and select Create ->Servlet from the
resulting pop-up menu.
4. On the Create Servlet dialog, enter in the information to configure the
servlet. An example of this can be seen in Figure 45 on page 116. There
are some important items to note about the dialog:
- The servlet name is used by WebSphere to identify the servlet. It is not
related to the URL used to access the servlet.
- The servlet Web path list is used to assign the URL(s) used to access
the servlet. It is automatically prefixed by the WebSphere host and Web
application, as shown in Figure 46 on page 116. This is mapped to a
URL depending on the host settings. For example, if the host is
mapped to http://localhost/, then the URL for the servlet would be
http://localhost/itso/helloWorld.
- The initialization parameters are on the Advanced tab of the Create
Servlet dialog.
Chapter 6. Java Servlets
115
Figure 45. The Create Servlet dialog
Figure 46. The Add Web Path to Servlet dialog
5. Finally, start the Web application. The servlet should now be accessible.
If there is a problem accessing the servlet, verify that the classname of the
servlet is entered correctly, that the classpath of the Web application is
correctly entered (including any supporting classes used by the servlet), that
the URL is correct, and that the Web application is running.
6.6.1 Problems converting servlets
This section details some of the issues we found when converting servlets.
116
Migrating WebLogic Applications to WebSphere Advanced Edition
6.6.1.1 Case-insensitive data treated sensitively
The most significant problem we had in converting unpackaged servlets was
with retrieving header names from an HttpServletRequest. We had a servlet
that displayed the HTTP headers. Rather than using
HttpServletRequest.getHeader(String name) to retrieve the HTTP header it
was seeking, it retrieved an enumeration of the header names (via
HttpServletRequest.getHeaderNames()), and examined them individually.
According to the Java Servlet 2.2 JavaDoc, the HTTP headers are caseinsensitive. However, the code examining the headers was not. WebLogic
returned the header names in a mixed-case format, whereas WebSphere
returned them all as lowercase.
The service() method of the servlet was like this:
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException,
java.io.IOException {
java.io.PrintWriter out = resp.getWriter();
java.util.Enumeration headers = req.getHeaderNames();
while (headers.hasMoreElements()) {
String name = (String)headers.nextElement();
String value = req.getHeader(name);
out.println(“Header name “ + name + “ has value “ + value);
}
}
The output from WebLogic was:
Header name Connection has value Keep-Alive
Header name User-Agent has value Mozilla/4.76 [en] (WinNT; U)
Header name Host has value localhost:7001
Header name Accept has value image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, image/png, */*
Header name Accept-Encoding has value gzip
Header name Accept-Language has value en
Header name Accept-Charset has value iso-8859-1,*,utf-8
The output from WebSphere was:
Header name accept has value image/gif, image/x-xbitmap, image/jpeg,
image/pjpeg, image/png, */*
Header name accept-charset has value iso-8859-1,*,utf-8
Header name accept-encoding has value gzip
Header name accept-language has value en
Header name connection has value Keep-Alive
Header name host has value localhost
Header name user-agent has value Mozilla/4.76 [en] (WinNT; U)
Chapter 6. Java Servlets
117
As can been seen, the case of the header names has changed, but the
header values have not. Code that relies on the case of the header names
would not migrate unchanged from WebLogic to WebSphere.
It is worth noting that the HttpServletRequest.getHeader(String name)
method is case-insensitive as well.
6.6.1.2 Using third-party classes
In order to enable the use of third-party classes in WebSphere, the classpath
of the Web application needs to be modified. WebSphere Application Server,
Advanced Edition 3.5.2 supports third-party classes written to conform to the
Java 1.2.2 Specification (or earlier). It does not support Java 1.3 classes at
this time.
6.7 Migrating a J2EE Web application
WebSphere Application Server, Advanced Edition lacks direct support for
J2EE Web applications, but a tool is provided, within the WebSphere
Administrative Console, to convert WAR files. This tool is accessible by
selecting Console ->Tasks ->Convert A War File from the main menu. This
will take you through a series of steps. For this example, we built the example
J2EE Web application that is delivered with WebLogic Server into a WAR file,
which we placed at D:\WeblogicExamples\cookie.war.
1. First, you select the servlet engine to deploy the J2EE Web application
into.
2. You then select the host to deploy into.
3. Next, you select the WAR file to be deployed.
4. You then select the directory that the J2EE Web application will be
unpacked into. This will be used as the root for the WebSphere-style Web
application.
5. As the final step, you have to enter the name of the Web application and
the path to the root of the Web application (from the root of the host). This
is a defect in the WebSphere implementation, because it should be able to
read this information from the web.xml file that is part of the WAR file.
118
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 47. Applying the Web Name and Path to the converted Web application
You should then be able to access the root page of the Web application
according to the settings of the host you selected and the path you entered in
the final step. For our example, this was http://localhost/itso-webapp.
6.7.1 Problems With converting Web applications
6.7.1.1 Strict servlet-mappings
One problem that is worth noting is that WebSphere is strict about having the
servlet-mapping section of the web.xml file conform to the Java Servlets 2.2
Specification (Section 10.2). In particular, it requires that the servlet-mapping
begin with a ‘/’ character. The sample web.xml file provided with WebLogic
Server does not conform to this rule. This prevents the servlets from being
deployed, but is a simple problem to correct (if not to diagnose).
An example of a bad servlet-mapping would be:
<servlet>
<servlet-name>CookieCounter</servlet-name>
<servlet-class>servlets.CookieCounter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieCounter</servlet-name>
<url-pattern>monster</url-pattern>
</servlet-mapping>
Chapter 6. Java Servlets
119
The correct servlet-mapping would be:
<servlet>
<servlet-name>CookieCounter</servlet-name>
<servlet-class>servlets.CookieCounter</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieCounter</servlet-name>
<url-pattern>/monster</url-pattern>
</servlet-mapping>
6.7.1.2 Problems binding JSPs into servlets
J2EE-style Web applications allow a servlet to be deployed either as a
compiled Java class, or as a JSP file. An example of this would be:
<servlet>
<servlet-name>CookieCounter</servlet-name>
<jsp-file>cookie.jsp</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieCounter</servlet-name>
<url-pattern>monster</url-pattern>
</servlet-mapping>
WebSphere only allows compiled Java classes to be deployed as servlets.
In order to migrate applications that use JSPs as servlets, we recommend
that the JSP be implemented as a servlet.
6.8 Converting J2EE references
The deployment descriptor in J2EE Web applications allows for various
references to be defined. The purpose of these references is to allow the
developer to be able to access various environment-dependent values (such
as EJB homes and DataSources), in such a way that does not impact the
deployer. These values are then able to be retrieved within the JNDI name
space of “java:comp/env”.
The deployment descriptor provides a mapping of these JNDI entries to the
values correct for the deployed environment.
For a more complete description of J2EE References, as they exist in Web
applications, see Section 9.9 of the Java Servlets 2.2 Specification, and
Chapter 5 of the Java 2 Platform, Enterprise Edition 1.2 Specification.
120
Migrating WebLogic Applications to WebSphere Advanced Edition
Unfortunately, WebSphere Application Server, Advanced Edition 3.5.2 does
not support this functionality (Web applications and related features are an
optional component of the Java Servlets 2.2 Specification), whereas
WebLogic Server 5.1 does support it. The only solution is a manual
conversion of the JNDI lookups.
J2EE References fall into three categories. These are:
• Environment entries (env-entry)
• Enterprise Java Bean references (ejb-ref)
• Resource references, such as JDBC data sources (resource-ref)
Converting EJB and resource references is covered extensively in 7.4, “JNDI
lookups expanded” on page 134. However, the solution for environment
entries for EJBs will not work for servlets.
Under WebSphere, the most appropriate means of providing similar
functionality is to pass in the environment variables either as initialization
parameters to the servlet, or as attributes on the servlet engine.
Values passed in via the initialization parameters are available via the
getInitParameter() method on the ServletConfig (available via
Servlet.getServletConfig()).
Values passed in as attributes on the servlet engine are available via the
getAttribute() method on the servlet Context (available via
ServletConfig.getServletContext()).
To retain complete functionality, you would define the value as an attribute on
the servlet engine, and then pass the name of that attribute in as an
initialization parameter to the servlet. Thus, a line of code like this:
String value = (String)(new InitialContext().lookup(“java:comp/env/Name”));
would become:
String value =
getServletConfig().getServletContext().getAttribute(getServletConfig().get
InitParamter(“Name”));
However, for many applications, this form of double-indirection, while
retaining deployment flexibility, is probably overkill. It would normally be
acceptable to provide the value either as an initialization parameter, or as an
attribute of the servlet engine, and use either the ServletConfig or
ServletContext to retrieve the value.
Chapter 6. Java Servlets
121
6.9 Converting J2EE security
In this section we discuss the issues associated with security migration.
6.9.1 Migrating the user database
This section does not describe how to migrate user settings from WebLogic
Server to WebSphere Application Server, Advanced Edition. Both products
have sophisticated user management tools, including the ability to delegate
user authentication to the operating system or a directory service. For this
reason, the actual migration of the user database is beyond the scope of this
section, and, indeed, this book.
WebSphere Application Server, Advanced Edition can be configured to
authenticate users either against the local operating system, or, using
Lightweight Third Party Authentication, against an LDAP-based directory
service.
6.9.1.1 Authenticating against the operating system
In order to configure WebSphere to use the operating system for
authentication, you need to start up the WebSphere Administrative Console.
Once started, select Console ->Tasks ->Configure Global Security
Settings.
Figure 48. Selecting the authentication mechanism
122
Migrating WebLogic Applications to WebSphere Advanced Edition
Once the Set Global Security Wizard dialog is displayed, you should switch to
the Authentication Mechanism tab. From this tab, you can select the local
operating system as the authentication mechanism.
For further information on how to configure WebSphere Application Server,
Advanced Edition authentication settings, especially for authenticating
against an LDAP directory, consult the WebSphere documentation.
6.9.2 Changes required for security migration
WebSphere Application Server, Advanced Edition support for Java Servlets
includes the full API for security. Therefore, no code changes should need to
be made in order to migrate security-related aspects of Java Servlets.
However, as WebSphere Application Server, Advanced Edition has no
support for J2EE Web applications, it is not possible to declaratively secure
parts of the Web application. Instead, it is necessary to use the WebSphere
Administration Console to secure the Web application. For information on
how to do this, consult the WebSphere documentation.
In addition, if the Web application being migrated uses form-based
authentication, it is necessary to create a Custom Login Form for
WebSphere.
The Java Servlets 2.2 Specification discusses two types of authentication
mechanisms. These are HTTP-based authentication mechanisms (HTTP
Basic, HTTP Digest, and HTTPS client), and form-based authentication. For
more details on the types of authentication mechanisms, consult Section 11.5
of the Java Servlets 2.2 Specification.
6.9.2.1 Configuring WebSphere to use HTTP-based authentication
In order to use HTTP-based authentication, you need to open the WebSphere
Administrative Console, and select Console ->Tasks ->Configure Global
Security Settings. Once the Set Global Security Wizard is displayed, select
the Application Defaults tab.
Chapter 6. Java Servlets
123
Figure 49. Setting the challenge type
Selecting a challenge type of Basic (User ID and Password) will configure
WebSphere to use HTTP-based authentication.
6.9.2.2 Configuring WebSphere to use form-based authentication
WebSphere can be configured to use form-based authentication. To do this,
follow the steps outlined in 6.9.2.1, “Configuring WebSphere to use HTTPbased authentication” on page 123, but select Custom as the challenge type.
You will also be required to specify the URL to use for authentication. Two
fields are available, providing a URL for login, and another for relogin.
However, these are required to be the same in the current version of
WebSphere Application Server, Advanced Edition.
The URL provided may be a static HTML page, or it may be a servlet.
Ultimately, however, the user should submit user information, such as a user
ID and password, to a servlet, which can then use the IBM Security APIs to
authenticate the user. For an example of such a servlet, see the
CustomLoginServlet provided with WebSphere. The servlet should be
available at %WAS_HOME%\servlets\CustomLoginServlet.java.
124
Migrating WebLogic Applications to WebSphere Advanced Edition
6.10 Migrating htmlKona
htmlKona is an API available with WebLogic Server, expressly for creating
and manipulating HTML programmatically.
WebSphere does not have such a set of APIs distributed with it. The
recommended approach is to replace the use of htmlKona with JavaServer
Pages, which allow for more convenient development and maintenance of the
HTML.
If there is a strong need to manipulate HTML programatically, we suggest that
you instead manipulate XHTML, a version of HTML 4.0 that is XMLcompatible. This will permit you to use the powerful IBM XML parser tools. In
any event, migrating servlets that make extensive use of the htmlKona APIs
will require extensive rewriting of code.
Chapter 6. Java Servlets
125
126
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 7. Enterprise JavaBeans
This chapter presents a comprehensive set of EJB migration issues and
recommendations. It is based primarily on an analysis of the EJB 1.0 and EJB
1.1 Specifications.
7.1 Introduction
Enterprise JavaBeans (EJBs) are the core of the J2EE enterprise Java
component technology. EJBs are remotely accessible, distributed objects.
They implement the business logic of an enterprise system and provide
clients with Java interfaces for remote access. As enterprise components,
EJBs extend the write once run anywhere feature of Java to enterprise
transactional servers, such as WebSphere and WebLogic. In theory, an EJB
can be redeployed in any J2EE server without recompilation. All that is
required is a redeployment, optionally modifying deployment parameters to
conform with the new operational environment.
Figure 50 on page 128 depicts the EJB architecture. The basic idea is that
EJBs live inside containers provided by J2EE vendors. The container is
responsible for resource services such as persistence, transactions, security,
and resource management, while the EJBs implement the business logic.
Other Java classes can live in the same container for use by EJBs, in
particular for access to legacy systems. Clients create and access EJBs
through Java interfaces. Although the interfaces declare the EJB business
methods, interface calls are intercepted by the container. EJBs only get
control indirectly through container-managed method calls. The container
delegates interface calls to its contained EJBs only after performing
necessary system services.
An EJB is parameterized to enhance its portability. It can reference
environment properties, other resources such as DataSources, and other
EJBs, but only through indirect named references. The names are compiled
into the EJBs, and their values are provided by deployment descriptors.
Transaction management, security management, and container-managed
persistence (CMP) are also specified by declarative deployment parameters.
A deployment descriptor is constructed for the EJBs as part of an assembly
process. A deployment descriptor tool simplifies this process and packages
the result as an ejb-jar file. This file contains the original EJB classes and
interfaces along with the completed deployment descriptor.
The next step is to deploy the ejb-jar into the container. Code is generated
during this step. Stubs and ties are generated for RMI-IIOP remote access to
© Copyright IBM Corp. 2001
127
client
(servlet, application)
remote
home
lookup resource
stub
stub
access,
update
create,
find
ejb-ref
lookup resource
1.0
environment
container
CMP & transactions
1.1
resource-ref
env-entry
deployment descriptors
ties
JNDI
server
EJB
other Java classes
Figure 50. EJB architecture
the EJB objects. Vendor-specific code is also generated. This code includes
the vendor’s implementation of the deployment parameters. Vendors may
extend deployment descriptors with vendor-specific features. Additional code
may be generated to support these features.
The container provides a JNDI server for runtime access to the values of
deployment parameters. These values are loaded into the server when an
EJB is started. At that point, the EJB is available to all clients for access
through the JNDI server. Clients can include servlets, Java applications, and
other EJBs. Environment properties are also made available, but only to the
EJBs with which they were deployed. One of the major changes between the
EJB 1.0 and the EJB 1.1 Specifications affects the programmatic interface for
access to environment properties. EJB 1.0 uses a Properties object, while
EJB 1.1 uses the JNDI server.
128
Migrating WebLogic Applications to WebSphere Advanced Edition
At runtime, a client locates an EJB’s home through the appropriate JNDI
server. For a servlet in a Web server, this is normally the container’s default
JNDI server. A public JNDI server is needed for remote access directly from
an application. The EJB’s home object implements the Home interface and is
used to create or find EJB instances. EJB instances are referenced by the
resulting stubs. The stubs implement the EJB’s Remote interface. The
Remote interface supports all of the business logic methods, providing
access and manipulation of the remote EJB instances.
7.2 Major migration issues
The WebLogic 5.1 container and deployment tools follow the EJB 1.1
Specification. The WebSphere 3.5 container and deployment tools follow the
EJB 1.0 Specification. Thus, migrating EJBs from WebLogic 5.1 to
WebSphere 3.5 requires that we migrate the EJBs from the EJB 1.1 to the
EJB 1.0 Specification. The bulk of this chapter identifies and discusses the
required modifications. In most cases, no source code changes are required
because the EJBs are compliant with both specifications. For the cases that
require changes, we outline the available alternatives. When source code
changes are required, we encourage minimal changes so that the code can
easily revert back to the EJB 1.1 Specification in the future.
We used the EJB specifications themselves as the major source of
information for this chapter. Appendix C, “Revision History” of the EJB 1.1
Specification is a complete list of changes to the EJB specifications. Over 100
changes are documented there. We discovered that only eight of these
changes actually affect the reverse migration from EJB 1.1 to EJB 1.0. They
are described in the following sections of this chapter. There are about 20
other changes to the specifications that have no impact on migration. For
completeness, these are documented in 7.12, “Non-issues” on page 150.
Most of the remaining changes are improvements and corrections to the
document itself, and do not constitute substantive changes to the EJB
specifications.
The title of each of the following sections describes the specification change
that led to a migration issue. We provide a detailed background on each of
these specification changes along with our recommendations for the resulting
migration issues. As appropriate, migration issues are documented with
before and after source code examples. We validated most of the
recommendations in this chapter by means of the Java Pet Store migration
documented in Chapter 9, “Migration example: The Java Pet Store” on
page 181. We also tell you which recommendations we did not test.
Chapter 7. Enterprise JavaBeans
129
7.2.1 Summary of recommendations
Here is a list of recommendation for the major EJB migration issues covered
in this chapter.
• Replace EJBException with RemoteException.
• Use EJBContext Properties in place of JNDI for environment properties.
• Deploy EJBs with full java:comp/env/ejb names.
• Rely on VisualAge for Java to construct deployment descriptors.
• Use Enumeration in place of Collection for Finder methods.
• Use JNDI names in place of HomeHandles.
• Revert to EJB 1.0 CMP ejbCreate specification.
• Use javax.jts for transaction package.
• Use transaction attribute NotSupported in place of Never.
• Replace Principal with Identity.
• Use read-only method attribute in place of the WebLogic isModified
method.
7.3 EJBException replaces RemoteException in EJBs
An EJB reports unexpected errors to its container by throwing an
EJBException or a RemoteException, depending on the EJB release level.
EJBException is used in EJB 1.1 while RemoteException is used in EJB 1.0.
Examples of unexpected errors include database errors and
RemoteExceptions thrown from dependent EJBs. Clients only see
RemoteExceptions. All EJBExceptions are wrapped by the container in a
RemoteException. The client can use getMessage to determine if the
RemoteException was a communication error or caused by an EJBException.
If your EJBs use EJBException, they will have to be modified to compile and
run properly with the EJB 1.0 Specification supported by WebSphere. This
change only affects exceptions thrown by EJBs to their containers. It does not
affect EJB Remote and Home interfaces — they continue to use
RemoteException.
An application that uses the 1.1 EJBException will fail to compile in an EJB
1.0 environment. Although both releases provide an EJBException class, the
1.0 EJBException is a checked exception (extending java.lang.Exception)
while the 1.1 EJBException is an unchecked exception (extending
java.lang.RuntimeException). The WebSphere JDK will report errors when
130
Migrating WebLogic Applications to WebSphere Advanced Edition
you compile unchecked 1.1 EJBExceptions. The compiler complains that
EJBException should be caught or added to the EJB method’s throws clause.
This, however, is not the correct solution to the problem.
On further examination of the EJB specifications we found that the EJB 1.0
EJBException is actually an anomaly. It is in the javax.ejb package, but it is
not in the EJB 1.0 Specification. The EJBException was removed late in the
drafting of the EJB 1.0 Specification, but unfortunately, it was left in the class
library. (See “C.2 Changes since Release 0.9” in the Enterprise JavaBeans
1.0 Specification.) The correct way to report unexpected errors to the EJB 1.0
container is by using the RemoteException.
Although deprecated in EJB 1.1, EJBs that throw RemoteException must still
be supported in EJB 1.1 containers. If your EJBs use RemoteException for
this purpose, then you are not affected by this migration issue and should just
plan to move to EJBExceptions after a future upgrade to an EJB 1.1compliant platform.
Table 6 on page 131 provides a summary of how EJB 1.0 and EJB 1.1
containers deal with exceptions thrown from their contained EJBs. The basic
rule is that the container wraps unchecked exceptions in a RemoteException,
but passes checked exceptions (including all application exceptions) through
to its clients.
Source code changes are required to convert EJBs from the 1.1 to the 1.0
Specification. Client code and EJB Home and Remote interfaces are not
affected. Indeed, if you have the option to procrastinate and stick with the
deprecated 1.0 RemoteException behavior, no changes are required to your
EJBs either.
Table 6. Container behavior for EJB exceptions
exception
EJB 1.1
EJB 1.0
Application
exception
(checked)
[note 1]
Container throws same
application exception.
Any client transaction is not
marked for rollback.
Container throws same
application exception.
Any client transaction is not
marked for rollback.
RemoteException
(checked)
Deprecated but supported.
Behavior same as for
EJBException.
Container throws
RemoteException [note 3].
Any client transaction is not
marked for rollback.
Chapter 7. Enterprise JavaBeans
131
exception
EJB 1.1
EJB 1.0
EJBException
[note 2]
Container throws
RemoteException [note 3].
Any client transaction is
marked for rollback.
Not defined [note 4].
Other unchecked
exception
Container throws
RemoteException [note 3].
Any client transaction is
marked for rollback.
Notes
1) Application exceptions are always checked exceptions and should not extend
RuntimeException and RemoteException.
2) EJBException is unchecked in EJB 1.1, and checked in EJB 1.0 (see note 4).
3) Container throws TransactionRolledbackException instead, if it rolls back a
transaction. TransactionRolledbackException is a subclass of RemoteException.
4) EJB 1.0 EJBException class exists, but was removed from the specification.
5) Good practice recommends that an unchecked exception be documented by an
@throws javadoc tag instead of a throws clause.
The following is a typical example of the use of the EJB 1.1 EJBException.
Both newly discovered errors, and errors propagated from other EJBs, are
reported to the EJB container by throwing an EJBException.
public Account getAccount() {
try {
AccountHome acctHome = EJBUtil.getAccountHome();
return acctHome.findByPrimaryKey(userId);
} catch (FinderException fe) {
throw new EJBException(fe);
}
catch (RemoteException re) {
throw new EJBException(re);
}
}
There are two approaches to converting this code back to the EJB 1.0
Specification. You can return to using RemoteException, or you can create a
new unchecked exception that acts like the 1.1 EJBException.
7.3.1 Revert to RemoteException
The following code is a modification to the above example. It shows the
standard EJB 1.0 use of RemoteException to report errors to the container.
public Account getAccount() throws RemoteException {
try {
AccountHome acctHome = EJBUtil.getAccountHome();
132
Migrating WebLogic Applications to WebSphere Advanced Edition
return acctHome.findByPrimaryKey(userId);
} catch (FinderException fe) {
throw new RemoteException(fe);
}
}
Since RemoteException is a checked exception, it must be added to the
method’s throws clause. RemoteExceptions thrown from other EJBs need not
be caught; they just propagate up to their container. Also, as a checked
exception, RemoteException does not roll back client transactions. In rare
cases you may need to add a call to the setRollbackOnly method on the
EJBContext object to duplicate the precise client transactioning semantics of
the unchecked 1.1 EJBException.
7.3.2 Use unchecked EJBExceptionMigrate
An alternative solution uses an unchecked exception in place of the
RemoteException. We used this approach in the Java Pet Store example in
9.3.4, “EJBException changes” on page 205, and recommend its use
generally. Not only are its semantics identical to the 1.1 EJBException (see
Table 6 on page 131), but the changes are trivial and obvious to the reader. In
the following code, the new unchecked EJBExceptionMigrate replaces the 1.1
EJBException in our original example.
public Account getAccount() {
try {
AccountHome acctHome = EJBUtil.getAccountHome();
return acctHome.findByPrimaryKey(userId);
} catch (FinderException fe) {
throw new EJBExceptionMigrate(fe);
}
catch (RemoteException re) {
throw new EJBExceptionMigrate(re);
}
}
where:
public class EJBExceptionMigrate extends RuntimeException {
public EJBExceptionMigrate () { super(); }
public EJBExceptionMigrate (Exception ex) { super(ex.toString()); }
public EJBExceptionMigrate (String mess) { super(mess); }
}
Chapter 7. Enterprise JavaBeans
133
7.3.3 EJBException subclasses
The 1.1 EJBException can have subclasses. NoSuchEntityException extends
EJBException, and was added with the EJB 1.1 Specification. It means that
the requested entity was removed from the database. Users can also extend
the EJBException. These subclasses must be converted to work with the 1.0
EJBs of WebSphere. To this end, it is possible to add appropriate subclasses
to RemoteException, but we think that extending the EJBExceptionMigrate
offers a cleaner solution. For example, the replacement class
NoSuchEntityExceptionMigrate is defined as follows:
public class NoSuchEntityExceptionMigrate extends EJBExceptionMigrate {
public NoSuchEntityExceptionMigrate () { super(); }
public NoSuchEntityExceptionMigrate (Exception ex) {
super(ex.toString()); }
public NoSuchEntityExceptionMigrate (String mess) { super(mess); }
}
With this approach, the names of user-defined exceptions remain unchanged
— only their parent class name needs to change. For example, convert:
public class GeneralFailureException extends EJBException {
...
}
to:
public class GeneralFailureException extends EJBExceptionMigrate {
...
}
7.4 JNDI lookups expanded
EJBs can access several kinds of dependent objects at runtime by means of
named references. The values bound to these names can be changed
without recompiling the EJB code. A primary function of EJB deployment is to
customize EJBs by defining these name/value pairs. Major changes were
made in this area of the EJB specification between Releases 1.0 and 1.1. In
theory, this impacts all EJBs that migrate from the EJB 1.1 Specification
supported by WebLogic to the EJB 1.0 Specification supported by
WebSphere. In practice, however, much of the impact can be minimized or
avoided as described below.
Table 7 on page 135 identifies the different types of objects that can be
looked up at runtime. It shows the different API and naming conventions used
for the EJB 1.1 and EJB 1.0 Specifications. The object types are identified by
their EJB 1.1 deployment descriptor names: env-entry, ejb-ref, and resource-
134
Migrating WebLogic Applications to WebSphere Advanced Edition
ref. This table details the following important differences between EJB 1.1
and EJB 1.0 for the type, scope, and naming syntax of these references.
• env-entry lookups use different APIs — JNDI lookup for EJB 1.1, and
EJBContext environment properties for EJB 1.0.
• ejb-entry supports different object types — several Java primitive wrapper
types for EJB 1.1, but only java.lang.String for EJB 1.0.
• env-entry name scope — both global and local for EJB 1.1 (although
global scope is not normally supported by deployment tools), but only local
scope for EJB 1.0.
• ejb-ref and resource-ref name scope — both global and local for EJB 1.1,
but only global scope for EJB 1.0.
• JNDI names follow different conventions — EJB 1.1 recommends specific
context names such as ejb and jdbc, while EJB 1.0 context names are less
constrained.
In summary, the EJB 1.1 Specification introduced three important
improvements that cause migration problems:
1. It integrated the env-entry with JNDI-based deployment parameters by
deprecating the EJBContext environment properties and requiring JNDI
lookup instead.
2. It expanded support for env-entry object types to include Integer, Boolean,
Double, Byte, Short, Long, and Float, in addition to String.
3. It added a JNDI environment naming context (ENC) to the EJB container
with the name java:comp/env. With this, JNDI supports both local and
global (with respect to the JNDI server) lookups for all object types.
Table 7. Deployment parameter lookup APIs and conventions
object type
EJB 1.1
EJB 1.0
env-entry
type: Integer, Boolean, Double,
Byte, Short, Long, Float,
String.
local scope: JNDI lookup by
java:comp/env/name.
global scope: JNDI lookup by
otherContext/name
(possible, but not currently
specified).
type: String.
local scope: EJBContext
environment properties
getProperty(“name”).
global scope: not supported.
Chapter 7. Enterprise JavaBeans
135
object type
EJB 1.1
EJB 1.0
ejb-ref
type: EJBHome.
local scope: JNDI lookup by
java:comp/env/ejb/name.
global scope: JNDI lookup by
otherContext/ejb/name.
type: EJBHome.
local scope: not supported.
global scope: JNDI lookup by
anyContext/ejbName.
resource-ref
(only JDBC
DataSource
resource shown)
type: DataSource.
local scope: JNDI lookup by
java:comp/env/jdbc/name.
global scope: JNDI lookup by
otherContext/jdbc/name.
type: DataSource.
local scope: not supported.
global scope: JNDI lookup by
anyContext/jdbc/name.
7.4.1 env-entry lookups
The following code is an example of an EJB 1.1 env-entry lookup. It reads a
local Boolean env-entry parameter named sendMail.
InitialContext ic = new InitialContext();
Boolean send = (Boolean)ic.lookup(“java:comp/env/sendMail”);
if (send.booleanValue()) { ... }
In an EJB 1.0 container, the corresponding lookup uses the EJBContext
environment properties.
Properties env = ejbContext.getEnvironment();
String boolString = env.getProperty(“sendMail”);
Boolean send = new Boolean(boolString);
if (send.booleanValue()) { ... }
By comparing these two examples, the required changes are:
• Use the EJBContext environment properties instead of the InitialContext
and JNDI.
• Use the name sendMail instead of java:comp/env/sendMail for lookup.
• Convert the retrieved Properties String value to a Boolean object.
Making these changes by hand is error prone. Doing them mechanically is
moderately complicated, especially when variations on this example are
considered. Therefore, we developed a simpler and more reliable way to
implement these modifications.
We replaced the InitialContext with a wrapper, called InitialContextMigrate,
that has access to the EJBContext environment properties. The lookup
method of this helper class retrieves the appropriately named deployment
136
Migrating WebLogic Applications to WebSphere Advanced Edition
parameter from the environment properties, and converts it to the correct
type. The migrated code looks almost identical to the original EJB 1.1 code.
InitialContextMigrate ic = new InitialContextMigrate(ejbContext);
Boolean send = (Boolean)ic.lookup(“java:comp/env/sendMail”);
if (send.booleanValue()) { ... }
The type of the deployment parameter is specified as the first token on the
deployment String. For our example, you would specify the following in the
deployment tool:
parameter name:
parameter value:
sendMail
Boolean false
For more information on the InitialContextMigrate helper class, see 9.3.3,
“JNDI ENC changes” on page 200.
7.4.2 ejb-ref and resource-ref lookups
EJB 1.1 introduced the JNDI environment naming context (ENC) with the
default context name java:comp/env. Entries in this naming context are
scoped locally to the EJB. Different EJBs can use the same name to deploy
completely unrelated parameter values. This scoping is the same as that of
the EJB 1.0 environment properties. Indeed, the solution to env-entry
lookups, described in 7.4.1, “env-entry lookups” on page 136, exploits this
fact. An env-entry with the JNDI name java:comp/env/sendMail is looked up
in the local EJB 1.0 environment properties under the name sendMail. In
effect, the EJB 1.0 environment properties implement the JNDI ENC for enventry objects.
So our only remaining JNDI problem is to simulate its ENC for ejb-ref and
resource-ref objects in an EJB 1.0 container. We consider several
alternatives:
• Manually manage the global JNDI name space to avoid conflicts.
• Provide indirection using the EJB 1.0 environment properties.
• Deploy with full ENC names.
7.4.2.1 Manage the global JNDI name space
One approach to avoiding name conflicts is to employ an application-oriented
unique naming convention for ejb-ref and resource-ref objects across all
applications. This is not a new idea. Indeed, this is the default policy for an
EJB 1.0 environment.
For example, assume two unrelated applications both use the JNDI name
java:comp/env/jdbc/myDB to refer to different databases. You simply modify
Chapter 7. Enterprise JavaBeans
137
the code for at least one of them to use a different JNDI name. More
generally, you partition your JNDI name space by application names, for
example java:comp/env/applName/resourceName, and modify all
applications to use this convention.
The downside to this alternative is that you must modify precisely that source
code that deployment descriptors are supposed to make portable without
source code modifications.
7.4.2.2 Indirection via environment properties
This alternative simulates the JNDI ENC by using the EJB 1.0 environment
properties to avoid conflicts for ejb-ref and resource-ref objects. Instead of
changing the JNDI names already in the code, use additional env-entry
deployment parameters to provide unique aliases for these names. The code
for the myDB example above would look like the following:
Properties env = ejbContext.getEnvironment();
String alias = env.getProperty(“java:comp/env/jdbc/myDB”);
InitialContext ic = new InitialContext();
DataSource db = (DataSource)ic.lookup(alias);
Two deployment parameters are required for this approach:.
env-entry
resource-ref
java:comp/env/jdbc/myDB
jdbc/AccountDB
jdbc/AccountDB
someDataSource
At first glance, this looks like a bigger coding change than just changing the
names directly. However, by encapsulating the required alias lookup code in
the InitialContextMigrate class, a simpler solution results. This solution uses
the original JNDI names, and supports future name changes without
recompilation.
InitialContextMigrate ic = new InitialContextMigrate(ejbContext);
DataSource db = ( DataSource)ic.lookup(“java:comp/env/jdbc/myDB”);
See 9.3.3, “JNDI ENC changes” on page 200 for additional details on the
InitialContextMigrate helper class.
7.4.2.3 Deploy with full ENC names
After doing the above analysis, we had the bright idea of simply using the full
JNDI ENC names for deployment. To our surprise, these names worked
unchanged in WebSphere. This is indeed the simplest approach, requiring no
source code changes at all!
Assuming that an EJB 1.1 has the following code:
138
Migrating WebLogic Applications to WebSphere Advanced Edition
InitialContext ic = new InitialContext();
Object objref = ic.lookup(“java:comp/env/ejb/account“);
AccountHome acct = (AccountHome)
PortableRemoteObject.narrow(objref, AccountHome.class);
You would use a deployment parameter such as the following in an EJB 1.1
container:.
ejb-ref
ejb/account
estore.account.ejb.AccountHome
The name used for deployment does not include the ENC of java:comp/env. In
effect, the ENC gets added for you by the deployment tool. But what happens
if you deploy the same code into a WebSphere EJB 1.0 container using the
following deployment parameter for the referenced AccountEJB?
ejbHome
java:comp/env/ejb/account
estore.account.ejb.AccountHome
The answer is that it works! We did not investigate the details of the actual
JNDI contexts, but presume that java:comp is the top level context, followed
by env and ejb. Of course, this JNDI name is actually a global name and must
be managed for potential conflicts. For many migration projects, this may be
the most expedient solution. The InitialContextMigrate class also allows you
to strip the ENC prefix from JNDI lookup names. This is useful for converting
ENC resource-ref names into global DataSource names. We used this
approach with the Java Pet Store in 9.4.1.3, “Create EJB deployment
descriptors” on page 212.
7.5 Deployment descriptors replaced
EJBs are deployed into their containers in accordance with deployment
descriptors. Deployment descriptors are specified after an EJB is compiled
and before it is deployed. They bind the EJB to its operational environment,
specifying the values of JNDI names and environment properties.
Deployment descriptors underwent major revisions between the EJB 1.0 and
EJB 1.1 Specifications. Their implementation, structure, and content
changed. The EJB 1.0 deployment descriptors are deprecated and are not
supported in EJB 1.1.
• javax.ejb.deployment package replaced by XML-based descriptors
EJB 1.0 deployment descriptors are serialized instances of classes in the
javax.ejb.deployment package. These classes include EntityDescriptor,
SessionDescriptor, ControlDescriptor (for method transaction attributes),
and AccessControlEntry (for method security attributes). An EJB 1.0
deployment tool captures deployment parameters as instances of these
Chapter 7. Enterprise JavaBeans
139
classes. It then serializes them and includes them in the ejb-jar file, ready
for deployment.
EJB 1.1 deployment descriptors are XML files that conform to the EJB 1.1
DTD. An EJB 1.1 deployment tool captures deployment parameters as
XML elements. The XML elements form the content of an ejb.xml file that
is added to the ejb-jar, ready for deployment. For our purposes, one
important advantage of the XML-based deployment descriptors is that
they can be read with an ordinary editor.
• Content of descriptors expanded
EJB 1.1 deployment descriptors include all of the EJB 1.0 deployment
parameters in addition to some new ones. The common descriptors
include:
- Names, classes, and JNDI names for an EJB and its interfaces.
- EJB type — entity or session.
- Re-entrancy indication.
- SessionBean’s state management and transaction demarcation.
- EntityBean’s persistence management, primary key, and CMP fields.
- Environment properties.
- Transaction attributes for each method (expanded with Never
attribute).
- Security attributes for each method (these changed significantly).
The new descriptors also include:
- Resource manager Connection factory references (resource-ref).
- EJB references (ejb-ref).
• Vendor-customization standardized
One of the problems with the EJB 1.0 deployment descriptor classes is
that there is no standard way to extend them for vendor-specific
deployment parameters. Subclasses do not work well because it is not
possible to read a serialized object without the vendor-specific subclass
definitions.
The EJB 1.1 XML-based deployment descriptors solve this problem by
allowing separate vendor-specific XML files to be added to the deployed
JAR file. The standard XML DTD cannot be modified, making it completely
portable.
140
Migrating WebLogic Applications to WebSphere Advanced Edition
From the perspective of migrating EJBs from WebLogic to WebSphere, how
best can we use EJB 1.1 deployment descriptors? Can they be used to
construct the required EJB 1.0 deployment descriptors? We investigated
three approaches.:
1. Automatically convert the EJB 1.1 XML descriptors into EJB 1.0 serialized
descriptors.
2. Use the EJB 1.1 XML descriptors as a written specification for entering
corresponding descriptors into an EJB 1.0 deployment descriptor tool.
3. Ignore the EJB 1.1 descriptors altogether, constructing EJB 1.0
deployment descriptors from scratch with an EJB 1.0 deployment
descriptor tool.
The first option is technically feasible. We did try an early version of one such
tool. Time constraints kept us from pursuing this option further. One problem
was that we did not discover a good way to import a serialized EJB 1.0
descriptor into a deployable JAR file, in particular into the VisualAge for Java
environment.
We settled on a combination of the last two options. We worked with several
deployment descriptor tools including WebSphere, VisualAge for Java, and
jetace. Each of these tools does a pretty good job of introspecting on EJB
classes and interfaces. This gets you more than half way to a complete
deployment descriptor. It helps that the EJB 1.0 descriptors are simpler. For
example, they do not require explicit ejb-ref and resource-ref entries. The few
remaining parameters, mostly env-entry parameters, can be obtained
manually from the EJB 1.1 XML descriptor file. See 9.4.1.3, “Create EJB
deployment descriptors” on page 212 for an example of this approach for the
Java Pet Store.
7.6 Finders expanded to Collection
If your application has a Finder method that returns the java.util.Collection
type, you must modify it to use the Enumeration type before it will deploy
properly under WebSphere 3.5.
An EJBEntity Home must have one or more Finder methods. A Finder method
may return a reference to a single EJB or a collection (with zero or more
elements) of EJB references. The EJB references must be the same type as
that of the Finder’s EJB. This is implemented in the ejbFinder method by
returning a collection of the EJB’s primary keys. The container converts the
collection of primary keys into a collection of EJBObjects that are returned to
the client.
Chapter 7. Enterprise JavaBeans
141
The EJB 1.0 Specification supports java.util.Enumeration as the only type for
a collection-returning Finder method. The EJB 1.1 Specification added the
Java 2 java.util.Collection type as a legal Finder return type. This means that
the following EJB 1.1 Finder method requires modification to work with
WebSphere 3.5.
public Collection ejbFindOrders(String uid) throws FinderException {
try{
dbConnection = getDBConnection();
ArrayList orderIdList = new ArrayList();
Statement stmt = dbConnection.createStatement();
ResultSet result = stmt.executeQuery(userOrderSelect(uid));
if ( !result.next() ) {
stmt.close();
throw new SQLException ("No Orders found”);
} else {
do {
orderIdList.add( new Integer(result.getInt(1)) );
} while (result.next());
return orderIdList;
// list of Order primary keys
}
} catch (java.sql.SQLException se) {
throw new FinderException ("SQL Exception in finding");
} finally {
try {
dbConnection.close();
} catch (SQLException se) {
throw new FinderException ("SQL Exception in finding ");
}
}
}
The problem is that although the WebSphere JDK supports the Java 2
Collection type, the WebSphere container and deployment tools, in keeping
with the EJB 1.0 Specification, do not support Collection-returning Finder
methods. This means that the above code will compile under the WebSphere
JDK, but will fail to deploy properly. Moreover, the error message issued
during deployment is not very helpful for discovering the problem.
7.6.1 Convert Collection Finder to Enumeration Finder
There is only one reasonable alternative to solving this migration problem.
You should use Enumeration in place of Collection. Fortunately, this is easy to
do, and only requires localized code changes.
142
Migrating WebLogic Applications to WebSphere Advanced Edition
On the server side, you must convert the returned Collection to an
Enumeration. On the client side, you must convert the Enumeration back to a
Collection. The only option you have is in your choice of the Collection
implementation type — we chose Vector in this example. Here are the
conversions expressed as methods:
public static Collection convertEnumeration(Enumeration enum) {
Vector v = new Vector();
while (enum.hasMoreElements()) {
v.add(enum.nextElement());
}
return v;
}
public static Enumeration convertCollection(Collection col) {
return new Vector(col).elements();
}
Implementation of this modification affects the EJB implementation, its Home
interface, and all clients that use the Finder method. An easy way to locate all
client uses is to modify the Home interface and recompile. The compiler
errors pinpoint the client changes. For the above example, we need to do the
following:
• Modify the EJB method to return an Enumeration.
public Enumeration ejbFindOrders(String uid) throws FinderException {
try{
ArrayList orderIdList = new ArrayList();
...
return convertCollection(orderIdList); // Order primary keys
...
}
• Modify the Home interface Finder method declaration to return an
Enumeration.
public Enumeration findOrders(String uid)
throws FinderException, RemoteException;
• Modify all client uses to convert back to a Collection.
Collection orders = convertEnumeration(home.findOrders(“Bill”));
This technique was tested with the Java Pet Store application. See 9.3.6,
“Collection finder changes” on page 207 for further details.
Chapter 7. Enterprise JavaBeans
143
7.7 HomeHandle added
A javax.ejb.Handle object provides a robust, long-lived, persistent reference
to an EJB object. It is serializable, so it can be written to, and read from
Streams. Its useful lifetime spans client sessions and server restarts, and
possibly even server upgrades. Although not guaranteed to be deserializable
from different systems, it may even work across systems. Both the EJB 1.0
and EJB 1.1 Specifications support Handle objects.
EJB 1.1 introduced javax.ebj.HomeHandle with the same capabilities for EJB
Homes. Since EJB 1.0 does not support HomeHandle, applications that use
HomeHandle have a migration problem for WebSphere 3.5. There is no
simple replacement for this capability in an EJB 1.0 system.
Normally an EJBHome object is obtained by a JNDI lookup. A HomeHandle
allows the same object to be obtained without knowing its JNDI name. In this
example, a HomeHandle has previously been written to someStream:
public AccountHome getAccountHome ()
throws RemoteException, IOException, ClassNotFoundException {
HomeHandle homeRef = (HomeHandle)someStream.readObject();
AccountHome home = (AccountHome)ProtableRemoteObject.narrow
(homeRef.getEJBHome(),AccountHome.class);
return home;
}
Since HomeHandles can be obtained indirectly from EJBObjects, as in the
following example, there are programs that use HomeHandles with no
knowledge of the underlying JNDI name:
public void saveAccountHome(EJBObject obj)
throws RemoteException, IOException {
AccountHome home = (AccountHome)ProtableRemoteObject.narrow
(obj.getEJBHome(),AccountHome.class);
HomeHandle homeRef = home.getHomeHandle();
someStream.writeObject(homeRef);
}
7.7.1 Use JNDI names in place of HomeHandles
If you plan to migrate a program with HomeHandles, it will require a redesign
to preserve the JNDI name instead of the HomeHandle. One approach would
be to add a business method to the EJB itself that returns the JNDI name for
the EJB Home. This method could use an EJB environment property for the
JNDI name to make the code portable. With this approach, the above
example is converted without using a HomeHandle object.
144
Migrating WebLogic Applications to WebSphere Advanced Edition
public interface AccountHome extends EJBHome {
...
public String getJNDIName() throws RemoteException;
}
public void saveAccountHome(EJBObject obj)
throws RemoteException, IOException {
String jndiName = obj.getJNDIName();
someStream.writeObject(jndiName);
}
public AccountHome getAccountHome ()
throws RemoteException, IOException, ClassNotFoundException {
String jndiName = (String)someStream.readObject();
InitialContext ctx = new InitialContext();
AccountHome home = (AccountHome)ProtableRemoteObject.narrow
(ctx.lookup(jndiName),AccountHome.class);
return home;
}
We did not test this solution.
7.8 CMP ejbCreate change
In the EJB 1.0 Specification, the ejbCreate methods for EJBEntity objects
follow two different rules, depending on whether they are for CMP or BMP
entities:
• A CMP ejbCreate must return void.
public void ejbCreate() throws CreateException { ... }
• A BMP ejbCreate must return the primary key type. As an example,
assume an OrderEJB with an Integer primary key class.
public Integer ejbCreate () throws CreateException {
...
return new Integer(...);
}
The problem with this specification is that it makes it impossible to extend a
CMP entity with a BMP entity or vice versa. You cannot change the return
type on an overridden method, ejbCreate in this case. The EJB 1.1
Specification corrected this difficulty by requiring all EJBEntity ejbCreate
methods to return the type of their primary key, even for CMP entities. CMP
ejbCreate methods simply return null. For example:
public interface CMPOrderHome extends EJBHome { ... }
Chapter 7. Enterprise JavaBeans
145
public interface BMPOrderHome extends CMPOrderHome { ... }
public class CMPOrderEJB implements EJBEntity {
...
public Integer ejbCreate() throws CreateException {
...
return null;
}
}
public class BMPOrderEJB extends CMPOrderEJB {
...
public Integer ejbCreate() throws CreateException {
...
return new Integer(...);
}
}
The above code will compile with the WebSphere JDK, but it will not deploy
properly into the WebSphere container.
You must identify all CMP entities in your application, and make the
necessary modifications before deployment. Only the EJBs need to be
changed. No changes are required to the Home interfaces or client code.
We considered two different migration cases:
1. If there is no inheritance, the simplest solution is to revert to the EJB 1.0
convention for CMP ejbCreate methods.
2. If there is inheritance, as in the above example, you can preserve the
original code (including its inheritance) as non-EJB implementation
classes, and use inheritance to create simple replacement EJBEntity
classes. The replacement EJBEntity classes inherit most of their code
from the implementation classes, and provided the appropriate EJB 1.0
ejbCreate methods.
We show examples for both cases. We did not test these examples.
7.8.1 Revert to the EJB 1.0 CMP ejbCreate rule
For the above CMPOrderEJB example (without the inheritance), we have to
make the following modifications. Change the Integer return type to void and
remove the return value.
public class CMPOrderEJB implements EJBEntity {
...
public void ejbCreate() throws CreateException {
146
Migrating WebLogic Applications to WebSphere Advanced Edition
...
return ;
}
}
7.8.2 Use inheritance from implementation objects
For the above BMPOrderEJB example (with its inheritance), we make the
following modifications. Convert the original BMPOrderEJB tree into a nonEJB implementation tree by removing its implements clause. The ejbCreate
methods get new names so they do not conflict with the new EJBEntity
classes. Replace the original BMPOrderEJB and CMPOrderEJB classes with
simple EJBEntity classes that extend the appropriate level of the
implementation tree. The new ejbCreate methods follow the EJB 1.0 return
type rule, and they are the only new methods required. The original Home
interfaces remain unchanged.
public class CMPOrderImpl {
...
public Integer ejbCreateImpl() throws CreateException {
...
return null;
}
}
public class BMPOrderImpl extends CMPOrderImpl {
...
public Integer ejbCreateImpl() throws CreateException {
...
return new Integer(...);
}
}
public class CMPOrderEJB implements EJBEntity extends CMPOrderImpl {
public void ejbCreate() throws CreateException {
ejbCreateImpl();
return ;
}
}
public class BMPOrderEJB implements EJBEntity extends BMPOrderImpl {
public Integer ejbCreate() throws CreateException {
return ejbCreateImpl();
}
}
Chapter 7. Enterprise JavaBeans
147
7.9 Transaction changes
There are two minor changes to transaction support between EJB 1.0 and
EJB 1.1 that affect our migration tasks:
1. The EJB 1.0 package name javax.jts was changed to the EJB 1.1 package
name javax.transaction. This package is used primarily for the
UserTransaction class. If you miss this modification, don’t worry because
the compiler will catch it for you.
2. The Never transaction attribute was added to EJB 1.1. It requires that the
container throw the RemoteException if a client calls the method with a
user transaction context. Otherwise it works just like the NotSupported
transaction attribute.
The first of these changes is trivial. Just change the package name back to
the EJB 1.0 standard of javax.jts and recompile.
There is no EJB 1.0 transaction attribute that is equivalent to the new Never
attribute. The NotSupported attribute is the closest alternative. It is weaker
than Never, but is equivalent for all applications that follow the restriction that
they have no client transaction context when calling the associated method.
Use the NotSupported transaction attribute.
7.10 Authentication method changes
The java.security.Identity class is deprecated in the Java 2 JDK. As a result,
two methods on the EJBContext object changed between the EJB 1.0 and the
EJB 1.1 Specifications:
• The getCallerIdentity() method was deprecated in favor of the new
getCallerPrincipal() method.
• The isCallerInRole(Identity) method was deprecated in favor of the new
isCallerInRole(String) method.
If your application compiles without errors for these methods, then you do not
have to worry about this problem. This means that either:
1. Your application uses neither the Principal nor the Identity authentication
methods, or
2. Your application uses the Identity authentication methods. These methods
are deprecated, but are still supported by WebLogic 5.1, so they are
probably in existing WebLogic applications.
148
Migrating WebLogic Applications to WebSphere Advanced Edition
In the first case, you are home free. In the second case, even though your
application compiles, it may not run properly until you activate the
WebSphere authentication features. See the redbook WebSphere V3.5
Handbook, SG24-6161 for information on activating WebSphere
authentication.
7.10.1 Replace Principal with Identity
The most common use of the getCallerPrincipal method is to obtain a group
or user name for reporting purposes.
String userId = ejbContext.getCallerPrincipal().getName();
This use migrates trivially to the EJB 1.0 standard by replacing Principal with
Identity:
String userId = ejbContext.getCallerIdentity().getName();
The isCallerInRole method is more problematic. The EJB 1.1 version of this
method takes a String as an argument, while the EJB 1.0 version takes an
Identity object. In both cases, the method checks to see if the current caller is
in the group or role specified by the argument. An example of the Principalbase method follows:
boolean member = ejbContext.isCallerInRole(“Manager”);
When using the EJB 1.0 Identity version of the isCallerInRole method, it is
unclear how to construct the required Identity argument. If you try the
following obvious conversion, you get a compiler error:
boolean member = ejbContext.isCallerInRole(new Identity(“Manager”));
The problem is that the Identity class is abstract. All of its methods are
defined, but it is explicitly marked as abstract. This is because the Identity
class is designed to be extended with additional identification fields, and to
override the identityEquals method. The following alternative compiles:
boolean member = ejbContext.isCallerInRole(new MyIdentity(“Manager”));
where,
public class MyIdentity extends Identity {
public MyIdentity (String role) { super(role); }
}
We did not get to test this thoroughly, but believe that with the appropriate
activation of WebSphere authentication features, this code also executes as
expected. For some additional comments on this approach, see http://
www.javaworld.com/javaworld/jw-01-2000/jw-01-ssj-ejb2.html.
Chapter 7. Enterprise JavaBeans
149
7.11 Read-only EntityBeans
Performance of the persistence support for EntityBeans can be improved
significantly if the container is told about read-only operations. If an entity has
not been updated, there is no need to write it back to the database.
Interestingly, this important performance feature is not part of either the EJB
1.0 or the EJB 1.1 Specification. However, both WebLogic and WebSphere
provide vendor-specific ways to specify this information.
• WebLogic uses a runtime approach. Each EntityBean has an isModified
method that returns Boolean. The WebLogic container calls this method to
determine when to update the underlying database.
• WebSphere uses a declarative approach, consistent with existing
transaction attribute deployment parameters. The read-only attribute can
be specified in the VisualAge for Java EJB deployment tool. It cannot,
however, be specified in the jetace tool. The read-only attribute is
specified at the method level for each method that does not change the
EntityBean.
7.11.1 Use read-only method attributes
The WebLogic isModified methods are ignored in the WebSphere container,
so there is no need to change or remove them.
To get the best performance from the WebSphere container, use the readonly method attribute. Unfortunately, deciding which methods are read-only
and which are not may be nontrivial. Remember that the WebLogic isModified
methods determine this dynamically at runtime, while the WebSphere readonly method approach is a static declarative determination. You will have to
study how the existing isModified methods work. Depending on the design of
your EJBs, this may or may not map cleanly to the statically specified readonly attributes.
7.12 Non-issues
During the process of identifying EJB migration issues, we studied many
specification changes that do not appear to cause migration issues. For
completeness, and possibly to set your own mind at ease, we document them
here. We separate them into two lists, tightenings and clarifications. A
tightening is where something that is legal in EJB 1.0 is no longer legal in EJB
1.1. A clarification is something that did not actually work, or was never
intended to work, but was not covered explicitly or clearly in the EJB 1.0
Specification. Assuming that your application is consistent with the EJB 1.1
150
Migrating WebLogic Applications to WebSphere Advanced Edition
Specification, a clarification cannot give rise to a migration issue from
WebLogic to WebSphere.
Some of the tightenings were bad ideas in the first place, and are therefore
not in common practice. In other cases, they represent real restrictions that
required EJB modifications when moving from EJB 1.0 to EJB 1.1. In all
cases, however, what is specified in the EJB 1.1 Specification should work in
the WebSphere EJB 1.0 container. For that reason, they also cause no
migration issues.
7.12.1 Tightenings
• hashCode and equals methods required
Primary keys require hashCode and equals methods.
• FinderException required
EJBEntity Finder methods must throw the FinderException.
• Use of finalize method outlawed
The finalize method must not be specified for any EJB.
• Use of this variable tightened
An EJB must not pass the this variable as an argument or a result. The
EJBContext getEJBObject method should be used instead.
• Use of == and equals tightened
The == operator and the equals method are not defined for EJB
references.
• Use of PortableRemoteObject.narrow tightened
PortableRemoteObject.narrow must be used for Handle.getEJBObject and
for portable EJB clients.
• Bean transactioning must be specified
The bean provider must specify either bean-managed or containermanaged transactioning for SessionBeans.
• Transaction management tightened
Transaction management responsibilities have been tightened generally.
• UserTransaction outlawed in EntityBean
EntityBeans must not use UserTransaction and EntityBeans cannot
specify TX_BEAN_MANAGED.
Chapter 7. Enterprise JavaBeans
151
• SessionSynchronization tightening
A SessionBean can use either SessionSynchronization or
UserTransaction, but not both. That is, SessionSynchronization is
disallowed for TX_BEAN_MANAGED.
• Transaction isolation level restricted
Only SessionBeans are allowed to manage transaction isolation level.
• Use of setRollbackOnly and getRollbackOnly restricted
The setRollbackOnly and getRollbackOnly methods are only legal with
bean-managed transactioning.
• IllegalException expanded
The IllegalException is thrown for the getUserTransaction,
setRollbackOnly, and getRollbackOnly methods when they are not
allowed.
• Use of UserTransaction tightened
The container must provide UserTransaction interface in JNDI context
java:comp/UserTransaction.
• EJB runtime container rules tightened
Container runtime rules have been tightened generally for JNDI, JTA, Java
2, and JDBC support.
• SessionBean identity tightened
SessionBean behaviors for primary key, remove, and isIdentical methods
have been tightened.
• Containers must support EntityBeans
This is not a problem for WebSphere 3.5 because it supports EntityBeans
with the EJB 1.0 Specification.
7.12.2 Clarifications
• An EJB can have a superclass
This is not a problem in WebSphere 3.5 because it already supports EJB
subclassing.
• Primary key can be java.lang.String
This is not a problem in WebSphere because it already supports String
primary keys.
152
Migrating WebLogic Applications to WebSphere Advanced Edition
• Non-public, final, abstract, and static restricted
Non-public, final, and abstract EJB classes and static ejbCreate methods
are not allowed.
• ejbCreate/ejbPostCreate pairs required
The ejbCreate and ejbPostCreate methods must be specified as matched
pairs.
• Transient fields outlawed
CMP fields cannot be transient.
• EJB allowed to print
We actually did not test this in WebSphere 3.5.
• Non-remote references restricted
Container must not pass non-remote objects by reference, even between
containers in the same JVM.
Chapter 7. Enterprise JavaBeans
153
154
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 8. Database connectivity and persistence
This chapter describes the different methods and technologies you could use
in WebLogic to access persistent data in a database and how these should be
migrated to WebSphere. It is beyond the scope of this book to cover all these
technologies in detail. We focus on the JDBC API, which is a core part within
the Java 2 Platform, Enterprise Edition. We will also look at persistence
products from other vendors that you may encounter when migrating
applications, and consider the future direction of persistence solutions as
detailed in the Enterprise JavaBeans 2.0 Specification.
8.1 Introduction
Object persistence is a major topic in every enterprise application and
because persistence efforts always take a lot of time, you will find many
products and tools that promise to raise the productivity and lower the
maintenance costs. Many approaches can be used for persistent data
access, but we expect that not all these approaches will be used in the future,
as efforts to standardize functionality become more successful. See the EJB
2.0 and JDBC 3.0 Specifications from Sun Microsystems for more details of
proposed future directions.
The JDBC API has been established as the industry-standard interface for
Java applications to access databases. Nearly all leading database and
middleware vendors support JDBC technology. It is also a key technology in
the J2EE architecture and thus supported by both WebLogic and WebSphere
application servers.
JDBC has been widely accepted by the developer community, so you find
many applications based on the pure JDBC API. Both WebSphere as well as
WebLogic support the JDBC 2.0 standard, while JDBC 1.0 drivers still can be
used. These applications should not present any major migration difficulties.
There are many high-level technologies and frameworks based on JDBC,
mainly to provide a higher level of abstraction than JDBC does. The product
dbKona/htmlKona, which is shipped and supported by WebLogic, is such a
class library. It was provided with the intention to simplify JDBC programming,
for instance by automatically generating SQL with the consideration of
vendor-specific details. The new features of JDBC 2.0 have meant that most
of the previous dbKona/htmlKona benefits, such as caching, shared query
results, better support for displaying results in table views, are now supplied
by the base JDBC API. We expect that most developers will use the core
© Copyright IBM Corp. 2001
155
JDBC features, and that the role of proprietary extensions will become less
significant.
The market also offers many sophisticated persistence frameworks, which
provide complex mapping from objects to data stores, mostly relational
databases. Nearly all of them are built on top of the JDBC API, which
guarantees a high degree of platform and database vendor independence.
These type of products can be compared with what the Enterprise JavaBeans
specification says about entity beans, particularly about entity beans with
container-managed persistence (CMP). Entity beans support in EJBcompliant products has been demanded only since the EJB 1.1 Specification,
so it is fairly new. The latest EJB 2.0 Specification has many improvements
for the CMP bean type.
Given the limitations of the early EJB support for CMP, there are a lot of tools
available that offer persistency mapping for fine-grained objects. These tools
are far more comprehensive and typically provide more features than can be
supported with the current EJB 1.0/1.1 implementations. The Object People
(recently acquired by WebGain) offers their product TOPLink for BEA
WebLogic, which integrates the persistence product TOPLink into the
WebLogic Server. It is likely that you will encounter TOPLink when migrating
WebLogic applications, since it is a successful tool with wide acceptance.
TOPLink is used not only for fine-grained objects and for entity beans with
bean-managed persistence (BMP), but is also a sophisticated implementation
for CMP entity beans, with features beyond the EJB 1.1 standard.
WebSphere does not provide full compliance with the EJB 1.1 standard (see
Chapter 7, “Enterprise JavaBeans” on page 127 for a discussion of these
issues), but the WebSphere EJB 1.0+ implementation offers some
functionality, which already goes towards the EJB 2.0 Specification.
8.2 JDBC
JDBC is an API that provides a uniform programming interface to access
different forms of tabular data such as databases, spreadsheets, flat files and
so on. Because of the platform independence provided by Java, JDBC
provides a platform-independent access to databases. JDBC makes use of
the remote object features in Java (RMI) and thus enables database location
transparency. You can also make use of techniques to make proprietary
database issues transparent.
Both application server products, WebSphere as well as WebLogic, support
the JDBC 2.0 API standard. Therefore, you should not have to use any
156
Migrating WebLogic Applications to WebSphere Advanced Edition
specific packages of the application server vendor anymore, but only the
standard interfaces (java.sql.* and javax.sql.*). This makes code portable
between the servers.
Until quite recently both servers had their individual way of pooling database
connections, to share them between applications and thus avoiding the need
to wait until a new database connection is established, which is a fairly
expensive task. With the introduction of DataSources and pooled
DataSources, both products can use the JDBC 2.0 Optional Package API
standard for doing this in a uniform way. There are some slight differences,
which we describe in this chapter.
Both products have partnerships with several database vendors and they ship
and support their JDBC drivers. Nevertheless it should still be possible to use
any JDBC 1.0/2.0-compliant driver from another vendor. We detail some
potential problems in this chapter.
Another field where the middleware has to cooperate with the JDBC API is in
the support for distributed transactions. The JDBC 2.0 Optional Package API
also defines standards here and provides for a two-phase commit (2PC)
protocol. We tested that 2PC worked correctly and in the same way in both
servers.
8.2.1 DataSource
The DataSource specification and interfaces are part of the JDBC 2.0
Optional Package API. A DataSource can be seen as a representation of a
particular DBMS or some other data source, such as a file. A DataSource is
simply a factory for JDBC connections.
The previous means (JDBC 1.0) to get a connection to the database was via
the JDBC DriverManager or in WebSphere also with the IBM Connection
Manager (for connection pooling). With that approach the particular driver
and database had to be hardcoded. At least some developers used
properties files and a generic way to introduce new JDBC drivers.
But now with the specification of DataSources, developers have a standard
abstract way of obtaining database connections by using just a logical name.
The physical settings for the JDBC driver are set and updated by an
administrator. This makes code more portable and uniform, and eases
maintenance and deployment of JDBC applications. Figure 51 on page 158
illustrates the uses of a DataSource to connect to a database.
Chapter 8. Database connectivity and persistence
157
JNDI Naming
Service
lookup( )
Application
jdbc/example DS
Na
me
ame
Data
Source
eN
r
Se rve
JDBC
Driver
ber Descr
um
ion
ipt
Port
N
getConnection( )
as
Datab
Database
Figure 51. Connecting to a DataSource
WebSphere and WebLogic both offer support for generic JDBC 2.0 compliant
DataSources. Through their administration tools it is possible to set up
DataSources and bind them to the JNDI naming service of the server.
In both servers it is still possible to run applications using the old approach
via the JDBC DriverManager, and the Connection Manager is still supported
in WebSphere. But the preferred way of getting database connections is now
a DataSource. You are encouraged to use DataSources, since the
DriverManager and the ConnectionManager interfaces will be deprecated in
the future.
According to the specification of the JDBC 2.0 Optional Package API,
implementations of javax.sql.DataSource may be provided by JDBC driver
vendors as part of their JDBC 2.0 products. WebLogic does not provide any
assistance in incorporating DataSource implementations from other vendors
and for binding them into the name space. WebSphere provides specific
DataSource implementations from supported database vendors, including
DB2, Oracle, and Sybase. For other database vendors, WebSphere uses a
generic DataSource implementation similar to that used by WebLogic.
Generic DataSource implementations offer a way to utilize JDBC classes
from other vendors still at the Driver class level. This means that the
158
Migrating WebLogic Applications to WebSphere Advanced Edition
application administrator either has to integrate a foreign DataSource or
needs to get a foreign driver working with the generic DataSource. The
application developer is not impacted by the implemention of the DataSource
and is able to write highly portable code.
There are slight nuances in the implementations provided by WebLogic and
WebSphere, which could force you to change the code when migrating from
one vendor to the other.
8.2.1.1 Binding a DataSource to a naming service
To create a DataSource object within WebLogic, you define it in the
weblogic.properties file. DataSources always point to a connection pool,
which is also defined in the properties file.
For example a DataSource named jdbc/EstoreDB would be defined by adding
the following line to the weblogic.properties file:
weblogic.jdbc.DataSource.weblogic.jdbc.EstoreDB=EstorePool
If your DataSource has to support Java Transaction Services (JTS), then you
must use a connection pool with a JDBC driver supporting JTS. The following
line would add a JTS enabled DataSource (TXDataSource) with the logical
name jdbc/EstoreDB_TX.
weblogic.jdbc.TXDataSource.weblogic.jdbc.EstoreDB_TX=EstorePool
Regarding the naming of DataSources, the JDBC 2.0 Optional Package API
Specification from Sun Microsystems states the following:
“The JDBC 2.0 API specifies a simple policy for assigning JNDI names
to data sources. All JDBC data sources should be registered in the
JDBC naming subcontext of a JNDI name space, or in one of its child
subcontexts. The parent of the JDBC subcontext is the root naming
context.”
The WebSphere Admin tools, also in the VisualAge WebSphere Test
Environment, take the usage of the jdbc naming subcontext as a rule. A
WebSphere administrator shouldn’t use the jdbc or jdbc/ subcontext in the
DataSource name, as WebSphere already implicitly prepends this
subcontext. The data entry validation of the WebSphere Administrative
Console recognizes when jdbc/ is entered and will not duplicate it, but in the
WebSphere Test Environment you cannot enter jdbc/, but VisualAge always
adds jdbc/ to the front of every DataSource name.
For example, if in your WebLogic application you used a DataSource name of
myJtsDataSource or myNonJtsDataSource, you will have to change this
Chapter 8. Database connectivity and persistence
159
logical name when porting to WebSphere, because WebSphere forces you to
use the jdbc subcontext. So you would have to use jdbc.myJtsDataSource or
jdbc.myNonJtsDataSource in WebLogic to have a portable name.
WebSphere does not support the usage of further child subcontexts under
jdbc. The JDBC specification states that this should be possible, since the
JNDI name space is hierarchical.
When you use a logical DataSource name with two subcontexts, for instance
jdbc/xa/EstoreDB, in WebLogic you would simply add the line in the
weblogic.properties file:
weblogic.jdbc.TXDataSource.weblogic.jdbc.xa.EstoreDB=EstorePool
WebLogic takes the dot (“.”) as an indication for a new subcontext.
However, if you try to use the name xa/EstoreDB in one of the WebSphere
administration tools, you will get a NamingException saying that the jdbc/xa/
context was not found. So WebSphere does not automatically create a
subcontext under jdbc /. If you use xa.EstoreDB, WebSphere will accept the
name, but the dot (“.”) is not recognized as an indicator for a subcontext, but
as part of the name. You won’t be able to look up the DataSource using the
name jdbc/xa/EstoreDB, but you will have to use jdbc/xa.EstoreDB.
So if you want to develop an application portable between WebLogic and
WebSphere you should always use a logical DataSource name beginning
with the subcontext jdbc/ followed by a simple name without a further
subcontext (no dots or following slashes). This applies to the current
WebSphere Application Server, Advanced Edition, Version 3.5.
However, in a later stage, a J2EE-compliant application should not be
affected by the JNDI binding name for the DataSource, since all application
code should be doing lookup() calls using the “java:comp/env/jdbc/<...>”
resource-ref naming conventions. If coded this way, the application will never
be affected by the real JNDI name space location of the DataSource. It
becomes the problem of the Application Assembler or Deployer. The J2EE
application code will not have to be modified since it should not go directly to
the name space for the DataSource, but rather use the indirect resource-ref
mechanism. This is already supported in the currently available WebLogic
Server, Version 5.1 but not in WebSphere Application Server, Advanced
Edition, Version 3.5.
8.2.1.2 Connecting to a DataSource
The code sample in this chapter provides a short demonstration of code that
will run in WebLogic as well as in WebSphere.
160
Migrating WebLogic Applications to WebSphere Advanced Edition
In the class where you want to obtain the DataSource, import the following
packages:
import javax.sql.*;
import javax.naming.*;
To obtain a DataSource from the JNDI naming service, you first have to get
the root naming context as the initial context.
In WebLogic this is done with the following code snippet:
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
env.put(Context.PROVIDER_URL,
"t3://myserver:7001");
try
{
Context ctx = new InitialContext(env);
}
catch (NamingException e)
{
// handle exception
}
}
And for WebSphere it would look like this:
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.ibm.ejs.ns.jndi.CNInitialContextFactory");
env.put(Context.PROVIDER_URL,
"iiop://myserver:900");
try
{
Context ctx = new InitialContext(env);
}
catch (NamingException e)
{
// handle exception
}
}
Chapter 8. Database connectivity and persistence
161
As you can see, both products use different initial context factories. The URLs
are less product specific than configuration specific (in WebLogic you can still
use their t3 protocol, but now they support IIOP as well). The best practice is
to not hardcode those parameters, but get them from an external configurable
resource (an environment, a properties-file or another LDAP naming server).
If your code runs on the application server (Java Servlets, JSPs, EJBs), you
don’t have to pass any environment properties to obtain the right initial
context (see next code snippet).
After you have the initial context, you can look up the required DataSource. If
you bear in mind our recommendation about naming, then you could use the
following code snippet in both servers:
try
{
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("jdbc/EstoreDB");
Connection conn = ds.getConnection();
// execute query
// process results
}
catch
{
//
}
catch
{
//
}
(NamingException e)
handle exception
(SQLException e)
handle exception
WebSphere forces you to start the logical DataSource name with jdbc/. In
WebLogic you could also use a dot (“.”) instead of the slash (“/”), but this code
then would not be portable. The same applies if you would use another child
subcontext under jdbc/; then it would not be portable either.
Also for the name we recommend not to use hardcoded strings, but rather get
it from the environment or another configuration resource. As soon as
possible, you shouldn’t use the name of the DataSource directly, but the
resource-ref indirection in the deployment descriptor of your component.
162
Migrating WebLogic Applications to WebSphere Advanced Edition
8.2.2 Connection pools
Connection pools provide a significant performance gain, since there is an
overhead in the process of permanently opening and releasing database
connections.
With the introduction of the DataSource interface, connection pooling has
been abstracted,since there is no difference in the code, whether the
DataSource object has just opened a single connection or whether an
existing connection has been assigned from a PooledDataSource. The
pooling of DataSource connections is driver-independent. You shouldn’t need
any server-specific classes or packages any longer to access DataSource
connections from a pool.
One thing you have to take care of in the code: Always call a close() on the
connection you obtain from DataSource.getConnection(), as soon as the
connection will not be needed any longer. In this way you do not really close
the connection, but rather return it to the pool and make it available for other
applications. This is shown in the next code fragment:
Connection conn = null;
try
{
DataSource ds = (DataSource) ctx.lookup("jdbc/EstoreDB");
Connection conn = ds.getConnection();
// execute query
// process results
}
catch (NamingException e)
{
// handle exception
}
catch (SQLException e)
{
// handle exception
}
finally
{
if (conn != null)
conn.close();
}
From the developer’s point of view, connection pools work the same way on
both servers, but for the administrator there are some differences that need to
Chapter 8. Database connectivity and persistence
163
be taken into account. WebSphere and WebLogic offer different tools to
create and configure connection pools. WebLogic has slightly more to offer in
regards to maintenance. There are more configurable properties, such as
capacityIncrement, to set how many connections are added to the pool if the
current connections are all reserved. WebLogic thus has more scope for
performance tuning in this area. It also has a finer grained system for security
in administrative tasks (access control list support).
WebLogic also offers a so-called multi-tier driver, or WebLogic JDBC/RMI
driver. It is what is called a JDBC type 3 driver, which uses a network server
to relay or proxy the JDBC requests onto the database. Only the network
server is directly connected to the database with another database-specific
driver. The clients don’t have to use native code, but only use the slim pureJava driver. With the WebLogic JDBC/RMI driver the client remains
completely independent of the driver that is used on the server.
WebSphere doesn’t offer such a generic driver, but it is possible for applets
and application clients to get database connections from the server if you use
the DB2net-driver. DB2 in its package includes the net-driver, which is
basically a type 3 driver (COM.ibm.db2.jdbc.net.DB2Driver).
We had problems trying to use the WebLogic JDBC/RMI driver in
WebSphere, because the WebLogic driver needs specific property settings,
which can’t be set using WebSphere.
8.2.3 Available drivers
WebSphere Application Server, Advanced Edition V3.5 supports the following
database systems:
• DB2
• InstantDB
• Oracle 8i
• Sybase
InstantDB is supplied as a solution for users who do not have database
software available for use as a configuration repository. It is not
recommended for application usage and does not support EJB CMP, or JTA.
Periodically new drivers may be added to the supported list. Please refer to
the online product documentation to see the most recent list.
For WebSphere Application Server software prerequisites, go to :
http://www-4.ibm.com/software/webservers/appserv/doc/v35/a_as.htm
164
Migrating WebLogic Applications to WebSphere Advanced Edition
This does not mean that you cannot use any JDBC 1.0/2.0-compliant drivers
supplied by other database vendors for use in Java Servlets or EJB BMP, but
you will have to evaluate and confirm the suitability of those drivers.
For instance we tried to use the Cloudscape JDBC driver, which is shipped
with the WebLogic Server.
8.2.3.1 Introducing a JDBC driver in VisualAge for Java
In the WebSphere Test Environment Control Center only a few preconfigured
JDBC drivers are available in a drop-down combobox list, when you try to
configure a DataSource. The combobox is not editable, so it is not possible to
introduce a new JDBC driver via the user interface.
You have to edit the file <VAJava_root>\ide\tools\com-ibm-ivj-uiwebcontrolcenter\com\ibm\ivj\control\dbdrivers.properties and append the
class name of the new JDBC driver with its full package name. The drivers
are separated by a semicolon. For our example with Cloudscape, we added
COM.cloudscape.core.JDBCDriver.
Restart the WebSphere Test Environment and the new driver will be available
for selection in the combobox.
The procedure for configuring a DataSource is described in 4.1.3.3,
“DataSource configuration” on page 69.
For our Cloudscape driver we selected COM.cloudscape.core.JDBCDriver
from the combobox. We entered jdbc:cloudscape:petStoreDB as the URL and
selected JDBC as the database type.
We had to add: D:\weblogic\eval\cloudscape\lib\cloudscape.jar; to the
Workspace classpath in VisualAge for Java.
For an EJB developer there is an alternative way to set the JDBC driver within
the WebSphere Test Environment. When the entire database access of your
application is done via entity beans with container-managed persistence
(CMP), then you may also use a panel in the EJB Server Configuration to set
your JDBC driver, but WebSphere does not support any driver different from
the approved ones (DB2, Oracle, Sybase) for EJB CMP.
8.2.3.2 Introducing a new JDBC driver in the WebSphere runtime
The configuration procedure for JDBC drivers and DataSources in the
runtime WebSphere Application Server, Advanced Edition completely differs
from that used in the WebSphere Test Environment.
Chapter 8. Database connectivity and persistence
165
See step 1. on page 51 to see a detailed step-by-step example of how to
introduce a new driver to the WebSphere runtime system.
As said in that section, some drivers will not be able to run the way you would
like with just the generic settings. Sometimes you will have or want to set
driver-specific properties to operate the database in a specific mode.
8.2.3.3 JDBC driver-specific properties in WebLogic Server
WebLogic Server offers a way to go beyond generic settings. With their JDBC
driver configuration you can also set driver-specific properties, which are
used to create the connection pool.
For example, the following shows the configuration of a Cloudscape
connection pool in weblogic.properties:
weblogic.jdbc.connectionPool.EstorePool=\
url=jdbc:cloudscape:petStoreDB,\
driver=COM.cloudscape.core.JDBCDriver,\
initialCapacity=1,\
maxCapacity=2,\
capacityIncrement=1,\
props=user=none;password=none;server=none
The first line specifies the logical name for the connection pool, which in our
case is EstorePool.
In the url= line, you can specify the full JDBC vendor-specific database URL.
In WebSphere, this URL will be composed with the URL prefix of the JDBC
driver (<protocol>:<subprotocol>, fir example, jdbc:cloudscape), a colon (“:”)
and the database name (petStoreDB). WebLogic doesn’t make up the URL
programmatically, but just takes what you set as the full URL. In WebSphere if
you specify a URL prefix for the JDBC driver, it will automatically insert a
colon between the URL prefix and what you entered under the database
name. The URL syntax is vendor specific and does not necessarily prescribe
this colon preceding the location and name of the database. However, most of
the well-known driver vendors do use the same format. But if the URL
specified by your driver vendor is different, then for WebSphere you should
leave the URL prefix for the JDBC driver blank and enter the full URL in the
database name field of the DataSource configuration.
The driver= line defines the full package class name of the JDBC driver.
There are more optional keys for configuring connection pools (not only
initialCapacity, maxCapacity, capacityIncrement), which often don’t have a
counterpart in WebSphere, but they are not crucial to get the JDBC driver or
166
Migrating WebLogic Applications to WebSphere Advanced Edition
DataSource runable on both systems. They are mainly for performance
tuning.
The props key is a slight benefit for WebLogic in regards to openness for
integration of new JDBC drivers. In our Cloudscape example, this was not an
issue, since we didn’t have the need to specify any database-specific
properties. But in some applications, you have to specify environment
properties for the database to set a specific mode. They are passed in the
getConnection(url, props) method when the server creates the pool of
connections. In the JDBC driver configuration in WebLogic, you can set these
key/value pairs under props.
In WebSphere, these specific settings can’t be done, unless the JDBC driver
vendor provides an alternative way of configuring those properties (for
example, incorporated in the URL). WebSphere has implemented an interim
solution to provide Sybase-specific properties, where you can specify the
properties in a datasources.xml file located in the <AppServerhome>\properties directory. This is a temporary solution, which cannot be
reliably used for drivers or DataSources other than those from Sybase. In the
dataSources.xml file, you can set attributes in form of key/value pairs for a
DataSource, but this support is currently only being used for Sybase
properties and to pick up the prepared statement cache size for the
connection pool.
8.2.3.4 Migration issues when changing JDBC drivers or databases
The JDBC API provides a common programming interface for accessing
different databases, it can also be used to use vendor-specific features
(stored procedures, utilizing metadata, specific data types, SQL dialects, and
so on). In this case changing the database or the driver would not be easy.
Driver support for advanced JDBC 2.0 scenarios such as batch updates,
CLOB/BLOB support, scrollable ResultSets, programmatic changes through
ResultSet, distributed transactions, etc. also varies from vendor to vendor.
The JDBC specification discourages use of the DriverManager in favor of
DataSources saying that the DriverManager, Driver, and DriverPropertyInfo
are legacy features of JDBC and that they may be deprecated in the future. In
previous versions of JDBC the DriverManager's getConnection(url, property)
was the standard method of obtaining a connection, so developers are
familiar with this and often expect the same behavior from DataSource
implementations.
Changing a JDBC driver and using its functionality shouldn’t have any
particular dependency on the application server but, because WebSphere
doesn’t have support the setting of driver-specific properties where the driver
Chapter 8. Database connectivity and persistence
167
is not compliant, and that only certain drivers are allowed for Entity CMP, this
could mean that a driver used in a WebLogic application can’t be used in
WebSphere.
So if the driver you use in WebLogic cannot work with generic settings and
thus cannot be integrated into the WebSphere environment, you may have to
check whether your database code will be a major migration issue.
Should you encounter this situation during your migration, we recommend
that you give careful consideration to your options before migrating to a
different driver or database. It is possible that the driver-specific properties
used in your WebLogic application are not crucial to the application
functionality and that using the generic driver support provided in WebSphere
may perform acceptably.
However, it is possible that you will have to use a different JDBC driver or
consider migrating to a different database system. We expect this issue to
decline in importance over time, as JDBC driver vendors move over time
towards providing the standard way to get and set properties. The JDBC 2.0
Standard Extensions Specification says that the only property that is required
on a DataSource is the description. The specification defines other standard
properties that must use to the defined names. All standard and vendorspecific properties must provide get and set methods and the use of getter
and setter methods is the standard way of handling properties for
DataSources. Once JDBC driver vendors move to this standard, we expect
that migration between vendors will become an easier task.
8.2.4 Distributed transactions
Since the JDBC 2.0 Optional Package API there is support for distributed
transactions within JDBC. Distributed transactions are commands that are
sent to multiple database servers. Either all of them are completed (commit)
or none (rollback). The extended functionality allows a JDBC driver to support
the two-phase commit protocol (2PC) used by the Java Transaction API. The
Java Transaction API (JTA) and the Java Transaction Service (JTS) specify
the Java interfaces between a transaction manager, the application, the
resource manager, and the application server.
The transaction part of the JDBC 2.0 Optional Package API is mainly
intended to be used for transactions in a component-based architecture,
where a server handles transaction declarations and controls distributed
transaction boundaries. In the case of EJBs, the EJB server will take care of
transactions.
168
Migrating WebLogic Applications to WebSphere Advanced Edition
In special situations if you want to demarcate the boundaries of a transaction
explicitly, for instance in Java Servlets, JSPs, EJB session beans with
transaction attribute TX_BEAN_MANAGED or even in stand-alone programs,
JTA provides the javax.transaction.UserTransaction interface. Developers can
use a UserTransaction to begin, commit, or roll back transactions.
Working with distributed transactions should not have a significant impact on
the application code, since the JDBC, JTA and EJB implementations offer
standardized interfaces. Nevertheless there are again some coding
differences and restrictions.
Before you start testing, you have to install a JTA enabled driver into
WebSphere. Refer to step 3. on page 54 to find out how to do this.
8.2.4.1 Migrating a WebLogic JTA example to WebSphere
On the WebLogic home page, you can find an example of using a JTS driver.
JTA is the high-level interface for the developer and JTS is the lower-level
interface that is used by the container to operate with the JDBC driver. The
example can be found at the URL: http://www.weblogic.com/docs51/classdocs/
jts_driver.html.
This is the source code of the example:
import javax.transaction.UserTransaction;
import java.sql.*;
import javax.naming.*;
import java.util.*;
import weblogic.jndi.*;.
.
.
{
Connection conn = null;
UserTransaction tx = null;
try
{
Context ctx = null;
Hashtable env = new Hashtable();
env.put(
Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
// Parameters for the WebLogic Server.
// Substitute the correct hostname, port number
// user name, and password for your environment:
Chapter 8. Database connectivity and persistence
169
env.put(Context.PROVIDER_URL, "t3://localhost:7001");
env.put(Context.SECURITY_PRINCIPAL, "Fred");
env.put(Context.SECURITY_CREDENTIALS, "secret");
ctx = new InitialContext(env);
tx = (UserTransaction)
ctx.lookup("javax.transaction.UserTransaction");
// Start a transaction on the current thread:
tx.begin();
// Load the JTS driver
Driver myDriver =
(Driver) Class.forName("weblogic.jdbc.jts.Driver").newInstance();
// Get a connection from the connection pool.
Properties props = new Properties();
props.put("connectionPoolID", "myConnectionPool");
conn = myDriver.connect("jdbc:weblogic:jts", props);
// Execute your database operations.
// Close your connection objects.
// Note that closing the connections does not commit the transaction
// nor return the connection to the pool:
conn.close();
// Execute any other database operations.
//
//
//
//
Complete the transaction by either committing the transaction or
rolling it back. The JTS driver will commit all the transactions
on all connection objects in the current thread and return the
connection to the pool.
tx.commit();
// or:
tx.rollback();
}
catch (Exception e)
{
170
Migrating WebLogic Applications to WebSphere Advanced Edition
try
{
if (conn != null)
conn.close();
if (tx != null)
tx.rollback();
}
catch (Exception e2)
{
}
// handle Exception
}
}
This code could run in a servlet, a JSP, an EJB session bean with
TX_BEAN_MANAGED, or an application. We decided to test this example in
a servlet within WebSphere.
In order to have the example run in WebSphere, remove the unnecessary
import statement:
import weblogic.jndi.*;
The WebLogic example does not use the recommended DataSource
interface. While we are migrating from WebLogic to WebSphere, we are also
going to use the recommended and portable approach via DataSource. This
allows a 2PC protocol to be supported, through the use of XADataSource and
XAConnections.
Therefore, insert the following import statement:
import javax.sql.*;
In the method, the first action is getting the initial context. We have already
described that you have to change weblogic.jndi.WLInitialContextFactory to
com.ibm.ejs.ns.jndi.CNInitialContextFactory as the provider URL to the server
and port of the WebSphere naming service using the IIOP protocol (for
example, iiop://myserver:900). The security settings are optional, but if you
set it you must set a known user who has read access to the naming service.
After you obtained the initial context, you can look up the UserTransaction
object. WebLogic binds this object under the JNDI name
javax.transaction.UserTransaction, while you can get the WebSphere
counterpart at jta/usertransaction. As a best practice, again we recommend
that you get the name from an external resource (environment, property file, a
Chapter 8. Database connectivity and persistence
171
common logical name in JNDI,...) instead of hardcoding it. So in WebSphere
you get the UserTransaction object with the following context lookup:
// Get JNDI name for UserTransaction from system environment
// and take the WebSphere name as default
String utxName = System.getProperty("jta.UserTransaction");
if (utxName == null)
utxName = "jta/usertransaction";
tx = (UserTransaction) ctx.lookup(utxName);
Notice that the client does a simple type cast of the lookup result, rather than
invoking a narrow method as required with other JNDI lookups.
We decided to use the DataSource interface to get the transaction-enabled
connection to the database. In WebSphere we configured a DataSource
called jdbc/exampleTX, which is based on a JTA-enabled JDBC driver. To get
the connection via the DataSource you can type:
// Get JNDI name for the example TXDataSource from system environment
// and take jdbc/exampleTX as default
String dsName = System.getProperty("example.TXDataSource");
if (dsName == null)
dsName = "jdbc/exampleTX";
DataSource ds = (DataSource) ctx.lookup(dsName);
System.out.println("Datasource lookup - OK");
Connection conn = ds.getConnection();
All other methods including the transaction code (tx.begin(), tx.commit(),
tx.rollback()), the executed database commands on the connection and the
closing of the connections can pretty much stay the same in both servers.
With JTA enabled driver connections obtained from a DataSource, the
autoCommit attribute is turned off by default. You also should not call
conn.commit() or conn.rollback(), but let the transaction manager do that for
you (tx.commit() or tx.rollback()).
When working with transactions, you will observe that the current WebLogic
implementation of JTA/JTS is very limited. Read what is said in their example:
“If these [database] operations use the JTS driver to access the same
connection pool as the transaction begun, they will participate in that
transaction. If the additional database operations using the JTS driver use
a different connection pool from the one specified in step 5
(myDriver.connect()), an exception will be thrown when you try to commit
or roll back the transaction.”
172
Migrating WebLogic Applications to WebSphere Advanced Edition
In their JTA/JTS implementation, only one connection pool (DataSource) can
participate within a single transaction. Within this transaction every lookup()
to the DataSource will return the same connection instance and thus
guarantee transactional integrity. This is a poor implementation in comparison
with the WebSphere solution, in which you can use many different
DataSources within a distributed transaction. They are committed using the
standard two-phase commit (2PC) protocol.
We successfully tested our Java Servlets transaction example in the
WebSphere runtime environment, but we could not run it in the WebSphere
Test Environment of VisualAge for Java, because the servlet was based on
the 2.2 Specification. While this book was written the WebSphere Test
Environment only supported Java Servlets 2.1. The Tomcat test environment
in VisualAge supports Java Servlets 2.2 but couldn’t handle WebSphere
distributed transactions.
8.2.5 Summary: Writing portable JDBC applications
To sum it up it can be said that for JDBC applications to be portable from one
application server to the other, you have to consider the following points:
• Use the DataSource interface to:
a. Get the connection to the data source
b. Get a connection from a connection pool
c. Get a connection that supports distributed transactions
• Don’t hardcode the JNDI Name of your DataSource or the
UserTransaction object, but get it from the environment or a configuration
file
• Use a portable JNDI name, for example jdbc/yourDataSourceName
(WebSphere has a limitation here: only a single subcontext starting with
jdbc/ is allowed)
• When you look up the DataSource from the JNDI context, use a slash for
the subcontext not a dot (use jdbc/yourDataSourceName and not
jdbc.yourDataSourceName)
• Use the JTA interface for distributed transactions, just WebLogic Server is
not there yet
• The JDBC driver being used could be a problem, since you might have
difficulties integrating it in the application server. Therefore avoid
database-specific and JDBC vendor-specific coding in case you will have
to use a different database or JDBC driver.
Sources of differences between databases and JDBC drivers are:
Chapter 8. Database connectivity and persistence
173
- The actual data types offered.
- The details of the SQL commands, syntax, and operations.
- The availability of DBMS-related services such as batch processing.
- DababaseMetaData and ResultSetMetaData: avoid dependencies on
vendor-specific information except where your code also supports a
completely portable solution.
- Stored procedure support and syntax are generally vendor-specific; if
used, process ResultSets before OUT parameters.
- Multiple ResultSets and vendor-specific batch support -- avoid use.
- SQLException and SQLWarning attributes are generally vendorspecific -- only use data for presentation.
- Transaction isolation level -- don't be dependent on a particular vendorsupplied default and avoid user control of same with
setTransactionIsolation().
- Support for scrollable ResultSet is optional; use a RowSet bean.
- Support for updatable ResultSet is optional (CONCUR_UPDATABLE).
Although this avoids the explicit SQL problem, it is still vendor-specific.
RowSet is a more portable solution.
- Support for JDBC 2.0 batch update feature (addBatch(),
executeBatch()) is optional. This is better than a vendor-specific batch
processing language, but it may still be non-portable.
- RowSet may have optional URL and database name parameters. Use
DataSource options instead.
8.3 jDriver (jdbcKona)
jDriver (formerly jdbcKona) is a collection of native JDBC drivers for Oracle,
Sybase, Informix and Microsoft SQL Server. These drivers provide a number
of extensions to the vendor’s original JDBC driver. For example, the
jdbcKona/Oracle driver provides an extension for creating and using Oracle
sequences. jdbcKona seems to be part of WebLogic Server Version 4.5 and
has been replaced by jDriver, a collection of WebLogic JDBC drivers, in 5.1.
jDriver-drivers are two-tier and multi-tier drivers that depend on client-side
middleware to function. WebLogic has no single packaged JAR-file for their
drivers, which could then be taken over to a different application server. You
would need to filter out all class and interface types from the WebLogic core
174
Migrating WebLogic Applications to WebSphere Advanced Edition
classes which are needed by the driver and package it on your own. But it is
doubtful whether this is a good and valid solution.
A discussion about available drivers for WebSphere can be found in 8.2.3,
“Available drivers” on page 164.
For more information on the BEA WebLogic jDriver Family see: http://
www.beasys.com/products/weblogic/drivers.shtml
For details of using the jdbcKona family of JDBC drivers: http://
www.weblogic.com/docs/classdocs/API_joci.html
8.4 dbKona
dbKona is a WebLogic tool that provides a higher-level mechanism for
accessing JDBC databases. Much as with htmlKona, applications developed
using dbKona will likely require considerable effort to migrate.
Below is a snippet of code from a dbKona code example. The connection
(conn) is created using the standard JDBC 1.0 API. It is unclear if dbKona
supports a connection obtained from a DataSource.
...
ts1 = new TableDataSet(conn, "emp");
for (int i = 0; i < 100; i++) {
Record rec = ts1.addRecord();
rec.setValue("empno", i)
.setValue("ename", "Person " + i)
.setValue("deptno", i);
}
// Save new records. dbKona does selective saves, that is,
// it saves only those records in the TableDataSet.
System.out.println("Inserting " + ts1.size() + " records.");
ts1.save();
// Define a KeyDef for updates and deletes.
KeyDef key = new KeyDef().addAttrib("empno");
// Update the 100 records that we originally added.
ts2 = new TableDataSet(conn, "emp", key);
ts2.where("empno < 100");
ts2.fetchRecords();
for (int i = 0; i < ts2.size(); i++) {
Chapter 8. Database connectivity and persistence
175
Record rec = ts2.getRecord(i);
rec.setValue("ename", "Worker " + i);
}
ts2.save();
...
The full example can be found at http://www.weblogic.com/docs/examples/
dbkona/db2examples.html. The KeyDef mentioned in the example is the primary
key of the table. The primary key must be known in order to do updates.
Unfortunately, dbKona is likely to cause problems during a migration. One
problem with tools such as dbKona is that developers tend to forget about
such things as application layering. That is, it is very likely that dbKona code
will be found directly in the servlet code. As part of the migration effort, a
distinct data layer should be introduced.
dbKona provides a higher-level abstraction of JDBC, but in this example we
see that dbKona is marginally higher-level than using the standard JDBC
PreparedStatements. The use of JDBC 2.0 Rowsets would provide a more
standard alternative to much of the dbKona functionality.
A considerable amount of work must be done to convert existing dbKona
source into standard JDBC 2.0, but this is the recommended and portable
way. Unfortunately, this will be a largely mechanical effort, since we are not
aware of tools to automate the process.
For the most-part, dbKona calls can be converted directly into JDBC calls.
As with htmlKona, there also is no technical reason why the dbKona code
cannot be used without modification in WebSphere. However, it is unclear
whether dbKona classes licensed from WebLogic Server can be legally used
in WebSphere, or if dbKona can be licensed separately from WebLogic
Server.
For an overview of dbKona architecture see: http://www.weblogic.com/docs/
techoverview/db.html
8.5 Business objects - persistence frameworks
In Java 2 Platform, Enterprise Edition the EJB specification is beginning to
provide a business object standard, but there is still much that remains to be
done. Similarly the Java Data Objects (JDO) Specification is also on the way
and currently available as Version 0.8, public review draft.
176
Migrating WebLogic Applications to WebSphere Advanced Edition
One issue with current EJB specifications as documented in the Enterprise
JavaBeans Specification, Version 2.0 from Sun Microsystems is that:
Every method call to an entity object via the remote and home interface
is potentially a remote call. Even if the calling and called entity bean
are collocated in the same JVM, the call must go through the container,
which must create copies of all the parameters that are passed through
the interface by value (that is, all parameters that do not extend the
java.rmi.Remote interface). The container is also required to check
security and apply the declarative transaction attribute on the intercomponent calls. The overhead of an inter-component call will likely be
prohibitive for object interactions that are too fine-grained.
The solution for fine-grained business objects considered by the EJB
specification are so-called dependent objects, which should not be
implemented as entity beans. Instead, a dependent object is better
implemented as a Java class (or several classes) and included with the entity
bean on which it depends.
Regarding entity beans, the EJB 1.1 Specification left many things open to
the server provider. This caused some non-portable code. The new EJB 2.0
Specification deals with many of these issues and makes some major steps
towards standardization of entity beans. The revised entity bean specification
includes support for container-managed relationships between entity beans
and dependent objects. It provides a foundation for pluggable persistence
managers and specifies a portable finder query syntax called EJB QL.
Furthermore, it enables support for more efficient vendor implementations by
leveraging lazy loading, dirty detection, memory footprint reduction.
We expect that the major J2EE server products, like WebLogic Server and
WebSphere Application Server, Advanced Edition will provide support for the
new EJB standard in future versions.
8.5.1 Container-managed persistence (CMP) entity beans
The coding for CMP entity beans is much simpler than for BMP (beanmanaged persistence), because most of the work is being done by the
container. CMP entity beans should perform better than BMPs because the
container has a lot of possibilities to optimize performance issues.
Entity beans as such are the most puzzling for migration issues, because they
still have a heavy dependency on server proprietary solutions.
WebLogic offers two CMP persistence solutions:
Chapter 8. Database connectivity and persistence
177
• The WebLogic Server RDBMS Persistence for trivial entity bean
applications
• TOPLink for WebLogic
TOPLink is sold as an add-on to WebLogic Server, but it is a popular EJB
container that is widely used in WebLogic applications.
WebSphere’s CMP solution has more to offer than WebLogic’s simple CMP
implementation. WebSphere already supports associations and inheritance
for EJBs. There is a current restriction that EJBs must use the DataSources
from DB2, Oracle, or Sybase. Other databases cannot be used for CMP entity
beans.
A TOPLink for WebSphere is also announced and should be available shortly.
Refer to 8.5.3, “TOPLink” on page 178 to get more information about
migration issues involved with that product.
8.5.2 Bean-managed persistence (BMP) entity beans
As the name implies BMP entity beans have to manage their persistent data
on their own. This can be done either by using direct JDBC, a persistence
mapping tool or even a legacy application.
The persistence approach in the BMP may be an issue for portability or
migration. If the BMP persistence uses JDBC you have to consider the points
mentioned earlier in this chapter. If you use other products or applications,
migration issues or incompatibilities will be vendor and product specific.
8.5.3 TOPLink
TOPLink for Java is a persistence framework that maps objects to relational
databases. TOPLink has a significant install base and, as such, may be part
of a migration effort.
TOPLink for Java is written in Java and should migrate with relative ease from
one application server to the next.
TOPLink for WebLogic is a container designed specifically to provide
persistence mapping for WebLogic Server. Some parts of WebLogic Server
have, in fact, been influenced by the TOPLink implementation. TOPLink for
WebLogic is BEA's preferred container-managed persistence solution. They
do have an alternative (WebLogic Server RDBMS Persistence), but BEA's
own sales force aggressively markets (and frequently sells) TOPLink. The
178
Migrating WebLogic Applications to WebSphere Advanced Edition
point is that where there are CMP EJBs with WebLogic, TOPLink is probably
being used.
TOPLink was recently (April 2000) purchased by WebGain as part of a
combined BEA/WebGain purchase of The Object People.
TOPLink for WebSphere has been announced and will be shipping by the end
of November 2000. From an application developer's point-of-view, there is
only one significant difference between the WebLogic and WebSphere
products.
The WebLogic version of the product automatically generates primary keys
for entity beans upon creation using a sequence table. Due to a timing issue
with the WebSphere container, TOPLink cannot automatically generate keys
for WebSphere. The application developer must modify their ejbCreate(...)
methods to include a single line of code to generate sequence numbers:
TOPLink.Public.EJB.SessionManager.getManager().getSession("TLWSEmployeeDem
o").getActiveUnitOfWork().assignSequenceNumber(this);
It's ugly code, but it's only one small change. Unfortunately it is very nonstandard. TOPLink does force a number of other non-standard things into
your beans, especially if you want to take advantage of more advanced
features such as deferred loading of contained objects.
8.5.3.1 Migration strategy
For TOPLink for Java, there are no major issues. The migration should be
relatively simple.
For TOPLink for WebLogic, migration should still be a relatively simple matter
of mechanically making changes to the code.
8.5.4 Other persistence managers
Besides TOPLink, there are also other persistence manager products on the
market that provide support for both servers. These include Thought Inc.’s
CocoBase and Versant’s Object Container (OO database).
Chapter 8. Database connectivity and persistence
179
180
Migrating WebLogic Applications to WebSphere Advanced Edition
Chapter 9. Migration example: The Java Pet Store
This chapter uses the Java Pet Store application from Sun Microsystems to
provide an example of the migration approach we recommend. While
individual chapters of this redbook make more detailed recommendations
about specific migration topics, we use the Java Pet Store example to provide
an overview of how these techniques can be combined to migrate a complete
application.
9.1 Introduction
This chapter is a complete example of a small, but non-trivial migration effort,
a mini-migration. We apply the process outlined in 1.4, “How to use this
guide” on page 10, and made use of the migration issues documented
elsewhere in this book. We have chosen the well-known Java Pet Store
example. Although this example is small enough to migrate in a single step,
we planned to use the incremental approach discussed in 2.4, “Migration
strategies” on page 26. In addition to being closer to a real migration effort,
this approach helped us validate the incremental migration technique.
9.1.1 Why Java Pet Store?
The Java Pet Store application is a particularly good example for our
purposes:
• It has been deployed on BEA WebLogic Server.
• It conforms to the J2EE interfaces and architecture.
• Although it is a small application, it is non-trivial.
• It is a well-known example, likely to be familiar to the reader.
Developed by Sun Microsystems, the Java Pet Store application has been
deployed on a number of different EJB servers, including BEA WebLogic
Server. A detailed step-by-step description of how to deploy the Java Pet
Store on BEA WebLogic Server is available from at: http://developer.java.
sun.com/developer/technicalArticles/J2EE/deployathon2/BEAreadme.html.
There are currently two versions of this application available from Sun
Microsystems, Version 1.0.1 and Version 1.1. We use Version 1.0.1 because
it is the one that has been deployed to the BEA WebLogic Server.
The Java Pet Store application was designed as a J2EE-compliant
application. Indeed, it has become the J2EE reference application. It adheres
to the J2EE APIs and architecture guidelines, and has been written to be
© Copyright IBM Corp. 2001
181
moderately portable. As such, it highlights J2EE deployment and migration
issues more than it does the vendor-specific conversion issues that might be
found in non-J2EE WebLogic applications.
Although we document the steps we took to migrate Java Pet Store 1.0.1 from
WebLogic to WebSphere, this is not written to be the official step-by-step
instructions for deploying the Java Pet Store on WebSphere. Our goal is to
provide more general guidance on how to migrate WebLogic J2EE
applications. As such, we provide additional hints on how to discover and
resolve migration problems. The Java Pet Store is just our vehicle for
accomplishing this goal.
We used the following process:
a. Analyze the Java Pet Store application.
b. Identify major migration issues and plan the migration stages.
c. Establish the migration environment.
d. Migrate the EJB server, stage 1.
e. Migrate the Web server, stage 2.
Not all of our redbook authors were familiar with the details of the Java Pet
Store application. This meant that we had to go through an initial analysis and
discovery process similar to what is involved in a real migration effort. We
have captured some of this experience by describing unexpected problems
and how we went about solving them. In particular, we realized early on that
we would have to make more Java source code changes to the Enterprise
JavaBeans than we would have preferred. Since the Java Pet Store follows
the Enterprise JavaBeans 1.1 Specification we had to make code changes to
revert to the Enterprise JavaBeans 1.0 Specification. Anticipating a future
upgrade to the Enterprise JavaBeans 1.1 Specification, we tried to do this in a
way that retains as much of the original Enterprise JavaBeans 1.1 code as
possible.
9.2 Understand the application
The first step of a migration is to develop an understanding of the application
you plan to migrate. In many cases, the developers tasked to migrate an
application are not its original developers, or even the maintenance team.
Also, migration requires a different perspective, one directed more towards
standards and portability. As preparation for our mini-migration example, we
took a few minutes to become familiar with the Java Pet Store user interface,
and then spent a fair amount of time understanding its structure and
182
Migrating WebLogic Applications to WebSphere Advanced Edition
implementation. We were not interested in a full understanding of the
implementation. We needed just enough information to identify likely
migration problems, and to evaluate possible migration strategies. Indeed, we
consciously avoided becoming experts on the Java Pet Store by not studying
the extensive design documentation provided by Sun Microsystems at
http://developer.java.sun.com/developer/Books/DesignEntApps/chap10.pdf.
9.2.1 Java Pet Store user interface
This is a typical Web store application with a typical Web store browser-based
user interface. It includes pages for welcome, inventory, ordering, and
checkout. Figure 52 on page 184 shows selected examples of the user
interface. After installing the Java Pet Store application on our migration
platform under the BEA WebLogic Server, we spent about five minutes
playing with the user interface to become familiar with its functionality. If you
are migrating a complex system, you will need to spend more time with this
activity.
Chapter 9. Migration example: The Java Pet Store
183
Figure 52. Java Pet Store user interface
9.2.2 Java Pet Store implementation
Compared with the user interface, you will want to spend quite a bit more time
studying the implementation of your application. The documentation provided
with the Java Pet Store application was a good place for us to start, but we
also found it helpful to examine the directory and package structures, the
deployment descriptions, and the source code itself. We recommend that you:
184
Migrating WebLogic Applications to WebSphere Advanced Edition
• Identify the application’s pieces and understand how they fit into the
overall architecture.
With the Java Pet Store, we paid particular attention to the Java Servlets,
the JavaServer Pages, and the Enterprise JavaBeans. The general roles
of these components are well-defined by the J2EE specification. Java
Servlets and JavaServer Pages reside in the Web tier while Enterprise
JavaBeans reside in the application tier.
• Question the role of the other pieces you find in your application.
For example, the Java Pet Store contains a set of model pieces that can
reside in both of the servers. Discovering this sort of information is
important if you plan to migrate your application in different stages.
• Understand how your database fits into the application.
Typically, this is done through the entity beans, but you may find that your
Web tier also makes direct references to the database. We discovered that
this is the case with the Java Pet Store. Again, this is important if you plan
to stage your migration.
• Finally, notice any unusual or interesting features.
For example, the Java Pet Store contains classes that deal with security
and user authorization. Migrating this sort of feature can be troublesome
because it typically relies on vendor-specific or system-specific details.
• Construct an inventory of the pieces in your application.
The Java Pet Store application contains about 90 Java classes and 35
JavaServer Pages. Figure 53 on page 187 provides a high-level view of
this inventory. The directory structure on the left of this figure was taken
from Windows NT Explorer. The package structure on the right of this
figure was taken from VisualAge for Java. Using this view, and digging a
bit deeper into deployment descriptions and the code, we discovered the
following about this inventory of pieces:
- The package structure corresponds nicely to the directory structure.
- All of the JavaServer Pages are located in the docroot subdirectory.
- The web subdirectories contain classes for the Web tier.
- The ejb subdirectories contain classes for the EJB tier.
- There are seven components, each with three packages for their ejb,
web, and model aspects.There are a variety of EJB types:
• ShoppingCartEJB, a stateful SessionBean, in cart\ejb
• AccountEJB, a BMP entity bean, in account\ejb.
Chapter 9. Migration example: The Java Pet Store
185
• CatalogEJB, a stateless SessionBean, in catalog\ejb.
• ShoppingClientControlEJB, a stateful SessionBean, in control\ejb.
• InventoryEJB, a BMP entity bean, in inventory\ejb.
• MailerEJB, a stateless SessionBean, in mailer\ejb.
• OrderEJB, a BMP entity bean, in order\ejb.
- Each EJB, except for the MailerEJB, is referenced by classes found in
the corresponding Web tier web subdirectories.
- Each EJB, except for the MailerEJB and the
ShoppingClientControlEJB, has a corresponding model subdirectory.
With this little bit of information, the roles of the ejb and web directories
are clear. Understanding the classes in the model subdirectories requires
more information about the application architecture.
186
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 53. Java Pet Store directory and package structure
Chapter 9. Migration example: The Java Pet Store
187
9.2.3 Java Pet Store architecture
For migration purposes, it is not necessary to understand all of the details of
an application’s architecture. It is important, however, to know what pieces go
onto which servers and how the pieces communicate with and depend on
each other. The architecture of the Java Pet Store application exemplifies
several patterns common to J2EE applications. Figure 54 on page 188
depicts the architecture.
Web server
1
web
browser
[controller]
servlet
translates
events
[view]
names of
JSPs
9
7
5 [events]
8
[model]
names
6 [updates model]
2 [returns list
of updated
models]
catalog
EJB server
OrderEJB
Account
EJB
...
3
controller
EJB -- state
machine
updates EJBs
database
4
Figure 54. Java Pet Store architecture
• Multi-tier server.
Aside from the user’s browser, there are typically three or more tiers in an
J2EE application. JavaServer Pages and Java Servlets in the Web server
translate HTTP requests into method calls on the EJBs in the EJB server,
and the EJBs encapsulate the underlying database. For the most part, the
Java Pet Store is typical. One exception is that the catalog database can
188
Migrating WebLogic Applications to WebSphere Advanced Edition
be referenced directly by both the Web server and the CatalogEJB in the
EJB server. This impacts the migration effort in that database connections
occur in both the Web and EJB servers. (We discuss the catalog database
further in 9.2.4, “Java Pet Store database” on page 190.)
• MVC pattern for user interactions.
The Web server uses a variation on the Model-View-Controller (MVC)
pattern, called the Model 2 Architecture. See http://developer.java.
sun.com/developer/onlineTraining/JSPIntro/contents.html for more
information. JavaBeans events are generated by the command processor
whenever EJBs are updated. These events are defined in the
com.sun.estore.control.events package. The events tell the model objects
when to refresh themselves from the underlying EJBs. The JavaServer
Pages simply populate themselves from the model objects located in the
Web server. Since JavaBeans events require that both the event source
and event listeners be in the same JVM, these components are closely
coupled within the Web server, and must be migrated together.
• Value objects for communicating across server boundaries.
Value objects are serializable, immutable objects. They have getter
methods, but no setter methods. They are also referred to as model beans
in the Java Pet Store application. Model beans are typically used to
communicate between EJBs and Java clients outside of the EJB server.
They can be copied freely with the understanding that their value is a
snapshot of EJB data values at the time they were generated. The Java
Pet Store uses model beans to update the Web model objects when the
underlying EJBs have been modified. The Web model objects are
surrogates for the underlying EJBs, but since they are in the same JVM,
they can listen to JavaBeans events generated within the Web server.
Indeed, these Web server objects are implemented by extending the
model beans with event listeners. For migration purposes, this tells us that
the same model objects must work for both the Web server and the EJB
server at each stage of the migration. These classes are shared by both
servers.
• JNDI names used to connect pieces in different servers.
There are lots of cross-server references in a J2EE application. In the
Java Pet Store application, the Web server has to find the EJBs in the EJB
server. It also has to find the catalog database because the catalog is not
strictly encapsulated by an EJB. Finally, the EJBs themselves have to be
able to find each other and their respective databases. These connections
are all handled by JNDI entries. To help with portability, the package
com.sun.estore.util contains all of the JNDI lookup names. That’s the good
news. The bad news is that we expected to have to modify some of these
Chapter 9. Migration example: The Java Pet Store
189
names to be compatible with the EJB 1.0 Specification. For the record,
JNDINames.java in the com.sun.estore.util package, defines the following
static final String variables:
-
CATALOG_EJBHOME
SCC_EJBHOME
CART_EJBHOME
ACCOUNT_EJBHOME
ORDER_EJBHOME
INVENTORY_EJBHOME
MAILER_EJBHOME
INVENTORY_DATASOURCE
ESTORE_DATASOURCE
MAIL_SESSION
USE_CATALOG_EJB
SECURITY_ADAPTER_CLASSNAME
SERVER_TYPE
SEND_CONFIRMATION_MAIL
The value of each of these Strings uses the Enterprise JavaBeans 1.1
standard for the java:comp/env JNDI default naming context. For example,
the value of CART_EJBHOME is java:comp/env/ejb/cart. Since the
Enterprise JavaBeans 1.0 Specification does not support the new JNDI
naming context, these names were an issue for our migration of the Java
Pet Store application.
9.2.4 Java Pet Store database
Frequently, the differences in database products and their use offer the
greatest challenges when migrating enterprise applications. However,
database migration is a topic in its own right and is beyond the scope of this
book. Any needed database migration should be done independently of
migrating your J2EE application. That said, you should be interested in how
the pieces of your J2EE application map to your database. This knowledge
can impact your J2EE migration in various ways, in particular with respect to
deployment and for staging needed changes.
When we looked at the Java Pet Store application, we found that it uses a
variety of ways to implement persistence data. In general, there are several
places to look to find this sort of information:
• EJBs.
• Deployment descriptors.
• References to the java.sql.Connection interface.
190
Migrating WebLogic Applications to WebSphere Advanced Edition
For the Java Pet Store, examining classes that reference the Connection type
generated interesting results. Figure 55 on page 191 lists all of the classes
that reference the java.sql.Connection interface.
com.sun.estore.account.ejb.AccountDAO.java
com.sun.estore.account.ejb.AccountEJB.java
com.sun.estore.catalog.model.CatalogDAO.java
com.sun.estore.catalog.model.CatalogImpl.java
com.sun.estore.inventory.ejb.InventoryDAO.java
com.sun.estore.inventory.ejb.InventoryEJB.java
com.sun.estore.order.ejb.OrderDAO.java
com.sun.estore.order.ejb.OrderDAOOracle.java
com.sun.estore.order.ejb.OrderDAOCS.java
com.sun.estore.order.ejb.OrderDAOSybase.java
com.sun.estore.order.ejb.OrderEJB.java
com.sun.estore.order.ejb.UUIDGenerator.java:
Figure 55. Java Pet Store connection references
The first thing to note in this list is that only three of the four packages are ejb
packages. The other one is the model package for the catalog. Both the
CatalogEJB (in an ejb package) and the CatalogWebImpl (in a web package)
extend the CatalogImpl class (in a model package). All of the catalog
database code is located in the CatalogImpl class. So the bottom line is that
the catalog database is accessed from two different objects, one in the Web
server and the other in the EJB server. Since the Java Pet Store catalog is a
read-only database, this is a plausible implementation. It also means that if
we change the CatalogImpl class, we will impact both the Web server and the
EJB server. This is another example of code sharing across server
boundaries.
The second thing to note is that there are a number of classes with DAO in
their names, meaning data access object. Remember that all of the entity
beans use BMP. The DAO classes are where you will find all of the BMP SQL
code. This technique encapsulates code that may need modifications as a
result of database migration. The fact that the com.sun.estore.order.ejb
package has separate implementations for three different database products
also highlights the problems of database migration. In retrospect, we should
have paid more attention to this aspect of the Java Pet Store because we also
migrated to a DB2 database, which was not one of the supported databases.
Finally, what is missing from Figure 55 on page 191? There are no references
to the Connection type in the ShoppingClientControllerEJB, the
Chapter 9. Migration example: The Java Pet Store
191
ShoppingCartEJB, or the MailerEJB. Indeed, these EJBs have no real
persistent data. Given that the MailerEJB is a stateless SessionBean, this is
not surprising. The ShoppingCartEJB and the ShoppingClientControllerEJB
do, however, contain data, but this data is not persistent across user
sessions. Their data is maintained in memory as hashtables. As stateful
SessionBeans, the cart and the user state data are simply lost when the
current session ends. Because they have no underlying database
dependencies, these EJBs should be easier to migrate than the other EJBs in
the Java Pet Store application.
9.2.4.1 Table names
The Java Pet Store uses a very simple mapping between EJBs and database
tables. An EJB instance generally maps to a single row in a table. This is a
typical arrangement for WebLogic applications that do not use a persistence
manager, such as TOPLink. In particular, the three EJBs and the one
JavaBean that map to a database encapsulate access to a total of eight
different tables.
• AccountEJB encapsulates the account table.
• InventoryEJB encapsulates the inventory table.
• OrderEJB encapsulates the item, product, and lineitem tables.
• CatalogModel bean encapsulate the item, product, and category tables.
Table names often present database migration problems. Embedded SQL
code must use actual table names, but different databases may use slightly
different table names for the same data. The Java Pet Store deals with this
portability problem by defining all table names as static final variables in the
com.sun.estore.util package. This makes it easy to find and change them if
needed. An even better approach might be to use env-entry attributes for
these names.
9.2.4.2 Interesting features
The Java Pet Store has a couple of interesting features that present migration
issues. No doubt your applications will have their own interesting features.
• As already mentioned, the catalog database is directly accessible both
from the Web server and from the EJB server.
• There is a SecurityAdapter class that is designed to authenticate users in
accordance with local system security rules. Since there is no standard for
authentication, we do not plan to offer a general solution for this common
migration issue.
192
Migrating WebLogic Applications to WebSphere Advanced Edition
• The MailerEJB makes use of the local system mailer process. This is also
a system-dependent issue that we do not plan to address in a general way.
• Many of the Java Pet Store classes are used in both the Web and the EJB
servers. This complicates migration staging and deployment.
9.2.5 The migration plan
After analyzing your application, you should have a pretty good idea which
potential migration issues you will have to address. From this information, you
can make a plan as to how to stage your migration.
For the Java Pet Store, we surveyed the migration issues in this book, and
based on our current knowledge of the application, identified the most likely
problems, which are:
• JNDI ENC
The Java Pet Store makes considerable use of the Enterprise JavaBeans
1.1 JNDI environment naming context (ENC). This issue is described in
detail in 7.4, “JNDI lookups expanded” on page 134. As expected, most of
this is for ejb-ref and resource-ref use, but there are also several env-entry
uses. Altogether, there are about 15 such references in nine different
classes.
• EJBException
The Java Pet Store makes significant use of the non-checked
EJBException defined for Enterprise JavaBeans 1.1. This issue is
described in 7.3, “EJBException replaces RemoteException in EJBs” on
page 130. Seven different classes use this exception. The Java Pet Store
also defines its own subclass of the EJBException, called
GeneralFailureException, another unchecked RuntimeException.
• Principal/Identity
The Enterprise JavaBeans 1.1 Principal class is used in one Java Pet
Store EJB. Although this is a minor problem in terms of the number of
affected classes, it is a particularly troublesome issue because it normally
requires a system-dependent implementation. This issue is discussed in
7.10, “Authentication method changes” on page 148.
• Collection finders
Two of the OrderEJB finder methods return the Collection type. This
feature was added to Enterprise JavaBeans 1.1. WebSphere currently
only supports Enumeration, in accordance with the EJB 1.0 Specification.
This problem is discussed in 7.6, “Finders expanded to Collection” on
page 141.
Chapter 9. Migration example: The Java Pet Store
193
We also considered other potential migration issues, but found that they do
not arise in the Java Pet Store. These issue include:
• CMP issues
Since the Java Pet Store does not use CMP entities, these issues do not
arise.
• String primary key
AccountEJB and InventoryEJB use String as their primary key, but these
seem to work fine in WebSphere.
9.2.6 Migration strategy
Our original plan was to use an incremental migration strategy. Due to time
constraints in completing this book, we elected to use a variation on this
strategy. Modifications to Web and EJB servers were pursued in parallel by
different authors, and then brought together for a single application
deployment. We deferred the verification of the incremental technique
described in 2.4, “Migration strategies” on page 26 until after we got the
application running under WebSphere.
9.2.6.1 Java Pet Store database
We established the migration platform at this point according to the
instructions in Chapter 3, “Configuration” on page 33. For the Java Pet Store,
this required the definition of a DB2 database preloaded with Pet Store data.
Since it is likely that you will also be migrating your application to DB2, you
will need to do something similar.
This was done by modifying the SQL database creation script for Oracle that
is distributed with the Java Pet Store application. At a bare minimum, the
table structure outlined in the SQL scripts needs to be created. In addition, a
user needs to be created to access the database (this will be used by a
DataSource within the WebSphere Application Server, Advanced Edition).
The DB2 SQL script that we used is available in the \petstore\bin directory of
the additional materials accompanying this book.
9.2.6.2 Pet Store on WebLogic
Before you get started with migrating the Java Pet Store to WebSphere, you
might want to see what is involved in deploying it on WebLogic. As you will
see, this is not actually necessary for our migration task, but it will provide you
with a basis for comparison. You will see that one of the main differences is
that no recompilation is required for the WebLogic installation. The WebLogic
deployathon page, at http://developer.java.sun.com/developer/
194
Migrating WebLogic Applications to WebSphere Advanced Edition
technicalArticles/J2EE/deployathon2/BEAreadme.html, provides easy
step-by-step instructions that work well.
9.3 Migrating EJBs
Throughout the remainder of this chapter, we assume directory path names
as shown in Table 8. You may need to adjust for different paths on your
system.
Table 8. Directory path naming conventions
Directory path
Purpose
e:\petstore
Distributed WebSphere Java Pet Store solution
d:\WebSphere\AppServer
WebSphere installation
d:\petstore\petstore.jar
Temporary EJB export directory
d:\WebSphere\petstore
Deployed Servlets and shared classes for Java Pet Store
Given the differences between the Enterprise JavaBeans 1.0 and 1.1
Specifications, it is not possible to perform a non-trivial migration from BEA
WebLogic Server 5.1 to WebSphere Application Server, Advanced Edition 3.5
without source level changes.
For the Java Pet Store, the relevant source code is identical, whether you use
the distribution from Sun Microsystems or from WebLogic. In either case you
should remove the security-related classes because they depend on
system-specific services. These classes will be replaced by our own,
admittedly simple, security classes. Remove:
• com.sun.estore.util.J2eeSecurityAdapter.java
• com.bea.estore.util.WLSecurityAdapter.java
• The com.bea.estore.rdbmsrealm package.
The e:\petstore directory contains the original Java Pet Store files in addition
to our modifications. This is how we constructed the e:\petstore directory.
1. Download the Java Pet Store, Version 1.0.1, from Sun Microsystems from
http://www.java.sun.com/j2ee/download.html#blueprints.
2. Put the file jps-1_0_1.zip into the e:\petstore\original directory and unzip it
into that directory.
3. Make a copy of e:\petstore\original\jps1.0.1\src\com and paste it into a
new directory e:\petstore\base. The e:\petstore\base directory contains
the base Java code for our migration.
Chapter 9. Migration example: The Java Pet Store
195
4. Rename e:\petstore\base\com\sun\estore\util\J2eeSecurityAdapter.java to
have a java-orig file type. This gets it out of the compile, but reminds us of
the original file.
5. If you chose to download the WebLogic deployment of the Java Pet Store,
perform the same steps, but rename WLSecurityAdapter.java, and don’t
put the rdbmsrealm package into e:\petstore\base.
This is a good time to look at the Java source code. VisualAge for Java is an
excellent tool for this purpose. Figure 56 on page 197 shows some of the
problems in the unmodified Java code. This All Problems list was generated
as follows:
1. Import the directory e:\petstore\base into a new PetStore project in
VisualAge for Java.
2. Open the All Problems tab.
3. The Java Pet Store depends on several packages that are not available by
default within VisualAge for Java. Three of them have been provided in the
e:\petstore\lib directory — activation.jar, mail.jar, and sunxml.jar. Import
each of these JARs into separate projects in VisualAge for Java. You will
notice that this resolves some of the problems.
4. If you haven’t already done so, import the latest servlet.jar file from the
d:\websphere\appserver\lib directory. More of the problems will be
resolved.
The problems that remain require source code changes to convert from the
Enterprise JavaBeans 1.1 Specification to the Enterprise JavaBeans 1.0
Specification. Our goal is to make these changes while preserving as much of
the original code as possible. This will make a future upgrade to the EJB 1.1
Specification easier.
9.3.1 Tools and techniques
We employed a combination of two techniques for locating and modifying the
Java source code problems. VisualAge for Java is great for discovering
problems. For example, it is clear from Figure 56 on page 197 that the new
unchecked EJBException is a problem when migrating to the EJB 1.0
Specification. Of course, we anticipated this problem. VisualAge for Java also
has very powerful editing features that make source code changes like these
relatively easy.
196
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 56. Initial Java Pet Store problems as seen in VisualAge for Java
We also used an automated tool for changing source code. Most of our
migration issues can be solved by making very local, and relatively simple
source code changes. We wrote a Perl script, called mg_convert, that
automatically modifies the code. Since this tool is based on simple pattern
matching, it can make mistakes if unusual programming conventions are
used. In the Java Pet Store example, it was easier to perform a few of the
required modifications by hand instead of programming their corrections into
Chapter 9. Migration example: The Java Pet Store
197
the conversion script. The advantage of this tool is that it can reliably (and
repeatedly) modify large amounts of code. If you change your mind about a
particular transformation, you can just rerun the script. The log that it
generates is also useful as a discovery tool. Figure 57 on page 199 is an
example of the generated conversion log.
Finally, to make source code changes as small as possible, we provided a
separate package, named com.ibm.websphere.migrate, for various helper
classes. It contains classes like EnumerationConvertor to help with finders
that return the Collection type, and InitialContextMigrate to help deal with the
JNDI default naming context.
At this point, only some of the EJB migration issues have been coded into the
mg_convert tool. This Perl script is available in the e:\petstore\bin directory.
The e:\petstore\bin\modify.bat command transforms the Java files in the
e:\petstore\base directory, and places all modified files into the
e:\petstore\modify directory. This directory can then be imported into your
PetStore project in VisualAge for Java, updating the Java classes with
corrections. Try importing e:\petstore\modify; all of the remaining problems
should be resolved.
1. In a DOS shell, change directories to e:\petstore\bin.
2. Enter the command modify.
3. Go to the VisualAge for Java workbench and import the directory
e:\petstore\migratelib into a new project.
4. Select the PetStore project.
5. Import the directory e:\petstore\modify into the PetStore project.
6. Go to the All Problems tab to see if any problems remain.
9.3.2 Source changes
As indicated in 9.2.5, “The migration plan” on page 193, our analysis of the
Java Pet Store code gave us a good idea of the code we needed to change.
Except for the Collection finders issue, these were all apparent as errors in
VisualAge for Java when we first compiled the e:\petstore\base code. The
Collection finders issue did not actually cause an error until we attempted to
deploy the EJBs. At that point, the EJB deployment tool caught the problem.
Since these migration issues are covered in detail in Chapter 7, “Enterprise
JavaBeans” on page 127, we only discuss the specifics of our solutions to the
Java Pet Store here.
198
Migrating WebLogic Applications to WebSphere Advanced Edition
C:\ITSO > cd petstore\bin
C:\ITSO\petstore\bin > modify
C:\ITSO\petstore\bin > mg_convert.pl ..\base ..\modify 1>..\modify\modify.console
C:\ITSO\petstore\bin > type ..\modify\modify.console | more
UNCHANGED: com/sun/estore/account/ejb/Account.java
UNCHANGED: com/sun/estore/account/ejb/AccountDAO.java
MODIFIED: com/sun/estore/account/ejb/AccountEJB.java
import com.ibm.websphere.migrate.InitialContextMigrate; /*MIGRATION*/
import com.ibm.websphere.migrate.EJBExceptionMigrate; /*MIGRATION*/
throw new EJBExceptionMigrate (se); /*MIGRATION*/
throw new EJBExceptionMigrate (se); /*MIGRATION*/
throw new EJBExceptionMigrate (se); /*MIGRATION*/
throw new EJBExceptionMigrate (se); /*MIGRATION*/
InitialContextMigrate ic = new InitialContextMigrate(context.getEnvironment()); /*MIGRATION*/
throw new EJBExceptionMigrate(ne); /*MIGRATION*/
throw new EJBExceptionMigrate(se); /*MIGRATION*/
UNCHANGED: com/sun/estore/account/ejb/AccountHome.java
UNCHANGED: com/sun/estore/account/ejb/DuplicateAccountException.java
UNCHANGED: com/sun/estore/account/model/AccountModel.java
UNCHANGED: com/sun/estore/account/web/AccountWebImpl.java
UNCHANGED: com/sun/estore/cart/ejb/ShoppingCart.java
UNCHANGED: com/sun/estore/cart/ejb/ShoppingCartEJB.java
UNCHANGED: com/sun/estore/cart/ejb/ShoppingCartHome.java
UNCHANGED: com/sun/estore/cart/model/CartItem.java
UNCHANGED: com/sun/estore/cart/model/ShoppingCartModel.java
UNCHANGED: com/sun/estore/cart/web/ShoppingCartWebImpl.java
UNCHANGED: com/sun/estore/catalog/ejb/Catalog.java
UNCHANGED: com/sun/estore/catalog/ejb/CatalogEJB.java
UNCHANGED: com/sun/estore/catalog/ejb/CatalogHome.java
UNCHANGED: com/sun/estore/catalog/model/CatalogDAO.java
WARNING: com/sun/estore/catalog/model/CatalogImpl.java needs EJBContext properties if called
WARNING: in EJB to lookup env-entry using java:comp/env/entryName,
WARNING: or for indirect lookup of java:comp/env/subcontext/name.
WARNING: Add an EJBContext variable to class and rerun conversion.
MODIFIED: com/sun/estore/catalog/model/CatalogImpl.java
import com.ibm.websphere.migrate.InitialContextMigrate; /*MIGRATION*/
InitialContextMigrate ic = new InitialContextMigrate(null/*properties object for env-entry*/); /*M
UNCHANGED: com/sun/estore/catalog/model/CatalogModel.java
UNCHANGED: com/sun/estore/catalog/model/Category.java
UNCHANGED: com/sun/estore/catalog/model/InventoryItem.java
UNCHANGED: com/sun/estore/catalog/model/Item.java
UNCHANGED: com/sun/estore/catalog/model/Product.java
UNCHANGED: com/sun/estore/catalog/web/CatalogWebImpl.java
UNCHANGED: com/sun/estore/control/EStoreEventException.java
MODIFIED: com/sun/estore/control/GeneralFailureException.java
import com.ibm.websphere.migrate.EJBExceptionMigrate; /*MIGRATION*/
public class GeneralFailureException extends EJBExceptionMigrate /*MIGRATION*/
UNCHANGED: com/sun/estore/control/LoginFailedException.java
UNCHANGED: com/sun/estore/control/ejb/ModelUpdateManager.java
UNCHANGED: com/sun/estore/control/ejb/ShoppingClientController.java
Figure 57. EJB conversion using the mg_convert Perl script
Chapter 9. Migration example: The Java Pet Store
199
9.3.3 JNDI ENC changes
Initially, this looked like the most complex issue we had to deal with. In
retrospect, we probably spent more time on it than it deserved. The only
cases that required changes are the env-entry cases. With that said, here is
what we did.
As indicated in Chapter 7, “Enterprise JavaBeans” on page 127, migrating
from the EJB 1.1 JNDI default context to EJB 1.0 involves these aspects of
the JNDI lookup code:
1. The type of the object being retrieved — this can be an env-entry, an
ejb-ref, or a resource-ref such as a DataSource.
2. The scope of the JNDI name — this can be scoped to the EJB itself, or it
can have a scope global to the JNDI server.
3. The syntax of the JNDI name — this varies between env-entry, JDBC
DataSource objects, and other resources like ejb-ref.
4. The availability of the EJBContext Properties object.
There are times when you need access to the EJBContext’s environment
Properties object. This is required for env-entry lookups because that is
where such values are found in Version 1.0 of EJBs. Unfortunately,
depending on the structure of the code, you are not always guaranteed
access to an appropriate EJBContext variable. This is true in the Java Pet
Store example in the JNDIUtil and StateMachine classes.
5. The same JNDI lookup code may have to operate in multiple runtime
environments, for example EJB 1.0 and Servlet 2.2
Finally, the Java Pet Store presented us with a special problem in the
JNDIUtil.java class. This class does all of the JNDI lookups for EJBHome
objects, and it is called from both the Servlet 2.2 environment and the EJB
1.0 environment. Any changes that impacted this class had to work
properly in both of these environments.
All JNDI ENC migration examples have the following pattern in the original
code. This particular example is from EJBUtil.java
InitialContext initial = new InitialContext();
Object objref = initial.lookup(JNDINames.ACCOUNT_EJBHOME);
The object resulting from the lookup is then cast to its actual type. This may
be a normal cast, as in the case of an Integer env-entry, or it may be a
PortableRemoteObject.narrow cast, as in the case of an EJBHome. For our
purposes, the type of cast does not matter. To make the required code
changes as small as possible, we chose to use a helper class for the lookup
200
Migrating WebLogic Applications to WebSphere Advanced Edition
method. In all cases, we converted code like that shown above to one of the
following, depending on the presence of an EJBContext variable.
1. If an EBJContext variable is not available:
InitialContextMigrate initial = new InitialContextMigrate
(null/*properties object for env-entry*/); /*MIGRATION*/
Object objref = initial.lookup(JNDINames.ACCOUNT_EJBHOME);
2. If an EJBContext variable is available (the variable is ctx in this example):
InitialContextMigrate ic = new InitialContextMigrate
(ctx.getEnvironment()); /*MIGRATION*/
Boolean bool = (Boolean)ic.lookup(JNDINames.SEND_CONFIRMATION_MAIL);
In either case, an import statement was added for the helper class:
import com.ibm.websphere.migrate.InitialContextMigrate;
/*MIGRATION*/
Notice that we have followed the convention of adding the comment
/*MIGRATION*/ to every changed line of code, whether this line was changed
automatically or by hand.
All of the JNDI ENC changes were automated by the mg_convert script. If an
EJBContext variable is not available, a warning is also generated to indicated
that the EJBContext Properties object may be needed for proper execution.
The EJBContext Properties object is required for EJB 1.0 env-entry lookups,
but it is optional in other cases. Unfortunately, it is not possible to make this
determination automatically. We also had to keep in mind the requirement
discussed in step 5. on page 200 when designing these code changes; that
is, the EJB 1.0/Servlet 2.2 cohabitation constraint.
The pattern of changes for JNDI ENC are extremely simple, requiring the
modification of a single constructor call from InitialContext() to
InitialContextMigrate(Properties). The changes could easily be done by hand.
VisualAge for Java, for example, offers search and edit commands that are
more than adequate. In either case, the big payoff is to encapsulate the actual
lookups into the InitialContextMigrate helper class. In particular, the env-entry
lookups use the EJBContext Properties and also perform type conversions to
the desired env-entry object type. Before looking at specific JNDI ENC
examples from the Java Pet Store, we take a look at the InitialContextMigrate
helper class.
The InitialContextMigrate class is a wrapper for the standard
javax.naming.InitialContext class. It replaces the behavior of the
lookup(String) method to distinguish between the following cases at runtime,
based on the value of the String argument.
Chapter 9. Migration example: The Java Pet Store
201
• EJB env-entry
Do the EJB 1.0 equivalent of an env-entry lookup for the JNDI name
java:comp/env/envName. This means use the EJBContext Properties
object provided by the InitialContextMigrate constructor to obtain an EJB
1.0 environment deployment String for envName. This was actually the
only case we needed to change for the Java Pet Store. All other lookups
worked with the unmodified JNDI names.
An EJB 1.1 env-entry can be any of a number of Java wrapper types, for
example, Integer or Boolean. Since Properties can only provide String
types, the InitialContextMigrate optionally converts the retrieved String into
the type specified by its first token. For example, a deployment value of
“Integer 556” will construct an Integer(“556”) object. This convention
impacts the environment values used for EJB deployment of the Java Pet
Store.
If no Properties object has been provided, we assume that this is a call
from a Servlet. In this case, we just do the standard JNDI lookup. This
convention allows EJBs 1.0 to live happily with Servlets 2.2, while using
the same InitialContextMigrate helper class. This is important for the Java
Pet Store because its JNDIUtil class is use by both EJBs and Servlets for
all the different types of JNDI lookups.
• Non-EJB env-entry
This case is used by Servlets, and is indicated by passing null for the
Properties parameter. The InitialContextMigrate lookup simply delegates
to the standard InitialContext lookup.
• JDBC env-resource
For this case we use a standard InitialContext().lookup(). The only
difference is the String provided to JNDI. Since we thought that JNDI
naming might be a problem for DataSource lookups (see 8.2.1.1, “Binding
a DataSource to a naming service” on page 159 for details),
InitialContextMigrate provides a place to translate the JNDI name if
needed. We discovered that no such translation was needed.
• EJB ejb-ref
This case is similar to the JDBC env-resource case, also allowing for
translation of the JNDI name. Our experiments indicated that the EJB 1.1
java:comp/env/ejb/ejbName form works just fine for EJBHome lookups.
• Other env-resource
The Java Pet Store actually uses one non-JDBC env-resource. It is a
reference to the javax.mail.Session, using
java:comp/env/mail/MailSession for the JNDI name. Because of time
202
Migrating WebLogic Applications to WebSphere Advanced Edition
constraints, we chose not to migrate this feature. However, the
InitialContextMigrate class is a place for any special handling of such
requests.
The InitialContextMigrate class has two additional features that may be useful
in some migration efforts. We did not actually use them with the Java Pet
Store migration. For additional details, look at the InitialContextMigrate code
in e:\petstore\migratelib.
• If a Properties object is provided for a JDBC or EJB lookup, it is used to try
to find an alias for the provided JNDI name. If one is found, it replaces the
original name and is used for the actual JNDI lookup. Otherwise the
original name is used for the JNDI lookup. This is useful when the JNDI
resource name and the deployed name are different. This can be helpful
during a transition phase of a larger migration project.
• The InitialContextMigrate class can be configured to use a JNDI server
other than the default name server for JDBC or EJB lookups. This is handy
if you are using an incremental migration strategy and need to temporarily
use resources in a different EJB or database server.
9.3.3.1 Summary of JNDI ENC changes
No JNDI names had to be changed. The only essential changes were to use
the InitialContextMigrate for the env-entry cases. All other JNDI lookups
worked with the EJB 1.1 style of JNDI names. However, do not expect these
names to provide EJB scoping in WebSphere, because that is not part of the
EJB 1.0 Specification. To insure EJB scoping, use the EJBContext Properties
object for aliasing as described above.
Java Pet Store env-entry changes
The Java Pet Store has two env-entry attributes:
1. JNDIUtil reads a Boolean from java:comp/env/sendConfirmationMail.
JNDIUtil needed a bit of manual conversion because the original static
method sendConfirmationMail() had no EJBContext available. We added
an EJBContext ctx parameter to the method and to its only caller,
StateMachine. These change were made directly in the e:\petstore\base
directory.
public static boolean sendConfirmationMail(EJBContext ctx){/*MIGRATION*/
InitialContextMigrate ic = new
InitialContextMigrate(ctx.getEnvironment()); /*MIGRATION*/
Boolean bool = (Boolean)ic.lookup(JNDINames.SEND_CONFIRMATION_MAIL);
The environment deployment value for sendConfirmationMail is “Boolean
false”.
Chapter 9. Migration example: The Java Pet Store
203
2. StateMachine reads a String from
java:comp/env/securityAdapterClassName. This code also needed some
manual conversion because the StateMachine class did not originally
contain an EJBContext variable. We added the ejbCtx instance variable,
by hand, and passed it to the constructor of StateMachine. It was also
necessary to modify its only caller, ShoppingClientControllerEJB to pass
its EJBContext object in the StateMachine constructor.
InitialContextMigrate ic = new
InitialContextMigrate(ejbCtx.getEnvironment()); /*MIGRATION*/
securityAdapterClassName = (String)
ic.lookup(JNDINames.SECURITY_ADAPTER_CLASSNAME);
Java Pet Store ejb-ref changes
All EJBHome references are obtained by calling static methods in the EJBUtil
class. These methods are called by Servlets and by EJBs, so modifications
must work in both environments. All of these methods were changed
automatically by the mg_convert script and they all follow the same pattern.
public static AccountHome getAccountHome() {
try {
InitialContextMigrate initial = new InitialContextMigrate
(null/*properties object for env-entry*/); /*MIGRATION*/
Object objref = initial.lookup(JNDINames.ACCOUNT_EJBHOME);
Since these are all EJBHome lookups, there is no need to provide a
Properties object to the InitialContextMigrate constructor. Indeed, since the
JNDI lookup names — java:comp/env/ejb/account in this case — are not
translated by the InitialContextMigrate lookup, behavior is identical to that of
InitialContext. These changes can simply be ignored if you are not using the
automated mg_convert script.
Java Pet Store resource-ref changes
OrderEJB, InventoryEJB, AccountEJB, and CatalogImpl were all
automatically modified to use InitialContextMigrate to look up their
DataSource objects.
private Connection getDBConnection() throws SQLException {
Connection connection;
try {
InitialContextMigrate ic = new InitialContextMigrate
(context.getEnvironment()); /*MIGRATION*/
DataSource ds = (DataSource)
ic.lookup(JNDINames.ESTORE_DATASOURCE);
connection = ds.getConnection();
204
Migrating WebLogic Applications to WebSphere Advanced Edition
Since the semantics of these lookups are the same as the original code,
these changes may be ignored if using hand editing.
The CatalogImpl is one of the shared classes, used in both the Servlet and
EJB environments. Consequently, it does not have an EJBContext variable
available, so its InitialContextMigrate constructor takes null as its argument.
protected Connection getDBConnection() {
try {
InitialContextMigrate ic = new InitialContextMigrate
(null/*properties object for env-entry*/); /*MIGRATION*/
DataSource ds =
(DataSource)ic.lookup(JNDINames.ESTORE_DATASOURCE);
return ds.getConnection();
9.3.4 EJBException changes
As described in 7.3, “EJBException replaces RemoteException in EJBs” on
page 130, this is a very simple change. We simply replaced the EJB 1.1
unchecked EJBException RuntimeException with a different EJB 1.0
unchecked RuntimeException, which we call EJBExceptionMigrate.
EJBExceptionMigrate is unchecked because if extends
java.lang.RuntimeException. This exception is defined in the provided
com.ibm.websphere.migrate helper package. These changes were all
automatically done by the mg_convert script, including the addition of the
required import statement. The OrderEJB class provides numerous examples
of this modification. It also affects AccountEJB, ShoppingClientControllerEJB,
StateMachine, InventoryEJB, and MailerEJB.
private Connection getDBConnection() throws SQLException {
Connection connection;
try {
InitialContextMigrate ic = new
InitialContextMigrate(context.getEnvironment()); /*MIGRATION*/
DataSource ds = (DataSource)
ic.lookup(JNDINames.ESTORE_DATASOURCE);
connection = ds.getConnection();
} catch (NamingException ne) {
Debug.print(ne);
throw new EJBExceptionMigrate(ne); /*MIGRATION*/
} catch (SQLException se) {
Debug.print(se);
throw new EJBExceptionMigrate(se); /*MIGRATION*/
}
return connection;
}
Chapter 9. Migration example: The Java Pet Store
205
The Java Pet Store also defines its own unchecked RuntimeException by
extending the EJB 1.1 EJBException. The same conversion works equally
well for this situation, making the user-defined GeneratFailureException a
subclass of EJBExceptionMigrate.
import com.ibm.websphere.migrate.EJBExceptionMigrate; /*MIGRATION*/
public class GeneralFailureException
extends EJBExceptionMigrate /*MIGRATION*/
With these changes in place, all of the “EJBException not handled” problems
disappear from the All Problems window in Figure 56 on page 197.
9.3.5 Principal/Identity changes
As described in 7.10, “Authentication method changes” on page 148, the EJB
1.0 Specification requires using the Identity type instead of the Principal type.
This affects the getUserIdentity() and inCallerInRole(Identity) methods on the
EJBContext object. The Java Pet Store OrderEJB and
ShoppingClientControllerEJB classes make use of these methods. The
mg_convert script automatically changes Principal to Identity. The
isCallerInRole method requires the following slightly more complex change.
This change was also automated.
if (context.isCallerInRole
(new IdentityMigrate("GOLD_CUSTOMER"))) { /*MIGRATION*/
IdentityMigrate is just a subclass of the abstract Identity class.
These changes were successful in that they eliminated the original compiler
errors, but the compiled code failed to execute properly in WebSphere.
Without also enabling the WebSphere security feature, we got the
NotImplementedeException at runtime. Because of time constraints, we did
not pursue this problem further.
As a workaround, we simply commented out the Java Pet Store security
checking and used the j2ee user ID that is in the supplied database.
// if ( context.isCallerInRole(
//
new IdentityMigrate("GOLD_CUSTOMER"))) { /*MIGRATION*/
and,
//
206
String userId = sc.getCallerIdentity().getName(); /*MIGRATION*/
String userId = "j2ee"; /*MIGRATION*/
Migrating WebLogic Applications to WebSphere Advanced Edition
9.3.6 Collection finder changes
As described in 7.6, “Finders expanded to Collection” on page 141, you must
modify finder methods that return the Collection type. Collection is not a legal
finder return type in EJB 1.0. You must use Enumeration instead. We only
discovered this problem in the Java Pet Store when we tried to deploy it. It
does not cause a compiler error. You will have to examine your code carefully
to discover this problem earlier. It was easy to automatically locate and
change the EJB and EJBHome finder methods headers from Collection to
Enumeration. In the Java Pet Store, there are just two such finder methods,
both in OrderEJB:
public Enumeration ejbFindUserOrders( String userId ) /*MIGRATION*/
public Enumeration ejbFindByStatus( String status ) /*MIGRATION*/
Unfortunately, you also have to locate and change the EJB finder return
values, and all client code that uses these finders. After the above change,
you will find these quickly because of the resulting compiler errors. We made
these changes manually. The finder return must convert its Collection to an
Enumeration, and each client must convert its returned Enumeration back to
a Collection. To reduce the amount of added code, we provided these
intermediate conversions by means of helper methods in the
EnumerationCollector class, found in the com.ibm.websphere.migrate
package.
public static Collection convertEnumeration(Enumeration enum) {
Vector v = new Vector();
while (enum.hasMoreElements()) {
v.add(enum.nextElement());
}
return v;
}
public static Enumeration convertCollection(Collection col) {
return new Vector(col).elements();
}
Here are examples of their use, from OrderEJB and PendingOrdersBean,
respectively.
return(EnumerationConvertor.convertCollection
(ODAO.findByStatus(dbConnection))); /*MIGRATION*/
Collection orderColl = EnumerationConvertor.convertEnumeration
(home.findByStatus(Order.PENDING)); /*MIGRATION*/
These changes work for all implementations of Collection and Enumeration.
The implementation of the Enumeration in the EJB code will in general be
Chapter 9. Migration example: The Java Pet Store
207
different from the implementation of the Enumeration in the client code. Only
the Enumeration interface is guaranteed. This is the same for Collection in
EJB 1.1.
9.3.7 DB2 database support
This is an example of a migration issue that we did not discover until runtime.
You should plan on a few such problems in your migration efforts.
In the Java Pet Store, the OrderEJB is only implemented for Oracle, Sybase,
and CloudScape databases. These implementations are nicely packaged in
their own classes — OrderDAOOracle, OrderDAOSybase, OrderDAOCS —
each of which extends the abstract class OrderDAO. The correct
implementation is selected at runtime by the following code:
OrderDAO OD = null;
String DBProductName =
dbConnection.getMetaData().getDatabaseProductName().trim();
if (DBProductName.startsWith("Oracle")) {
OD = new OrderDAOOracle();
else if (DBProductName.equals("SQL Server")) {
OD = new OrderDAOSybase();
else if (DBProductName.equals("DBMS:cloudscape")) {
OD = new OrderDAOCS();
}
return OD;
Our problem was that we had converted the PETSTORE database to DB2.
This problem is an example of what is described in 8.2.3.4, “Migration issues
when changing JDBC drivers or databases” on page 167. Database metadata
is one of the JDBC openings into vendor-specific migration issues.
Given the design of the Java Pet Store, the correct solution to this problem is
to implement an OrderDAODB2 class and add it to the above case statement.
Indeed, since this is a database migration problem, it should be done as an
independent migration project. We do not show the details of the
OrderDABDB2 class because it is not in the scope of this guide. Since this
code is not exercised until final checkout from the Java Pet Store, most of the
application runs without making this change.
9.4 Java Pet Store deployment
In the ideal case, you deploy a J2EE application by providing the deployment
tool with the application’s EAR file. This does not work for our Java Pet Store
migration for several reasons:
208
Migrating WebLogic Applications to WebSphere Advanced Edition
• WebSphere does not support EAR files.
Although the J2EE reference platform supported EAR files early on, they
have only recently become a part of the official J2EE specification. Neither
WebSphere nor WebLogic support the EAR files. (See 2.2.2.3, “Java 2
Platform, Enterprise Edition (J2EE) specification” on page 22 for more
details.) The next best approach is to separately deploy an EJB JAR file
for the EJB server and a WAR file for the Web server. We use a variation
on this approach.
• We had to make source code changes.
Even if EAR files were fully supported, we would have to reconstruct its
contents because we have modified the source code.
• Java Pet Store servlets and EJBs share code.
The Java Pet Store EAR file contains separate copies of many of its
classes — one for the servlets in the WAR file and another for the EJBs in
a separate JAR file. Any classes that are used in common will be
duplicated. For example, if you make a minor change to one of the shared
classes, you must reconstruct both the WAR and the JAR files and
redeploy the entire application. EJB deployment, in particular, is time
consuming. Any shortcut to this process risks having different versions of
the same classes in two different places, a typical cause of classpath
errors. During our Java Pet Store mini-migration effort, we actually
experienced this problem, and have therefore compensated for it in our
deployment recommendations.
• Incompatible deployment objects.
The EJB 1.1 Specification uses a standard XML deployment object
whereas the EJB 1.0 uses instances of the now-deprecated
javax.ejb.deployment classes. During the course of this exercise, we
experimented with several approaches to converting standard XML
deployment descriptors into EJB 1.0 deployment objects. For our purpose,
it turned out to be easier to just use a standard EJB 1.0 deployment tool to
recreate the deployment descriptor objects from scratch. We
experimented with the jetace, VisualAge for Java, and WebSphere
deployment tools. For the Java Pet Store, VisualAge for Java turned out to
be the most effective. Our source code was in VisualAge for Java, and we
only had to go through the descriptor specification process once.
• Deployment code generation alternatives.
The EJB stubs and ties must be generated by either WebSphere or
VisualAge for Java. One advantage of using VisualAge for Java is that it
has a superior test environment. Unfortunately, we had problems trying to
Chapter 9. Migration example: The Java Pet Store
209
use VisualAge for Java for EJB deployment and test. At the time of this
writing, there was an outstanding defect that caused VisualAge for Java to
hang during EJB deployment. We also tried using the deployment code
generated by WebSphere as input to the VisualAge for Java test
environment. We ran into serialization versioning problems. We were
forced to choose WebSphere for deployment code generation.
The bottom line is that we developed our own custom deployment process,
which we describe here. As the deployment process evolves, a more standard
approach will be possible in the future. A secondary advantage of the process
described here is that you get to learn more about the structure and workings
of WebSphere.
We used the following deployment process for the Java Pet Store:
1. Use VisualAge for Java to create classes, EJBs, and deployment
descriptors.
2. Create two different exports from VisualAge for Java — one for EJBs only,
and one for everything else (including servlets and shared classes).
3. Modify the WebSphere classpath to add the Java Pet Store classes.
4. Use WebSphere to generate EJB deployment code.
Refer to Table 8 on page 195 for our directory naming conventions.
9.4.1 VisualAge for Java steps
We used VisualAge for Java to compile the Java Pet Store and create the
EJBs. Most of the steps described here are only needed for the initial
deployment. Once your projects are defined, you can redeploy as described
in 9.4.3, “Redeployment cycle” on page 232. Redeployment is much simpler.
The Java Pet Store depends on several other packages. We added these
packages to VisualAge for Java just once. Also, the EJB deployment
descriptors only need to be entered once. If you choose to hand modify the
source code, then the source is only imported once. If you choose to use the
mg_convert script, you will have to re-import the modified source code each
time it changes.
9.4.1.1 Java Pet Store dependencies
1. Before you start, make sure that the following features have been added to
your VisualAge for Java environment. See 4.1.1, “Installation” on page 60
for details.
- IBM EJB Development
210
Migrating WebLogic Applications to WebSphere Advanced Edition
- WebSphere Test Environment
2. Create projects containing Java Pet Store dependencies.
The first three projects below contain packages on which the Java Pet
Store depends. They have been provided as JAR files in e:\petstore\lib.
You only need class files for these packages. Without these packages, you
get a lot of undefined class compiler errors.
The WebSphere Migrate project contains the source code for the migration
helper classes. Import a directory of source code for this project. Of
course, you need these classes only if you plan to use them for your own
solution. Refer to 4.1.2, “Overview of useful VisualAge for Java features”
on page 62 for details on defining VisualAge for Java projects.
Table 9. Projects for Java Pet Store dependencies
Project
JAR files or source directory
Sun XML
e:\petstore\lib\sunxml.jar
Java Activation
e:\petstore\lib\activation.ja
Java Mail
e:\petstore\lib\mail.jar
WebSphere Migration Package
e:\petstore\migrate
3. You also need the servlet.jar from the WebSphere distribution.
Import this into the existing Servlets project and version it with the one
version option to make sure it is available as the default for your Java Pet
Store project.
9.4.1.2 Compile Java Pet Store classes
1. Create a PetStore project and import the provided source code.
- Import e:\petstore\base first.
- Import e:\petstore\modify second.
You only need the Java files from these directories. It is always a good
idea to version your projects after each major modification as described in
4.1.2, “Overview of useful VisualAge for Java features” on page 62. To
version the projects:
a. Select PetStore -> manage -> open edition
b. Select PetStore -> manage -> version, using the one option.
2. At this point, all of the PetStore code should have compiled correctly.
Verify this by looking at the All Problems tab. If there are problems (other
Chapter 9. Migration example: The Java Pet Store
211
than deprecated methods), then something is wrong — recheck the
preceding steps.
9.4.1.3 Create EJB deployment descriptors
1. Click on the EJB tab and then create a new EJB group as described in
4.1.4, “EJB Development Environment” on page 71. Call it PetStoreEJBs.
This group should be part of the PetStore project.
2. Create the EJBs.
With the PetStoreEJBs selected, bring up the enterprise bean SmartGuide
with the Add Enterprise Bean action. See Figure 58 on page 213. Step
through the following process seven times — once for each EJB in the
Java Pet Store.
- Select Use an existing bean class.
- Browse for the package.
- Select the ejb package for the next EJB, for example
com.sun.extore.account.ejb.
- Click OK to fill in the Bean name.
- Click Next to fill in initial home and remote class names.
- Correct these names; for example AccountEJBHome should be
AccountHome, and AccountEJB should be Account. VisualAge for Java
assumes a slightly different naming convention for EJBs.
With the ShoppingCartEJB, you will initially get an error about multiple
ejbCreate methods. We will fix this soon. It is because the default for
SessionBean is stateless, and a stateless SessionBean can only have one
ejbCreate.
212
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 58. Create EJB in VisualAge for Java
3. Adjust EJB deployment attributes. See Figure 59.
After each EJB has been added to the EJB group, go back and adjust the
deployment attributes for each EJB. This includes the JNDI names, state
management, and any environment reference attributes.
- The correct JNDI names are shown in Table 10.
- The state manager for ShoppingCartEJB should be #STATEFUL.
Chapter 9. Migration example: The Java Pet Store
213
- Under the Environment tab, specify:
• For MailerEJB, sendConfirmationMail has the value Boolean false.
This is described on page 202.
• For ShoppingClientControllerEJB, securityAdapterClassName has
the value com.sun.estore.util.WebsphereSecurityAdapter.
Table 10. Java Pet Store EJB JNDI names
214
EJB
JNDI name
AccountEJB
java:comp/env/ejb/account
CatalogEJB
java:comp/env/ejb/catalog
InventoryEJB
java:comp/env/ejb/inventory
MailerEJB
java:comp/env/ejb/mail
OrderEJB
java:comp/env/ejb/order
ShoppingCardEJB
java:comp/env/ejb/card
ShoppingClientControllerEJB
java:comp/env/ejb/scc
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 59. Modify EJB deployment properties in VisualAge for Java
9.4.1.4 Export from VisualAge for Java to WebSphere
1. Export the EJB JAR file.
Chapter 9. Migration example: The Java Pet Store
215
Figure 60. Export EJB JAR file
Figure 61 on page 217 shows how to export the EJB JAR. Use a
temporary location for the JAR file. Its contents will be imported into
WebSphere at deployment time. We used d:\petstore\petstore.jar for this
file.
- Do not select referenced types and resources. This will expand the
contents of the JAR to include all dependent classes. We want to keep
the file size to a minimum.
- Select beans and classes, but not java. There should be 7 beans and
21 classes — a remote, home, and ejb for each EJB. The 7 deployment
objects are included as .ser files. This is the minimum required to
deploy the EJBs into WebSphere.
- Click Finish to create the JAR file.
2. Export all other classes.
216
Migrating WebLogic Applications to WebSphere Advanced Edition
The PetStore and WebSphere Migrate projects contain all of the other
classes, in particular, all of the classes shared between the Servlets and
the EJBs. In fact, they also include the 21 classes already exported in the
previous step. Of these, the home and remote classes are also needed by
the Servlet clients. You could exclude the 7 EJB classes from the export,
but we did not bother. See Figure 61 on page 217 for the details.
Figure 61. Export Java Pet Store classes from VisualAge for Java
- .Under the Projects tab, select both the PetStore and the IBM
WebSphere Migrate projects.
- Choose the Export action and Export to directory. You could export
to a JAR, but a directory is easier to modify one class at a time.
- Use the Servlet classes directory d:\WebSphere\petstore\classes. With
this step you are actually doing part of the Servlet deployment for the
Chapter 9. Migration example: The Java Pet Store
217
Java Pet Store. In a production environment, you should stop the
PetStore Server before performing this step.
- Only export the class files. We do not need the Java or resource files.
- Click Finish to generate the directory.
9.4.2 WebSphere steps
The steps described in this section accomplish the following:
• Configure WebSphere for the various servers and DataSources required
by the Java Pet Store.
• Deploy the Web server components (Servlet and JSPs).
• Deploy the EJBs.
Most of this is done by standard WebSphere commands. However, due to the
issues mentioned in 9.4, “Java Pet Store deployment” on page 208, a small
bit of custom configuration is also required.
The deployment of the Java Pet Store Web server requires the addition of two
helper servlets. They are contained in the com.ibm.webshpere.migrate helper
package, and have no impact on the Java Pet Store source code. Their
deployment is describe in this section.
• JNDIRegister Servlet.
It was necessary to bind entries into the JNDI name space as a means of
providing configuration information. WebSphere does not provide a way to
do this via the administration console, and therefore a programmatic
means of doing so was required. The easiest way we had was to write a
servlet to perform the JNDI binding at initialization, and then configure
WebSphere to load the servlet with the Web application.
• ControllerServlet Servlet.
Due to limitations in WebSphere, it was necessary to replace the Main.jsp
file with a ControllerServlet, identical in features to the Main.jsp. For more
details on these limitations, see 6.7.1.2, “Problems binding JSPs into
servlets” on page 120.
9.4.2.1 Java Pet Store dependencies
1. Copy additional JAR files into WebSphere.
218
Migrating WebLogic Applications to WebSphere Advanced Edition
The three JAR files that were needed by VisualAge for Java to compile
Java Pet Store, are also needed at runtime. Copy them into the
d:\WebSphere\AppServer\lib directory
Table 11. WebSphere JARs for Java Pet Store dependencies
JAR files
WebSphere location
e:\petstore\lib\sunxml.jar
d:\WebSphere\AppServer\lib\sunxml.jar
e:\petstore\lib\activation.jar
d:\WebSphere\AppServer\lib\activation.jar
e:\petstore\lib\mail.jar
d:\WebSphere\AppServer\lib\mail.jar
2. Add these same JAR files to the classpath for WebSphere.
Edit the configuration file d:\WebSphere\AppServer\bin\admin.config. Add
three paths to the end of the very long classpath variable. Make sure your
editor handles long lines, and make sure you get the syntax right.
;d:/WebSphere/AppServer/lib/sunxml.jar
;d:/WebSphere/AppServer/lib/activation.jar
;d:/WebSphere/AppServer/lib/mail.jar
3. Also add the deployed Java Pet Store classes directory to this classpath.
;d:/WebSphere/petstore/classes
4. You will have to restart the WebSphere server for these changes to take
effect. You can use the NT Services to stop and start the IBM WebSphere
Admin Server.
5. Use the WebSphere Data Source Wizard to define the two DataSources
used by the Java Pet Store.
Table 12. Java Pet Store DataSources
DataSource name
Database
EstoreDataSource
PETSTORE
InventoryDataSource
PETSTORE
It is not necessary to add DataSources to the EJB container because
there are no CMP EJBs in the Java Pet Store.
9.4.2.2 Create Java Pet Store application and deploy the EJBs
1. Create an application server on your machine node.
Name the server PetStore Server. We will add an EJB container and a
Web server to this application server. If you plan to do any debugging, it is
handy to modify the working directory property of the application server to
Chapter 9. Migration example: The Java Pet Store
219
a more convenient location. We changed it to d:\WebSphere\petstore. This
is where you will find the sysout and syserr logs for debugging.
2. Create an EJB Container in the PetStore Server. Name it PetStore
Container.
3. Create Enterprise Bean in the PetStore Container.
Figure 62. Deploy EJBs in WebSphere
See Figure 62. This is where we deploy the EJBs exported from VisualAge
for Java. You will create all seven of the EJBs in one shot.
- Browse for the JAR file. We put it in d:\petstore\petstore.jar.
- Select the petstore.jar file. It is important to not click down inside of the
JAR file. If you do, you will not deploy all of the contained EJBs and will
probably get a error. See the Open window in Figure 62 on page 220.
- Click Select .
220
Migrating WebLogic Applications to WebSphere Advanced Edition
- Click Deploy Only.
This takes a while. This is one of the reasons we separated all other
classes from the EJBs. You are more apt to want to change one of the
other classes and you can do that very quickly.
This is where the deployment code is generated. You will get several OK
confirmation windows, one for each EJB.
Your PetStore Container should look like the one in Figure 73 on
page 233.
9.4.2.3 Create servlet engine and deploy servlets
We construct the Web server in a fashion similar to the EJBContainer. First
we create a servlet engine. Then we define a Web application in the servlet
engine. Finally, we populate the Web application with servlets.
1. Copy what should be the contents of the WAR file into the Web application
directory d:\WebSphere\petstore.
Table 13. Deploy Java Pet Store JSPs and tables
Source directory
Web application directory
e:\petstore\original\jps1.0.1\src\docroot\*
d:\WebSphere\petstore\web\*
e:\petstore\original\jps1.0.1\src\lib\web-inf
d:\WebSphere\petstore\web\web-inf
Note the name change for the docroot. The d:\WebSphere\petstore\web
directory now contains all of the HTML, JSP, and taglib files. This is part of
the WAR file deployment process. Note that our migration requires no
changes to the contents of these files.
2. Create servlet engine in the PetStore Server.
Name it PetStore Servlet Engine. See Figure 63 on page 222. It is
important to select the Full Compliance Mode option. This activates the
Servlet 2.2 and JSP 1.1 versions required by the Java Pet Store.
Chapter 9. Migration example: The Java Pet Store
221
Figure 63. Create Servlet Engine
3. Create Web application.
Use the wizard to create a Web application. Do not simply add a servlet to
the PetStore Servlet Engine. The reason is that the wizard automatically
generates several useful servlets for error reporting and file serving.
Figure 64, Figure 65, and Figure 66 show the basic wizard sequence.
- The Web Application Name does not allow blanks. Name it PetStore.
- Choose Enable File Servlet.
- Choose Enable JSP 1.1.
- Select PetStore Servlet Engine as the parent servlet engine.
- In the Web Application Web Path field, enter /estore. Don’t forget the
initial slash.
- Click Next to continue with Web application advanced properties.
222
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 64. Create Web Application - step 1
Chapter 9. Migration example: The Java Pet Store
223
Figure 65. Create Web Application - step 2
224
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 66. Create Web Application - step 3
4. Specify advanced Web application properties.
- The last page of the Create Web Application wizard is for advanced
properties as shown in Figure 67. If you fail to complete this page, don’t
panic because the same fields are available on the Advanced tab of the
Web Application’s Properties window, also shown in Figure 68. Use the
scrollbar to expose some of the options you need.
- Document root is d:\WebSphere\petstore\web.
- Classpath is d:\WebShpere\petstore\classes.
- The Welcome Files is index.html.
- The Error Pages maps the Exception java.lang.Exception to the
Location /error.
- You are done with the wizard. Click Finish.
Chapter 9. Migration example: The Java Pet Store
225
Figure 67. Properties of a Web application
Figure 68. Advanced properties of a Web application
5. Modify the Error Reporting Facility properties.
226
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 69. Set servlet error reporting path
Error Reporting Facilities is one of the servlets created for you
automatically. Use its General properties tab to change the Servlet Web
Path as shown in Figure 69.
- Click Edit to bring up a Path editor.
- Change the path to error. You can only change part of this name.
- Click OK ->Apply->OK.
There is a lot of flexibility in the order for setting these properties. Indeed,
Figure 69 shows a property being set after the creation of the helper
servlets (which we haven’t described yet).
9.4.2.4 Create helper servlets
The ControllerServlet is actually the main servlet. The JNDIRegister Servlet
initializes the JNDI ENC for the PetStore Web application.
Chapter 9. Migration example: The Java Pet Store
227
1. Create the ControllerServlet. See Figure 70.
Figure 70. Configure Controller servlet
- Create a servlet on the PetStore Web Application.
- The servlet name is ControllerServlet.
- ClassName is com.ibm.websphere.migrate.ControllerServlet.
- Click Add to specify the Web Path as control/*.
- Click OK->OK.
2. Create the JNDIRegister Servlet. See Figure 71 on page 230.
This step is similar to the previous one, except that we use the Advanced
tab to specify initialization parameters.
- The Web Application name is PetStore.
- The Servlet Name is JNDIRegister.
- The Servlet Class Name is com.ibm.websphere.migrate.JNDIRegister.
- There is no Web path because we don’t want users getting to this
servlet.
228
Migrating WebLogic Applications to WebSphere Advanced Edition
- On the Advanced tab:
• Load at Startup is True (not False as shown in Figure 71).
• Enter the following initialization parameters:
Table 14. Servlet initialization parameters
JNDI Name
Value
java:comp/env/useCatalogEJB
false
java:comp/env/
securityAdapterClassName
com.ibm.websphere.migrate.
WebSphereSecurityAdapter
java:comp/env/serverType
WebSphere
• Click OK->OK.
Chapter 9. Migration example: The Java Pet Store
229
Figure 71. Configure JNDIRegister servlet
230
Migrating WebLogic Applications to WebSphere Advanced Edition
9.4.2.5 Run Java Pet Store
At this point, your WebSphere configuration should look like Figure 69 on
page 227. You need to start the server and then run the Java Pet Store
application.
1. Click PetStore Server->Start.
After a little while, the appearance of the WebSphere configuration will
change to that shown in Figure 72 on page 231. All of the servers, EJBs,
and servlets change from stopped to running status.
Figure 72. Start the application server
2. Access the Java Pet Store via your browser with the URL
http://localhost/estore.
Your browser will present pages like the ones shown in Figure 52 on
page 184.
Chapter 9. Migration example: The Java Pet Store
231
9.4.3 Redeployment cycle
If your migration project is anything like ours, it did not work the first time
through. We had multiple redeployment cycles to fix various problems as they
were discovered. Here are the steps for a typical redeployment.
1. Modify source code, and possibly EJB deployment attributes, in the
VisualAge for Java environment. You will be repeating some or all of the
steps discussed in 9.4.1.2, “Compile Java Pet Store classes” on page 211
and 9.4.1.3, “Create EJB deployment descriptors” on page 212
2. Re-export classes from VisualAge for Java.
This is described in 9.4.1.4, “Export from VisualAge for Java to
WebSphere” on page 215. You will always need to re-export your classes.
You only need to re-export EJBs if the EJBs or their deployment attributes
change. VisualAge for Java makes this easy by remembering the path and
file names.
3. Stop the PetStore Server.
4. If you had to re-export the EJBs, you need to redeploy them now.
- First, remove each EJB from the PetStore Container as shown in
Figure 73.
232
Migrating WebLogic Applications to WebSphere Advanced Edition
Figure 73. Remove EJBs before redeployment
- Redeploy the newly exported EJBs as described in step 3. on
page 220.
5. Before restarting the PetStore Server, remove the sysout and syserr logs
to make debugging easier.
6. Restart the PetStore Server.
Chapter 9. Migration example: The Java Pet Store
233
234
Migrating WebLogic Applications to WebSphere Advanced Edition
Appendix A. Using the additional material
This redbook also contains additional material on the Internet. See the
appropriate section below for instructions on using or downloading this
material.
A.1 Locating the additional material on the Internet
The Web material associated with this redbook is also available on the
Internet from the IBM Redbooks Web server. Point your Web browser to:
ftp://www.redbooks.ibm.com/redbooks/SG245956
Alternatively, you can go to the IBM Redbooks Web site at:
ibm.com/redbooks
Select the Additional materials and open the directory that corresponds with
the redbook form number.
A.2 Using the Web material
The additional Web material that accompanies this redbook includes the
following:
File name
5956code.zip
Description
Zipped Code Samples
A.2.1 System requirements for downloading the Web material
The following system configuration is recommended for downloading the
additional Web material.
Hard disk space:
Operating System:
8 MB
Windows NT or Windows 2000
A.2.2 How to use the Web material
Create a subdirectory (folder) on your workstation and copy the contents of
the Web material into this folder. The unzipped folder will contain example
code as described in the chapters of this redbook.
© Copyright IBM Corp. 2001
235
236
Migrating WebLogic Applications to WebSphere Advanced Edition
Appendix B. Special notices
This publication is intended to help developers migrate Java 2 Platform,
Enterprise Edition application from BEA WebLogic Server 5.1 to WebSphere
Application Server, Advanced Edition 3.5. The information in this publication
is not intended as the specification of any programming interfaces that are
provided by WebSphere Application Server, Advanced Edition 3.5. See the
PUBLICATIONS section of the IBM Programming Announcement for
WebSphere Application Server, Advanced Edition 3.5 for more information
about what publications are considered to be product documentation.
References in this publication to IBM products, programs or services do not
imply that IBM intends to make these available in all countries in which IBM
operates. Any reference to an IBM product, program, or service is not
intended to state or imply that only IBM's product, program, or service may be
used. Any functionally equivalent program that does not infringe any of IBM's
intellectual property rights may be used instead of the IBM product, program
or service.
Information in this book was developed in conjunction with use of the
equipment specified, and is limited in application to those specific hardware
and software products and levels.
IBM may have patents or pending patent applications covering subject matter
in this document. The furnishing of this document does not give you any
license to these patents. You can send license inquiries, in writing, to the IBM
Director of Licensing, IBM Corporation, North Castle Drive, Armonk, NY
10504-1785.
Licensees of this program who wish to have information about it for the
purpose of enabling: (i) the exchange of information between independently
created programs and other programs (including this one) and (ii) the mutual
use of the information which has been exchanged, should contact IBM
Corporation, Dept. 600A, Mail Drop 1329, Somers, NY 10589 USA.
Such information may be available, subject to appropriate terms and
conditions, including in some cases, payment of a fee.
The information contained in this document has not been submitted to any
formal IBM test and is distributed AS IS. The use of this information or the
implementation of any of these techniques is a customer responsibility and
depends on the customer's ability to evaluate and integrate them into the
customer's operational environment. While each item may have been
reviewed by IBM for accuracy in a specific situation, there is no guarantee
© Copyright IBM Corp. 2001
237
that the same or similar results will be obtained elsewhere. Customers
attempting to adapt these techniques to their own environments do so at their
own risk.
Any pointers in this publication to external Web sites are provided for
convenience only and do not in any manner serve as an endorsement of
these Web sites.
The following terms are trademarks of the International Business Machines
Corporation in the United States and/or other countries:
e (logo)®
IBM ®
RS/6000
SecureWay
System/390
WebSphere
XT
Lotus
eSuite
PAL
Redbooks
Redbooks Logo
S/390
SP
VisualAge
Wizard
400
Domino
SP1
Notes
The following terms are trademarks of other companies:
Tivoli, Manage. Anything. Anywhere.,The Power To Manage., Anything.
Anywhere.,TME, NetView, Cross-Site, Tivoli Ready, Tivoli Certified, Planet
Tivoli, and Tivoli Enterprise are trademarks or registered trademarks of Tivoli
Systems Inc., an IBM company, in the United States, other countries, or both.
In Denmark, Tivoli is a trademark licensed from Kjøbenhavns Sommer - Tivoli
A/S.
C-bus is a trademark of Corollary, Inc. in the United States and/or other
countries.
Java and all Java-based trademarks and logos are trademarks or registered
trademarks of Sun Microsystems, Inc. in the United States and/or other
countries.
Microsoft, Windows, Windows NT, and the Windows logo are trademarks of
Microsoft Corporation in the United States and/or other countries.
PC Direct is a trademark of Ziff Communications Company in the United
States and/or other countries and is used by IBM Corporation under license.
ActionMedia, LANDesk, MMX, Pentium and ProShare are trademarks of Intel
Corporation in the United States and/or other countries.
238
Migrating WebLogic Applications to WebSphere Advanced Edition
UNIX is a registered trademark in the United States and other countries
licensed exclusively through The Open Group.
SET, SET Secure Electronic Transaction, and the SET Logo are trademarks
owned by SET Secure Electronic Transaction LLC.
Other company, product, and service names may be trademarks or service
marks of others.
Appendix B. Special notices
239
240
Migrating WebLogic Applications to WebSphere Advanced Edition
Appendix C. Related publications
The publications listed in this section are considered particularly suitable for a
more detailed discussion of the topics covered in this redbook.
C.1 IBM Redbooks
For information on ordering these publications see “How to get IBM
Redbooks” on page 245.
• e-Commerce Patterns Using WebSphere Commerce Suite, Patterns for ebusiness Series , SG24-6156
• Servlet and JSP Programming with IBM WebSphere and VisualAge for
Java, SG24-5755
• Application Server Solution Guide, Enterprise Edition: Getting Started,
SG24-5320
• WebSphere V3 Performance Tuning Guide, SG24-5657
• WebSphere Scalability: WLM and Clustering Using WebSphere
Application Server Advanced Edition, SG24-6153
• IBM WebSphere and VisualAge for Java Database Integration with DB2,
Oracle, and SQL Server, SG24-5471
• IBM WebSphere Performance Pack: Load Balancing with IBM SecureWay
Network Dispatcher, SG24-5858
• Design and Implement Servlets, JSPs, and EJBs for IBM WebSphere
Application Server, SG24-5754
• Developing an e-business Application for the IBM WebSphere Application
Server, SG24-5423
• Enterprise JavaBeans Development Using VisualAge for Java, SG24-5429
• WebSphere V3.5 Handbook, SG24-6161
C.2 IBM Redbooks collections
Redbooks are also available on the following CD-ROMs. Click the CD-ROMs
button at ibm.com/redbooks for information about all the CD-ROMs offered,
updates and formats.
© Copyright IBM Corp. 2001
241
CD-ROM Title
Collection Kit
Number
IBM System/390 Redbooks Collection
SK2T-2177
IBM Networking Redbooks Collection
SK2T-6022
IBM Transaction Processing and Data Management Redbooks Collection SK2T-8038
IBM Lotus Redbooks Collection
SK2T-8039
Tivoli Redbooks Collection
SK2T-8044
IBM AS/400 Redbooks Collection
SK2T-2849
IBM Netfinity Hardware and Software Redbooks Collection
SK2T-8046
IBM RS/6000 Redbooks Collection
SK2T-8043
IBM Application Development Redbooks Collection
SK2T-8037
IBM Enterprise Storage and Systems Management Solutions
SK3T-3694
C.3 Other resources
These publications are also relevant as further information sources:
• Flanagan, David, Jim Farley, William Crawford and Kris Magnusson, Java
Enterprise in a Nutshell, O’Reilly & Associates, Inc. 1999, ISBN
1565924835
• Nagaratnam, Nataraj et al, Security Overview of IBM WebSphere
Standard/Advance 3.02, IBM white paper, available at: http://
www.ibm.com/software/webservers/appserv/whitepapers.html
• Shane Claussen and Mike Conner, Developing Dynamic Web Sites Using
the WebSphere Application Server, available at:
http://service2.boulder.ibm.com/devcon/news0399/artpage2.htm
C.4 Referenced Web sites
These Web sites are also relevant as further information sources:
• http://www.ibm.com/software/webservers/appserv/ IBM Software
WebSphere Application Server overview
• http://java.sun.com/products/ejb/docs.html
JavaBeans specifications page
Sun’s Enterprise
• http://www.ibm.com/software/ebusiness IBM’s Application Framework for ebusiness
• http://www.ibm.com/software/developer/web/patterns/ IBM Patterns for ebusiness site
• http://www.weblogic.com/docs51/resources.html BEA WebLogic Server 5.1
Documentation Center
• http://java.sun.com/j2ee/ Java 2 Platform, Enterprise Edition
242
Migrating WebLogic Applications to WebSphere Advanced Edition
• http://www.bea.com/products/weblogic/server/ BEA WebLogic Server
• http://java.sun.com/products/jdk/1.2 Java 2 SDK, Standard Edition
Version 1.2 Software
• http://www.ibm.com/software/data/db2/udb/ DB2 Universal Database
overview
• http://www.weblogic.com/docs51/admindocs/properties.html Setting
WebLogic properties
• http://www.ibm.com/software/ad/vajava/ VisualAge for Java Overview
• http://java.sun.com/j2ee/download.html Java 2 Platform, Enterprise
Edition - Downloads and Specifications
• http://www.ibm.com/software/webservers/httpservers/ IBM HTTP Server
overview
• http://java.sun.com/products/jsp/ JavaServer Pages technology
• http://java.sun.com/products/jsp/download.html JavaServer Pages
Technology download
• http://www.weblogic.com/docs51/classdocs/API_jsp.html Using WebLogic
JSP
• http://java.sun.com/products/jsp/taglibraries.html JavaServer Pages
Technology - Powering the Web Experience with Dynamic Content
• http://www.javaworld.com/javaworld/jw-01-2000/jw-01-ssj-ejb2.html
Create forward-compatible beans in EJB, JavaWorld January 2000
• http://www-4.ibm.com/software/webservers/appserv/doc/v35/a_as.htm
WebSphere Application Server, Advanced Edition - software prerequisites
• http://java.sun.com/products/jdbc/jdbc20.stdext.pdf JDBC 2.0 Standard
Extension API
• http://java.sun.com/j2se/1.3/docs/guide/jdbc/index.html Sun
Microsystems JDBC documentation
• http://www.beasys.com/products/weblogic/drivers.shtml BEA WebLogic
jDriver Family
• http://www.weblogic.com/docs/classdocs/API_joci.html Using jdbcKona/
Oracle
• http://www.weblogic.com/docs/examples/dbkona/db2examples.html WebLogic
4.5 Simplifying JDBC programming with dbKona
• http://developer.java.sun.com/developer/technicalArticles/J2EE/
deployathon2/BEAreadme.html Deploying the Java Pet Store application on
WebLogic Server
Appendix C. Related publications
243
• http://developer.java. sun.com/developer/onlineTraining/JSPIntro/
contents.html JavaServer Pages fundamentals, Short course contents
• http://www.java.sun.com/j2ee/download.html#blueprints Download J2EE
Blueprints including Java Pet Store from Sun Microsystems
• http://www7b.boulder.ibm.com/wsdd/library/ WebSphere Developer Domain
- Library
244
Migrating WebLogic Applications to WebSphere Advanced Edition
How to get IBM Redbooks
This section explains how both customers and IBM employees can find out about IBM Redbooks,
redpieces, and CD-ROMs. A form for ordering books and CD-ROMs by fax or e-mail is also provided.
• Redbooks Web Site ibm.com/redbooks
Search for, view, download, or order hardcopy/CD-ROM Redbooks from the Redbooks Web site.
Also read redpieces and download additional materials (code samples or diskette/CD-ROM images)
from this Redbooks site.
Redpieces are Redbooks in progress; not all Redbooks become redpieces and sometimes just a few
chapters will be published this way. The intent is to get the information out much quicker than the
formal publishing process allows.
• E-mail Orders
Send orders by e-mail including information from the IBM Redbooks fax order form to:
In United States or Canada
Outside North America
e-mail address
[email protected]
Contact information is in the “How to Order” section at this site:
http://www.elink.ibmlink.ibm.com/pbl/pbl
• Telephone Orders
United States (toll free)
Canada (toll free)
Outside North America
1-800-879-2755
1-800-IBM-4YOU
Country coordinator phone number is in the “How to Order”
section at this site:
http://www.elink.ibmlink.ibm.com/pbl/pbl
• Fax Orders
United States (toll free)
Canada
Outside North America
1-800-445-9269
1-403-267-4455
Fax phone number is in the “How to Order” section at this site:
http://www.elink.ibmlink.ibm.com/pbl/pbl
This information was current at the time of publication, but is continually subject to change. The latest
information may be found at the Redbooks Web site.
IBM Intranet for Employees
IBM employees may register for information on workshops, residencies, and Redbooks by accessing
the IBM Intranet Web site at http://w3.itso.ibm.com/ and clicking the ITSO Mailing List button.
Look in the Materials repository for workshops, presentations, papers, and Web pages developed
and written by the ITSO technical professionals; click the Additional Materials button. Employees may
access MyNews at http://w3.ibm.com/ for redbook, residency, and workshop announcements.
© Copyright IBM Corp. 2001
245
IBM Redbooks fax order form
Please send me the following:
Title
Order Number
First name
Quantity
Last name
Company
Address
City
Postal code
Country
Telephone number
Telefax number
VAT number
Card issued to
Signature
Invoice to customer number
Credit card number
Credit card expiration date
We accept American Express, Diners, Eurocard, Master Card, and Visa. Payment by credit card not
available in all countries. Signature mandatory for credit card payment.
246
Migrating WebLogic Applications to WebSphere Advanced Edition
Abbreviations and acronyms
API
Application
Programming Interface
BMP
bean-managed
persistence
CMP
container-managed
persistence
EJB
Enterprise JavaBeans
HTML
HyperText Markup
Language
HTTP
HyperText Transfer
Protocol
IBM
International Business
Machines Corporation
IDE
Integrated
Development
Environment
ITSO
International Technical
Support Organization
JDBC
Java database
connectivity
JDK
Java Development Kit
JMS
Java Message Service
JNDI
Java Naming and
Directory Interface
JSP
JavaServer Pages
J2EE
Java 2 Platform,
Enterprise Edition
LDAP
Lightweight Directory
Access Protocol
MVC
Model-View-Controller
WAS
WebSphere Application
Server
WTE
WebSphere Test
Environment
XML
eXtensible Markup
Language
2PC
two-phase commit
© Copyright IBM Corp. 2001
247
248
Migrating WebLogic Applications to WebSphere Advanced Edition
Index
A
ACL 39
Apache 58, 78
application
analysis 11
application redesign 13
application server
create 45
architecture 4
Model 2 110
authentication
form based 124
HTTP based 123
identity 148
operating system 122
principal 148
B
BEA 17, 80
beans
business logic 111
result beans 111
best practices 2
BMP 145, 177, 178
Bootstrap port 69
breakpoint 63
browser 5, 44, 111
business logic beans 111
C
cache tag 87
CGI 109
problems 109
checkjspfiles 94
CICS 25
classpath 115
Client JAR 77
Cloudscape 51
CMP 20, 72, 127, 156, 165, 177
ejbCreate 145
CocoBase 84
COM 24
com.ibm.websphere.migrate 198
Common Gateway Interface 109
compileCommand 94
© Copyright IBM Corp. 2001
Composition Editor 59
configuration 33
connection pool 39
connection pooling 157, 163
ConnectionManager 158
console 63
container-managed persistence 20, 127, 165
D
DAO 191
data access object 191
database 12, 155
configuration 51
migration 12
WebLogic connection 39
DataSource 39, 51, 63, 120, 157
add to WebSphere Test Environment 70
connecting 161
create 53
initial context 162
naming 159
DB2 33, 208
dbKona 175
debugger 63
Deployed JAR 77
deploying JSP 91
deployment descriptor 28, 74, 127, 139
development environment 33
DriverManager 158
E
EJB
container 29
create container 46
deployment descriptors 20
development environment 61, 71
finder methods 141
HomeHandle 144
migration issues 129
read only 150
EJB 2.0 Specification 73
EJB home 63, 72, 120
EJB JAR 77
EJB server 77
ejbCreate 145
EJBException 130, 193, 196
249
subclasses 134
EJBExceptionMigrate 133
EJBHome 144
ejb-ref 121, 134
lookups 137
ENC 193
enterprise archives 22
Enterprise JavaBeans 6, 19, 20 , 72, 127
create in VisualAge for Java 73
deployment descriptors 20
differences 20
importing to VisualAge for Java 76
specification 20
EnumerationConvertor 198
env-entry 121, 134
lookup 136
examples 8
F
feature comparison 19
finder 141
Framework for e-business 14
H
header names 117
HomeHandle 144
htmlKona 125
I
IBM HTTP Server 41, 55
identity authentication 148
incremental migration 11
InitialContext 69, 136
InitialContextMigrate 136
installation 33
JDK 34
UDB 35
VisualAge for Java 56, 60
WebLogic 38
WebSphere 40
WebSphere Studio 55
InstantDB 41, 164
Internet Explorer 34
isCallerInRole 206
isModified method 150
250
J
J2EE 1
applications 27
architecture 4
business object standard 176
feature levels 19
Reference Implementation server 83
references 120
specification 4, 22
Java 85
Java 2 Platform, Enterprise Edition 1, 31
Java Data Objects
JDO 176
Java Message Service 22
Java Pet Store 8, 64, 111, 133, 181
architecture 188
collection finder changes 207
database 185, 190
database changes 208
deployment 208
EJBException 193
implementation 184
import in VisualAge for Java 64
JNDI 189
JNDI ENC 193
JNDI ENC changes 200
model 185
Principal/Identity changes 206
source changes 198
user interface 183
WebLogic implementation 195
Java Servlets 5, 18, 63, 78, 109
deploying in WebSphere 114
differences 21
migration examples 112
JavaScript 85
JavaServer Pages 5, 18, 85, 110
differences 21
JDBC 18, 21, 22, 70, 155
DriverManager 157
transactions 168
writing portable applications 173
JDBC driver 51, 70
VisualAge for Java 165
jdbcKona 174
JDK 33
installation 34
jDriver 174
jetace 76, 81, 141, 150, 209
Migrating WebLogic Applications to WebSphere Advanced Edition
JMS 21, 22
JNDI 23, 63, 68, 120, 128, 130, 189
environment naming context 137, 193
lookups 29
resolving names 28
Jolt 24
JSP 78, 83
actions 85
declarations 85
deploying 91
deployment 85
directives 85
examples,WebLogic
migrating JSP examples 100
expressions 85
samples 85
scriplets 85
securing 99
tags 85
XML tag format 87
JSP 1.1 Specification 86
JSP 1.2 Specification 86
JSP Compiler 63
JSP Execution Monitor 63, 66
JSP servlet 39, 91
JTA 52, 54, 164, 169
non-portable code 7
JDBC drivers 167
JTA 169
process 2, 10, 13
reasons 26
security 122, 123
sequence 11
strategies 26
testing 30
tools 83
transaction support 148
understanding the Java Pet Store 182
user database 122
migration testing environment 33
Model 2 architecture 110
Model-View-Controller 111
MVC 111, 189
N
named references
JNDI
lookups 134
Netscape Communicator 34
O
Oracle 164
K
keepgenerated 95
L
LDAP 122
M
mg_convert 197
migration
analysis 11
database 12
EJBs 127
examples 8, 33, 112
guide 2
issues 2, 6
documenting 9
J2EE specification 8
J2EE support 8
vendor services 8
vendor-specific 7
P
pageCheckSeconds 93
Patterns for e-business 14, 15
persistence 150, 155
persistence access builder 61, 78
persistence manager 179
persistent name server 63, 68
portable code 2
principal authentication 148
process tag 88
protocol 52
PROVIDER_URL 69
R
read-only attribute
remote interfaces
RemoteException
repeat tag 88
resource-ref 121,
lookups 137
150
72
130
134
251
result beans 111
S
security 123
security migration 122
servlet engine 63
create 47
servlet mapping 119
ServletContext 121
source code 13
subprotocol 52
Sybase 164
T
tag libraries 87, 98
tag library descriptor 89
Tengah Application Server 17
test system 30
TLD 99
Tomcat 33, 58, 61, 67, 78
TOPLink 24, 25, 84, 178, 192
transactions 148, 168
Tuxedo 24
U
UDB 33
installation 35
unpackaged servlet 114
user database 122
UserTransaction 63
V
verbose 95
Versant Object Container 84
VisualAge for Java 59, 196
add feature 61
configuring an EJB Server 77
console 63
create EJBs 73
EJB development environment 61
features 59
generating EJB deployed code 76
importing EJBs 76
installation 56, 60
JDBC driver 165
servlet engine 66
WebLogic Server integration 61
252
workbench 62
VisualAge for Java, Enterprise Edition 33
W
WAR file 95, 113, 118
Web application 91
create 48
migrating 118
Web application design 110
Web path list 115
WebLogic 30, 33
5.1 17
database configuration 39
deploying JSPs 91
events 24, 25
feature comparison 19
information 17
installation 38
JSP configuration 39
start 39
testing 40
VisualAge Integration Kit 80
WebLogic Enterprise 17
weblogic.properties 39, 91
WebSphere 30
configuration 45
database configuration 51
deploying JSPs 92
examples 44
information 18
installation 40
JDBC drivers 166
JSP processors 92
test 42
WebSphere Administrative Console 43, 51, 92,
115
WebSphere feature comparison 19
WebSphere InfoCenter 51, 81
WebSphere software platform 18
WebSphere Studio 33, 83
installation 55
WebSphere Test Environment 52, 59, 61, 65, 165
add DataSource 70
Control Center 66
starting 66
workbench 62
workingDir 94
workspace 61
Migrating WebLogic Applications to WebSphere Advanced Edition
WTE see WebSphere Test Environment 65
X
XML 20, 81, 87, 125
deployment descriptor 139
descriptors 74
253
254
Migrating WebLogic Applications to WebSphere Advanced Edition
IBM Redbooks review
Your feedback is valued by the Redbook authors. In particular we are interested in situations where a
Redbook "made the difference" in a task or problem you encountered. Using one of the following
methods, please review the Redbook, addressing value, subject matter, structure, depth and
quality as appropriate.
• Use the online Contact us review redbook form found at ibm.com/redbooks
• Fax this form to: USA International Access Code + 1 845 432 8264
• Send your comments in an Internet note to [email protected]
Document Number
Redbook Title
SG24-5956-00
Migrating WebLogic Applications to WebSphere Advanced Edition
Review
What other subjects would you
like to see IBM Redbooks
address?
Please rate your overall
satisfaction:
O Very Good
Please identify yourself as
belonging to one of the
following groups:
O Customer
O Business Partner
O IBM, Lotus or Tivoli Employee
O None of the above
Your email address:
The data you provide here may
be used to provide you with
information from IBM or our
business partners about our
products, services or activities.
O Please do not use the information collected here for future
marketing or promotional contacts or other communications beyond
the scope of this transaction.
Questions about IBM’s privacy
policy?
The following link explains how we protect your personal information.
ibm.com/privacy/yourprivacy/
© Copyright IBM Corp. 2001
O Good
O Average
O Poor
O Solution Developer
255
Migrating WebLogic Applications to WebSphere Advanced Edition
(0.5” spine)
0.475”<->0.875”
250 <-> 459 pages
®
Migrating WebLogic
Applications to WebSphere
Advanced Edition
Understanding the
migration issues and
preparing a
migration strategy
Guidelines for
writing portable
applications
Considerations for
completing and
implementing a
migration
The WebSphere Application Server, Advanced Edition
provides a leading implementation of Java 2 Platform,
Enterprise Edition technologies including Java Servlets,
JavaServer Pages, and Enterprise JavaBeans. A primary
competitor to WebSphere is BEA WebLogic Server, with
support for the same programming technologies. In theory, a
developer could write and deploy applications using
WebLogic and move them to WebSphere without code
changes. In practice, there are nuances in the
implementations of the technologies that a developer and
systems integrator should be aware of.
INTERNATIONAL
TECHNICAL
SUPPORT
ORGANIZATION
This redbook will help you plan the migration of an application
developed for BEA WebLogic Server, so that the application
will run on WebSphere Application Server, Advanced Edition.
We explain the differences between the implementations of
WebLogic and WebSphere, provide guidance to developers on
how to deploy existing applications from WebLogic to
WebSphere, and discuss how to design portable new
applications that may be deployed on WebSphere or
WebLogic.
IBM Redbooks are developed by
the IBM International Technical
Support Organization. Experts
from IBM, Customers and
Partners from around the world
create timely technical
information based on realistic
scenarios. Specific
recommendations are provided
to help you implement IT
solutions more effectively in
your environment.
BUILDING TECHNICAL
INFORMATION BASED ON
PRACTICAL EXPERIENCE
For more information:
ibm.com/redbooks
SG24-5956-00
ISBN 073841722X