EJB3.0框架实例----区分有状态bean和无状态bean

1.通过这个例子可以区分,有状态bean和无状态bean中的数据会不会混淆;
2.一种取巧的做法是:在建立的客户端的工程上右键,选择build path--->把服


务端的EJB工程导入的,新建立的java客户端里面
3.正规的工作时候,还是需要在相应的接口类中打包,然后把打包好的.jar文件


放到,新建的java project客户端工程里的目录下的;
4.异常:
Need to specify class name in environment or system property, or


as an applet parameter, or in an application resource file:


java.naming.factory.initial
原因:
1.没有写入jndi.properties.
2.Need to specify class name in environment or system property. 的


意思就是找不到你的EJB环境变量. 换句话说就是你的客户在使用lookup


的时候. context没有设置对.
3.Need to specify class name in environment or system property, or


as an applet parameter, or in an application resource file:


java.naming.factory.initial
网上搜了半天,都是说配置不对,但我使用的是代码InitialContext


ctx=new InitialContext(props);的方式,不存在jndi配置文件不对的问


题,最后想起之前一个教程里的一句命名空间的话,于是登录jboss控制


台,找到部署的ejb,前面一个java提醒鸟我,将代码里lookup中参数前


面加上java:,搞定。

public class EjbClient {
public static void main(String[] args) {
Properties props=new Properties();
props.setProperty


("java.naming.factroy.initial","org.jnp.interfaces.NamingContextFact


ory");
props.setProperty


("java.naming.provider.url","localhost:1099");//或者


jnp://localhost...也可
props.setProperty("java.naming.factory.url.pkgs",


"org.jboss.naming:org.jnp.interfaces");//此行必须有
try{
InitialContext ctx=new InitialContext(props);
HelloWorld helloworld=(HelloWorld)ctx.lookup


("java:HelloWorldBean/remote");//前面的java是关键
System.out.println(helloworld.sayHello("jack"));
}catch(NamingException e){
System.out.println("error:"+e.getMessage());
}
}
}
-----------------------------------------------------------------
5.注意:如果不想用jndi.properties也可以这样:
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,


"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
p.put(Context.PROVIDER_URL, "tcp://localhost:61616");
p.put(Context.SECURITY_PRINCIPAL, "system");
p.put(Context.SECURITY_CREDENTIALS, "manager");
p.put("connectionFactoryNames", "topicCF");
p.put("topic.topic1", "jms.topic1");
InitialContext ctx=new InitialContext(p);
-----------------------------------------------------------
1.Exception in thread "main" javax.naming.NameNotFoundException:


StatelessEjbBean not bound
a.由于没有加入EJB的jar包;
b.EJB项目没有部署
------------------------------------------------------------
EJB3.0框架实例:
项目作用:通过这个例子可以区分,有状态bean和无状态bean中的数据会不会混


淆;
1.建立服务端EJB3.0项目:EJBTest_02
在:com.credream.ejb下:
StatefulEjb.java
package com.credream.ejb;
public interface StatefulEjb {
public void compute(int i);
public int getResult();
}
------------------------------------------
StatefulEjbBean.java
package com.credream.ejb;


import javax.ejb.Remote;
import javax.ejb.Stateful;


@Stateful
@Remote
public class StatefulEjbBean implements StatefulEjb {
private int state;
public void compute(int i) {
state=state+i;
}
public int getResult() {
return state;
}


}
------------------------------------------------------------
StatelessEjb.java
package com.credream.ejb;


public interface StatelessEjb {
public void compute(int i);
public int getResult();
}
-------------------------------------------
StatelessEjbBean.java
package com.credream.ejb;


import javax.ejb.Remote;
import javax.ejb.Stateless;


@Stateless
@Remote
public class StatelessEjbBean implements StatelessEjb {
private int state;
public void compute(int i) {
state=state+i;
}
public int getResult() {
return state;
}
}
-------------------------------------------------------------------
2.建立客户端JAVAproject:EJBTest02_client
建立jndi.properties文件
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
3.导入EJB的jar包;
4.com.credream.ejb下coding
StatefulEjbClient.java
package com.credream.ejb;


import javax.naming.InitialContext;


public class StatefulEjbClient {


/**
* @param args
*/
public static void main(String[] args)throws Exception {
InitialContext context = new InitialContext();
//第一次会话
StatefulEjb ejb1=(StatefulEjb)context.lookup


("StatefulEjbBean/remote");
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());


//第二次会话
StatefulEjb ejb2=(StatefulEjb) context.lookup


("StatefulEjbBean/remote");
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
}
}
-------------------------------------------------------------------
StatelessEjbClient.java
package com.credream.ejb;


import javax.naming.InitialContext;
import javax.naming.NamingException;


public class StatelessEjbClient {


/**
* @param args
*/
public static void main(String[] args)throws Exception {
InitialContext context = new InitialContext();
//第一次会话
StatelessEjb ejb1=(StatelessEjb)context.lookup


("StatelessEjbBean/remote");
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());
ejb1.compute(1);
System.out.println(ejb1.getResult());

//第二次会话
StatelessEjb ejb2=(StatelessEjb) context.lookup


("StatelessEjbBean/remote");
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
ejb2.compute(1);
System.out.println(ejb2.getResult());
//虽然是去的同一个服务端的对象,但是每次的客户端调用 的服务端的对


象都是不同的
System.out.println("ejb1==ejb2"+(ejb1==ejb2));
}
}
--------------------------------------------------------------------



你可能感兴趣的:(bean)