Professional Documents
Culture Documents
Access An Ejb From A Servlet
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;
/** * 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 {
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();
// 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() ); }
// 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 ); } }
<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> */