首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

创办JNDI Binding

2012-10-31 
创建JNDI Binding开发J2EE程序时候,最让人头疼的莫过於各种各样的JNDI Binding,用得最多的一个类型要算Dat

创建JNDI Binding
开发J2EE程序时候,最让人头疼的莫过於各种各样的JNDI Binding,用得最多的一个类型要算DataSource,某些应用服务器上还有邮件服务、目录服务等等。

J2EE程序使用起来十分简单灵活,把服务器安装好然後把J2EE程序上传上去就可以了,比起PHP程序来要简单得多,但是在开发和测试时就要遇到各类名目繁多的概念和封装。一些非EJB项目,例如用Spring组织的项目,为了提高速度往往需要用一些静态变量,但是这些静态变量在程序装载和卸除时经常会出现一些奇怪的问题。

解决这些问题颇费周折,最好的方法莫过於把业务逻辑拿到应用服务器之外编写和测试,但是应用服务器一般都自带大量强大的JNDI资源,废弃不用的话产品会丢失不少卖点,将其模拟下来是最好的方法。一个项目甚至项目里的每个模块,在开发前期做好测试计划都是很有必要的,但这个话题太大了,这里写不了,我这里只写一些关於自己创建JNDI Binding的内容。

自己创建JNDI Binding需要建一大堆模型,至少需要InitialContextFactoryBuilder、InitialContextFactory和Context这三个,不可谓不复杂,但是其机制并不繁琐,只是想得周全一些罢了,例子代码如下:

package testjndi;import java.util.Hashtable;import javax.naming.Binding;import javax.naming.Context;import javax.naming.Name;import javax.naming.NameClassPair;import javax.naming.NameParser;import javax.naming.NamingEnumeration;import javax.naming.NamingException;import javax.naming.spi.InitialContextFactory;import javax.naming.spi.InitialContextFactoryBuilder;import javax.naming.spi.NamingManager;/** * * @author */public class CustomizedInitialContextFactoryBuilder            implements InitialContextFactoryBuilder {    public static void initialize() {        try {            // 覆盖原先的设置            NamingManager.setInitialContextFactoryBuilder(                new CustomizedInitialContextFactoryBuilder());        }catch(Exception e) {            e.printStackTrace(System.err);        }    }    public InitialContextFactory createInitialContextFactory                (Hashtable<?, ?> environment) throws NamingException {        return new MyCustomizedInitialContextFactory();    }        private class MyCustomizedInitialContextFactory            implements InitialContextFactory {        public Context getInitialContext(Hashtable<?, ?> environment)                throws NamingException {            CustomizedContext customizedContext                    = new CustomizedContext();            return customizedContext;        }    }    private class CustomizedContext implements Context {        public Object addToEnvironment(String propName, Object propVal)                throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void bind(Name name, Object obj) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void bind(String name, Object obj) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void close() throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public Name composeName(Name name, Name prefix) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public String composeName(String name, String prefix)                throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public Context createSubcontext(Name name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public Context createSubcontext(String name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void destroySubcontext(Name name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void destroySubcontext(String name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public Hashtable<?, ?> getEnvironment() throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public String getNameInNamespace() throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public NameParser getNameParser(Name name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public NameParser getNameParser(String name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public NamingEnumeration<NameClassPair> list(Name name)                throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public NamingEnumeration<NameClassPair> list(String name)                throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public NamingEnumeration<Binding> listBindings(Name name)                throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public NamingEnumeration<Binding> listBindings(String name)                throws NamingException {                        throw new UnsupportedOperationException("Not supported yet.");        }        public Object lookup(Name name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public Object lookup(String name) throws NamingException {            // 在这里将JNDI名帮定到实际的内容上            if (name == null) {                throw new NamingException("Name must not be null.");            }else if(name.equals("Key")) {                return "Value";            }else {                throw new NamingException("Name "" + name + "" not found.");            }        }        public Object lookupLink(Name name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public Object lookupLink(String name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void rebind(Name name, Object obj) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void rebind(String name, Object obj) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public Object removeFromEnvironment(String propName)                throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void rename(Name oldName, Name newName) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void rename(String oldName, String newName)                throws NamingException {                        throw new UnsupportedOperationException("Not supported yet.");        }        public void unbind(Name name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }        public void unbind(String name) throws NamingException {            throw new UnsupportedOperationException("Not supported yet.");        }    }}


最後用一段代码验证一下结果:

public class Main {    /**     * @param args the command line arguments     */    public static void main(String[] args) {        // 启动JNDI资源        CustomizedInitialContextFactoryBuilder.initialize();        try {            InitialContext initialContext = new InitialContext();            System.out.println(initialContext.lookup("Key"));        }catch(Exception e) {            e.printStackTrace(System.err);        }    }    }


打印出"Value",结果正确。

热点排行