由于在最近的项目中需要用到EJB2.0,所以花了一段时间去研究这项技术;以前接触过EJB3.0,但是在学习的过程中这两者之间有很大的差别,大部分都是访问远程接口,在编写访问远程接口的代码时,而且以前是在JBoss上部署的,相对比较简单,在网上也有很多相关的例子;在写代码的过程中发现访问本地接口时相对比较复杂(配置比较复杂,代码基本都一样,就是客户端访问的时候不一样);在此跟大家分享下weblogic部署EJB2.0 实现本地接口的SessionBean的一些学习经验,希望对大家有用。因为访问本地接口的客户端需要跟接口部署在一起(运行在同一个虚拟机里),所以在这里我将建立一个web应用,在部署时用Ant打包部署。
关键点:需要把整个工程打包成一个ear包,在ear包中需要包含web模块和ejb模块。
1、weblogic的安装和配置
2、建立一个Web工程,编写local接口,源代码如下:
HelloWorldLocal.java
package cn.com.servyou.ejb.session.local;
import javax.ejb.EJBLocalObject;
public interface HelloWorldLocal extends EJBLocalObject {
public String sayHello(String name) ;
}
3、编写home接口:源代码如下:
HelloWorldLocalHome.java
package cn.com.servyou.ejb.session.local;
import javax.ejb.CreateException;
import javax.ejb.EJBLocalHome;
//实现ejblocalhome接口
public interface HelloWorldLocalHome extends EJBLocalHome {
public HelloWorldLocal create() throws CreateException;
}
4、编写Sessionbean,源代码如下:
SecondSessionBean.java
package cn.com.servyou.ejb.session.local;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class SecondSessionBean implements SessionBean {
public void ejbActivate() throws EJBException, RemoteException {
}
public void ejbPassivate() throws EJBException, RemoteException {
}
public void ejbRemove() throws EJBException, RemoteException {
}
public void setSessionContext(SessionContext arg0) throws EJBException, RemoteException {
}
public void ejbCreate() {
}
public String sayHello(String name) {
return name+ ",你好";
}
}
以上3步不做解释,根据不同的逻辑,实现也不同。
4、配置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 id="ejb-jar_ID">
<enterprise-beans>
<session>
<ejb-name>HelloWorld</ejb-name>
<local-home>cn.com.servyou.ejb.session.local.HelloWorldLocalHome</local-home>
<local>cn.com.servyou.ejb.session.local.HelloWorldLocal</local>
<ejb-class>cn.com.servyou.ejb.session.local.SecondSessionBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>
5、配置weblogic-ejb-jar.xml
<?xml version="1.0"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN"
"http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd">
<weblogic-ejb-jar>
<weblogic-enterprise-bean>
<ejb-name>HelloWorld</ejb-name>
<jndi-name>HelloWorldName</jndi-name>
<local-jndi-name>HelloWorldNameTest</local-jndi-name>
</weblogic-enterprise-bean>
</weblogic-ejb-jar>
6、这一步是相当重要的一步,配置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-local-ref>
<description>xxx</description>
<ejb-ref-name>ejb/HelloWorldNameTest</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>cn.com.servyou.ejb.session.local.HelloWorldLocalHome</local-home>
<local>cn.com.servyou.ejb.session.local.HelloWorldLocal</local>
<ejb-link>HelloWorld</ejb-link>//此处是本地接口的配置中的ejb-name相对应的名字
</ejb-local-ref>
</web-app>
7、编写客户端访问代码:
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
<%@ page import="java.util.Properties" %>
<%@ page import="javax.naming.Context" %>
<%@ page import="javax.naming.InitialContext"%>
<%@ page import="cn.com.servyou.ejb.session.local.HelloWorldLocal" %>
<%@ page import="cn.com.servyou.ejb.session.local.HelloWorldLocalHome" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<%
try {
//Properties properties = new Properties();
//properties.put(Context.INITIAL_CONTEXT_FACTORY,
// "weblogic.jndi.WLInitialContextFactory");
//properties.put(Context.PROVIDER_URL, "t3://localhost:7001");
Context ctx = new InitialContext();
HelloWorldLocalHome obj = (HelloWorldLocalHome) ctx
.lookup("java:comp/env/ejb/HelloWorldNameTest");//此处对应的是web.xml中的ejb-ref-name的配置
HelloWorldLocal local = obj.create();
System.out.println(local.sayHello("ak47"));
} catch (Exception ee) {
ee.printStackTrace();
}
%>
</head>
<body>
This is my JSP page. <br>
</body>
</html>
8、在web项目的webroot的meta-inf目录下创建一个application.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC '-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN' 'http://java.sun.com/dtd/application_1_3.dtd'>
<application>
<display-name>ejb2.0</display-name>
<description></description>
<module>
<web>
<web-uri>sessionbean.war</web-uri>//此处是打包web模块的名称
<context-root>ejb2.0</context-root>//访问的根路径
</web>
</module>
<module>
<ejb>sessionbean.jar</ejb>//此处是打包web模块的名称
</module>
</application>
9、打包和部署,利用ant打包和部署:
build.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="ejb" default="deploy" basedir="..">
<property name="app.dir" value="${basedir}/ejb"/>
<property name="src.dir" value="${app.dir}/src"/>
<property name="weblogic.home" location="D:\bea\weblogic81"/>
<property name="wls.username" value="weblogic"/>
<property name="wls.password" value="12345678"/>
<property name="wls.hostname" value="localhost"/>
<property name="wls.port" value="7001"/>
<property name="wls.server.name" value="myserver"/>
<property name="build.dir" value="${app.dir}/build"/>
<property name="build.classes.dir" value="${build.dir}/classes"/>
<property name="build.classes.metainf" value="${build.classes.dir}/META-INF"/>
<path id="build.classpath">
<fileset dir="${weblogic.home}/server/lib">
<include name="weblogic.jar"/>
</fileset>
<pathelement location="${build.classes.dir}"/>
</path>
<taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy"
classpathref="build.classpath"/>
<target name="prepare" depends="clean">
<mkdir dir="${build.dir}"/>
<mkdir dir="${build.classes.dir}"/>
<mkdir dir="${build.classes.metainf}"/>
</target>
<target name="compile" depends="prepare">
<javac srcdir="${src.dir}" destdir="${build.classes.dir}" debug="on" deprecation="on"
optimize="off" includes="cn/**">
<classpath refid="build.classpath"/>
</javac>
<copy todir="${build.classes.metainf}">
<fileset dir="${app.dir}/WebRoot/META-INF">
<exclude name="application.xml"/>
</fileset>
</copy>
</target>
<target name="ear" depends="compile">
<jar jarfile="${app.dir}\sessionbean.jar">
<fileset dir="${build.classes.dir}">
<include name="**/*.*"/>
</fileset>
</jar>
<war warfile="${app.dir}/sessionbean.war" webxml="${app.dir}/WebRoot/WEB-INF/web.xml">
<fileset dir="${app.dir}/WebRoot">
<include name="*.*"/>
</fileset>
</war>
<ear earfile="${app.dir}/sessionbean.ear" appxml="${app.dir}/WebRoot/META-INF/application.xml">
<fileset dir="${app.dir}">
<include name="sessionbean.jar"/>
<include name="sessionbean.war"/>
</fileset>
</ear>
<delete file="${app.dir}/sessionbean.jar"/>
<delete file="${app.dir}/sessionbean.war"/>
</target>
<target name="deploy" depends="undeploy,ear">
<wldeploy action="deploy" name="sessionbean" source="${app.dir}/sessionbean.ear"
targets="${wls.server.name}" user="${wls.username}" password="${wls.password}"
adminurl="t3://${wls.hostname}:${wls.port}"
debug="true" verbose="true" failonerror="true"/>
<echo message="可以通过http://${wls.hostname}:${wls.port}/sessionbean/调用EJB"/>
</target>
<target name="undeploy" >
<wldeploy action="undeploy" name="sessionbean" source="${app.dir}/sessionbean.ear"
targets="${wls.server.name}" user="${wls.username}" password="${wls.password}"
adminurl="t3://${wls.hostname}:${wls.port}"
debug="false" verbose="false" failonerror="false"/>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
</project>
注意在运行build.xml的时候,需要启动weblogic,weblogic的一些属性,根据自己机器上的配置进行修改。
然后就可以用http://localhost:7001/ejb2.0/index.jsp进行访问了。