You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
3.8 KiB
Java

Access an ejb from a servlet
package com.ack.web.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ack.j2ee.ejb.session.Lawyer;
import com.ack.j2ee.ejb.session.LawyerHome;
/**
* web.xml configuration part of the an ejb component
*
* <web-app>
...
<ejb-ref>
<ejb-ref-name>yoda</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.ack.j2ee.ejb.session.LawyerHome</home>
<remote>com.ack.j2ee.ejb.session.Lawyer</remote>
</ejb-ref>
...
</web-app>
*
* the vendor-specific mapping of the res-ref-name into their
* own application server space, eg weblogic does the following
* in a weblogic.xml file
*
<weblogic-web-app>
...
<reference-descriptor>
...
<ejb-reference-description>
<ejb-ref-name>yoda</ejb-ref-name>
<jndi-name>ejb/lawyer</jndi-name>
</ejb-reference-description>
...
</reference-descriptor>
...
</weblogic-web-app>
*/
public class AccessAnEjbFromAServlet extends HttpServlet {
private Context ctx;
public void init() throws ServletException {
try {
// lets share the context for ejb lookup for
// this servlet's incoming requests
ctx = new InitialContext();
}
catch( NamingException nex ) {
throw new ServletException( "couldn't locate JNDI context", nex );
}
}
public void doGet( HttpServletRequest req, HttpServletResponse res )
throws ServletException, IOException {
res.setContentType( "text/html" );
PrintWriter pw = res.getWriter();
try {
// get reference to business interface from home interface
Lawyer lawyer = getLawyer();
// use the business interface
lawyer.sendHimDown( "bad guy" );
// let application server reclaim ejb resources
lawyer.remove();
}
catch( LawyerException lex ) {
pw.println( lex.getMessage() );
}
catch( Exception ex ) {
log( "problem using the lawyer", ex );
pw.println( ex.getMessage() );
}
pw.println( "well, that wasn't so bad" );
}
private Lawyer getLawyer() throws LawyerException {
try {
Object ejbObject = null;
// get hold of the object you want by name
synchronized( this ) {
System.out.println( "calling on yoda..." );
ejbObject = ctx.lookup( "java:comp/env/yoda" );
}
// narrow retrieved object into specific expected type
LawyerHome home = (LawyerHome) PortableRemoteObject.
narrow( ejbObject, LawyerHome.class );
return home.create();
}
catch( Exception ex ) {
log( "problem getting hold of a lawyer", ex );
throw new LawyerException( ex.getMessage() );
}
}
}
class LawyerException extends Exception {
public LawyerException( String str ) {
super( str );
}
}
/**
*
* This is the web.xml configuration
*
<web-app>
...
<ejb-ref>
<description>bring forth the yoda lawyer</description>
<ejb-ref-name>yoda</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.ack.j2ee.ejb.session.LawyerHome</home>
<remote>com.ack.j2ee.ejb.session.Lawyer</remote>
</ejb-ref>
</web-app>
*
* But the vendor-specific xml file must map this
* ejb-ref-name to the name in the JNDI space, for
* example, in weblogic we have the weblogic.xml,
*
<weblogic-web-app>
<reference-descriptor>
<ejb-reference-description>
<ejb-ref-name>yoda</ejb-ref-name>
<jndi-name>ejb/lawyer</jndi-name>
</ejb-reference-description>
</reference-descriptor>
</weblogic-web-app>
*/