原创 利用JBOSS+MyEclipse完成一个简单的EJB示例 收藏

新一篇: Struts中文解决方法 | 旧一篇: 解决索爱w950铃音偏小的方法

利用JBOSS+MyEclipse完成一个简单的EJB示例
 
目标:
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.xmljboss.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目录下。
 
补充:在jspservlet中调用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>
将属性IsolatedCallByValue的值改为true
 
3、编辑%jboss%/server/default/deploy/jboss-web.deployer/META-INF/jboss-service.xml
 
 <attribute name="Java2ClassLoadingCompliance">false</attribute>
       <attribute name="UseJBossWebLoader">false</attribute>
将属性Java2ClassLoadingComplianceUseJBossWebLoader的值改为false,这里默认值一般都是false
 
一般情况下,使用第二种方式就可以解决该问题。
 

发表于 @ 2007年08月13日 14:50:00|评论(loading...)|编辑

新一篇: Struts中文解决方法 | 旧一篇: 解决索爱w950铃音偏小的方法

评论

#JavaWangJun 发表于2007-09-25 08:38:12  IP: 221.133.234.*
好象EJB在JBOSS3.2.5
中跑有问题啊,我是按照你说的这样做的
我是一个菜鸟,请赐教阿
#小数 发表于2007-10-17 20:23:27  IP: 221.192.237.*
怎么都说JBOSS不支持jdk1.6
是不是真的
谢谢
#小数 发表于2007-10-17 20:24:39  IP: 221.192.237.*
能不能给个源码
看看
itshu@163.com
#gxf212 发表于2007-10-20 19:06:14  IP: 222.212.190.*
最近没有时间更新BLOG啊。 源码现在都不在了 不好意思
#yykzz 发表于2008-01-04 17:58:00  IP: 218.249.100.*
配置客户端的时候需要修改web.xml,这样jsp才能够找到相应的servlet

<?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>ejbtest</servlet-name>
<servlet-class>com.lovo.servlet.EJBServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ejbtest</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
</web-app>
#ben_koch 发表于2008-09-17 10:59:58  IP: 119.119.235.*
yykzz 说的对。我就是搞了半天才发现缺少web.xml的。
#dsfsd 发表于2008-09-24 11:14:01  IP: 218.81.119.*
[url=http://www.dzbcgs.com.cn/putuobc.html]普陀搬场[/url]
[url=http://www.dzbcgs.com.cn/changningbc.html]长宁搬场[/url]
[url=http://www.dzbcgs.com.cn/xuhuibc.html]徐汇搬场[/url]
[url=http://www.dzbcgs.com.cn/pudongbc.html]浦东搬场[/url]
[url=http://www.dzbcgs.com.cn/minhangbc.html]闵行搬场[/url]
[url=http://www.dzbcgs.com.cn/luwanbc.html]卢湾搬场[/url]
[url=http://www.dzbcgs.com.cn/huangpubc.html]黄浦搬场[/url]
[url=http://www.dzbcgs.com.cn/zhabeibc.html]闸北搬场[/url]
[url=http://www.dzbcgs.com.cn/fengxianbc.html]奉贤搬场[/url]
[url=http://www.dzbcgs.com.cn/songjiangbc.html]松江搬场[/url]
[url=http://www.dzbcgs.com.cn/yangpubc.html]杨浦搬场[/url]
[url=http://www.dzbcgs.com.cn/jinganbc.html]静安搬场[/url]
[url=http://www.dzbcgs.com.cn/jiadingbc.html]嘉定搬场[/url]
[url=http://www.dzbcgs.com.cn/nanhuibc.html]南汇搬场[/url]
[url=http://www.dzbcgs.com.cn/jinshanbc.html]金山搬场[/url]
[url=http://www.dzbcgs.com.cn/qingpubc.html]青浦搬场[/url]
[url=http://www.dzbcgs.com.cn/jingshajiangbc.html]金沙江搬场[/url]
[url=http://www.dzbcgs.com.cn/jmbc.html]居民搬场[/url]
[url=http://www.dzbcgs.com.cn/gybc.html]工业搬场[/url]
[url=http://www.dzbcgs.com.cn/putuobc.html]普陀搬家[/url]
[url=http://www.dzbcgs.com.cn/changningbc.html]长宁搬家[/url]
[url=http://www.dzbcgs.com.cn/pudongbc.html]浦东搬家[/url]
[url=http://www.dzbcgs.com.cn/xuhuibc.html]徐汇搬家[/url]
[url=http://www.dzbcgs.com.cn/minhangbc.html]闵行搬家[/url]
[url=http://www.dzbcgs.com.cn/luwanbc.html]卢湾搬家[/u
#dsfsd 发表于2008-09-24 11:14:14  IP: 218.81.119.*
工业搬场
普陀搬家
长宁搬家
浦东搬家
徐汇搬家
闵行搬家
卢湾搬家
黄浦搬家
闸北搬家
奉贤搬家
松江搬家
杨浦搬家
静安搬家
嘉定搬家
南汇搬家
金山搬家
青浦搬家
金沙江搬家
居民搬家
工业搬家
#lgx112358xxx24 发表于2008-09-24 17:03:48  IP: 220.178.21.*
lgx112358xxx24
lgx112358xxx
wow gold
wow gold
wow gold
item4sale
item4sale
item4sale
item4sale
item4sale
item4sale
item4sale
age of conan gold
age of conan gold
age of conan gold
age of conan gold
age of conan gold
干洗连锁店
干洗连锁店
连锁加盟洗衣店
连锁加盟洗衣店
干洗设备价格
干洗设备价格
连锁店
#son 发表于2008-09-25 09:25:55  IP: 221.221.11.*
长途搬家
货架
驾校
搬场公司
上海搬场公司
搬家公司
上海搬家公司
汽车网
Google排名
货架
肺癌
直肠癌
珍香胶囊
胃癌
结肠癌
肝癌
乳腺癌
食道癌
清肺散结丸
北京驾校
quilting machine

光盘刻录
光盘制作
光盘印刷
rolex watches
#item4sale 发表于2008-09-26 13:08:29  IP: 220.178.20.*
sjjkk26 zhenlili09
wow gold
wow gold
wow gold
item4sale
item4sale
item4sale
item4sale
item4sale
item4sale
item4sale
buy age of conan gold
buy age of conan gold
buy age of conan gold
buy age of conan gold
buy age of conan gold
洗涤机械
洗涤机械
干洗机价格
干洗机价格
加盟干洗店连锁
加盟干洗店连锁
#xfsleep928 发表于2008-09-28 09:07:28  IP: 220.178.21.*
xfsleep928
9ha2ppy9
wow gold
wow gold
wow gold
wow gold
oofay.us
warhammer power leveling
warhammer online power leveling
美的空调
美的空调
美的中央空调
美的中央空调
新加坡留学
新加坡留学
留学新加坡
留学新加坡
隔膜泵
隔膜泵
磁力泵
磁力泵
东方医院
东方医院
wow gold
wow gold
#十大金牌光棍 周杰伦最有才刘德华最完美(图)  发表于2008-10-02 10:03:11  IP: 220.178.21.*
xfwowo102
10wo8wo10
wow gold
wow gold
wow gold
wow gold
oofay.us
warhammer power leveling
warhammer online power leveling
美的空调
美的空调
美的中央空调
美的中央空调
新加坡留学
新加坡留学
留学新加坡
留学新加坡
隔膜泵
隔膜泵
磁力泵
磁力泵
东方医院
东方医院
wow gold
wow gold
#dfhhh07 发表于2008-10-07 09:19:59  IP: 220.178.20.*
dfhhh07
YptttOcT
wow gold
wow gold
英国留学签证
新加坡签证
美国留学
英国大学排名
荷兰留学
法国签证
留学
澳洲签证
英国留学费用
英国留学中介
英国留学网
英国留学论坛
英国留学申请
法国签证
留学英国
wow gold
wow gold
wow gold
wow gold
#mygamestock 发表于2008-10-08 15:48:28  IP: 220.178.21.*
xfwowo108
10wo8wo10
wow gold
wow gold
wow gold
wow gold
wow gold
oofay.us
warhammer power leveling
warhammer online power leveling
美的空调
美的空调
美的中央空调
美的中央空调
新加坡留学
新加坡留学
留学新加坡
留学新加坡
隔膜泵
隔膜泵
磁力泵
磁力泵
东方医院
东方医院
wow gold
wow gold
<
#wow gold 发表于2008-10-09 09:30:31  IP: 60.166.107.*
mhaode4
mhaode22
wow gold
wow gold
gonaseal
gonaseal
gonaseal
gonaseal
gonaseal
lomenxi
lomenxi
lomenxi
lomenxi
wow gold
wow gold
phone games
phone games
mobile Games
mobile Games
上海厂房
上海厂房
厂房出租
厂房出租
厂房租赁
厂房租赁
厂房
#lgxoogle9 lgxoogle 发表于2008-10-09 14:41:17  IP: 220.178.21.*
lgxoogle9 lgxoogle
[url=http://item4sale.com/faq.aspx]wow gold[/url]
[url=http://item4sale.com]wow gold[/url]
[url=http://item4sale.com/gvgold38.html]wow gold[/url]
[url=http://item4sale.com/ItemsIndex.aspx]item4sale[/url]
[url=http://item4sale.com/default.aspx]item4sale[/url]
[url=http://item4sale.com/faq.aspx]item4sale[/url]
[url=http://item4sale.com/ContactUs.aspx]item4sale[/url]
[url=http://item4sale.com/AboutUs.aspx]item4sale[/url]
[url=http://item4sale.com/PLproductlist.aspx?gamecode=013]item4sale[/url]
[url=http://www.gocdk.com]item4sale[/url]
[url=http://brogame.com/Cheap.065.Age_of_Conan_-_US.aspx]age of conan gold[/url]
[url=http://itemrate.com/Cheap.065.Age_of_Conan_-_US.G.aspx]age of conan gold[/url]
[url=http://mygamestock.com/Cheap.013.World_of_Warcraft_-_US.aspx]age of conan gold[/url]
[url=http://oforu.com/Cheap.065.Age_of_Conan_-_US.aspx]age of conan gold[/url]
[url=http://gosuperplayers.com]age of conan gold[/url]
[url=http://www.leexi.com]干洗连锁店[/url]
[url=http://www.leexi.com/webs/jmfy.aspx]干洗连锁店[/url]
[url=http://www.leexi.com]水洗设备[/url]
[url=http://www.leexi.com/xideshebei.htm]水洗设备[/url]
[url=http://www.cilanie.com]干洗设备价格[/url]
[url=http://www.cilanie.com/gsjj/index3.asp]干洗设备价格[/url]
[url=http://www.leexi.com]连锁店[/url]
[url=http://www.leexi.com/webs/jmfy.aspx]连锁店[/url]
[url=http://www.goodpolisher.com/news_show.asp?id=89]鞋机[/url]
#lgxoogle9 lgxoogle 发表于2008-10-09 14:41:27  IP: 220.178.21.*
lgxoogle9 lgxoogle
wow gold
wow gold
wow gold
item4sale
item4sale
item4sale
item4sale
item4sale
item4sale
item4sale
age of conan gold
age of conan gold
age of conan gold
age of conan gold
age of conan gold
干洗连锁店
干洗连锁店
水洗设备
水洗设备
干洗设备价格
干洗设备价格
连锁店
连锁店
#mygamestock 发表于2008-10-10 09:43:40  IP: 220.178.21.*
xfwowo1010
10wo8wo10
brogame
wow gold
wow gold
wow gold
wow gold
wow gold
oofay.us
warhammer power leveling
warhammer online power leveling
美的空调
美的空调
美的中央空调
美的中央空调
新加坡留学
新加坡留学
留学新加坡
留学新加坡
隔膜泵
隔膜泵
磁力泵
磁力泵
东方医院
东方医院
wow gold
#wow gold 发表于2008-10-13 15:31:33  IP: 220.178.20.*
zlzly0810 wazly1013
wow gold
wow gold
wow gold
item4sale
item4sale
item4sale
item4sale
item4sale
item4sale
item4sale
AoC gold
AoC gold
AoC gold
AoC gold
AoC gold
洗涤设备
洗涤设备
全自动干洗机
全自动干洗机
门禁
门禁
擦鞋机
擦鞋机
Csdn Blog version 3.1a
Copyright © 狼狼