powerwind 发表于 2006-8-3 00:51

[HelloWorld] Jboss下第一个EJB程序

看《精通EJB》(第三版)这本书到第十章的时候我还在写 HelloWorld 程序。书上第三章说:本书建议开发者能够动手将HelloWorld组件编译,并且运行起来。我现在终于做到了。

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

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

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

HelloBean.java
package powerwind;
public class HelloBean implements javax.ejb.SessionBean
{
        private javax.ejb.SessionContext ctx;
        public void ejbCreate(){}
        public void ejbRemove(){}
        public void ejbActivate(){}
        public void ejbPassivate(){}
        public void setSessionContext(javax.ejb.SessionContext ctx)
        {
                this.ctx=ctx;
        }
        public String sayHello()
        {
                return "Hello EJB!";
        }
}

使用JSP文件调用EJB组件。
<%@ page contentType="text/html;charset=GBK" %>
<%@ page import="powerwind.*,javax.ejb.*,javax.naming.*,javax.rmi.*" %>
<html>
<body>
<%
        String message=null;
try{
                InitialContext ic=new InitialContext();
                Object obj=ic.lookup("HelloEJB");
                HelloHome home=(HelloHome)PortableRemoteObject.narrow(obj,powerwind.HelloHome.class);
                Hello hello=home.create();
                message=hello.sayHello();
        }catch(Exception e){
                e.printStackTrace();
        }
%>
<h1><%=message%></h1>
</body>
</html>

(未完)

[ 本帖最后由 powerwind 于 2006-8-3 00:52 编辑 ]

powerwind 发表于 2006-8-3 10:12

部署文件

先在当前目录新建两个文件夹,分别为 META-INF 和 WEB-INF ,其中META-INF 下有三个文件:ejb-jar.xml、jboss.xml 和 application.xml ,WEB-INF 下有 jboss-web.xml 和 web.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>HelloEJB,my first ejb program</description>
<display-name>HelloEJB</display-name>
        <enterprise-beans>
                <session>
                        <ejb-name>HelloEJB</ejb-name>
                        <home>powerwind.HelloHome</home>
                        <remote>powerwind.Hello</remote>
                        <ejb-class>powerwind.HelloBean</ejb-class>
                        <session-type>Stateless</session-type>
                        <transaction-type>Container</transaction-type>
                </session>
        </enterprise-beans>
</ejb-jar>


jboss.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss>
        <enterprise-beans>
                <session>
                        <ejb-name>HelloEJB</ejb-name>
                        <jndi-name>HelloEJB</jndi-name>
                </session>
        </enterprise-beans>
</jboss>


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

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>
<web-app>
        <ejb-ref>
                <ejb-ref-name>HelloEJB</ejb-ref-name>
                <ejb-ref-type>Session</ejb-ref-type>
                <home>powerwind.HelloHome</home>
                <remote>powerwind.Hello</remote>
        </ejb-ref>
</web-app>


jboss-web.xml

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
        <ejb-ref>
                <ejb-ref-name>HelloEJB</ejb-ref-name>
                <jndi-name>HelloEJB</jndi-name>
        </ejb-ref>
</jboss-web>


application.xml

<?xml version="1.0" encoding="UTF-8"?>
<application>
<display-name>HelloEJB J2EE Application</display-name>
        <module>
                <web>
                        <web-uri>HelloEJB.war</web-uri>
                        <context-root>/HelloEJB</context-root>
                </web>
        </module>
        <module>
                <ejb>HelloEJB.jar</ejb>
        </module>
</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 编辑 ]

wool王 发表于 2006-8-3 12:50

楼主的程序没有用JNDI查找,跑得动吗?

powerwind 发表于 2006-8-3 12:53

楼上, Object obj=ic.lookup("HelloEJB")这个就是!

wool王 发表于 2006-8-3 14:21

很奇怪。我客户端和你写一样就失败了。。。今晚回去看看。

MJOfPowerwind 发表于 2006-8-3 16:28

按楼主的方法我试过了,是可以的!
楼上要细心,因为JSP的一点点错就可能有误差。

wool王 发表于 2006-8-3 18:15

楼上的。。。你的ID把你出卖了。。。还楼主。。。晕。。。

powerwind 发表于 2006-8-9 19:37

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

HelloLocal.java

package powerwind;
public interface HelloLocal extends javax.ejb.EJBLocalObject
{
        public String sayHello();
}


HelloLocalHome.java

package powerwind;
public interface HelloLocalHome extends javax.ejb.EJBLocalHome
{
        public HelloLocal create() throws javax.ejb.CreateException;
}

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

                                          InitialContext ic=new InitialContext();
                HelloLocalHome home=(HelloLocalHome)ic.lookup("java:/comp/env/HelloEJB");
                HelloLocal helloLocal=home.create();
                message=helloLocal.sayHello();

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

<ejb-jar>
<description>HelloEJB,my first ejb program</description>
<display-name>HelloEJB</display-name>
        <enterprise-beans>
                <session>
                        <ejb-name>HelloEJB</ejb-name>
                        <local-home>powerwind.HelloLocalHome</local-home>
                        <local>powerwind.HelloLocal</local>
                        <ejb-class>powerwind.HelloBean</ejb-class>
                        <session-type>Stateless</session-type>
                        <transaction-type>Bean</transaction-type>
                </session>
        </enterprise-beans>
</ejb-jar>

web.xml

<web-app>
        <ejb-local-ref>
                <ejb-ref-name>HelloEJB</ejb-ref-name>
                <ejb-ref-type>Session</ejb-ref-type>
                <local-home>powerwind.HelloLocalHome</local-home>
                <local>powerwind.HelloLocal</local>
                <ejb-link>HelloEJB</ejb-link>
        </ejb-local-ref>
</web-app>

jboss-web.xml

<jboss-web>
        <ejb-local-ref>
                <ejb-ref-name>HelloEJB</ejb-ref-name>
                <jndi-name>HelloEJB</jndi-name>
                <ejb-link>HelloEJB</ejb-link>
        </ejb-local-ref>
</jboss-web>

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

PS:
HelloLocalHome home=(HelloLocalHome)ic.lookup("java:/comp/env/HelloEJB");若改成 HelloLocalHome home=(HelloLocalHome)ic.lookup("HelloEJB");,我发现运行错误。
页: [1]
查看完整版本: [HelloWorld] Jboss下第一个EJB程序