我是新来的Java EE。 目前我打算通过Java EE 6教程,第1卷(基本概念测试版)由Sun Microsystems。 为了摆脱单调的阅读我不时有几个Java EE的项目/别人写代码玩。
我来自东南。 我的头还是有一些SE。 在SE( 两层应用程序)我用
DATABASE_URL = "jdbc:mysql://something.db_server.com/db_name"
这是我的客户怎么知道哪里是数据库服务器。
在一个Java EE的例子中,我看到了
// Access JNDI Initial Context.
Properties p = new Properties();
p.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
p.put("java.naming.provider.url","jnp://localhost:1099");
p.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");
InitialContext ctx = new InitialContext(p);
// Change jndi name according to your server and ejb
HelloRemote remote = (HelloRemote) ctx.lookup("HelloBean/remote");
msg = "Message From EJB --> " + remote.sayHello();
这个我明白。 该代码有URL和端口号。 有这条线
p.put("java.naming.provider.url","jnp://localhost:1099");
客户端知道哪里是由URL和端口敲服务器。 我认为,在代码的Java EE 5的时间写的。
今天,我已经发现,其中的Netbeans 7,Java EE 6的,和GlassFish 3用于另一示例。 客户端代码
@EJB
private static MySessionRemote mySession;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
JOptionPane.showMessageDialog(null,
"result = " + mySession.getResult());
}
这里是链接http://netbeans.org/kb/docs/javaee/entappclient.html
没有URL和端口号中给出。
由David R. Heffelfinger Java EE 6的开发使用Netbeans 7在第7章有类似的例子笔者没有说明它是如何在这本书完成。 我认为他已经做到了,但我可能错过了...
我的问题是客户端如何找到服务器,而无需网址是什么? 难道是这些XML文件中的一个声明? 客户可以在加州和GlassFish Server可以在纽约。 任何人都可以向我解释,或指向任何补习/博客/文章在哪里可以找到答案?
谢谢。
有两件事情是怎么回事。
的第一件事是,在获得对远程EJB参考的方式并不在Java EE中指定。 你是在一个单独的供应商是如何认为它应该做的摆布。
虽然JNDI是用于这种事实上的标准,即使这本身就不是强制性的。
例如:JBoss的截至AS7
在JBoss AS中截止到AS 7,下面的序列用于获得远程引用:
Properties env = new Properties();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
env.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
env.put(Context.PROVIDER_URL, "jnp://myserver.example.com:1099");
InitialContext context = new InitialContext(env);
Bean bean = (Bean) context.lookup("myear/MyBean/remote");
在此,远程服务器的URL被提供给初始上下文,从上下文一个bean被检索。 (请注意,你不能添加众所周知的“java:/”前缀在这里,否则将通过JNDI被拦截和就地解决,尽管做了查找上的远程上下文)
由于这种方法是如所提到的不规范,一个供应商可以改变它完全实现的版本之间。 即使对于相同的Java EE版本实现。
例如:JBoss的AS7
在JBoss AS中7时,JBoss想从JNDI移开(因为它没有指定JNDI必须使用),现在大约发生在下列方式 :
首先,您需要把一个jboss-ejb-client.properties
文件与以下上下文类路径:
endpoint.name = client-endpoint
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED = false
remote.connections = default
remote.connection.default.host = myserver.example.com
remote.connection.default.port = 4447
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS = false
并使用代码如下所示:
Properties env = new Properties();
env.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
InitialContext context = new InitialContext(env);
Bean bean = (Bean) context.lookup("ejb:/myear/mymodule/MyBean!com.example.Bean");
因此,从它的代码看起来像没有给定URL,但它是静态隐藏在配置文件中。
应用程序客户端容器
今天,我已经发现,其中的Netbeans 7,Java EE 6的,和GlassFish 3用于另一示例。 客户端代码[...]
这又是另一回事。 什么是证明存在一个所谓的应用程序客户端容器 (又名ACC)。
这是从上面的例子中,其中Java SE应用程序使用JNDI联系远程服务器不同。 该应用程序客户端容器是有点在Java EE中一个不起眼的事情。 这个想法似乎是从服务器(如一个applet或Java Web Start的应用程序)动态下载的客户端代码,它奇迹般地然后“知道”它起源而来。 没有为(静态)注射在主类,你可以用它来直接注入远程豆的支持非常有限。
应用客户端容器是从Java EE的初期而且据我所知从未得到重视的想法。 毕竟这些年来从未其初始受孕后多少进展。 由于它仍然需要一吨的供应商具体的事情要做,我想大多数人不打扰它,只是使用JNDI。
有将需要一个jndi.properties
在它的配置数据文件。 客户端无法神奇地知道要连接的服务器,即使它需要连接到同一台主机与客户机上运行的服务器 - 仍然可以是多个。
这个例子是很奇怪虽然 - EJB注释将表明它应该在Java EE容器中运行,而不是作为一个客户端应用程序。
我还想指出,在客户端应用程序调用EJB的是不是真的那么常见; 它更多的是服务端技术。 如果你希望提供给客户端应用程序通过JAX-RS它更容易和更便携的使用例如REST风格的Web服务的接口。