EJB的名声很不好,尤其在Spring框架出现以后,而EJB3似乎脱胎换骨了。而我现在学习的仍然是EJB2,原因是EJB3的书很难找。暑假时大概把《精通EJB》和《EJB》这两本书看过一下,现在想复习,加深理解,就从第一个HelloWorld开始。
文件结构:
E:.
│ build.xml
│
└─src
├─META-INF
│ application.xml
│ ejb-jar.xml
│ jboss.xml
│
├─powerwind
│ ClientServlet.java
│ Hello.java
│ HelloBean.java
│ HelloHome.java
│
└─WEB-INF
jboss-web.xml
web.xml
ant文件
build.xml
<?
xml
version
=
"1.0"
?>
<
project
name
=
"Hello"
default
=
"prepare"
basedir
=
"."
>
<
property
environment
=
"env"
/>
<
property
name
=
"src.dir"
value
=
"${basedir}/src"
/>
<
property
name
=
"jboss.home"
value
=
"${env.JBOSS_HOME}"
/>
<
property
name
=
"build.dir"
value
=
"${basedir}/build"
/>
<
property
name
=
"classes.dir"
value
=
"${build.dir}/classes"
/>
<
property
name
=
"dist.dir"
value
=
"${basedir}/dist"
/>
<
path
id
=
"compile.classpath"
>
<
pathelement
location
=
"${classes.dir}"
/>
<
fileset
dir
=
"${jboss.home}/client"
>
<
include
name
=
"jboss-j2ee.jar"
/>
<
include
name
=
"javax.servlet.jar"
/>
<
include
name
=
"commons-httpclient.jar"
/>
</
fileset
>
</
path
>
<
target
name
=
"prepare"
>
<
mkdir
dir
=
"${classes.dir}"
/>
<
mkdir
dir
=
"${dist.dir}"
/>
<
copy
todir
=
"${build.dir}"
>
<
fileset
dir
=
"${src.dir}"
>
<
include
name
=
"WEB-INF/*.xml"
/>
<
include
name
=
"META-INF/*.xml"
/>
</
fileset
>
</
copy
>
</
target
>
<
target
name
=
"clean"
>
<
delete
dir
=
"${build.dir}"
/>
<
delete
dir
=
"${dist.dir}"
/>
</
target
>
<
target
name
=
"compile"
depends
=
"prepare"
>
<
javac
srcdir
=
"${src.dir}"
destdir
=
"${classes.dir}"
>
<
classpath
refid
=
"compile.classpath"
/>
</
javac
>
</
target
>
<
target
name
=
"jar"
depends
=
"compile"
>
<
jar
destfile
=
"${dist.dir}/HelloEJB.jar"
>
<
fileset
dir
=
"${build.dir}"
>
<
exclude
name
=
"META-INF/application.xml"
/>
<
include
name
=
"META-INF/*.xml"
/>
</
fileset
>
<
fileset
dir
=
"${classes.dir}"
>
<
include
name
=
"**/*.class"
/>
</
fileset
>
</
jar
>
</
target
>
<
target
name
=
"war"
depends
=
"jar"
>
<
jar
destfile
=
"${dist.dir}/HelloEJB.war"
>
<
fileset
dir
=
"${build.dir}"
>
<
include
name
=
"WEB-INF/*.xml"
/>
</
fileset
>
</
jar
>
</
target
>
<
target
name
=
"ear"
depends
=
"war"
>
<
jar
destfile
=
"${dist.dir}/HelloEJB.ear"
>
<
fileset
dir
=
"${dist.dir}"
>
<
include
name
=
"HelloEJB.jar"
/>
<
include
name
=
"HelloEJB.war"
/>
</
fileset
>
<
fileset
dir
=
"${build.dir}"
>
<
include
name
=
"META-INF/application.xml"
/>
</
fileset
>
</
jar
>
</
target
>
<
target
name
=
"deploy"
depends
=
"ear"
>
<
copy
file
=
"${dist.dir}/HelloEJB.ear"
overwrite
=
"true"
todir
=
"${jboss.home}/server/default/deploy"
/>
</
target
>
</
project
>
java源文件
Hello.java
package
powerwind;
import
java.rmi.RemoteException;
import
javax.ejb.EJBObject;
public
interface
Hello
extends
EJBObject {
public
String sayHello()
throws
RemoteException;
}
HelloHome.java
package
powerwind;
import
java.rmi.RemoteException;
import
javax.ejb.CreateException;
import
javax.ejb.EJBHome;
public
interface
HelloHome
extends
EJBHome {
public
Hello create()
throws
RemoteException, CreateException;
}
HelloBean.java
package
powerwind;
import
java.rmi.RemoteException;
import
javax.ejb.EJBException;
import
javax.ejb.SessionBean;
import
javax.ejb.SessionContext;
public
class
HelloBean
implements
SessionBean {
private
SessionContext
context
;
public
void
ejbCreate()
throws
EJBException, RemoteException {
}
public
void
ejbActivate()
throws
EJBException, RemoteException {
}
public
void
ejbPassivate()
throws
EJBException, RemoteException {
}
public
void
ejbRemove()
throws
EJBException, RemoteException {
}
public
void
setSessionContext(SessionContext newContext)
throws
EJBException {
context
= newContext;
}
public
String sayHello()
throws
EJBException {
return
"Hello from ejb"
;
}
}
用于测试的Servlet
ClientServlet.java
package
powerwind;
import
java.io.IOException;
import
java.io.PrintWriter;
import
javax.naming.InitialContext;
import
javax.rmi.PortableRemoteObject;
import
javax.servlet.ServletException;
import
javax.servlet.http.HttpServlet;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
public
class
ClientServlet
extends
HttpServlet {
public
void
doGet(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
response.setContentType(
"text/html"
);
PrintWriter out = response.getWriter();
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();
}
out.println(message);
out.flush();
out.close();
}
public
void
doPost(HttpServletRequest request, HttpServletResponse response)
throws
ServletException, IOException {
doGet(request, response);
}
}
配置文件:
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-jar
<?
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
>
application.xml
<?
xml
version
=
"1.0"
?>
<
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
>
jboss-web.xml
<?
xml
version
=
"1.0"
?>
<
jboss-web
>
<
ejb-ref
>
<
ejb-ref-name
>
HelloEJB
</
ejb-ref-name
>
<
jndi-name
>
HelloEJB
</
jndi-name
>
</
ejb-ref
>
</
jboss-web
>
web.xml
<?
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
>
ClientServlet
</
servlet-name
>
<
servlet-class
>
powerwind.ClientServlet
</
servlet-class
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
ClientServlet
</
servlet-name
>
<
url-pattern
>
/ClientServlet
</
url-pattern
>
</
servlet-mapping
>
<
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
>
输入
ant –deploy 部署,启动Jboss服务器,在浏览器地址栏输入:
http://localhost:8080/HelloEJB/ClientServlet
然后看到浏览器输出“
Hello from ejb”,就是成功了。