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;
publicinterface Hello extends EJBObject {
public String sayHello() throws RemoteException;
}
HelloHome.java
package powerwind;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
publicinterface 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;
publicclass HelloBean implements SessionBean {
private SessionContext context;
publicvoid ejbCreate() throws EJBException, RemoteException {
}
publicvoid ejbActivate() throws EJBException, RemoteException {
}
publicvoid ejbPassivate() throws EJBException, RemoteException {
}
publicvoid ejbRemove() throws EJBException, RemoteException {
}
publicvoid 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;
publicclass ClientServlet extends HttpServlet {
publicvoid 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();
}
publicvoid 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”,就是成功了。
查看本文来源