[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 编辑 ]
部署文件
先在当前目录新建两个文件夹,分别为 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 编辑 ] 楼主的程序没有用JNDI查找,跑得动吗? 楼上, Object obj=ic.lookup("HelloEJB")这个就是! 很奇怪。我客户端和你写一样就失败了。。。今晚回去看看。 按楼主的方法我试过了,是可以的!
楼上要细心,因为JSP的一点点错就可能有误差。 楼上的。。。你的ID把你出卖了。。。还楼主。。。晕。。。 书上的例子还有两个文件分别是: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]