Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

This application will take you through plugin export and import using Apache Geronimo. We will enlist the

We are using Apache Geronimo V2.1.1 for this tutorial.
We have used an existing tutorial from tutorial section. Refer Stateless Session Bean tutorial for application development and deployment first. Later we will use Apache Geronimo to Export the application and dependencies as plugin and import the same.

To run this tutorial, as a minimum you will be required to have installed the following prerequisite software.

  • Apache Geronimo 2.1.1
  • Sun JDK 5.0+ (J2SE 1.5)
  • Eclipse 3.3.1.1 (Eclipse Classic package of Europa distribution), which is platform specific
  • Web Tools Platform (WTP) 2.0.1
  • Data Tools Platform (DTP) 1.5.1
  • Eclipse Modeling Framework (EMF) 2.3.1
  • Graphical Editing Framework (GEF) 3.3.1

Details on installing eclipse are provided in the Development environment section.
This tutorial is organized in the following sections:

Table of Contents

Creating a Stateless Session EJB project

...

Code Block
titleRegisterBeanRemote.java
borderStylesolid

package statelessejb;
import javax.ejb.Remote;
@Remote
public interface RegisterBeanRemote 
{
public void register(String FirstName, String LastName, String Sex, String UserName, String Password);
public boolean verify(String username, String password);
}

...

Code Block
titleRegisterBean.java
borderStylesolid

package statelessejb;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.sql.DataSource;
@Stateless
public class RegisterBean implements RegisterBeanRemote{
	@Resource(name="jdbc/userds")
	private DataSource dbsource;
	private Connection dbconnect;
	@PostConstruct
	public void initialize()
	{
		try{
			dbconnect= dbsource.getConnection();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	public void register(String FirstName, String LastName, String Sex, String UserName, String Password)
	{
		try
		{
			String insert="INSERT INTO USERINFO (" + "FIRSTNAME," + "LASTNAME," + "SEX," + "USERNAME," + "PASSWORD)" + " VALUES(?,?,?,?,?)";
			PreparedStatement ps=dbconnect.prepareStatement(insert);
			ps.setString(1,FirstName);
			ps.setString(2,LastName);
			ps.setString(3,Sex);
			ps.setString(4,UserName);
			ps.setString(5,Password);
			int rs =ps.executeUpdate();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	public boolean verify(String username, String password)
	{
		boolean ret=false;
		String select="SELECT * FROM USERINFO";
		try{
		PreparedStatement ps=dbconnect.prepareStatement(select);
		ResultSet rs= ps.executeQuery();
		while(rs.next())
		{
			String str=(rs.getString("USERNAME")).trim();
			String str1=(rs.getString("PASSWORD")).trim();
			if (str.compareTo(username)==0)
			{
			if(str1.compareTo(password)==0)
			
				{
				ret=true;
				break;
				}
			
			else
			    ret=false;
			}
			else
				ret=false;
		}
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		System.out.println(ret);
		return ret;	
	}
	@PreDestroy
	public void destroy(){
		try
		{
		dbconnect.close();
		dbconnect=null;
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}

	}
}
Warning
titleWarning

Due to some limitations in Geronimo Eclipse Plugin the generated deployment plan(openejb-jar.xml) does not have the correct namespace. Replace the existing namespace as shown in the figure with the following
<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.2" xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pkgen="http://www.openejb.org/xml/ns/pkgen-2.0" xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.2" xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2">

...

Creating a database using Administrative Console

...

. Once done refer the illustration in this tutorial to export and import JEE artifacts from Apache Geronimo administration console.

Info
titleClarification

Application client referred in this tutorial is actually a Web Application Client.

Table of Contents

...

Code Block
titleCreateTable.sql
borderStylesolid

CREATE TABLE USERINFO
(
FIRSTNAME char(20),
LASTNAME  char(20),
SEX       char(7),
USERNAME  char(20),
PASSWORD  char(20)
)

...

Creating a datasource using Administrative Console

...

Creating application client

  1. Create a new dynamic Web Project with the name Application Client.
  2. Right click on WebContent and create the following jsp's
    Code Block
    titlelogin.jsp
    borderStylesolid
    
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Welcome to Apache Geronimo</title>
    </head>
    <body bgcolor="white">
    <form method="post" action="passCredentials.jsp">
    <h2 align="center"><font color="blue">Welcome to Apache Geronimo</font></h2>
    <h2 align="center"><font color="blue">Enter your credentials</font></h2>
    Enter your Username
    <input type="text" name="username" size=20><br>
    Enter your Password
    <input type="password" name="password" size=20><br>
    <input type="submit" value="Login">
    <a href="http://localhost:8080/ApplicationClient/register.jsp">NewUser</a>
    </form>
    </body>
    </html>
    
    This form is the login page for our application. Once the user enters his/her credentials, these are passed to another jsp passCredentials.jsp(checkout the action in the form tag) to verify the authenticity of user credentials. In case the user is new he has to go through the registration process. This statement <a href="http://localhost:8080/ApplicationClient/register.jsp">NewUser</a> is used to route the user to registration page.
    Code Block
    titlepassCredentials.jsp
    borderStylesolid
    
    <%@ page import="java.util.Properties,javax.naming.Context,javax.naming.InitialContext,statelessejb.RegisterBeanRemote" %>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Insert title here</title>
    </head>
    <body bgcolor="white">
    <%!boolean i; %>
    <%
    Properties prop=new Properties();
    prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
    	prop.put("java.naming.provider.url", "ejbd://localhost:4201");
    Context context = new InitialContext(prop);
    RegisterBeanRemote myejb=(RegisterBeanRemote)context.lookup("RegisterBeanRemote");
    String s= request.getParameter("username");
    String s1= request.getParameter("password");
    i=myejb.verify(s,s1);
    %>
    <% 
    	if (i==true){ 
    %>
    <jsp:forward page="/resources.jsp"></jsp:forward>
    <% 
    	} else {
    %>
    	<jsp:forward page="/login.jsp"></jsp:forward>
    <% 
    }
    %>
    </body>
    </html>
    
    <%!boolean i; %> is a declaration for a global variable. The other part is a scriptlet which does a JNDI lookup to the remote interface. Later the user credentials are passed to verify function. In case the credentials are correct user is routed to the resources page else he is redirected to login page to re-login.
    Tip
    titleWhy is the lookup name RegisterBeanRemote??

    This will be explained in the deploy an run section

    Code Block
    titleresources.jsp
    borderStylesolid
    
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Welcome to Apache Geronimo</title>
    </head>
    <body bgcolor="white">
    <h3><font color="blue">Welcome to Apache Geronimo Resource Center</font></h3> 
    Apache Geronimo Home Page
    <a href="http://geronimo.apache.org">Apache Geronimo Home page</a><br>
    Join our mailing list
    <a href="http://geronimo.apache.org/mailing-lists.html">Apache Geronimo Mailing List</a><br>
    Come and Contribute to Apache Geronimo V2.1 Documentation
    <a href="http://cwiki.apache.org/GMOxDOC21/">Apache Geronimo V2.1 Documentation</a>
    </body>
    </html>
    
    This is the final page of the application which displays the various resources.
    Code Block
    titleregister.jsp
    borderStylesolid
    
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Welcome to Apache Geronimo</title>
    </head>
    <body bgcolor="white">
    <script type="text/javascript">
    function valForm()
    {
    	if (this.document.form1.username.value=="" || this.document.form1.username.value=="")
    	{
    		alert("You cannot leave the field blank");
    		this.document.form1.firstname.focus();
    		return false;
    	}
    	else
    	{
    		return true;
    	}
    }
    </script>
    <h2 align="center"><font color="blue">Welcome to Apache Geronimo User Registration</font></h2>
    <form method="post" name="form1" action="passVariables.jsp" onSubmit=" return valForm();">
    FirstName
    <INPUT type="text" name="firstname" SIZE=20><br>
    LastName
    <INPUT type="text" name="lastname" SIZE=20 ><br>
    Sex<br>
    <input type="radio" name="sex" value="male"> Male
    <br>
    <input type="radio" name="sex" value="female"> Female
    <br>
    Select a UserName<br>
    <input type="text" name="username" size=20><br>
    Select a Password<br>
    <input type="password" name="password"  size=20><br>
    <br>
    <input type="submit" value="Submit">
    </form>
    </body>
    </html>
    
    This page is the registration page. Once th user fills up the form and press Submit a valform() function is called which validates the field username and password. In case any of them is empty an alert is send which suggests empty fields in the form. If all is fine passVariables.jsp is called.
    Code Block
    titlepassVariables.jsp
    borderStylesolid
    
    <%@ page import="java.util.Properties,javax.naming.Context,javax.naming.InitialContext,statelessejb.RegisterBeanRemote" %>
    
    <html>
    <head>
    
    <meta http-equiv="Refresh" content="5;URL=http://localhost:8080/ApplicationClient/login.jsp">
    <title>Welcome to Apache Geronimo</title>
    </head>
    
    <%
    Properties prop=new Properties();
    prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory");
    	prop.put("java.naming.provider.url", "ejbd://localhost:4201");
    Context context = new InitialContext(prop);
    RegisterBeanRemote myejb=(RegisterBeanRemote)context.lookup("RegisterBeanRemote");
    String s= request.getParameter("firstname");
    String s1= request.getParameter("lastname");
    String s2= request.getParameter("sex");
    String s3= request.getParameter("username");
    String s4= request.getParameter("password");
    myejb.register(s,s1,s2,s3,s4);
    %>
    
    <h3 align="center"><font color="blue">Thank you for registering with Apache Geronimo</font></h3>
    <h3 align="center"><font color="blue">Redirecting to Login Page</font></h3>
    </html>
    
    In this page the fields are retrieved from register.jsp and the register function in the bean class is called to populate the database.
    The code <meta http-equiv="Refresh" content="5;URL=http://localhost:8080/ApplicationClient/login.jspImage Removed"> suggests to wait for 5 seconds and then move to login.jsp
    Code Block
    titleindex.jsp
    borderStylesolid
    
    <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
        pageEncoding="ISO-8859-1"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <body>
    <jsp:forward page="/login.jsp" />
    </body>
    </html>
    

    Few more configurations

  1. In the EJB Project. Under META-INF, Edit openejb-jar.xml and add the following
    Code Block
    titledatasource dependency
    borderStylesolid
    
    <sys:dependencies>
                <sys:dependency>
                    <sys:groupId>console.dbpool</sys:groupId>
                    <sys:artifactId>jdbc%2Fuserds</sys:artifactId>
                </sys:dependency>        
    </sys:dependencies>
    
    Finally the openejb-jar.xml will look like this
    Code Block
    titleopenejb-jar.xml
    borderStylesolid
    
    <?xml version="1.0" encoding="UTF-8"?>
    <openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar-2.2" xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:pkgen="http://www.openejb.org/xml/ns/pkgen-2.0" xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.2" xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2">
      <sys:environment>
        <sys:moduleId>
          <sys:groupId>default</sys:groupId>
          <sys:artifactId>StatelessSessionEJB</sys:artifactId>
          <sys:version>1.0</sys:version>
          <sys:type>car</sys:type>
        </sys:moduleId>
        <sys:dependencies>
                <sys:dependency>
                    <sys:groupId>console.dbpool</sys:groupId>
                    <sys:artifactId>jdbc%2Fuserds</sys:artifactId>
                </sys:dependency>        
    </sys:dependencies>
      </sys:environment>
      <enterprise-beans/>
    </openejb-jar>
    
    Info
    titleWhere did the above dependencies come from??

    To make the datasource visible to EJB we need to add a dependency to the EJB deployment plan that is openejb-jar.xml. The above element can be obtained automatically from Geronimo Database Pool wizard. Select usage against the database pool jdbc/userds

  2. In the WEB Project. Under WEB-INF, Edit geronimo-web.xml and add the following
    Code Block
    titleEJB dependency
    borderStylesolid
    
    <sys:dependencies>
           <sys:dependency>
                <sys:groupId>default</sys:groupId>
          		<sys:artifactId>StatelessSessionEJB</sys:artifactId>
          		<sys:version>1.0</sys:version>
          		<sys:type>car</sys:type>
           </sys:dependency>        
    </sys:dependencies>
    
    Finally the geronimo-web.xml will look like this
    Code Block
    titlegeronimo-web.xml
    borderStylesolid
    
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.2" xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.2" xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.2" xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.2">
      <sys:environment>
        <sys:moduleId>
          <sys:groupId>default</sys:groupId>
          <sys:artifactId>ApplicationClient</sys:artifactId>
          <sys:version>1.0</sys:version>
          <sys:type>car</sys:type>
        </sys:moduleId>
        <sys:dependencies>
           <sys:dependency>
                <sys:groupId>default</sys:groupId>
          		<sys:artifactId>StatelessSessionEJB</sys:artifactId>
          		<sys:version>1.0</sys:version>
          		<sys:type>car</sys:type>
           </sys:dependency>        
    </sys:dependencies>
      </sys:environment>
      <context-root>/ApplicationClient</context-root>
    </web-app>
    
  3. Right click the ApplicationClient Project and select properties. Select Java Build Path->Projects. Click add and add Stateless Session EJB. This is required for the compilation of the Client code.

Deploy and Run

Warning
titlewarning

Due to limitation with Geronimo Eclipse Plugin, you will have to export the Stateless Session EJB project and Web Application project as a jar and war respectively.

...

Exporting the application as a plugin

...