A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

META-INF下:
persistence.xml:
Xml代码  [url=][/url]

  • <?xml version="1.0" encoding="UTF-8"?>  
  • <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  •     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  •     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"  
  •     version="1.0">  
  •     <persistence-unit name="init-ds">  
  •         <!-- 数据源:server\default\deploy\datasources\visesbdb-ds.xml 中jndi-name为datasources/visesbdb -->  
  •         <jta-data-source>java:/datasources/visesbdb</jta-data-source>  
  •     </persistence-unit>  
  • </persistence>  

或:
Java代码  [url=][/url]

  • <?xml version="1.0" encoding="UTF-8"?>  
  • <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  •     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  •     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"  
  •     version="1.0">  
  •     <persistence-unit name="msgreceiver-ds">  
  •         <jta-data-source>java:/datasources/visesbdb</jta-data-source>  
  •         <jar-file>com.project.soa.lightesb.bean-2.2.0.jar</jar-file>  
  •         <properties>  
  •             <property name="hibernate.hbm2ddl.auto" value="none" />  
  •             <property name="hibernate.show_sql" value="false" />  
  •             <property name="hibernate.format_sql" value="false" />  
  •         </properties>  
  •     </persistence-unit>  
  • </persistence>  

  或:
Java代码  [url=][/url]

  • <persistence xmlns="http://java.sun.com/xml/ns/persistence"  
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  • xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"  
  • version="1.0">  
  •    
  • <persistence-unit name="jboss-eb" transaction-type="JTA">  
  •   <jta-data-source>java:/MSSQLDS</jta-data-source>  
  •   <class>org.tibetjungle.javaeee.beginner.ejb.eb.Book</class>  
  • </persistence-unit>  
  •   
  • </persistence>  



会话bean

无状态会话bean
  平常,我们使用最多的是无状态bean,因为它的bean实例可供多个用户使用,所以它的性能比有状态bean高.正因为一个bean实例被多个用户使用.那么,前一个用户设置的值有可能被后一个用户所修改,所以它无法正确保存某个用户设置的值,因此是无状态的.

有状态会话bean

有状态bean平常使用的并不多,因为它的一个bean实例只供一个用户使用,所以性能开销比较大,正因为它的实例只被一个用户使用, 用户为它设置的值是不会被其他用户修改,所以可以正确保存用户设置的值,因此是有状态的.


Session bean的客户端开发
Java代码  [url=][/url]

  • public static void main(String[] args) {  
  •     Properties props = new Properties();  
  •     props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");  
  •     props.setProperty("java.naming.provider.url", "localhost:1099");  
  •     try {  
  •         InitialContext ctx = new InitialContext(props);  
  •         HelloWorld helloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");  
  •         System.out.println(helloworld.sayHello("佛山"));  
  •     } catch (NamingException e) {  
  •         System.out.println(e.getMessage());  
  •     }  
  • }  



设置JNDI访问环境信息
在进行JNDI查找前,我们必须设置应用服务器的上下文信息,主要是设置JNDI驱动的类名(java.naming.factory.initial)和命名服务提供者的URL (java.naming.provider.url) 。

java.naming.factory.initial或Context.INITIAL_CONTEXT_FACTORY:
环境属性名,用于指定InitialContext工厂(或JNDI驱动),它类似于JDBC指定数据库驱动类。
因为本例子连接的是JbossNS(命名服务的实现者),所以使用Jboss提供的驱动类:org.jnp.interfaces.NamingContextFactory

java.naming.provider.url或Context.PROVIDER_URL:
         环境属性名,包含提供命名服务的主机地址和端口号。它类似于JDBC指定数据库的连接URL。连接到JbossNS的URL格式为:jnp://host:port,该URL的“jnp:”部分是指使用的协议,JBoss使用的是基于Socket/RMI的协议。host为主机的地址,port为JNDI服务的端口。除了host之外,其他部分都是可以不写的。

下面是数据库访问例子:
Java代码  [url=][/url]

  • Class.forName("org.gjt.mm.mysql.Driver").newInstance();  
  • Properties props = new Properties();  
  • props.put("user","root");  
  • props.put("password","123456");  
  • Connection conn =  DriverManager.getConnection("jdbc:mysql://localhost:3306/itcast",  props);  


如同数据库一样,根据访问命名服务器的不同,为上下文设置的驱动类和URL也是不同的,如下面是访问Sun应用服务器的上下文信息:
Java代码  [url=][/url]

  • Properties props = new Properties();  
  • props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");  
  • props.setProperty("java.naming.provider.url", "localhost:3700");  
  • InitialContext = new InitialContext(props);  
  • HelloWorld helloworld = (HelloWorld) ctx.lookup("com.foshanshop.ejb3.HelloWorld");  


如果客户端运行在应用服务器内,我们不需要为InitialContext设置应用服务器的上下文信息,也不建议设置。
因为应用服务器启动时会把JNDI驱动类等上下文信息添加进系统属性,创建InitialContext对象时如果没有指定Properties参数,InitialContext内部会调用System.getProperty()方法从系统属性里获取必要的上下文信息。对本例子而言,你可以省略传入props参数,之所以给InitialContext设置参数,目的是引出相关知识点,便于教学。在实际应用中,如果给InitialContext设置了参数,反而会带来不可移植的问题。

注:创建InitialContext对象时如果没有指定Properties参数,InitialContext还会在classpath下寻找jndi.properties文件,并从该文件中加载应用服务器的上下文信息。这样避免了硬编码为InitialContext设置Properties参数。

jndi.properties的配置如下:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces



Jboss默认生成的JNDI 名称
当EJB发布到Jboss 时,如果我们没有为它指定全局JNDI名称或修改过其默认EJB名称,Jboss就会按照默认的命名规则为EJB生成全局JNDI名称,默认的命名规则如下:

如果把EJB作为模块打包进后缀为*.ear的JAVA EE企业应用文件,默认的全局JNDI名称是
本地接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/local
远程接口:EAR-FILE-BASE-NAME/EJB-CLASS-NAME/remote
       EAR-FILE-BASE-NAME为ear文件的名称,EJB-CLASS-NAME为EJB的非限定类名。
例:把HelloWorld应用作为EJB模块打包进名为HelloWorld.ear的企业应用文件,它的远程接口的JNDI 名称是:HelloWorld/HelloWorldBean/remote

如果把EJB应用打包成后缀为*.jar的模块文件,默认的全局JNDI名称是
本地接口:EJB-CLASS-NAME/local
远程接口:EJB-CLASS-NAME/remote
例:把HelloWorld应用打包成HelloWorld.jar文件,它的远程接口的JNDI名称是:HelloWorldBean/remote


使用注释改变Session Bean的JNDI 名称

如果我们没有指定EJB的JNDI名称,当EJB发布到应用服务器时,应用服务器会按默认规则为EJB生成全局JNDI名称。当我们需要自定义JNDI名称时,可以这样做
如果EJB在Jboss中使用,可以使用Jboss提供的 @LocalBinding 和 @RemoteBinding 注释,@LocalBinding注释指定Session Bean的Local接口的JNDI名称,@RemoteBinding注释指定Session Bean的Remote接口的JNDI名称,如下:
Java代码  [url=][/url]

  • @Stateless  
  • @Remote ({Operation.class})  
  • @RemoteBinding (jndiBinding="foshanshop/RemoteOperation")  
  • @Local ({LocalOperation.class})  
  • @LocalBinding (jndiBinding="foshanshop/LocalOperation")  
  • public class OperationBean implements Operation, LocalOperation {  
  •   
  • }  






0 个回复

您需要登录后才可以回帖 登录 | 加入黑马