Java命名和目录接口JNDI开发EJB的问题。

The_east_key 2002-06-07 10:04:05
以下为完整程序,请共同探讨。建议jb6
现总是出现问题,不能顺利执行ls命令。请帮忙。
------------------------------------------------------------
package browser;

/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2002</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/
import javax.naming.*;
import java.io.*;
import java.util.*;
import java.rmi.*;

public class Browser extends Exception
{
public static void main(String[] args)
{ try
{
Browser bb = new Browser();
bb.browse();
// new Browser().browse();
}
catch(Exception e)
{ e.printStackTrace();
}
}
//初始上下文
protected Context ctx;
//当我们进入目录树的时候,JNDI命名对象用来跟踪我们所在的当前上下文。
protected Name currName;
//我们使用NameParser来为我们生成命名对象。NameParser知道如何使用专有服务技术语义来创建一个命名。
//如文件系统服务技术的“c:\winnt”,或者LDAP服务技术的“cn=Ed Roman,ou=Perple,o=Airius.com”
protected NameParser parser;
public Browser() throws Exception
{
//创建初始上下文,系统特性里提供参数
ctx = new InitialContext(System.getProperties());
//从服务技术里获得Nameparser
parser = ctx.getNameParser("");
System.out.println("parser is :" + parser);
//使用NameParser创建目录结构中我们所处的最初位置。因为NameParser是服务技术的特性,导致命名对象被设计成特定目录的语法。
currName = parser.parse("");
System.out.println("currName is :::"+currName+":::");
System.out.println("first step is ok!");
}

//调用它来开始浏览文件系统目录结构。这个方法并不十分重要。它只是和用户相互作用。
public void browse()
{
//从标准输入中读入输入的信息
String line = null,command = null,args = null;
StringTokenizer tokens = null;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (true)
{
//及时打印,读取下一行输入,并获取命令
try
{
System.out.println("system start!");
System.out.println("currName is :"+ currName);
System.out.println(currName+">");
line = reader.readLine();
System.out.println();
tokens = new StringTokenizer(line,"",false);
//获取命令,如“cd..”中的“cd”
command = tokens.nextToken();
//获取变量,如“cd..”中的..
if (tokens.hasMoreElements())
{
args = line.substring(command.length()+1,line.length());
}
}
catch(Exception e)
{
continue;
}
//根据命令进行事件分析,调用相应的JNDI功能。
try
{
if (command.equals("ls"))
{
ls();
}
else if (command.equals("mv"))
{
//计算出用户想要更改的上下文命名(mv)
String oldStr = null,newStr = null;
try
{
StringTokenizer argtokens = new StringTokenizer(args,"",false);
oldStr = argtokens.nextToken();
newStr = argtokens.nextToken();
}
catch(Exception e)
{
throw new Exception("syntax:mv<old context><new context>");
}
mv(oldStr,newStr);
}
else if (command.equals("cd"))
{
cd(args);
}
else if (command.equals("mkdir"))
{
mkdir(args);
}
else if (command.equals("rmdir"))
{
rmdir(args);
}
else if (command.equals("cat"))
{
cat(args);
}
else if (command.equals("quit"))
{
System.exit(0);
}
else
{
System.out.println("Syntax:[ls|mv|cd|mkdir|rmdir|cat|quit][args...]");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}

//列举当前上下文(文件夹)的内容
private void ls() throws Exception
{
//get an enmueration of names bound to this context
NamingEnumeration e = ctx.list(currName);
//each enumeration element is a NameClasPair.
//Print the Name part.
while (e.hasMore())
{
NameClassPair p = (NameClassPair)e.next();
System.out.println(p.getName());
}
}
//进入目录结构
private void cd(String newLoc) throws Exception
{
if (newLoc == null)
{
throw new Exception("You must speciy a folder");
}
//如果用户想要进入一个错误的文件夹时,保存以前的命名。
Name oldName = (Name)currName.clone();
try
{
//如果用户输入“cd..”,通过从命名中删除最后的元素弹出一个目录。
if (newLoc.equals(".."))
{
if (currName.size()>0)
{
currName.remove(currName.size()-1);
}
else
{
System.out.println("Already at top level.");
}
}
//另外,用户输入“cd<folder>”,进入更深一层目录结构
//注意,我们使用的addAll(),它将每一个基本文件夹名加入到整个命名中,这就是说当我们稍后输入“cd..”,我们只能够进入一个文件夹
else
{
currName.addAll(parser.parse(newLoc));
}
//弹出一个目录之后,我们通过一个lookup()操作确认我们的工作如果lookup()失败,我们需要恢复目录原来的名称,然后抛出一个例外。
ctx.lookup(currName);
}
catch(Exception e)
{
currName = oldName;
throw new Exception("Cannot traverse to desired directory:"+e.toString());
}
}
//重新命名一个上下文
private void mv(String oldStr,String newStr) throws Exception
{
//进入当前的上下文
Context currCtx = (Context)ctx.lookup(currName);
//重新命名subContext
currCtx.rename(oldStr,newStr);
}
//构造子文件夹
private void mkdir(String str) throws Exception
{
Context currCtx = (Context)ctx.lookup(currName);
currCtx.createSubcontext(str);
}
//删除子文件夹
private void rmdir(String str) throws Exception
{
Context currCtx = (Context)ctx.lookup(currName);
currCtx.destroySubcontext(str);
}
//显示一个文件(文件系统服务技术的细节)
private void cat(String fileStr) throws Exception
{
//将文件名附加的文件夹上
Name fileName = (Name)currName.clone();
...全文
16 点赞 收藏 回复
写回复
回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

还没有回复,快来抢沙发~

发动态
发帖子
Java EE
创建于2007-09-28

6.6w+

社区成员

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
申请成为版主
社区公告
暂无公告