magine a software project for which the front-end developers work with PHP and the back-end developers create Enterprise JavaBeans (EJBs). As the project evolves, the front-end applications need to speak to the back-end EJBs, but this can’t be done in one simple step. So what’s the solution? Well, exposing the EJBs as Web services enables PHP to work with them. This article provides just such a solution.
Many developers face the challenge of mixing Java and PHP, based on the numerous posts I see on different discussion forums asking, “How do I link PHP with EJB?!” The few answers they receive usually suggest using Web services, but they never offer a practical example. Because this problem has no easy solution, the practical example this article offers is complex, involving Java, PHP, and SOAP technologies. (IMHO, the process of exposing EJBs as Web services requires much more coverage than one article can offer.)
PHP developers who have tried to work with EJB know it is impossible unless the EJB components are exposed as Web services. In large organizations, these developers usually do not have the rights or permissions to manipulate existing EJBs or to create and deploy new ones. So, they need to request their “Application Deployer” managers to expose the EJBs. In smaller shops, some developers probably work with EJB as well as PHP. For those jacks of all trades, this article demonstrates how to:
- Configure an EJB component (a simple stateless session bean)
- Deploy it as a Web service with SOAP
- Modify their PHP code to access the EJB component
The following is a brief listing of all the technologies and software used in this article:
- J2SE (version 1.4.1) to create EJB components
- J2EE RI, which is in the J2EE package (version 1.3.1) as the application server
- Apache SOAP (version 2.3.1) to take advantage of SOAP technology
- Apache HTTP Server (version 1.3.31) to test the PHP code
- PHP (version 4.3.8)
- NuSOAP library for work with SOAP in PHP
Author’s Note: This article is not a detailed manual for installing and configuring PHP software, nor is it a manual for EJB component development. For more detailed information on these subjects, consult their official documentation or any of the numerous books about them. The only purpose of this article is to show the reader how to access an EJB component from PHP code. By the way, I used the Windows operation system, but since this software is all cross-platform, you should not have any problems running it on UNIX, for example.
Before jumping into the code, take a look at Figure 1, which shows a high-level theoretical diagram of the solution that you will implement.
Figure 1: Theoretical Diagram of Solution |
Prepare Your EJB Component
First things first: make sure you’ve downloaded and properly installed J2SE and J2EE. You need them to follow the example EJB component.
The following are the source code listings for the stateless session bean:
- Remote home interface:
greentest/HelloWorldHome.java
:package greentest;import javax.ejb.*;import java.rmi.RemoteException;public interface HelloWorldHome extends EJBHome { public HelloWorld create() throws CreateException, RemoteException;}
- Remote interface:
greentest/HelloWorld.java
:package greentest;import javax.ejb.*;import java.rmi.RemoteException;public interface HelloWorld extends EJBObject { public String say() throws RemoteException;}
- And the bean itself:
greentest/HelloWorldBean.java
:package greentest;import javax.ejb.*;public class HelloWorldBean implements SessionBean { public void setSessionContext(SessionContext ctx) { System.out.println("In setSessionContext(...)"); } public void ejbCreate() { System.out.println("In ejbCreate()"); }public void ejbActivate() { System.out.println("In ejbActivate()"); } public void ejbPassivate() { System.out.println("In ejbPassivate()"); } public void ejbRemove() { System.out.println("In ejbRemove()"); } public String say() { System.out.println("In business method say()"); return "Hello World! I am just tiny Stateless Session Bean!"; }}
As you can see, the only active business method in the bean is say()
, which returns the “Hello World” string. So, as long as you’ve installed J2SE and J2EE and modified the CLASSPATH
environment variable, you can compile everything now. All source files should be in directory src/
, and all classes will need to be in directory classes/. Also, don’t forget that as long as the enterprise bean is in the package greentest, you need a subdirectory named greentest
in classes/
and src/
as well. Other than that, the compilation process is easy:
cd srcjavac -d ..classes greentest*.java
You should not have any problems if you correctly followed all the steps and set CLASSPATH
correctly.
Deploy Your EJB Component
Next, you need to deploy the component bean. So, run your J2EE RI server:
j2ee –verbose
The –verbose
option allows you to see all the debug messages from the server.
Now, in a separate window (the J2EE RI server needs to be running all the time), run the deploy tool from J2EE package:
deploytool
To prepare and deploy the EJB component, take the following steps (consult the screenshots for guidance):
FILE ? NEW ? APPLICATION
Figure 2: New Application Wizard - Click
OK
. Single click onAlohaApp
. FILE ? NEW ? ENTERPRISE BEAN
, clickNEXT
Figure 3: New Enterprise Bean Wizard – EJB JAR - Click
NEXT
Figure 4: New Enterprise Bean Wizard – General - Click
NEXT
, thenFINISH
. TOOLS ? DEPLOY
Figure 5: Deploy AlohaApp – Introduction - Click
NEXT
Figure 6: Deploy AlohaApp – JNDI Names - Click
FINISH
Figure 7: Deployment Progress
If you arrived at the screen display above, you did everything correctly and your EJB component is deployed.
Test Your EJB Component
Now it’s time to test whether it works. You need to compile your client tool: HelloWorldClient.java
. The following is the source code:
import javax.ejb.*;import javax.naming.*;import java.rmi.*;import javax.rmi.*;import greentest.*;public class HelloWorldClient { public void go() { try { Context ic = new InitialContext(); // during deployment, in JNDI we called it 'Aloha', remember? Object o = ic.lookup("Aloha"); HelloWorldHome home = (HelloWorldHome) PortableRemoteObject.narrow(o,
HelloWorldHome.class); HelloWorld aloha = home.create(); System.out.println(aloha.say()); } catch (Exception ex) { ex.printStackTrace(); } } public static void main(String[] args) { new HelloWorldClient().go(); }}
To compile it, use AlohaAppClient.jar
(consisting of classes and stubs), which the deployment tool generated during the steps above. The compilation process itself is pretty easy:
javac -classpath %CLASSPATH%;C:greenphp_with_ejbAlohaAppClient.jar HelloWorldClient.java
Execute the normal client for your stateless session bean.
Figure 8: Executed Client for Stateless Session Bean |
If you see the above output, you’ve done everything correctly.
Install Apache SOAP
At this point, you need to download and install Apache SOAP and then integrate it into your application. Go back to your deployment tool window (Did you close it already? Too fast! Open it once again!) and take the following steps:
- Single click on
AlohaApp
.FILE ? ADD TO APPLICATION ? WEB WAR
Figure 9: Add Web WAR - Click on
ADD WEB WAR
(choosesoap.war
in thewebapps/
directory where your Apache SOAP is installed, like in the screenshot above).TOOLS ? DEPLOY
Figure 10: Deploy AlohaApp – Introduction - Click
NEXT
, againNEXT
, thenFINISH
If you’ve done everything correctly, you will see the screen below.
Figure 11: Deployment Progress
Now, to be 100 percent sure that your Apache SOAP is installed and working properly, type this URL in your browser window: http://localhost:8000/admin/
. If everything is okay, you will see the Apache SOAP Admin interface.
Have SOAP Expose Your EJB Component
Now, you need to tell Apache SOAP that you want to expose the EJB component to it. To accomplish this, use the next deployment descriptor, soap_dd.xml
:
scope="Application" methods="create"> value="com.sun.jndi.cosnaming.CNCtxFactory" /> org.apache.soap.server.DOMFaultListener
To deploy the EJB component as a Web service to Apache SOAP, use the following command:
java org.apache.soap.server.ServiceManagerClient
http://localhost:8000/servlet/rpcrouter deploy soap_dd.xml
It’s that easy!
Create a PHP Client to Access Your Bean
The next goal is to create a PHP client for your stateless session bean. The client will communicate with the bean by using SOAP. Assuming you successfully downloaded, installed, and configured Apache HTTP Server and PHP to “see” each other, you just need to download NuSOAP. The only thing you need to do to install it is copy file nusoap.php
into the directory where you put your simple PHP code (in this case, it is C:Program FilesApache GroupApachehtdocszzz
). Put the code for the PHP client into the same directory, and call all the PHP material (– soap_client.php
) with the following code:
call('say', array(), 'urn:demo');print_r($x);?>
Pretty simple, isn’t it? Now it’s show time! Just check that everything is as it should be:
- The J2EE RI server is still running.
- The Apache HTTP server is running (and configured properly to understand PHP code).
- All the source code is where it should be.
- Everything is properly deployed (you should not find any mistakes if you followed all steps above).
Open your browser and type the URL: http://localhost/zzz/soap_client.php
. You should see the screenshot below.
Figure 12: Deployment Progress |
Mission Accomplished
Congratulations! You were able to run your own PHP code, which successfully accessed your EJB component. I hope this solution will help you in the future. Feel free to contact me, if you will have any problems with the this example. I can help you either eliminate them or at least find your mistakes. Remember, while you have J2EE RI running, you can see all the debug messages. They’ll tell you what’s happening and where you have any problems. These messages are pretty clear, so they can be a great help.