Migrating WebLogic's JSP SimpleTag example to GlassFish
As I outlined in
href="http://weblogs.java.net/blog/sekhar/archive/2008/02/migrate_to_glas.html">Migrate
to GlassFish acitivities , I am migrating samples from different
application servers to GlassFish to illustrate migration to
GlassFish. Here, I selected the WebLogic's "JSP SimpleTag" sample to
migrate to GlassFish.
Simple Tag Sample Application
The sample application that I migrated is the JSP Simple Tagsample
from the WebLogic 9.2 distribution. The sample uses the Simple TAG API
for iterating through a collection and accessing a database. I used
the GlassFish + MySql bundle, resource injection, virtual directory
mapping to migrate the application.
The source for the WebLogic sample is in the directory
wls-install/weblogic92/samples/server/examples/src/examples/webapp/jsp/tags/simple.
To try the migrated sample to GlassFish
- Download and unzip
href="http://migrate2glassfish.dev.java.net/blogs/wl92/gf_jspSimpleTagDir.zip">gf_jspSimpleTagDir.zip
. The directory gf_jspSimpleTag contains files in an exploded EAR format. - Start MySql 5.0 database
- prepare database for example (see PointBase -> MySql section
below) - asadmin deploydir gf_jspSimpleTag
- http://localhost:8080/jspsimpleTag/SimpleTag.jsp
Deployment: WLS Split Directory -> GF Exploded Directory
This sample uses a split directory development structure. Thus, to
deploy on GlassFish, I first generated a directory in exploded format
using an ant build target in the build.xml for the WebLogic sample as follows:
cd
wls-install/weblogic92/samples/server/examples/src/webapp/jsp/tags/simple
ant build
ant package.exploded.ear
The above will build a jspSimpleTagEar directory in exploded
format as shown below:
<b>WebLogic: Exploded EAR</b>
jspSimpleTagEar
META-INF
.. application.xml
.. weblogic-application.xml
jspSimpleTagWar
.. ExamplesFooter.jsp
.. ExamplesHeader.jsp
.. SimpleTag.jsp
.. wls_examples.css
++ WEB-INF
.. web.xml
.. weblogic.xml
++ classes/examples/webapp/jsp/tags/simple
.. ExecuteSql.class
.. IteratorTag.class
++ tlds
.. simpleTag.tld
I repackaged the exploded directory as follows:
- Removed weblogic-application.xml. It was empty in this example.
- Replaced weblogic.xml with sun-web.xml. The mapping is described below.
- Modified simpleTag.jsp to use datasource name
- Modified ExecuteSql.java to use resource injection of DataSource.
- Modified ExamplesHeader.jsp to handle relative path in virtual directories.
Thus, the exploded ear on GlassFish is as follows:
<b>GlassFish: Exploded EAR </b>
jspSimpleTagEar
META-INF
.. application.xml
jspSimpleTagWar
.. ExamplesFooter.jsp
.. ExamplesHeader.jsp
.. SimpleTag.jsp
.. wls_examples.css
++ WEB-INF
.. web.xml
.. sun-web.xml
++ classes/examples/webapp/jsp/tags/simple
.. ExecuteSql.class
.. IteratorTag.class
++ tlds
.. simpleTag.tld
Then I deployed the exploded directory gf_jspSimpleTag on
GlassFish:
asadmin deploydir gf_jspSimpleTag
PointBase -> MySql
The WebLogic sample uses PointBase database. While GlassFish does
support PointBase, I chose to use MySql and used the GlassFish + MySql
bundle which can be downloaded from
href="http://java.sun.com/javaee/downloads/index.jsp">http://java.sun.com/javaee/downloads/index.jsp.
Next, I prepared the MySql database for the example - creating,
configuring and populating.
Database name change
The WebLogic sample uses a database
"examples-dataSource-demoXAPool". This step is not necessary but I
wanted a more suitable name related to my migration work.
Create and Populate wls92examples database
Next, I created the wls92examples and populated it. To populate the
script I used a script that came with the WebLogic sample. So here are
the steps:
$ cd gf-install/mysql/bin
$ mysql -u root
mysql> create database wls92examples;
mysql> grant all on wls92examples.* to 'sekhar'@'localhost' identified by 'secretpwd';
mysql> quit
$ mysql -u sekhar -p
Enter password: secretepwd
mysql> use wls92examples;
mysql> source <i>wls-install</i>/weblogic92/samples/server/examples/src/examples/common/ddl/demo_mysql.ddl
mysql> quit
Create a MySqlPool Connection Pool
Next, I created a new JDBC Connection Pool
- Name: MySqlPool
- Resource type: javax.sql.DataSource
- Datbase vendor: MySQL
I set the following properties using the GlassFish Admin
Console. The properties can be set either when the MySqlPool
connection pool is created or after pool creation by
- Navigate to: Resources -> Connection Pools -> MySqlPool
- Goto AdditionalProperties tab
- set the properties described below.
The properties that need to be set are:
- RelaxAutoCommit = true
This property needs to be set to true since ExecuteSql
class implements the following method from
javax.servlet.jsp.tagext.TryCatchFinally interface:
public void doCatch(Throwable t) throws Throwable {
if (conn != null) conn.rollback();
throw t;
}The code makes an assumption that the autocommit is false. If
autocommit is true, the above method will result in an
exception ( logged to <gf-domain>/server.log file ):
com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: Can't call rollback when autocommit=true -
user, password properties
Set the user and password used in creating and populating the
"wls92examples" database. - URL property
Set the URL property to jdbc:mysql://:3306/wls92examples
. This URL will be used to connect to the wls92examples database.
Create JDBC Resource jdbc/wls92examples
Create a JDBC Resource as follows:
- JNDI name : jdbc/wls92examples
- Pool name : MySqlPool ( created in above step )
- Description:
Source Code Changes
I modified the code as described here.
SimpleTag.jsp: Data source name change
Since I changed the database name to "wls92examples" (as described
above), accordingly, I changed the datasource name accordingly here as
well from
// WebLogic
String dataSourceName = "examples-dataSource-demoXAPool";to
// GlassFish
String dataSourceName = "wls92examples;
ExecuteSql.java: Resource injection of DataSource
The ExecuteSql.java class establishes a connection to a database
has non portable code
- use of weblogic.jndi.WLInitialContextFactory
- JNDI lookup on t3://localhost:7001
I wanted to make the code more portable. So I rewrote the code to
use resource injection in Java EE 5.
//<b>File name: ExecuteSql.java </b>
import javax.sql.DataSource;
import javax.annotation.Resource;
public class ExecuteSql extends BodyTagSupport implements TryCatchFinally {
....
@Resource(name="jdbc/wls92examples")
DataSource wlsds;
... omitted other modifcations to code ...
}
Resource injection works with managed classes. I was able to
resource injection since ExceuteSql class is a managed
class. ExecuteSql extends BodyTagSupport which in turn implements
javax.servlet.jsp.tagext.Tag interface.
weblogic.xml -> sun-web.xml Mapping
I migrated the appserver specific deployment descriptor : weblogic
to sun-web.xml as follows (Additional details ater the mapping).
<b><!-- weblogic.xml --></b>
<?xml version="1.0" encoding="ISO-8859-1"?>
<weblogic-web-app xmlns="http://www.bea.com/ns/weblogic/90">
<jsp-descriptor>
<page-check-seconds>1</page-check-seconds>
<verbose>true</verbose>
</jsp-descriptor>
<!--
Use the virtual-directory-mapping element to specify document roots other
than the default document root of the Web application for certain kinds of
requests, such as image requests. All images for a set of Web applications
can be stored in a single location, and need not be copied to the document
root of each Web application that uses them. For an incoming request, if a
virtual directory has been specified servlet container will search for the
requested resource first in the virtual directory and then in the
Web application's original document root.
-->
<virtual-directory-mapping>
<local-path>C:/bea/weblogic92/samples/server/</local-path>
<url-pattern>/examples/*</url-pattern>
</virtual-directory-mapping>
<virtual-directory-mapping>
<local-path>C:/bea/weblogic92/samples/server/examples/build</local-path>
<url-pattern>images/*</url-pattern>
</virtual-directory-mapping>
</weblogic-web-app>
<b><!-- sun-web.xml --></b>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 9.0 Servlet 2.5//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_5-0.dtd">
<sun-web-app>
<jsp-config>
<property name="modificationTestInterval" value="1"/>
<property name="verbose" value="true"/>
</jsp-config>
<property name="alternatedocroot_1" value="from=/examples/* dir=C:/bea/weblogic92/samples/server/"/>
<property name="alternatedocroot_2" value="from=/images/* dir=C:/bea/weblogic92/samples/server/examples/build"/>
</sun-web-app>
Virtual Directory Mapping
The example uses virtual directory mapping to locate the BEA logo
in the example. The GlassFish equivalent for WebLogic's
virtual-directory-mapping is the alternatedocroot property. I also had
to make two more changes to bring up the BEA logo. Of course, I could have replaced it with a
GlassFish logo once I was done :-) but I am trying to show migration
issues here.
URL Pattern
In alternatedocroot_2, I changed the URL pattern from
images/* to /images/*. Withtout the preceeding / , the following
WARNING is generated in the GlassFish server.log file
(i.e. gf-install/domain/domain1/logs/server.log )
[#|2008-05-15T17:57:49.500-0400|WARNING|sun-appserver9.1|javax.enterprise.system.container.web|_ThreadID=24;_ThreadName=httpWorkerThread-4848-1;images/*;_RequestID=1b29dda8-9133-4863-b0ef-9b7ec44c8576;|WEB0504: URL pattern images/* for alternate docbase is invalid|#]
Relative Path in URL
Another issue I ran into was related to use of a relative
path in ExamplesHeader.jsp. This file contains a reference to SRC
using a relative path as shown in the following fragment.
<b><!-- weblogic : ExamplesHeader.jsp fragment --></b>
...
<!-- TITLE -->
<table border=0 cellspacing="18" cellpadding="0">
<tr>
<td valign="top">
<a HREF="http://www.bea.com"><IMG SRC="../../../../images/logo_tm_onwt.jpg" alt="BEA Logo" width="161" height="96" border="0"></a>
<h3><%=request.getParameter("title")%></h3>
</td>
</tr>
</table>
...
The relative path used for SRC did not work (the BEA logo won't come up). I changed the SRC reference to images/* .
<b><!-- GlassFish : ExamplesHeader.jsp fragment --></b>
...
<cs_comment TITLE -->
<table border=0 cellspacing="18" cellpadding="0">
<tr>
<td valign="top">
<a HREF="http://www.bea.com"><IMG SRC="images/logo_tm_onwt.jpg" alt="BEA Logo" width="161" height="96" border="0"></a>
<h3><%=request.getParameter("title")%></h3>
</td>
</tr>
</table>
...
Summary
Except for the rewrite of the code to take advantage of resource
injection for injecting a datasource, the code changes were minimal.
As always, feedback is welcome. For questions and feedback, visit Migrate To GlassFish project and follow the "Discussion Forums" link .
- Login or register to post comments
- Printer-friendly version
- sekhar's blog
- 2639 reads






Comments
by gengyong - 2009-02-03 00:11
if you are going to try deploy the gf_jspSimpleTagDir.zip provided in the blog, pls take a look at the file: gf_jspSimpleTag\jspSimpleTagWar\WEB-INF\sun-web.xml, where alternatedocroot_1 & alternatedocroot_2 refer BEA installation as c:\Softwares\bea, however, most BEA installation on windows would be c:\bea. Pls make sure this reflects your real BEA installation path, otherwise the deployment will fails.