[转帖]一步一步教你远程调用EJB_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3762 | 回复: 0   主题: [转帖]一步一步教你远程调用EJB        下一篇 
lxk
注册用户
等级:上尉
经验:547
发帖:109
精华:0
注册:2011-8-18
状态:离线
发送短消息息给lxk 加好友    发送短消息息给lxk 发消息
发表于: IP:您无权察看 2011-11-3 13:36:24 | [全部帖] [楼主帖] 楼主

前期准备:弄清楚weblogic(或jboss)、tomcat、JBluder(或eclipse+MyEclipse)的使用方法,能写一个简单的基于struts框架的web工程,然后准备两台联网的电脑(局域网也可以),如果没有条件,也可以在同一台电脑上分别安装两个web服务器(例如:weblogic和tomcat)来代替,本文将采用后一种方法,采用weblogic作EJB容器,tomcat作web容器,用struts工程来调用EJB

准备好了吗?让我们开始下一步

第一步:写一个简单的EJB。写EJB最好用的还是JBuilder,毕竟够傻瓜化。当然作为专业人士,eclipse搭配MyEclipse是最佳选择,不过作为初学者,建议采用JBuilder。以下是本文测试所用到的EJB。

remote接口:

package testhello;
import javax.ejb.EJBObject;
public interface SayHello extends EJBObject {
      public String sayHello(String name) throws java.rmi.RemoteException;
}


home接口:

package testhello;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
import java.rmi.RemoteException;
public interface SayHelloHome extends EJBHome {
      public SayHello create() throws CreateException, RemoteException;
}


bean类:

package testhello;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
import javax.ejb.CreateException;
public class SayHelloBean implements SessionBean {
      SessionContext sessionContext;
      public void ejbCreate() throws CreateException {
      }
      public void ejbRemove() {
      }
      public void ejbActivate() {
      }
      public void ejbPassivate() {
      }
      public void setSessionContext(SessionContext sessionContext) {
            this.sessionContext = sessionContext;
      }
      public String sayHello(String name) {
            return "Hello "+name;
      }
}


如果你是采用上面两种工具来写的话,配置文件就不必考虑了

第二步:利用JBuilder或eclipse将这个EJB工程编译并打包,会得到一个jar(如果你的工程名叫testhello,那么这个jar文件就是testhello.jar)文件。如果你的EJB容器(weblogic或JBoss)是在本机上,那么在JBuilder或eclipse中就可以直接鼠标右击EJB工程,来部署EJB。如果需要部署到远程服务器上,只需要通过EJB容器的控制台将testhello.jar上传到远程端,然后在EJB Modler里面按提示部署好EJB。最后,别忘了在JNDI Tree里面察看你的EJB工程的JNDI名,本例的JNDI名叫SayHello

第三步:将remote接口和home接口打包成jar文件,copy到你要远程调用EJB的struts工程下的lib目录(例如:helloapp ->WEB-INF ->lib)

第四步:将weblogic的weblogic.jar(在weblogic的安装目录->weblogic81->server->lib文件夹中)copy到tomcat安装目录下的->shared->lib文件夹中,其实这里我们需要用到的只是weblogic.jar里的几个class文件而已,不过对于初学者而言,先不必去深究到底只需要那几个class。

第五步:编写一个简单的struts工程(其实这些都可以用工具生成),一下是调用EJB的HelloAction的源代码(特别要注意的是,记得要将之前第三步生成的jar包导入编辑器中,否则下面的代码编译通不过。如果你不知道导入jar包,就把那个jar包多copy一份到你的jdk安装目录 -> jre-> lib-> ext文件夹下)

package logging.actions;
import logging.Constants;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.util.MessageResources;
import org.apache.struts.validator.DynaValidatorForm;
public final class HelloAction extends Action{
      public ActionForward execute(ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception{
            InitialContext ctx=this.getInitialContext();
            //查找JNDI名为SayHello的EJB组件
            Object obj=ctx.lookup("SayHello");
            //获得远程EJB组件的home接口的引用
            testhello.SayHelloHome home=(testhello.SayHelloHome)PortableRemoteObject.narrow(obj,testhello.SayHelloHome.class);
            //获得远程EJB组件的remote接口的引用
            testhello.SayHello hello=home.create();
            String name="飘然随风";
            String sayString=hello.sayHello(name);
            request.setAttribute("userName",name);
            request.setAttribute("passWord",sayString);
            request.removeAttribute(mapping.getAttribute());
            return mapping.findForward("loginSuccess");
      }
      /*以下方法是作用是:通过传递环境属性选择JNDI驱动和服务器的网络位置,
  并连接到连接到JNDI树。
  这是采用weblogic做EJB容器时,远程调用EJB的固定初始化模式,初学者可以死记下来
*/
      private InitialContext getInitialContext() throws Exception {
            //EJB容器的地址
            String url = "t3://image:7001";
            String user = null;
            String password = null;
            Properties properties;
            properties = new Properties();
            properties.put(Context.INITIAL_CONTEXT_FACTORY,
            "weblogic.jndi.WLInitialContextFactory");
            properties.put(Context.PROVIDER_URL, url);
            if (user != null) {
                  properties.put(Context.SECURITY_PRINCIPAL, user);
                  properties.put(Context.SECURITY_CREDENTIALS,
                  password == null ? "" : password);
            }
            return new javax.naming.InitialContext(properties);
      }
}


第六步:如果你严格按照上面的步骤做了,那么剩下的就是同时启动weblogic和tomcat来测试了。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论