`
wujianjun0410
  • 浏览: 103698 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

servlet中调用EJB

阅读更多
对于初学像我这样初学EJB的菜鸟来讲,EJB的配置是一件非常繁琐的事情,不堪回首啊。呵呵,今天终于明白了昨天晚上遇到的一个白痴错误,所以将一个简单的例子写下来。
我这个例子的前提是EJB已经发布成功,在servlet中对已经发布的EJB的调用。
首先已要做的就是将已发布的EJB组件的jar文件拷贝到当前Web工程的lib下,其目录结构为:
EJB端:
    EJBFolderName
          |
          |------classes 
          |            |
          |            |-------hello
          |            |           |---------hello.class   //Remote
          |            |           |---------helloHome.class   //Home
          |            |           | ---------helloBean.class  //Bean
          |            |
          |            |--------META-INF
          |                           |------ejb-jar.xml  //EJB配置文件
            |                           |------MANIFEST.MF  //Manifest-Version: 1.0  Class-Path:
          | 
          |-----------src
                       |
                       |-------hello
                       |           |---------hello.java    //Remote
                       |           |---------helloHome.java    //Home
                       |           | ---------helloBean.java  //Bean
                       |
                       |--------META-INF
                                     |----ejb-jar.xml //servlet配置文件
                                     |-----MANIFEST.MF  //Manifest-Version: 1.0  Class-Path:

servlete端:
ServletFolderName
          |
          |----------src
          |            |-------hello
          |            |          |--------TestEJB.java  //被Servlet(只为目标清晰,也可直接写到Servlet内)
          |            |
          |            |-------TestEJBServlet.java  //一个Servlet  调用 包hello 中的方法。
          |
          |
          |----------WebRoot

                           |----------META-INF
                           |                  |--------MANIFEST.MF    //Manifest-Version: 1.0       Class-Path:
                           |
                           |----------WEB-INF
                                            |----------classes
                                            |               |-----------TestEJBServlet.class
                                            |               |
                                            |               | -----------hello                                              |                               |----------TestEJB.class
                                            |-----------lib              
                                            |            |----------FirstEJB.jar   //EJB打好的一个Jar包!EJB2.0不可缺少  

                                            |                           
                                            |------------web.xml   //Servlet配置文件             

基本文件结构就是这样。结束!         

*/下面是针对每个文件的详细说明://首先是Servlet端,Servlet有一个servlet文件,实现doGet方法和doPost方法,还有一个Servlet配置文件 web.xml
//TestEJBServlet.java:
import java.io.IOException;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



import hello.TestEJB;

public class TestEJBServlet extends HttpServlet {



	protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {

		this.doPost(request,response);  //直接以页面的形式调用Servlet 调用的事doGet方法,

                                                                                            //也可以直接在doGet方法中调用EJB

	}

         public void doPost(HttpServletRequest request, HttpServletResponse response){

         		try{

			new TestEJB("iiop://localhost:2809/").test();  //调用 TestEJB.java 中的test()方法。

		} catch(Exception e){

			e.printStackTrace();

		}



          }

}



//TestEJB.java:
package hello;

import javax.naming.Context;

import java.util.Properties;

import javax.naming.NamingException;

import javax.naming.InitialContext;

import javax.rmi.PortableRemoteObject;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

public class TestEJB {

	private static final String JNDI_NAME = "HelloEJB";  //EJB上传websphere时用的JNDI Name

	private String url;

	private HelloHome home;

	public TestEJB(String url) throws NamingException{

		this.url = url;

		home = lookUpHome();

	}

	private Context getInitialContext() throws NamingException {

		Properties prop = new Properties();

	   prop.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");

		prop.put(Context.PROVIDER_URL, url);

		return new InitialContext(prop);

	}

	private HelloHome lookUpHome() throws NamingException{

		Context ctx = getInitialContext();

		Object home = ctx.lookup(JNDI_NAME);

		return (HelloHome)PortableRemoteObject.narrow(home,HelloHome.class);

	}

	public void test() throws RemoteException,CreateException,NamingException {

		Hello hello = (Hello)PortableRemoteObject.narrow(home.create(),Hello.class);

		System.out.println(hello.sayHello());

	}

	/*public static void main(String args[]) throws Exception{

		try{

		new TestEJB("iiop://localhost:2809/").test();

		}catch(Exception e){

			e.printStackTrace();

		}

	}*/

}


//Servlet 配置文件 web.xml
<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" 

	xmlns="http://java.sun.com/xml/ns/j2ee" 

	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 

	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

	<servlet>

		<servlet-name>TestEJB</servlet-name>   

		<servlet-class>TestEJBServlet</servlet-class> 

	</servlet>

	<servlet-mapping>

		<servlet-name>TestEJBServlet</servlet-name>  //Servlet映射到web服务器上的名字

		<url-pattern>/servlet/TestEJBServlet</url-pattern>//Servlet映射到web服务器上的路径

	</servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>//默认开始页面(可有可无)

  </welcome-file-list>

</web-app>


接下来是EJB端:三个java文件(Home.java,Remote.java,Bean.java)和一个ejb-jar配置文件
helloHome.java(就是Home.java  本地接口)
package hello;

import java.rmi.RemoteException;

import javax.ejb.CreateException;

import javax.ejb.EJBHome;


public interface HelloHome extends EJBHome {

	public Hello create()throws CreateException,RemoteException;

}


hello.java(就是Remote.java  远程接口)
package hello;
import java.rmi.RemoteException;
import javax.ejb.EJBObject;

public interface Hello extends EJBObject {

	public String sayHello()throws RemoteException;

}


helloBean.java(就是Bean.java 实现类)
package hello;
import java.rmi.RemoteException;

import javax.ejb.EJBException;

import javax.ejb.CreateException;

import javax.ejb.SessionBean;

import javax.ejb.SessionContext;

public class HelloBean implements SessionBean {

	private SessionContext ctx;

	private String words ;

	public String sayHello(){

		System.out.println("i am in an EJB server."+words);

		return words;

	}

	public void ejbCreate() throws CreateException{

		this.words = "hello world";
	}
	public void ejbActivate() throws EJBException, RemoteException {

		// TODO Auto-generated method stub
	}

	public void ejbPassivate() throws EJBException, RemoteException {

		// TODO Auto-generated method stub
	}

	public void ejbRemove() throws EJBException, RemoteException {

		// TODO Auto-generated method stub
	}



	public void setSessionContext(SessionContext arg0) throws EJBException,

			RemoteException {
		this.ctx = arg0;
	}
}


还有一个配置文件ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar>

	<display-name>HelloEjb</display-name>

	<enterprise-beans>

		<session>

			<ejb-name>FirstEJB</ejb-name>

			<home>hello.HelloHome</home>

			<remote>hello.Hello</remote>

			<ejb-class>hello.HelloBean</ejb-class>

			<session-type>Stateless</session-type>

			<transaction-type>Container</transaction-type>

		</session>

	</enterprise-beans>

	<assembly-descriptor>

		<container-transaction>

			<method>

				<ejb-name>FirstEJB</ejb-name>

				<method-intf>Remote</method-intf>

				<method-name>*</method-name>

			</method>

			<trans-attribute>Required</trans-attribute>

		</container-transaction>

	</assembly-descriptor>

</ejb-jar>

最后还想说一下对EJB的调用的集中方式,主要有三种:
1、用property帮助设置环境
Properties properties = System.getProperties();
		 	
			properties.put(Context.PROVIDER_URL, "iiop://localhost:2809");
			properties.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
			Context ctx = new InitialContext(properties);

2、用Hashtable帮助设置环境
Hashtable environment = new Hashtable();

		    environment.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");

		    environment.put(Context.PROVIDER_URL, "iiop://localhost:2809");  //可选,同“corbaloc:iiop:localhost:2809”的效果一样。

		    Context ctx= new InitialContext(environment);

3、WAS默认的方法
	Context ctx = new InitialContext();
			Object ref = ctx.lookup("ejb/TestEJB");
			TestEJBHome home = (TestEJBHome) PortableRemoteObject.narrow(ref,	TestEJBHome.class);
			
			testinst = home.create();
			arg1.getWriter().println(testinst.testEJB());
			System.out.println(testinst.testEJB());
分享到:
评论

相关推荐

    JSP + EJB + Servlet 实例

    使用原始的servlet操作熟悉EJB的实体管理。 本实例主要功能:实现对员工、角色、账号、部门的关系管理。 本实例的实体设计:部门-员工:一对多。员工-账号:一对一。账号-角色:一对一。 主要采用EJB进行会话管理。...

    \websphere部署EJB3.docx

    5. **在Servlet中调用EJB**: 在同一个项目和容器中,Servlet可以通过注解方式(如`@EJB`)来直接注入并调用EJB。例如,Servlet `LoginServlet` 中,`@EJB`注解的`FristSessionBeanRemote`字段会自动查找并注入对应...

    jsp+servlet+EJB3.0网上书店

    在本项目中,Servlet通常作为控制器,处理HTTP请求,调用业务逻辑,然后将结果传递回JSP页面进行渲染。例如,用户提交登录表单时,对应的Servlet会验证用户名和密码,如果验证成功,则将用户信息保存到session,并重...

    JavaEE5学习笔记07-Web层与EJB集成总结

    例如,在Servlet中调用EJB: ```java InitialContext ctx = new InitialContext(); UserService userService = (UserService) ctx.lookup("java:global/myapp/UserService"); userService.insertUser(new UserDTO(...

    jsp+servlet+EJB简单应用

    2. **编写Servlet**:接着,编写`LoginServlet`和`RegisterServlet`,在`doPost`方法中处理表单提交的数据,调用EJB方法进行业务处理。 3. **实现EJB**:创建`UserEJB`,实现数据库操作,如查询、插入和更新用户信息...

    深入Java Servlet 网络编程

    6. **EJB和Java EE集成**:深入EJB的概念,如Stateless Session Beans、Stateful Session Beans、Message-driven Beans等,以及如何在Servlet中调用EJB方法。 7. **Spring框架的应用**:介绍Spring MVC模式,Spring...

    深入Java Servlet网络编程

    8 从Servlet中调用EJB 附录A 超文本传输协议 A. 1 MIME A. 2 URI和URL A. 3 HTTP详解 A. 3. 1 建立TCP/IP连接 A. 3. 2 客户端发送请求 A. 3. 3 服务器返回响应 A. 3. 4 HTTP报头 附录B Servlet API

    基于MVC设计模式构筑JSPServlet+EJB的Web应用

    3. 处理完成后,Servlet调用适当的JSP页面来展示结果给用户。 4. 如果需要与数据库交互,Servlet会将数据传递给JavaBean或EJB组件,由这些组件完成数据的存储或检索。 #### 实例分析 文章还提到了一个EAM(企业...

    EJB3.0_Servlet.rar_ejb3.0 example

    在Servlet的`doGet`或`doPost`方法中,可以直接调用注入的EJB的方法,进行业务逻辑处理。 此外,EJB 3.0还引入了拦截器(Interceptors),这是一种AOP(面向切面编程)机制,可以用于添加跨切面的功能,如日志、...

    JSP调用EJB例子[归类].pdf

    本示例主要介绍如何在JBoss 4.0环境中,使用JSP调用EJB组件。JBoss 4.0是一个全面的Java EE应用服务器,它整合了Tomcat 5.0作为内置的Servlet和JSP容器,使得开发者可以同时处理EJB和Web应用的部署。 首先,我们...

    Servlet+EJB3源代码

    在"ServletAndEJB3"这个源代码项目中,我们可以期待看到如何在实际应用中结合使用Servlet和EJB3,包括Servlet的请求处理、EJB的创建和调用,以及可能的JPA配置和数据库交互。通过分析这些源代码,开发者可以深入理解...

    基于JSP Servlet和EJB的学生教务管理系统

    在教务管理系统中,Servlet扮演了控制器的角色,负责接收用户的请求,调用相应的服务并传递数据,再将处理结果转发到对应的JSP页面。 3. **EJB (Enterprise JavaBeans)**: EJB是Java EE平台的核心组成部分,为开发...

    MVC设计模式的JavaWeb项目所需要的jar(Jsp+Servlet+JavaBean(EJB)).zip

    在MVC中,Servlet常作为控制器的角色,接收用户请求,调用模型处理,然后返回结果。 3. **JavaBean**: JavaBean是符合一定规范的Java类,主要用于封装数据和提供业务逻辑。在MVC模式下,JavaBean通常作为模型层的...

    AJAX和JSF和EJB整合

    2. **数据通信优化**:AJAX可以与EJB中的Session Beans交互,以异步方式调用服务方法,获取或更新数据。这种方式减少了网络延迟,提高了响应速度。 3. **界面反馈**:EJB处理业务逻辑后,结果可以通过JSF组件显示在...

    EJB项目执行流程

    这样,Servlet就可以直接调用EJB提供的业务方法。同时,HTML页面访问的URL需要在Servlet配置中进行映射,确保请求能正确路由到对应的Servlet。 4. **动态创建业务对象**:在Servlet中,我们会动态创建业务对象。这...

    WebLogic6.0中Ejb的使用-j2ee

    ### WebLogic 6.0中EJB的使用详解 #### 一、概述 EJB(Enterprise JavaBeans)是Java EE规范中的一个重要组成部分,主要用于构建分布式企业应用中的业务逻辑层。本文将详细介绍如何在WebLogic 6.0服务器环境中部署...

    eclipse-ejb项目.zip

    "ejb-project1-web"则可能是一个Web应用模块,它可能包含了Servlet、JSP等Web组件,这些组件可以调用EJB服务,将结果呈现给用户。这个模块与EJB模块通过Java EE的依赖注入(Dependency Injection)机制进行通信,...

    基于java的中的EJB编程实例代码.zip

    例如,Servlet或JSF可以作为客户端,调用EJB进行业务处理,然后将结果呈现给用户。JPA则负责数据持久化,与EJB实体bean交互。 在压缩包中的"codefans.net"文件可能是一个指向代码示例的链接或者实际的源代码文件。...

    MyEclipse进行Ejb快速开发配置

    在其他Java EE组件(如Servlet、JSP或JSF)中,你可以通过JNDI查找来调用EJB。MyEclipse提供了方便的代码生成工具,可以帮助你快速生成JNDI查找和EJB调用的代码。 七、EJB的高级特性 除了基础的EJB开发,MyEclipse...

Global site tag (gtag.js) - Google Analytics