一、无状态会话BEAN
搞了几年JAVA了,最近由于完全不懂EJB技术,被取笑了!我怒而学之.
以下为自己保留的代码,大部分抄袭网上的,只为自己保留,望看客一笑而过!
关键字一:DOMAIN域
为WEBLOGIC管理应用的机制.用WEBLOGIC自带的Configuration Wizard工具生成,根据功能不同能创建不同的工作域.
关键字二:部署
Eclipse+MyEclipse提供了比较强大的部署功能,这里忽略先.
具体代码如下:
package com.ejb;
import java.rmi.RemoteException;
import javax.ejb.EJBException;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
/**
* XDoclet-based session bean. The class must be declared
* public according to the EJB specification.
*
* To generate the EJB related files to this EJB:
* - Add Standard EJB module to XDoclet project properties
* - Customize XDoclet configuration for your appserver
* - Run XDoclet
*
* Below are the xdoclet-related tags needed for this EJB.
*
* @ejb.bean name="HelloWorld"
* display-name="Name for HelloWorld"
* description="Description for HelloWorld"
* jndi-name="ejb/HelloWorld"
* type="Stateless"
* view-type="remote"
*/
public class HelloWorld implements SessionBean {
/** The session context */
private SessionContext context;
private String message = "helloworld!";
public HelloWorld() {
// TODO Auto-generated constructor stub
}
public void ejbActivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbPassivate() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
public void ejbRemove() throws EJBException, RemoteException {
// TODO Auto-generated method stub
}
/**
* Set the associated session context. The container calls this method
* after the instance creation.
*
* The enterprise bean instance should store the reference to the context
* object in an instance variable.
*
* This method is called with no transaction context.
*
* @throws EJBException Thrown if method fails due to system-level error.
*/
public void setSessionContext(SessionContext newContext)
throws EJBException {
context = newContext;
}
/**
* 自己新创建的业务方法
**/
public String getMessage()throws EJBException
{
return this.message;
//return new String("helloworld!");
}
///////////////////////////////////////////////////////////////////////////////////分割线///////////////////////////////////////////////////////////////////////////
/*
* Generated by XDoclet - Do not edit!
*/
package com.ejb;
/**
* Session layer for HelloWorld.
* @xdoclet-generated at ${TODAY}
* @copyright The XDoclet Team
* @author XDoclet
* @version ${version}
*/
public class HelloWorldSession
extends com.ejb.HelloWorld
implements javax.ejb.SessionBean
{
public void ejbActivate() throws javax.ejb.EJBException, java.rmi.RemoteException
{
super.ejbActivate();
}
public void ejbPassivate() throws javax.ejb.EJBException, java.rmi.RemoteException
{
super.ejbPassivate();
}
public void setSessionContext(javax.ejb.SessionContext ctx) throws javax.ejb.EJBException
{
super.setSessionContext(ctx);
}
public void unsetSessionContext()
{
}
public void ejbRemove() throws javax.ejb.EJBException, java.rmi.RemoteException
{
super.ejbRemove();
}
public void ejbCreate() throws javax.ejb.CreateException
{
}
}
//////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////
/*
* Generated by XDoclet - Do not edit!
*/
package com.interfaces;
import javax.ejb.EJBException;
import java.rmi.*;
/**
* Remote interface for HelloWorld.
* @xdoclet-generated at ${TODAY}
* @copyright The XDoclet Team
* @author XDoclet
* @version ${version}
*/
public interface HelloWorld
extends javax.ejb.EJBObject
{
/**
* An example business method
* @throws EJBException Thrown if method fails due to system-level error. */
/*public void replaceWithRealBusinessMethod( )
throws java.rmi.RemoteException;*/
public String getMessage()throws EJBException,RemoteException;
}
//////////////////////////////////////////////////////////////////////////////分割线/////////////////////////////////////////////////////////////////////////////
/*
* Generated by XDoclet - Do not edit!
*/
package com.interfaces;
/**
* Home interface for HelloWorld.
* @xdoclet-generated at ${TODAY}
* @copyright The XDoclet Team
* @author XDoclet
* @version ${version}
*/
public interface HelloWorldHome
extends javax.ejb.EJBHome
{
public static final String COMP_NAME="java:comp/env/ejb/HelloWorld";
public static final String JNDI_NAME="ejb/HelloWorld";
public com.interfaces.HelloWorld create()
throws javax.ejb.CreateException,java.rmi.RemoteException;
}
/////////////////////////////////////////////////////////////////////////////分割线/////////////////////////////////////////////////////////////////////////////
/*
* Generated file - Do not edit!
*/
package com.interfaces;
/**
* Utility class for HelloWorld.
* @xdoclet-generated at ${TODAY}
* @copyright The XDoclet Team
* @author XDoclet
* @version ${version}
*/
public class HelloWorldUtil
{
/** Cached remote home (EJBHome). Uses lazy loading to obtain its value (loaded by getHome() methods). */
private static com.interfaces.HelloWorldHome cachedRemoteHome = null;
private static Object lookupHome(java.util.Hashtable environment, String jndiName, Class narrowTo) throws javax.naming.NamingException {
// Obtain initial context
javax.naming.InitialContext initialContext = new javax.naming.InitialContext(environment);
try {
Object objRef = initialContext.lookup(jndiName);
// only narrow if necessary
if (java.rmi.Remote.class.isAssignableFrom(narrowTo))
return javax.rmi.PortableRemoteObject.narrow(objRef, narrowTo);
else
return objRef;
} finally {
initialContext.close();
}
}
// Home interface lookup methods
/**
* Obtain remote home interface from default initial context
* @return Home interface for HelloWorld. Lookup using COMP_NAME
*/
public static com.interfaces.HelloWorldHome getHome() throws javax.naming.NamingException
{
if (cachedRemoteHome == null) {
cachedRemoteHome = (com.interfaces.HelloWorldHome) lookupHome(null, com.interfaces.HelloWorldHome.COMP_NAME, com.interfaces.HelloWorldHome.class);
}
return cachedRemoteHome;
}
/**
* Obtain remote home interface from parameterised initial context
* @param environment Parameters to use for creating initial context
* @return Home interface for HelloWorld. Lookup using COMP_NAME
*/
public static com.interfaces.HelloWorldHome getHome( java.util.Hashtable environment ) throws javax.naming.NamingException
{
return (com.interfaces.HelloWorldHome) lookupHome(environment, com.interfaces.HelloWorldHome.COMP_NAME, com.interfaces.HelloWorldHome.class);
}
/** Cached per JVM server IP. */
private static String hexServerIP = null;
// initialise the secure random instance
private static final java.security.SecureRandom seeder = new java.security.SecureRandom();
/**
* A 32 byte GUID generator (Globally Unique ID). These artificial keys SHOULD <strong>NOT </strong> be seen by the user,
* not even touched by the DBA but with very rare exceptions, just manipulated by the database and the programs.
*
* Usage: Add an id field (type java.lang.String) to your EJB, and add setId(XXXUtil.generateGUID(this)); to the ejbCreate method.
*/
public static final String generateGUID(Object o) {
StringBuffer tmpBuffer = new StringBuffer(16);
if (hexServerIP == null) {
java.net.InetAddress localInetAddress = null;
try {
// get the inet address
localInetAddress = java.net.InetAddress.getLocalHost();
}
catch (java.net.UnknownHostException uhe) {
System.err.println("HelloWorldUtil: Could not get the local IP address using InetAddress.getLocalHost()!");
// todo: find better way to get around this...
uhe.printStackTrace();
return null;
}
byte serverIP[] = localInetAddress.getAddress();
hexServerIP = hexFormat(getInt(serverIP), 8);
}
String hashcode = hexFormat(System.identityHashCode(o), 8);
tmpBuffer.append(hexServerIP);
tmpBuffer.append(hashcode);
long timeNow = System.currentTimeMillis();
int timeLow = (int)timeNow & 0xFFFFFFFF;
int node = seeder.nextInt();
StringBuffer guid = new StringBuffer(32);
guid.append(hexFormat(timeLow, 8));
guid.append(tmpBuffer.toString());
guid.append(hexFormat(node, 8));
return guid.toString();
}
private static int getInt(byte bytes[]) {
int i = 0;
int j = 24;
for (int k = 0; j >= 0; k++) {
int l = bytes[k] & 0xff;
i += l << j;
j -= 8;
}
return i;
}
private static String hexFormat(int i, int j) {
String s = Integer.toHexString(i);
return padHex(s, j) + s;
}
private static String padHex(String s, int i) {
StringBuffer tmpBuffer = new StringBuffer();
if (s.length() < i) {
for (int j = 0; j < i - s.length(); j++) {
tmpBuffer.append('0');
}
}
return tmpBuffer.toString();
}
}
////////////////////////////////////////////////////////////////////////////////////////分割线///////////////////////////////////////////////////////////////////
配置文件如下:
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><![CDATA[No Description.]]></description>
<display-name>Generated by XDoclet</display-name>
<enterprise-beans>
<!-- Session Beans -->
<session >
<description><![CDATA[Description for HelloWorld]]></description>
<display-name>Name for HelloWorld</display-name>
<ejb-name>HelloWorld</ejb-name>
<home>com.interfaces.HelloWorldHome</home>
<remote>com.interfaces.HelloWorld</remote>
<ejb-class>com.ejb.HelloWorldSession</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
<!--
To add session beans that you have deployment descriptor info for, add
a file to your XDoclet merge directory called session-beans.xml that contains
the <session></session> markup for those beans.
-->
<!-- Entity Beans -->
<!--
To add entity beans that you have deployment descriptor info for, add
a file to your XDoclet merge directory called entity-beans.xml that contains
the <entity></entity> markup for those beans.
-->
<!-- Message Driven Beans -->
<!--
To add message driven beans that you have deployment descriptor info for, add
a file to your XDoclet merge directory called message-driven-beans.xml that contains
the <message-driven></message-driven> markup for those beans.
-->
</enterprise-beans>
<!-- Relationships -->
<!-- Assembly Descriptor -->
<!--
To specify your own assembly descriptor info here, add a file to your
XDoclet merge directory called assembly-descriptor.xml that contains
the <assembly-descriptor></assembly-descriptor> markup.
-->
<assembly-descriptor >
<!--
To specify additional security-role elements, add a file in the merge
directory called ejb-security-roles.xml that contains them.
-->
<!-- method permissions -->
<!--
To specify additional method-permission elements, add a file in the merge
directory called ejb-method-permissions.ent that contains them.
-->
<!-- transactions -->
<!--
To specify additional container-transaction elements, add a file in the merge
directory called ejb-container-transactions.ent that contains them.
-->
<!-- finder transactions -->
<!-- message destinations -->
<!--
To specify additional message-destination elements, add a file in the merge
directory called ejb-message-destinations.ent that contains them.
-->
<!-- exclude list -->
<!--
To specify an exclude-list element, add a file in the merge directory
called ejb-exclude-list.xml that contains it.
-->
</assembly-descriptor>
</ejb-jar>
//////////////////////////////////////////////////////////////////////////////分割线///////////////////////////////////////////////////////////////////////////
weblogic-ejb-jar.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE weblogic-ejb-jar PUBLIC "-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN" "http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd">
<weblogic-ejb-jar>
<description><![CDATA[Generated by XDoclet]]></description>
<weblogic-enterprise-bean>
<ejb-name>HelloWorld</ejb-name>
<stateless-session-descriptor>
</stateless-session-descriptor>
<reference-descriptor>
</reference-descriptor>
<jndi-name>ejb/HelloWorld</jndi-name>
</weblogic-enterprise-bean>
<!--
To add enterprise beans that you have deployment descriptor info for, add
a file to your XDoclet merge directory called weblogic-enterprise-beans.xml that contains
the <weblogic-enterprise-bean></weblogic-enterprise-bean> markup for those beans.
-->
<!--
To add a security-role-assignment section, add
a file to your XDoclet merge directory called weblogic-security-role-assignment.xml that contains
the <security-role-assignment></security-role-assignment> markup.
-->
<!--
To add a run-as-role-assignment section, add
a file to your XDoclet merge directory called weblogic-run-as-role-assignment.xml that contains
the <run-as-role-assignment></run-as-role-assignment> markup.
-->
</weblogic-ejb-jar>
////////////////////////////////////////////////////////////////////////分割线///////////////////////////////////////////////////////////////////////////////////
打成JIA包部署到WEBLOGIC服务器。
最后是调用代码:
package com;
import java.rmi.RemoteException;
import java.util.Properties;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import com.interfaces.HelloWorld;
import com.interfaces.HelloWorldHome;
import javax.rmi.PortableRemoteObject;
public class EJBTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
// TODO 自动生成方法存根
Properties properties=new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
properties.setProperty(Context.PROVIDER_URL,"t3://localhost:7001");
Context context;
try {
context = new InitialContext(properties);
HelloWorldHome hwh=(HelloWorldHome)context.lookup("ejb/HelloWorld");
HelloWorld hw=hwh.create();
String s=hw.getMessage();
System.out.println(s);
} catch (NamingException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (RemoteException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (CreateException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
/*Properties properties=new Properties();
properties.setProperty(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory");
properties.setProperty(Context.PROVIDER_URL,"t3://localhost:7001");
Context context = new InitialContext(properties);
Object obj = context.lookup("ejb/HelloWorld");
HelloWorldHome home = (HelloWorldHome)PortableRemoteObject.narrow(obj,HelloWorldHome.class );
HelloWorld hello = home.create();
System.out.println(hello.getMessage());*/
}
}
部署EJB
1.
MyEclipse >Add and Remove Project Deployments
2.
点击
add
,添加部署服务器
weblogic
。
虽然能使用了,但还是有很多地方不太明白。慢慢进步咯!
看过三国志的朋友都知道一句名言:万事具备,只欠东风.
最近在学习SPRING框架的时候对此又有了深层的理解.
最近开发一个几百人的大项目,由于某些因素,不能使用开源框架.我们开发人员商议,准备顺应潮流,使用SPRING框架的某些设计思想来完成工作.
由于大家都没有几百人一起工作的项目经验,所以开始阶段是痛苦而没有成效的.特别在商议相互调用的接口时,简直成了讨价还价的菜市场(每个人的想法,水平,及设计能力的差异).~_~!!!
百无聊赖中,跑去开三国(你们吵你们的吧,我休息先),看到诸葛亮借东风一节,突然灵机一动,这不就是SPRING框架的IOC思想么??我先万事具备再说,只欠东风就OK!想到这里,心中窃喜,于是将需要的接口数据整理出来写了个XML文档,并用DTD定义,直接扔给调用我的家伙,想用我的接口么??我就要这些数据,你看着办吧~~!
于是不管他渴求的表情,自己工作去也.那个心里爽啊~
下面是一些模拟代码,希望能有用:
/*定义依赖注入的数据接口*/
public interface IOCINTERFACE
{
//只定义一个验证方法,验证DTD定义的数据
public boolean validate();
}
////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////
/**/
class IOCObject implement IOCINTERFACE
{
//需要注入的数据
private String username;
public void setUsername(String username)
{
this.username = username;
}
public String getUsername()
{
return this.username ;
}
//验证一下是否是我要的数据
public boolean validate()
{
if(this.username = null)
{
return false;
}
return true;
}
}
////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////
/*再定义一个执行接口*/
public interface OPERATION
{
public void execute();
}
////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////
class Test implement OPERATION
{
//定义操作对象
private IOCObject obj;
public void Test( IOCObject obj)
{
this.obj = obj;
}
public void execute()
{
if(this.obj.validate)
{
//处理业务逻辑
System.out.println(this.obj.getUsername+"hello!");
}
else
{
//异常日志
System.out.println("MB~~~给的什么数据啊~~我叼!")
}
}
}
////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////
/*万事具备了,借东风吧!*/
public class Main
{
public static void main(String[]args)
{
//做个东风先
IOCObject obj = new IOCObject ();
obj .setUsername("KenIT");
//依赖注入了,高兴啊!
Test test = new Test(ob);
//完成工作,打完收功
test.execute();
}
}
////////////////////////////////////////////////////////////////////////////////分割线////////////////////////////////////////////////////////////////////////////////////////
回想来发现IOC就是我们的诸葛老前辈发明的,居然.....,我强烈呼吁收版权税.
中华民族万岁~~~!