工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3588|回复: 7

[HelloWorld] Jboss下第一个EJB程序

[复制链接]
发表于 2006-8-3 00:51 | 显示全部楼层 |阅读模式
看《精通EJB》(第三版)这本书到第十章的时候我还在写 HelloWorld 程序。书上第三章说:本书建议开发者能够动手将HelloWorld组件编译,并且运行起来。我现在终于做到了。

从官方网站下载最新版的Jboss作EJB容器,安装后在 classpath 加上 jboss所在目录 \server\default\lib\jboss-j2ee.jar。现在可以写程序了。Java程序很简单,直接给出代码。

Hello.java
  1. package powerwind;
  2. public interface Hello extends javax.ejb.EJBObject
  3. {
  4.         public String sayHello() throws java.rmi.RemoteException;
  5. }
复制代码


HelloHome.java
  1. package powerwind;
  2. public interface HelloHome extends javax.ejb.EJBHome
  3. {
  4.         public Hello create() throws java.rmi.RemoteException,javax.ejb.CreateException;
  5. }
复制代码


HelloBean.java
  1. package powerwind;
  2. public class HelloBean implements javax.ejb.SessionBean
  3. {
  4.         private javax.ejb.SessionContext ctx;
  5.         public void ejbCreate(){}
  6.         public void ejbRemove(){}
  7.         public void ejbActivate(){}
  8.         public void ejbPassivate(){}
  9.         public void setSessionContext(javax.ejb.SessionContext ctx)
  10.         {
  11.                 this.ctx=ctx;
  12.         }
  13.         public String sayHello()
  14.         {
  15.                 return "Hello EJB!";
  16.         }
  17. }
复制代码


使用JSP文件调用EJB组件。
  1. <%@ page contentType="text/html;charset=GBK" %>
  2. <%@ page import="powerwind.*,javax.ejb.*,javax.naming.*,javax.rmi.*" %>
  3. <html>
  4. <body>
  5. <%
  6.         String message=null;
  7. try{
  8.                 InitialContext ic=new InitialContext();
  9.                 Object obj=ic.lookup("HelloEJB");
  10.                 HelloHome home=(HelloHome)PortableRemoteObject.narrow(obj,powerwind.HelloHome.class);
  11.                 Hello hello=home.create();
  12.                 message=hello.sayHello();
  13.         }catch(Exception e){
  14.                 e.printStackTrace();
  15.         }
  16. %>
  17. <h1><%=message%></h1>
  18. </body>
  19. </html>
复制代码


(未完)

[ 本帖最后由 powerwind 于 2006-8-3 00:52 编辑 ]
 楼主| 发表于 2006-8-3 10:12 | 显示全部楼层

部署文件

先在当前目录新建两个文件夹,分别为 META-INF WEB-INF ,其中  META-INF 下有三个文件:ejb-jar.xmljboss.xml application.xml WEB-INF 下有 jboss-web.xml web.xml 两个文件。下面是各文件的内容。

ejb-jar.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN' 'http://java.sun.com/dtd/ejb-jar_2_0.dtd'>
  3. <ejb-jar>
  4. <description>HelloEJB,my first ejb program</description>
  5. <display-name>HelloEJB</display-name>
  6.         <enterprise-beans>
  7.                 <session>
  8.                         <ejb-name>HelloEJB</ejb-name>
  9.                         <home>powerwind.HelloHome</home>
  10.                         <remote>powerwind.Hello</remote>
  11.                         <ejb-class>powerwind.HelloBean</ejb-class>
  12.                         <session-type>Stateless</session-type>
  13.                         <transaction-type>Container</transaction-type>
  14.                 </session>
  15.         </enterprise-beans>
  16. </ejb-jar>
复制代码


jboss.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <jboss>
  3.         <enterprise-beans>
  4.                 <session>
  5.                         <ejb-name>HelloEJB</ejb-name>
  6.                         <jndi-name>HelloEJB</jndi-name>
  7.                 </session>
  8.         </enterprise-beans>
  9. </jboss>
复制代码


----------------------------------------------------------------------------------------------------------------------------

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
  3. <web-app>
  4.         <ejb-ref>
  5.                 <ejb-ref-name>HelloEJB</ejb-ref-name>
  6.                 <ejb-ref-type>Session</ejb-ref-type>
  7.                 <home>powerwind.HelloHome</home>
  8.                 <remote>powerwind.Hello</remote>
  9.         </ejb-ref>
  10. </web-app>
复制代码


jboss-web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <jboss-web>
  3.         <ejb-ref>
  4.                 <ejb-ref-name>HelloEJB</ejb-ref-name>
  5.                 <jndi-name>HelloEJB</jndi-name>
  6.         </ejb-ref>
  7. </jboss-web>
复制代码


application.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <application>
  3. <display-name>HelloEJB J2EE Application</display-name>
  4.         <module>
  5.                 <web>
  6.                         <web-uri>HelloEJB.war</web-uri>
  7.                         <context-root>/HelloEJB</context-root>
  8.                 </web>
  9.         </module>
  10.         <module>
  11.                 <ejb>HelloEJB.jar</ejb>
  12.         </module>
  13. </application>
复制代码


现在一切就绪,该编译JAVA文件了。此时,文件目录结构应该是这样的:
HelloEJB下有index.jsp和文件夹WEB-INF、META-INF、powerwind
WEB-INF和META-INF文件夹下的文件在前面已说了,powerwind文件夹下有三个class文件。

现在开始打包,分三步:
jar cvf HelloEJB.jar META-INF/ powerwind/
jar cvf HelloEJB.war index.jsp WEB-INF/
jar cvf HelloEJB.ear HelloEJB.jar HelloEJB.war META-INF/


(实际上,HelloEJB.jar包中的 META-INF只需要 jboss.xml 和 ejb-jar.xml 两个文件,而 HelloEJB.ear 下的 META-INF只需要 application.xml ,图方便,现在三个文件放在一起,也没有妨碍 )

现在把文件 HelloEJB.ear 放到JBOSS下的 \server\default\deploy,在浏览器输入 http://localhost:8080\HelloEJB\index.jsp

这样第一个就EJB诞生了。

[ 本帖最后由 powerwind 于 2006-11-12 11:22 编辑 ]
回复

使用道具 举报

发表于 2006-8-3 12:50 | 显示全部楼层
楼主的程序没有用JNDI查找,跑得动吗?
回复

使用道具 举报

 楼主| 发表于 2006-8-3 12:53 | 显示全部楼层
楼上, Object obj=ic.lookup("HelloEJB")这个就是!
回复

使用道具 举报

发表于 2006-8-3 14:21 | 显示全部楼层
很奇怪。我客户端和你写一样就失败了。。。今晚回去看看。
回复

使用道具 举报

发表于 2006-8-3 16:28 | 显示全部楼层
按楼主的方法我试过了,是可以的!
楼上要细心,因为JSP的一点点错就可能有误差。
回复

使用道具 举报

发表于 2006-8-3 18:15 | 显示全部楼层
楼上的。。。你的ID把你出卖了。。。还楼主。。。晕。。。
回复

使用道具 举报

 楼主| 发表于 2006-8-9 19:37 | 显示全部楼层
书上的例子还有两个文件分别是:HelloLocal.java HelloLocalHome.java 。开始我觉得很奇怪,这两个文件怎么没有用到的呢?原来本地调用才要用的,所以我修改了下程序,完成第二个 HelloWorld。
首先,HelloBean.java这个文件可以完全不变,但是为了区别,我把 sayHello() 改了一点public String sayHello(){return "HelloLocal EJB!";}

HelloLocal.java

  1. package powerwind;
  2. public interface HelloLocal extends javax.ejb.EJBLocalObject
  3. {
  4.         public String sayHello();
  5. }
复制代码


HelloLocalHome.java

  1. package powerwind;
  2. public interface HelloLocalHome extends javax.ejb.EJBLocalHome
  3. {
  4.         public HelloLocal create() throws javax.ejb.CreateException;
  5. }
复制代码


那个用于测试的JSP文件,把 try 语句里改成这样

  1.                                           InitialContext ic=new InitialContext();
  2.                 HelloLocalHome home=(HelloLocalHome)ic.lookup("java:/comp/env/HelloEJB");
  3.                 HelloLocal helloLocal=home.create();
  4.                 message=helloLocal.sayHello();
复制代码

----------------------------------------------------------------------------------------------------------------
配置文件也要作相应更改。
ejb-jar.xml

  1. <ejb-jar>
  2. <description>HelloEJB,my first ejb program</description>
  3. <display-name>HelloEJB</display-name>
  4.         <enterprise-beans>
  5.                 <session>
  6.                         <ejb-name>HelloEJB</ejb-name>
  7.                         <local-home>powerwind.HelloLocalHome</local-home>
  8.                         <local>powerwind.HelloLocal</local>
  9.                         <ejb-class>powerwind.HelloBean</ejb-class>
  10.                         <session-type>Stateless</session-type>
  11.                         <transaction-type>Bean</transaction-type>
  12.                 </session>
  13.         </enterprise-beans>
  14. </ejb-jar>
复制代码

web.xml

  1. <web-app>
  2.         <ejb-local-ref>
  3.                 <ejb-ref-name>HelloEJB</ejb-ref-name>
  4.                 <ejb-ref-type>Session</ejb-ref-type>
  5.                 <local-home>powerwind.HelloLocalHome</local-home>
  6.                 <local>powerwind.HelloLocal</local>
  7.                 <ejb-link>HelloEJB</ejb-link>
  8.         </ejb-local-ref>
  9. </web-app>
复制代码

jboss-web.xml

  1. <jboss-web>
  2.         <ejb-local-ref>
  3.                 <ejb-ref-name>HelloEJB</ejb-ref-name>
  4.                 <jndi-name>HelloEJB</jndi-name>
  5.                 <ejb-link>HelloEJB</ejb-link>
  6.         </ejb-local-ref>
  7. </jboss-web>
复制代码

剩下工作和第一个 HelloWorld 一样。
这样,第二个 HelloWorld 诞生了。

PS:
HelloLocalHome home=(HelloLocalHome)ic.lookup("java:/comp/env/HelloEJB");若改成 HelloLocalHome home=(HelloLocalHome)ic.lookup("HelloEJB");,我发现运行错误。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-4 12:15

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表