先前是看了传智博客的EJB视频,然后又看了下《精通EJB3》都是用的注释方式,我本人不喜欢注释方式,所以就花了部分时间去查看了下有关注释方面的内容,最后终于将注释的改成了ejb-jar.xml配置文件方式。所做的大概有 有状态bean、无状态bean、会话bean、消息驱动bean、简单JPA操作几个方面。
环境:Jboss 5.1 Mysql 5.1 jdk1.6
今天就把我的第一个无状态bean先写下来,由于上班没时间。所以在附件里长传全部代码;
1、创建项目,建立好各个目录后,将JBOSS中的client里面jar引入进项目,配置好Jboss数据源
2、编写ant的build.xml文件,
<?xml version="1.0" encoding="UTF-8"?>
<!-- ======================================================================
2010-7-17 下午02:10:44
HelloBean
description
lyjBack
====================================================================== -->
<project name="EJB001" default="deploy" basedir=".">
<property name="src.dir" value="${basedir}\src" />
<property environment="env" />
<property name="jboss.home" value="${env.JBOSS_HOME}" />
<property name="jboss.server.config" value="default" />
<property name="build.dir" value="${basedir}\build" />
<path id="build.classpath">
<fileset dir="${jboss.home}\client">
<include name="*.jar" />
</fileset>
<pathelement path="${build.dir}" />
</path>
<target name="prepare">
<delete dir="${build.dir}" />
<mkdir dir="${build.dir}" />
</target>
<target name="compile" depends="prepare" description="编译">
<javac srcdir="${src.dir}" destdir="${build.dir}" classpathref="build.classpath">
</javac>
</target>
<target name="ejbjar" depends="compile" description="创建ejb包">
<jar jarfile="${basedir}\${ant.project.name}.jar">
<fileset dir="${build.dir}">
<include name="**/*.class" />
</fileset>
<metainf dir="${src.dir}\META-INF">
</metainf>
</jar>
</target>
<target name="deploy" depends="ejbjar" description="发布">
<copy file="${basedir}\${ant.project.name}.jar" todir="${jboss.home}\server\${jboss.server.config}\deploy" />
</target>
<target name="undeploy" description="卸载ejb">
<delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar" />
</target>
</project>
这里要注意的是:
1>build.xml中用到环境变量的一定在环境变量里面已经配置。
2>eclipse配置中,默认有集中提醒没选中,所以,得到eclipse配置ant配置中把problems的部分勾上。
3、编写bean接口
/**
*
*/
package com.lyj.ejb.stateless;
/**
* @author lyjBack
*
*/
public interface Hello {
public String hello(String name);
}
编写实现远程接口的bean
/**
*
*/
package com.lyj.ejb.stateless.impl;
import com.lyj.ejb.stateless.Hello;
//import javax.ejb.Local;
//import javax.ejb.Remote;
//import javax.ejb.Stateless;
/**
* @author lyjBack
*
*/
//@Stateless
//@Remote(Hello.class)
public class HelloBean implements Hello{
/* (non-Javadoc)
* @see com.lyj.ejb.stateless.Hello#hello()
*/
public String hello(String name) {
return name+"说:hello world";
}
}
其中注释部分我没删除,只是注释起来。
4、写ejb-jar.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"
version="3.0">
<enterprise-beans>
<!-- CountBean -->
<session>
<ejb-name>CountBean</ejb-name>
<business-remote>com.lyj.ejb.stateful.Count</business-remote>
<ejb-class>com.lyj.ejb.stateful.impl.CountBean</ejb-class>
<session-type>Stateful</session-type>
<remove-method>
<bean-method>
<method-name>remove</method-name>
</bean-method>
</remove-method>
<transaction-type>Container</transaction-type>
</session>
<!-- HelloBean -->
<session>
<ejb-name>HelloBean</ejb-name>
<business-local>com.lyj.ejb.stateless.HelloLocal</business-local>
<business-remote>com.lyj.ejb.stateless.Hello</business-remote>
<ejb-class>com.lyj.ejb.stateless.impl.HelloBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<!-- UserServiceBean -->
<session>
<ejb-name>UserServiceBean</ejb-name>
<business-remote>com.lyj.ejb.service.UserService</business-remote>
<ejb-class>com.lyj.ejb.service.impl.UserServiceBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<message-driven>
<ejb-name>LogBean</ejb-name>
<ejb-class>com.lyj.ejb.jms.queue.LogBean</ejb-class>
<transaction-type>Container</transaction-type>
<activation-config>
<activation-config-property>
<activation-config-property-name>destinationType</activation-config-property-name>
<activation-config-property-value>javax.jms.Queue</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>destination</activation-config-property-name>
<activation-config-property-value>queue/lyjQueue</activation-config-property-value>
</activation-config-property>
</activation-config>
<pre-destroy>
<lifecycle-callback-method>remove</lifecycle-callback-method>
</pre-destroy>
</message-driven>
<message-driven>
<ejb-name>LogBeanFirst</ejb-name>
<ejb-class>com.lyj.ejb.jms.topic.LogBeanFirst</ejb-class>
<transaction-type>Container</transaction-type>
<activation-config>
<activation-config-property>
<activation-config-property-name>destinationType</activation-config-property-name>
<activation-config-property-value>javax.jms.Topic</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>destination</activation-config-property-name>
<activation-config-property-value>topic/lyjTopic</activation-config-property-value>
</activation-config-property>
</activation-config>
<pre-destroy>
<lifecycle-callback-method>remove</lifecycle-callback-method>
</pre-destroy>
</message-driven>
<message-driven>
<ejb-name>LogBeanSecond</ejb-name>
<ejb-class>com.lyj.ejb.jms.topic.LogBeanSecond</ejb-class>
<transaction-type>Container</transaction-type>
<activation-config>
<activation-config-property>
<activation-config-property-name>destinationType</activation-config-property-name>
<activation-config-property-value>javax.jms.Topic</activation-config-property-value>
</activation-config-property>
<activation-config-property>
<activation-config-property-name>destination</activation-config-property-name>
<activation-config-property-value>topic/lyjTopic</activation-config-property-value>
</activation-config-property>
</activation-config>
<pre-destroy>
<lifecycle-callback-method>remove</lifecycle-callback-method>
</pre-destroy>
</message-driven>
</enterprise-beans>
<interceptors>
<description></description>
<interceptor>
<interceptor-class>com.lyj.ejb.stateful.CountCallbacks</interceptor-class>
<post-construct>
<lifecycle-callback-method>construct</lifecycle-callback-method>
</post-construct>
<pre-destroy>
<lifecycle-callback-method>destroy</lifecycle-callback-method>
</pre-destroy>
<post-activate>
<lifecycle-callback-method>activate</lifecycle-callback-method>
</post-activate>
<pre-passivate>
<lifecycle-callback-method>passivate</lifecycle-callback-method>
</pre-passivate>
</interceptor>
</interceptors>
<assembly-descriptor>
<interceptor-binding>
<ejb-name>CountBean</ejb-name>
<interceptor-class>com.lyj.ejb.stateful.CountCallbacks</interceptor-class>
</interceptor-binding>
</assembly-descriptor>
</ejb-jar>
由于所有的配置都在这
5、编写EJB客户测试类
/**
*
*/
package com.lyj.ejb.client;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.lyj.ejb.stateless.Hello;
/**
* @author lyjBack
*
*/
public class EJBClient {
/**
* @param args
* @throws NamingException
*/
public static void main(String[] args) throws NamingException {
Context ctx = new InitialContext();
Hello hello = (Hello) ctx.lookup("HelloBean/remote");
System.out.println(hello.hello("JAVA EE"));
}
}
6、编写EJB容器的jndi信息,如果是用Jboss5.1,那么就这样写
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
7、然后基本就完了,运行build.xml,然后启动Jboss。应该就能看到效果。
如果不想做第四步。那么就将代码中注释元数据的注释删除,应该就也能运行
分享到:
相关推荐
描述:“我自己做的第一个文档” 标签:“容器” 部分内容:本文档旨在深入探讨Spring轻量级容器与EJB重量级容器的区别,通过对这两个概念的剖析,帮助读者理解它们在企业级应用中的不同作用与优势。 一、容器的...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
《JavaWeb程序设计任务教程第2版》是一本深度探讨JavaWeb开发的教材,主要针对初学者和进阶者提供全面的知识覆盖。本教程通过详细解答课后习题,帮助读者深入理解JavaWeb编程的核心概念和技术。以下是相关知识点的...
总的来说,《Java程序设计》第一周的学习让我认识到Java的历史背景、版本发展及其在不同平台的应用。未来的学习中,我需要加强基础知识的巩固,提升编程实践能力,以更好地适应Java编程的需求。
2. 第一个字段区域“源文件夹”默认是项目的文件夹,保持默认值。 3. 在包字段区域输入 org.eclipseguide.hello。 4. 在类名字段区域输入 HelloWorld。 5. 在“Which Method Stubs Would You Like to Create?”区域...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该...
多人聊天+用户在线 21个目标文件 摘要:JAVA源码,媒体网络,山寨QQ,Java聊天程序 Java编写的山寨QQ,多人聊天+用户在线,程序分服务端和客户端,典型C/S结构, 当用户发送第一次请求的时候,验证用户登录,创建一个该...
# Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
当用户发送第一次请求的时候,验证用户登录,创建一个该qq号和服务器端保持通讯连接得线程,启动该通讯线程,通讯完毕,关闭Scoket。 QQ客户端登录界面,中部有三个JPanel,有一个叫选项卡窗口管理。还可以更新...
第18章J2EE规范和EJB组件模型,深入讨论了Java企业级应用的架构,包括EJB(Enterprise JavaBeans)的原理和使用,以及如何利用J2EE平台进行分布式系统的开发。 第10章线程和第11章GUI结合,可以理解多线程在GUI中的...
在本资源中,"我的j2EE成功之路源码第四章"显然是一份与学习和实践J2EE(Java 2 Platform, Enterprise Edition)相关的代码集合。J2EE是Java平台的一个版本,专为开发和部署企业级应用程序而设计,如Web应用、分布式...
在IT行业中,J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个重要组成部分,专为构建企业级分布式应用程序而设计。这个压缩包“我的j2ee成功之路源代码_20.zip”显然包含了作者在学习或实践中积累的...
3. **继承**:一个类继承另一个类后,可以重用父类的方法和字段,并且还可以定义自己的方法和字段。 4. **多态**:允许子类对象对父类对象进行替换的能力。多态性是通过接口实现或继承实现的。 #### 五、异常处理 ...
在J2EE的世界里,第四章通常涵盖的关键概念和知识点是相当广泛的,它可能涉及到诸如Servlet、...通过深入学习"我的J2EE成功之路"的第四章,你可以对J2EE开发有一个全面而深入的认识,为后续的项目实践打下坚实的基础。
"1"可能代表第一部分或第一章,"ex6"可能是指第六个练习或实验,"33"、"55"和"2"可能是其他练习或主题的编号。如果它们是源代码文件,那么可能包含了实现J2EE特定功能的示例代码。 在J2EE的学习中,可能会涉及以下...
"我的j2ee成功之路源码第十章"是一个学习资源,可能是一个教程或者一本电子书的章节,其中包含了关于J2EE开发的实例代码。这一章的焦点可能集中在特定的J2EE技术或概念上,旨在帮助开发者通过实践加深理解。 在J2EE...