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

利用JBOSS+MyEclipse完成一个简单的EJB示例

    博客分类:
  • jsp
阅读更多

目标:
1、编写一个简单的无状态会话Bean,传入一个字符串参数,返回字符串Hello + 字符串参数。
2、通过JSP页面上输入一个字符串,提交到Servlet,并调用EJB,最后在一个页面上输出处理后的字符串。
工具:
JBOSS 4.2GA + Eclipse 3.2.2 +MyEclipse 5.5GA + JDK 1.6

首先需要搭建好各种环境,这一步比较简单,就不再赘述。唯一需要注意的是在启动JBOSS服务器时可能会出现一些问题。如端口号被占用而导致服务器无法启动。如果出现这个问题可以在%JBOSS%/server/default/deploy/jboss-web.deployer/目录下找到server.xml文件,修改<Connector port="8080" address="${jboss.bind.address}"   
         maxThreads="250" maxHttpHeaderSize="8192"
         emptySessionPath="true" protocol="HTTP/1.1"
         enableLookups="false" redirectPort="8443" acceptCount="100"
         connectionTimeout="20000" disableUploadTimeout="true" />
中的port属性,然后再重新启动服务器。默认端口是8080。

JBOSS自带了TOMCAT 5.X,当然也可以使用另外的Web服务器,不过后面的程序会稍微有些改动。
环境搭建完成后就需要编写EJB代码。一个EJB至少需要3个类,即Home接口、远程接口、实现类。新建一个EJB Project,项目名为:MyFirstEJB.
1、创建Home接口---HelloHome.java
package com.lovo.interfaces;

public interface HelloHome extends javax.ejb.EJBHome {
       public com.lovo.interfaces.Hello create() throws javax.ejb.CreateException,
                     java.rmi.RemoteException;
}

2、创建远程接口---Hello.java
package com.lovo.interfaces;

public interface Hello extends javax.ejb.EJBObject {
       public String sayHello(String message) throws java.rmi.RemoteException;

}

3、创建实现类---HelloBean.java
package com.lovo.ejb;
import java.rmi.RemoteException;

import javax.ejb.CreateException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;

public class HelloBean implements SessionBean {

       private SessionContext context;

       public HelloBean() {}

       public void ejbActivate() throws EJBException, RemoteException {}

       public void ejbPassivate() throws EJBException, RemoteException {}

       public void ejbRemove() throws EJBException, RemoteException {}
      
       public void ejbCreate() throws CreateException {}

       public void setSessionContext(SessionContext newContext)
              throws EJBException {
              this.context = newContext;
       }
       public String sayHello(String message){
              if(message == null)
                     message = "";
              message = "Hello " + message + "!";
              return message;
       }

}

其中方法sayHello就是我们需要实现的业务。
类建好之后,接下来就需要配置相关的xml文件。在该项目下的META-INF里新建两个xml文件ejb-jar.xml和jboss.xml。具体配置如下:
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>
       <description>
              <![CDATA[No Description.]]>
       </description>
       <display-name>Generated by XDoclet</display-name>
       <enterprise-beans>
              <session>
                     <description>
                            <![CDATA[Description for Hello]]>
                     </description>
                     <display-name>Name for Hello</display-name>
                     <ejb-name>Hello</ejb-name>
                     <home>com.lovo.interfaces.HelloHome</home>
                     <remote>com.lovo.interfaces.Hello</remote>
                     <ejb-class>com.lovo.ejb.HelloBean</ejb-class>
                     <session-type>Stateless</session-type>
                     <transaction-type>Container</transaction-type>
              </session>
       </enterprise-beans>
       <assembly-descriptor>
       </assembly-descriptor>
</ejb-jar>


jboss.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 2.4//EN" "http://www.jboss.org/j2ee/dtd/jboss_2_4.dtd">
<jboss>
   <enterprise-beans>
      <session>
         <ejb-name>Hello</ejb-name>
         <jndi-name>ejb/Hello</jndi-name>
      </session>
   </enterprise-beans>
   <resource-managers>
   </resource-managers>
</jboss>

使用XDoclet来自动生成这些文件还是很方便的,只是同时会生成一些多余的类和代码,需要手动去删除他们。

到这里一个简单的无状态会话Bean就完成了,下面就是将他们部署到Jboss下面。可以将项目打包成jar文件,然后放在
%JBOSS%/server/default/deploy/目录下,这样就算部署完成。还可以使用MyEclipse来帮你进行部署。如果控制台上出现:
01:59:48,640 INFO [EjbModule] Deploying Hello
01:59:48,703 INFO [ProxyFactory] Bound EJB Home 'Hello' to jndi 'ejb/Hello'
01:59:48,703 INFO [EJBDeployer] Deployed: file:/%jboss%/server/default/deploy/MyFirstEJB.jar/
就表示部署成功。下面我们就可以编写客户端程序来调用该EJB。

新建一个Web项目,项目名为testEJB,里面包含两个jsp文件和一个servlet。
EJBServlet.java

package com.lovo.servlet;

import java.io.IOException;

import javax.ejb.CreateException;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lovo.interfaces.Hello;
import com.lovo.interfaces.HelloHome;
public class EJBServlet extends HttpServlet {

       public void doGet(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
              doPost(request, response);
       }

       public void doPost(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
              request.setCharacterEncoding("gb2312");
              String info = request.getParameter("info");
              InitialContext context = null;
              Hello hello = null;
              try
              {
                     context = new InitialContext();
                     HelloHome home = (HelloHome)context.lookup("ejb/Hello");
                     hello = home.create();
              }
              catch (NamingException e)
              {
                     e.printStackTrace();
              }
              catch (CreateException e)
              {
                     e.printStackTrace();
              }
              info = hello.sayHello(info);
              request.setAttribute("info", info);
              request.getRequestDispatcher("message.jsp").forward(request, response);
       }

}
从jsp页面上获得表单中的字符串,然后将这个字符串传递到EJB的会话Bean中进行处理。最后将返回的字符串显示在另外一个JSP页面上。

index.jsp

<%@ page language="java" isELIgnored="false" pageEncoding="gb2312"%>
<html>
<head>
    <title>EJB</title>
</head>
<body>
     <form action="servlet" method="post">
            <input type="text" name="info" />
            <input type="submit" value="提交">
     </form>
</body>
</html>

message.jsp

<%@ page language="java" isELIgnored="false" pageEncoding="utf-8"%>
<html>
<head>
    <title>message</title>
</head>
<body>
    <h1>${info }</h1>
</body>
</html>

如果Web项目和EJB项目在同一服务器中,那么象上面的程序运行是没什么问题的。如果Web项目和EJB项目不在同一台服务器中,或者同一台服务器中使用的不是JBOSS自带的Tomcat,那么需要修改一下servlet:
修改后的EJBServlet.java

package com.lovo.servlet;

import java.io.IOException;
import java.util.Hashtable;

import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.lovo.interfaces.Hello;
import com.lovo.interfaces.HelloHome;

public class EJBServlet extends HttpServlet {

       public void doGet(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
              doPost(request, response);
       }

       public void doPost(HttpServletRequest request, HttpServletResponse response)
                     throws ServletException, IOException {
              request.setCharacterEncoding("gb2312");
              String info = request.getParameter("info");
              InitialContext context = null;
              Hello hello = null;
/*********************添加的代码*****************************/
              Hashtable environment = new Hashtable();

              environment.put(Context.INITIAL_CONTEXT_FACTORY,
                            "org.jnp.interfaces.NamingContextFactory");
              environment.put(Context.URL_PKG_PREFIXES,
                            "org.jboss.naming:org.jnp.interfaces");
              environment.put(Context.PROVIDER_URL, "jnp://localhost:1099");
/***********************************************************/
              try
              {
                     context = new InitialContext(environment);
                     HelloHome home = (HelloHome) context.lookup("ejb/Hello");
                     hello = home.create();
              }
              catch (NamingException e)
              {
                     e.printStackTrace();
              }
              catch (CreateException e)
              {
                     e.printStackTrace();
              }
              info = hello.sayHello(info);
              request.setAttribute("info", info);
              request.getRequestDispatcher("message.jsp").forward(request, response);
       }

}

光修改这里还不够,还需要将%jboss%/client/jbossall-client.jar 和EJB项目的jar包拷贝到web 项目中WEB-INF\lib目录下。

补充:在jsp或servlet中调用EJB时出现下面错误时:
04:03:33,714 INFO [STDOUT] java.rmi.ServerException: EJBException:; nested exception is:
javax.ejb.EJBException: Invalid invocation, check your deployment packaging, method=public abstract test.ejb.TestEJBInterface test.ejb.TestEJBHome.create() throws javax.ejb.CreateException,java.rmi.RemoteException
解决办法有三种:
1、编辑%jboss%/server/default/conf/jboss-service.xml

<mbean code="org.jboss.naming.NamingService"
      name="jboss:service=Naming"
      xmbean-dd="resource:xmdesc/NamingService-xmbean.xml">
      <!-- The call by value mode. true if all lookups are unmarshalled using
         the caller's TCL, false if in VM lookups return the value by reference.
      -->
      <attribute name="CallByValue">false</attribute>
       ...
</mbean>
将属性CallByValue的值改为true

2、编辑%jboss%/server/default/deploy/ear-deployer.xml

<mbean code="org.jboss.deployment.EARDeployer"
      name="jboss.j2ee:service=EARDeployer">
           <attribute name="Isolated">false</attribute>
         <attribute name="CallByValue">false</attribute>
           <attribute name="EnablelibDirectoryByDefault">true</attribute>
   </mbean>
将属性Isolated和CallByValue的值改为true

3、编辑deploy\jbossweb-tomcat55.sar\META-INF\jboss-service.xml

<attribute name="Java2ClassLoadingCompliance">false</attribute>
       <attribute name="UseJBossWebLoader">false</attribute>
将属性Java2ClassLoadingCompliance和UseJBossWebLoader的值改为false,这里默认值一般都是false

一般情况下,使用第二种方式就可以解决该问题。
分享到:
评论

相关推荐

    EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程)

    在"**EJB3.0+JBOSS+MyEclipse初体验(完整代码和过程).txt**"文件中,你将找到一个完整的示例,涵盖了上述所有步骤,包括具体的代码片段和执行过程,这对于初学者来说是一个很好的起点,可以快速理解并实践EJB 3.0在...

    Myeclipse+JBoss开发的EJB3.0 多对多程序

    在本项目中,"Myeclipse+JBoss开发的EJB3.0 多对多程序" 是一个基于Java EE平台的课程实验,利用EJB3.0(Enterprise JavaBeans 3.0)规范和Myeclipse集成开发环境,以及JBoss应用服务器,实现了数据模型中的多对多...

    利用Myeclipse6和jboss开发EJB3入门实例

    本文将详细介绍如何使用Myeclipse 6和JBoss来开发一个EJB3入门级的应用程序。通过本教程,您将学习到EJB3的基本概念、所需开发工具的配置、以及如何创建和部署简单的EJB3实体Bean。 #### 二、开发工具准备 在正式...

    MyEclipse+EJB3+JBoss4部署EBJ+web项目HelloWorld详解

    以上步骤详细介绍了如何在 MyEclipse 8.5 环境下利用 EJB 3 和 JBoss 4 部署一个简单的 HelloWorld 示例项目。这个过程涵盖了环境搭建、项目创建、部署及测试等多个方面,有助于初学者更好地理解 Java EE 技术栈中的...

    使用Eclipse + MyEclipse开发Web Service的示例

    1. **启动MyEclipse**:首先,打开MyEclipse IDE,创建一个新的Java项目或选择已有的项目,这个项目将承载我们的Web服务。 2. **创建服务端类**:在项目中创建一个新的Java类,定义服务接口和实现。接口通常包含你...

    JBoss Myeclipse EJB3 Second Demo

    【JBoss Myeclipse EJB3 Second Demo】是基于JBoss应用服务器和MyEclipse集成开发环境的一个EJB3(Enterprise JavaBeans 3)实战示例。EJB3是Java EE(Enterprise JavaBeans)规范的一个版本,它简化了EJB的开发过程...

    jboss7下ejb3实例

    jboss7下的ejb3开发的实例,从jboss官方文档中的代码示例中拷贝到本地工程中,亲测可用,附件是完整的工程。包括一个stateless session和一个stateful session,包括测试客户端。

    ejb3.0 Jboss安装配置

    #### 三、Jboss+EJB 3.0 入门示例 **1. 创建EJB项目** - 使用MyEclipse 8.5创建一个新的EJB项目,并选择EJB 3.0作为项目版本。 **2. 编写代码** **第一种方法:接口和实现类分别配置@Remote和@Stateless** -...

    myeclipse8.6安装jboss drools 6.0规则引擎插件

    例如,您可以创建一个简单的示例规则,然后通过Drools的工作流引擎运行该规则,以验证安装和配置是否正确。这样,您就完成了基于MyEclipse 8.6的JBoss Drools 6.0规则引擎的集成和设置,现在可以充分利用Drools的...

    myeclipse教程

    本教程是关于如何利用 MyEclipse 和 JBoss 进行 Web 开发的系列教程的第二部分,重点在于企业级 JavaBean (EJB) 的开发。该教程不仅适用于那些想要深入学习 Java Web 技术的开发者,同时也能帮助提高英语水平,因为...

    MyEclipse开发实例

    - **MyEclipse EJB项目的概念**:MyEclipse EJB项目是一种特殊的Eclipse Java项目,除了标准的Java项目结构外,还包括一个`META-INF`文件夹,用于存放与EJB相关的元数据文件,如`ejb-jar.xml`等。 - **项目结构**:...

    jboss使用详细操作步骤

    接下来我们将介绍如何在 MyEclipse 中集成 JBoss,并完成相关配置。 1. **打开 MyEclipse**:启动 MyEclipse 并选择 “Servers” 视图。 2. **创建新的 JBoss Server**: - 在 “Servers” 视图中选择 “New” -&gt;...

    MyEclipse 10 JBPM 配置

    在MyEclipse的`dropins`目录下创建一个文本文件,文件内容指定JBPM插件的路径,例如`path=D:/Program Files/Genuitec/MyEclipse 10/myPlugins`,保存为`jbpmn.link`。 ### 第八步:清理MyEclipse更新文件夹 删除...

    php调用webservice及myeclipse创建webservice实例

    以下是一个简单的示例: ```php $soapClient = new SoapClient("http://example.com/service?wsdl"); $response = $soapClient-&gt;__soapCall('serviceName', array('param1' =&gt; 'value1', 'param2' =&gt; 'value2')); `...

    EJB3.0学习之运行环境配置

    ### EJB3.0 学习之运行环境配置详解 #### 一、EJB3.0简介 EJB(Enterprise JavaBeans)3.0是Java企业级应用...通过上述步骤,开发者可以搭建起一个完整的EJB3.0开发和运行环境,从而开始探索和利用EJB3.0的强大功能。

    myeclipse开发Java WebService.zip

    而"HelloWorld"可能是一个简单的示例服务,包含一个名为"HelloWorld"的类,该类有一个返回“Hello, World!”的公共方法。这是初学者常用来学习如何创建和调用Web服务的示例。 5. **调试和测试Java WebService** ...

    JPBM3的安装和一个简单的示例

    本教程将详细介绍如何在myEclipse环境中安装JPBM3插件,并通过一个简单的示例展示如何使用JBPM3进行流程设计。 ### 一、JPBM3插件安装 1. **下载插件** 访问`http://www.jboss.com`下载JPBM3插件,具体文件为`...

    EJB3入门例子

    **jbos5**是EJB3的一个流行实现,是JBoss Application Server的第五个主要版本。它提供了一个完整的Java EE 5兼容环境,包括对EJB3的支持。JBoss AS5提供了丰富的管理和监控工具,方便开发者部署和调试EJB3应用。 *...

Global site tag (gtag.js) - Google Analytics