用JBoss部署一个EJB,并构建一个客户端应用程序来运用它。
by Budi Kurniawan
很多人在开始学习Enterprise JavaBeans(EJB)时,在编译第一个enterprise bean以及在所选择的J2EE服务器上部署它时常常会遇到问题。首先,与其它J2EE 技术相比较,EJB的学习曲线是很陡的。第二,在编写一个enterprise bean时, 你必须处理许多文件。许多有关EJB的书籍的作者在他们的书的前几章都狂热地谈论这种技术,但是很少有人教你如何让你的第一个EJB运行。作为技术引导性文章,本文主要是讲述如何开发一个简单的EJB并用JBoss部署它,而不是探讨EJB的规范和技术。用其它J2EE服务器进行部署的过程是同样的,只是有些微小的变化。EJB是J2EE中的主要技术之一。你可能已经读到很多有关这个令人兴奋的技术的文章了, 现在可能正准备采取下个步骤:开发一个真正的EJB并在一个EJB容器中运行它。通过本文,你将学习到如何开发一个EJB、部署它、并构建一个客户端应用程序来运用它。本文运用的这个EJB很简单:叫做StringProcessor,它唯一的功能就是将一个字符串转换成大写。即,输入“ejb”,StringProcessor就会将它转换成“EJB”。本文的重点是讲述整个开发过程,所以我打算尽量地使代码简单。你可以通过这个小程序来证明我们要讲的概念。要开发和部署一个EJB应用程序,必须经历四个步骤: 1. 为你的bean编写类。
2. 编写部署描述符。
3. 创建一个部署文件。
4. 部署bean。 另外,我还将讲述如何构建一个客户端应用程序,因此你可以看到你的bean是如何运行的。 我将一步步地讲述。让我们以本文的例子为例, 首先建一个名为workplace的目录,作为你的工作区(workspace)。 你可以将你的bean classes放在com.javapro.ejb包中,所以你需要为源文件和Java类建几个目录(见图1)。在做完这些后,目录将会包含10个文件(见图2)。现在将注意力转移到构建你的EJB所需的步骤上。
by Budi Kurniawan
很多人在开始学习Enterprise JavaBeans(EJB)时,在编译第一个enterprise bean以及在所选择的J2EE服务器上部署它时常常会遇到问题。首先,与其它J2EE 技术相比较,EJB的学习曲线是很陡的。第二,在编写一个enterprise bean时, 你必须处理许多文件。许多有关EJB的书籍的作者在他们的书的前几章都狂热地谈论这种技术,但是很少有人教你如何让你的第一个EJB运行。作为技术引导性文章,本文主要是讲述如何开发一个简单的EJB并用JBoss部署它,而不是探讨EJB的规范和技术。用其它J2EE服务器进行部署的过程是同样的,只是有些微小的变化。EJB是J2EE中的主要技术之一。你可能已经读到很多有关这个令人兴奋的技术的文章了, 现在可能正准备采取下个步骤:开发一个真正的EJB并在一个EJB容器中运行它。通过本文,你将学习到如何开发一个EJB、部署它、并构建一个客户端应用程序来运用它。本文运用的这个EJB很简单:叫做StringProcessor,它唯一的功能就是将一个字符串转换成大写。即,输入“ejb”,StringProcessor就会将它转换成“EJB”。本文的重点是讲述整个开发过程,所以我打算尽量地使代码简单。你可以通过这个小程序来证明我们要讲的概念。要开发和部署一个EJB应用程序,必须经历四个步骤: 1. 为你的bean编写类。
2. 编写部署描述符。
3. 创建一个部署文件。
4. 部署bean。 另外,我还将讲述如何构建一个客户端应用程序,因此你可以看到你的bean是如何运行的。 我将一步步地讲述。让我们以本文的例子为例, 首先建一个名为workplace的目录,作为你的工作区(workspace)。 你可以将你的bean classes放在com.javapro.ejb包中,所以你需要为源文件和Java类建几个目录(见图1)。在做完这些后,目录将会包含10个文件(见图2)。现在将注意力转移到构建你的EJB所需的步骤上。
解决方案 »
- myeclipse中如何配置使maven项目可以正常发布到tomcat中
- java从入门到精通要看那些书籍,各位高手来说说
- hiberante 更新操作的问题
- 最近开发EJB3消息驱动BEAN时遇到了一个这样的问题 Exception in thread "main" javax.naming.CommunicationException 网上似乎没有看到这样的问题 就在某个地方看到一哈 但给出的解决方法??
- 求一个判断
- SOAPException ,在线等!急!
- hibernate中用middlegen产生映射文件时字段数据类型怎么不能随数据库更新呢?在线等,急!!!
- j2ee系统的硬件系统,软件系统该用什么?
- 配置data source
- jtable 获取值问题
- WEBLOGIC新手:如何设置连接池中的URL,NAME,DRIVER Classname之类的属性
- 江湖救急!网络书籍怎么选?还是继续《JAVA狠心技术卷2》?
正如你所知道的,一个enterprise bean最少由三个类构成(见列表1、2和3)。你应该在workplace/com/javapro/ejb目录中保存这些文件。编译源文件时,应该执行下面这些步骤。(假设你已经将javac.exe包含在你的“path”环境变量中了。注意这里的路径是针对Windows的。如果你在Linux/Unix中,应该对它做相应的修改。这不会是个大问题。)列表1. StringProcessor.java 文件 package com.javapro.ejb;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface StringProcessor extends EJBObject {
public String toUpperCase(String s) throws RemoteException;
}列表2. StringProcessorHome.java 文件 package com.javapro.ejb;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface StringProcessorHome extends EJBHome {
StringProcessor create() throws RemoteException, CreateException;
}列表3. StringProcessorBean.java 文件package com.javapro.ejb;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
public class StringProcessorBean implements SessionBean {
public String toUpperCase(String s) {
System.out.println("from StringProcessorBean");
if (s==null)
return null;
else
return s.toUpperCase();
}
public void ejbCreate() {}
public void ejbRemove() {}
public void ejbActivate() {}
public void ejbPassivate() {}
public void setSessionContext(SessionContext sc) {}
}
一个EJB应用程序的部署描述符采用的名字是ejb-jar.xml(见列表4)。即,它是个XML文件。你必须将这个文件保存到workplace/META-INF目录中。
列表4. ejb-jar.xml 文件<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar>
<description>Your first EJB application </description>
<display-name>String Processor Application</display-name>
<enterprise-beans>
<session>
<ejb-name>StringProcessor</ejb-name>
<home>com.javapro.ejb.StringProcessorHome</home>
<remote>com.javapro.ejb.StringProcessor</remote>
<ejb-class>com.javapro.ejb.StringProcessorBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Bean</transaction-type>
</session>
</enterprise-beans>
</ejb-jar>部署你的Bean
编写客户端应用程序 编译并运行
列表5. Client.java import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import java.util.Properties;
import com.javapro.ejb.StringProcessor;
import com.javapro.ejb.StringProcessorHome;public class Client { public static void main(String[] args) { // first argument must be the input
if (args.length==0) {
System.out.println("Please specify the input to convert to upper case.");
return;
}
String input = args[0]; // preparing properties for constructing an InitialContext object
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
properties.put(Context.PROVIDER_URL, "localhost:1099"); try {
// Get an initial context
InitialContext jndiContext = new InitialContext(properties);
System.out.println("Got context"); // Get a reference to the Bean
Object ref = jndiContext.lookup("StringProcessor");
System.out.println("Got reference"); // Get a reference from this to the Bean's Home interface
StringProcessorHome home = (StringProcessorHome)
PortableRemoteObject.narrow (ref, StringProcessorHome.class); // Create an Adder object from the Home interface
StringProcessor sp = home.create();
System.out.println ("Uppercase of '" + input + "' is " +
sp.toUpperCase(input));
}
catch(Exception e) {
System.out.println(e.toString());
}
}
}
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import java.util.*;
public class HSAreaInfoClient {
private s_HSAreaInfoHome s_HSAreaInfoHomeObject = null; //Construct the EJB test client
public HSAreaInfoClient() {
try {
//get naming context
Context ctx = getJBossInitialContext(); //look up jndi name
Object ref = ctx.lookup("s_HSAreaInfo"); //cast to Home interface
s_HSAreaInfoHomeObject = (s_HSAreaInfoHome) PortableRemoteObject.narrow(ref, s_HSAreaInfoHome.class);
}
catch(Exception e) {
e.printStackTrace();
}
}
public boolean createClient(){
try{
Context ctx = getJBossInitialContext();
Object ref = ctx.lookup("s_HSAreaInfo");
s_HSAreaInfoHomeObject = (s_HSAreaInfoHome) PortableRemoteObject.narrow(ref, s_HSAreaInfoHome.class);
return true;
}catch(Exception ex){
return false;
}
}
private javax.naming.Context getJBossInitialContext() throws NamingException {
java.util.Hashtable JNDIParm = new java.util.Hashtable();
JNDIParm.put(Context.PROVIDER_URL, "localhost:1099");
JNDIParm.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
return new InitialContext(JNDIParm);
}
//----------------------------------------------------------------------------
// Utility Methods
//---------------------------------------------------------------------------- public s_HSAreaInfoHome getHome() {
return s_HSAreaInfoHomeObject;
}
public java.util.Collection getUserName(){
try{
s_HSAreaInfo areainfo = getAreaInfoInstance();
Collection c = areainfo.getUserName();
if(c.size()>0){
return c;
}else{
return null;
}
}catch(Exception ex){
ex.printStackTrace();
//System.err.println("error:"+ex.toString());
return null;
}
}
private s_HSAreaInfo getAreaInfoInstance(){
try{
s_HSAreaInfo areainfo = (s_HSAreaInfo)PortableRemoteObject.narrow(
s_HSAreaInfoHomeObject.create(),s_HSAreaInfo.class);
return areainfo;
}catch(Exception ex){
System.err.println(ex.toString());
return null;
}
}
}在页面中调用如下:
......
<jsp:useBean id="callClient" scope="page" class="com.hisense.search.HSAreaInfoClient" />
......
if(callClient.createClient()){
Collection c = callClient.getUserName();
对不起了,mayafree。
我给你200分吧,呵呵
http://expert.csdn.net/Expert/topic/2488/2488023.xml?temp=.4195215