Java命名和目录接口

Java命名和目录接口
Java命名和目录接口

Java命名和目录接口(Java Naming and Directory Interface ,JNDI)是用于从Java应用程序中访问名称和目录服务的一组API。命名服务即将名称与对象相关联,以便能通过相应名称访问这些对象。而目录服务即其对象具有属性及名称的命名服务。

命名或目录服务允许您集中管理共享信息的存储,这在网络应用程序中很重要,因为它可以使这类应用程序更加一致和易于管理。例如,可以将打印机配置存储在目录服务中,这样所有与打印机相关的应用程序都能够使用它。

本文是一份代码密集型的快速入门指南,让您开始了解和使用JNDI。它:

?提供对JNDI的综述。

?描述JNDI的特性。

?提供使用JNDI开发应用程序过程中的体验。

?说明如何使用JNDI访问LDAP 服务器,比如Sun ONE Directory Server 。

?说明如何使用JNDI 访问J2EE 服务。

?提供示例代码,您可以对其进行修改,以用于您自己的应用程序。

JNDI综述

我们所有人每天都在不自知的情况下使用命名服务。例如,当您在浏览器中输入URL http://java.su https://www.360docs.net/doc/3b14024178.html,时,域名系统(Domain Name System ,DNS)将这个以符号表示的URL转换为一个通信标识符(IP地址)。在命名系统中,对象的范围可以从位于DNS记录中的名称变动到应用程序服务器中的企业JavaBeans组件(Enterprise JavaBeans Components ,EJBs),还可以到轻量级目录访问协议(Li ghtweight Directory Access Protocol ,LDAP)中的用户配置文件。

目录服务是命名服务的自然扩展。二者的关键区别在于,目录服务允许属性(比如用户的电子邮件地址)与对象相关联,而命名服务则不然。这样,使用目录服务时,您可以基于对象的属性来搜索它们。JNDI 允许您访问文件系统中的文件,定位远程RMI注册表中的对象,访问诸如LDAP这样的目录服务,并定位网络上的EJB。

很多应用程序选择使用JNDI都可以收到良好的效果,比如LDAP客户端、应用程序启动器、类浏览器、网络管理实用工具,或者甚至是地址簿。

JNDI架构

JNDI架构提供了一个标准的、与命名系统无关的API,这个API构建在特定于命名系统的驱动程序之上。

这一层帮助把应用程序和实际的数据源隔离开来,因此无论应用程序是访问LDAP、RMI、DNS还是其他的目录服务,这都没有关系。换句话说,JNDI与任何特定的目录服务实现无关,您可以使用任何目录,只要您拥有相应的服务提供程序接口(或驱动程序)即可,如图1所示。

图1: JNDI架构

注意,关于JNDI有一点很重要,即它同时提供应用程序编程接口(Application Programming Interface ,API)和服务提供程序接口(Service Provider Interface ,SPI)。这样做的实际意义在于,对于您的与命名或目录服务交互的应用程序来说,必须存在用于该服务的一个JNDI服务提供程序,这便是JNDI SPI 发挥作用的舞台。一个服务提供程序基本上就是一组类,这些类针对特定的命名和目录服务实现了各种J NDI接口——这与JDBC驱动程序针对特定的数据系统实现各种JDBC接口极为相似。作为一名应用程序开发人员,您不需要担心JNDI SPI.。您只需确保,您为每个想使用的命名或目录服务提供了一个服务提供程序。

J2SE和JNDI

JNDI被包含在Java 2 SDK 1.3 及其更新版本中。它还可以用作JDK 1.1和1.2的一个标准扩展。Jav

a 2 SDK 1.4.x的最新版本进行了改进,将以下命名/目录服务提供程序包括进来:

?轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP) 服务提供程序。

?公共对象请求代理架构(Common Object Request Broker Architecture ,CORBA)公共对象服务(Common Object Services ,COS)命名服务提供程序。

?Java远程方法调用(Remote Method Invocation ,RMI)注册表服务提供程序。

?域名系统(Domain Name System ,DNS) 服务提供程序。

有关服务提供程序的更多内容

在这里可以下载一系列服务提供程序。Windows注册表JNDI 提供程序(来自https://www.360docs.net/doc/3b14024178.html,)可能会引起您特别的兴趣,因为它允许您访问Windows XP/2000/NT/Me/9x上的注册表。

此外,还可以下载JNDI/LDAP Bootster Pack。这个增强补丁包含对流行的LDAP控件和扩展的支持。它代替了与LDAP 1.2.1服务提供程序捆绑在一起的增强补丁。参见Controls and Extensions以获得更多信息。

另一个要考察的有趣的服务提供程序是Sun的Directory Services Markup Language (DSML) v2.0提供程序。DSML的目标是将目录服务与XML连接起来

JNDI API

JNDI API 包括5个包:

?javax.naming: 包含用于访问命名服务的类和接口。例如,它定义了Context接口,该接口是执行查找时命名服务的入口点。

?javax.naming.directory:扩展命名包以提供用于访问目录服务的类和接口。例如,它增加了新的属性类,提供代表一个目录上下文的DirContext接口,并且定义了用于检查和更新与目录对象相关的属性的方法。

?javax.naming.event: 当访问命名和目录服务时,为事件通知提供支持。例如,它定义了一个NamingEvent类,用于表示由命名/目录服务生成的事件,以及一个监视NamingEvent s 类的, Naming Listener接口。

?javax.naming.ldap: 这个包为LDAP 版本3 扩展操作和空间提供特定的支持,而普通的ja vax.naming.directory包没有提供这些支持。

?javax.naming.spi: 这个包提供方法以动态插入对通过javax.naming及其相关包访问命名和目录服务的支持。只有那些对创建服务提供程序有着浓厚兴趣的开发人员才应该对这个包感兴趣。

JNDI 上下文

承前所述,命名服务是将名称与对象相关联。这种关联被称为绑定。一组这样的绑定被称为上下文,它提供返回对象的分解或查找操作。其他操作还可能包括绑定与解除绑定名称,以及列出被绑定的名称。注意,可以将一个上下文对象中的名称绑定到具有同样命名惯例的另一个上下文对象上。这被称为子上下文。例如,如果UNIX目录/home是一个上下文,那么名称与其相关的目录便是子上下文。例如,/home/gues ts.,这里的guests便是home的一个子上下文。

在JNDI中,上下文是使用javax.naming.Context接口来表示的,而这个接口也正是与命名服务进行交互的主要接口。Context(或稍后将要讨论的DirContext)接口中的每个命名方法都有两种重载的形式:

?lookup(String name): 接受一个字符串名称。

?lookup(https://www.360docs.net/doc/3b14024178.html,): 接受一个结构化的名称,比如CompositeName(一个跨越多个命名系统的名称)或CompondName(一个位于单个命名系统中的名称);二者均实现了Name接口。

下面是一个复合名称的例子:cn=mydir,cn=Q Mahmoud,ou=People,还有一个组合名称的例子:c

n=mydir,cn=Q Mahmoud,ou=People/myfiles/max.txt(这里的myfiles/max.txt是代表第二部分的一个文件名)。

javax.naming.InitialContext是一个实现了Context接口的类。使用这个类作为您到命名服务的入口点。要创建一个InitialContext对象,构造器需要采用一组属性,形式为java.util.Hashta ble或其子类之一,比如Properties.。下面是一个例子:

Hashtable env = new Hashtable();

// select a service provider factory

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.RefFSContext");

// create the initial context

Context contxt = new InitialContext(env);

INITIAL_CONTEXT_FACTORY指定JNDI服务提供程序中工厂类的名称。该工厂负责为其服务创建一个合适的InitialContext对象。在上面的代码片断中,指定了用于文件系统服务提供程序的一个工厂类。表1列出了用于所支持的服务提供程序的工厂类。注意,用于文件系统服务提供程序的工厂类需要从Sun Microsystems单独下载,它并没有与J2SE 1.4.x一起发行。

要通过来自命名或目录服务的名称检索或解析(查找)一个对象,使用Context: Object obj = cont xt.lookup(name)的lookup方法。lookup方法返回一个对象,该对象代表您想要查找的上下文的子上下文。

一个命名的例子

现在,让我们看一看一个使用命名服务的例子。在这个例子中,我们编写了一个简单的程序,用于查找一个其名称被当作命令行参数传入的对象。在这里,我们将使用一个用于文件系统的服务提供程序,而且因此,我们提供作为参数的名称必须是一个文件名。示例代码1中给出了相应代码。

示例代码1: Resolve.java

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import java.util.Hashtable;

public class Resolve {

public static void main(String argv[]) {

// The user should provide a file to lookup

if (argv.length != 1) {

System.err.println("Usage: java Resolve ");

System.exit(-1);

}

String name = argv[0];

// Here we use the file system service provider

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory");

try {

// Create the initial context

Context ctx = new InitialContext(env);

// Look up an object

Object obj = ctx.lookup(name);

// Print it out

System.out.println(name + " is bound to: " + obj);

// Close the context

ctx.close();

} catch (NamingException e) {

System.err.println("Problem looking up " + name + ": " + e); }

}

}

在这里,我假定您使用的是Java 2SDK 1.4.x,它附带有几个服务提供程序(上面已经列出)。这个应用程序要使用文件系统服务提供程序,而在默认情况下,文件系统服务提供程序并未安装。因此,您需要下载并安装它。另一方面,如果您运行这个程序,而服务提供程序却还没有被安装,您将得到一个NoInit ialContextException,意指无法找到服务提供程序工厂类,因此不能初始化这个类。接着,您需要在您的classpath中包括fscontext.jar 和providerutil.jar——或者像我一样,您可以简单地将这两个文件拷贝至JAVA_HOME\jre\lib\ext,这里的JAVA_HOME 是指您的Java 2SDK安装的根目录。

要测试这个应用程序:

1.确保您已经下载并安装了文件系统服务提供程序(正如上一段所讲的那样),因为这个服务提供程序并没有与J2SE 1.4.x一起提供。

2.拷贝代码并将其粘贴到文件中,并将文件命名为Resolve.java。

3.使用javac编译Resolve.java。

4.使用java解释器运行应用程序。

下面是一次示范运行:

prompt> java Resolve \classes

\classes is bound to: com.sun.jndi.fscontext.FSContext@f62373

如果您提供的名称是一个文件名,您将看到如下结果:

prompt> java Resolve \classes\Resolve.java

\classes\Resolve.java is bound to: C:\classes\Resolve.java

列出文件目录的内容

现在,让我们看一看如何使用其他JNDI API列出一个文件目录的内容。我们假定,您想让用户能够使用f ile:///这样的URL 来指定命令行参数。在这种情况下,您要设置一个新的属性PROVIDER_URL,如示例代码2所示。Context 的listBindings方法返回一个NamingEnumeration对象,可以通过使用一个while循环来迭代这个对象,如示例代码2所示。

示例代码2Resolve2.java

import javax.naming.Binding;

import javax.naming.NamingEnumeration;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.naming.NamingException;

import java.util.Hashtable;

public class Resolve2 {

public static void main(String argv[]) {

// The user should provide a file to lookup

if (argv.length != 1) {

System.err.println("Usage: java Resolve2 ");

System.exit(-1);

}

// Here we use the file system service provider

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.fscontext.FSContextFactory");

env.put(Context.PROVIDER_URL, argv[0]);

try {

// Create the initial context

Context ctx = new InitialContext(env);

NamingEnumeration ne = ctx.listBindings("");

while(ne.hasMore()) {

Binding b = (Binding) ne.next();

System.out.println(b.getName() + " " + b.getObject());

}

// close the context

ctx.close();

} catch (NamingException e) {

System.err.println("Problem looking up " + argv[0] + ": " + e); }

}

}

要测试这个应用程序,遵照与上一个例子同样的编辑和运行步骤即可。下面是一次示范运行:prompt>: java Resolve2 file:///uddi

fig1.gif C:\uddi\fig1.gif

fig2.gif C:\uddi\fig2.gif

fig3.gif C:\uddi\fig3.gif

fig4.gif C:\uddi\fig4.gif

fig5.gif C:\uddi\fig5.gif

impl.txt C:\uddi\impl.txt

目录服务

承前所述,目录服务便是其对象具有属性及名称的命名服务。具有属性和名称的对象被称为目录入口。应用程序可以使用目录服务存储和检索目录对象的属性。它甚至可以被用于对象存储。

LDAP

轻量级目录访问协议(LDAP)来源于X.500 协议(由位于Ann Arbor的密歇根大学开发),是一个用于访问和管理目录服务的协议;它定义了客户端应该如何访问存储在服务器上的数据,但没有定义应该如何存储数据。LDAP目录由带有描述性信息的入口组成,这些描述性信息描述了人(例如,姓名、电话号码、电子邮件地址,等等)或网络资源(比如打印机、传真机之类的)。这类描述性信息被存储在一个入口的属性中,入口的每个属性均描述了一种特定类型的信息。下面给出一个例子,内容是用于描述一个人的属性:

cn: Qusay H. Mahmoud

mail: qmahmoud@https://www.360docs.net/doc/3b14024178.html,

telephoneNumber: 123-4567

LDAP 目录服务可以用于基于属性查找某个人的电话号码或电子邮件地址。表2列出了一些常见的LDAP 属性:

LDAP名称是一个(名称,值) 对的序列,比如姓名、组织、国家。

cn=Qusay Mahmoud, o=https://www.360docs.net/doc/3b14024178.html,, c=Canada

javax.naming.directory.DirContext是一个JNDI的目录服务接口,它扩展了javax.naming.C ontext。它提供的方法有:

?search: 搜索匹配目录入口的目录,并比较一个目录入口和一组属性。

?bind和createSubcontext: 添加一个新的目录入口。

?modifyAttributes: 修改一个目录入口的特定属性。rename方法可以用于修改入口名称本身。

?unbind和destroySubcontext: 删除一个特定的目录入口。

?close: 结束与一台LDAP服务器的会话。

使用JNDI 进行LDAP编程

要操作一台LDAP 服务器(比如Sun ONE Directory Server)中的对象,您必须首先连接到该服务器;您可能还需要使您自己通过服务器的身份验证。要连接到服务器,您可以从DirContext接口获得对一个对象的引用。使用InitialDirContext类可以做到这一点,而该类需要一个Hashtable。

下面的代码片断可以使用户通过一台LDAP服务器的身份验证,并连接到该服务器上。注意,这里使用的是简单的身份验证。简单身份验证包括把用户的完全限定的DN和用户的明文口令发送给LDAP 服务器。

要避免暴露明文口令,使用带有加密通道的SSL机制,如果您的LDAP服务器支持这种机制的话。想要了解关于身份验证模式的更多信息,请参见JNDI Tutorial。

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.ldap.LdapCtxFactory");

// specify where the ldap server is running

env.put(Context.PROVIDER_URL,

"ldap://https://www.360docs.net/doc/3b14024178.html,:61596");

env.put(Context.SECURITY_AUTHENTICATION, "simple");

env.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager");

env.put(Context.SECURITY_CREDENTIALS, "password");

// Create the initial directory context

DirContext ctx = new InitialDirContext(env);

连接到LDAP 服务器上之后,您可以在LDAP服务器上添加新的入口、或者修改、删除、搜索一个入口。

下面的代码片断说明了如何添加或存储一个新的入口。注意:要存储一个对象,您需要使用Java Schema 装载它,而Java Schema并没有在目录服务器上被预配置。想要了解关于此点的更多信息,请参见JND I指南中的Java Objects and the Directory部分。

SomeObject Obj = new SomeObjct("param1", "param2", "param3");

ctx.bind("cn=myobject", obj);

您可以使用lookup方法查找一个对象,如下:

SomeObject obj = (SomeObject) ctx.lookup("cn=myobject");

示例代码3 给出了一个如何检索命名对象的属性的例子。正如您所看到的那样,用于选择工厂类的代码与前面相同。我们使用InitialDirContext类创建了一个目录上下文DirContext,getAttributes 方法用于返回对象的属性,而最后,get方法找到了姓并打印之。相当直观,是不是?

示例代码3: GetAttrib.java

import javax.naming.Context;

import javax.naming.directory.InitialDirContext;

import javax.naming.directory.DirContext;

import javax.naming.directory.Attributes;

import javax.naming.NamingException;

import java.util.Hashtable;

class GetAttrib {

public static void main(String[] argv) {

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.ldap.LdapCtxFactory");

// specify where the ldap server is running

env.put(Context.PROVIDER_URL,

"ldap://localhost:389/o=https://www.360docs.net/doc/3b14024178.html,,c=Canada");

// use simple authenticate to authenticate the user

env.put(Context.SECURITY_AUTHENTICATION, "simple");

env.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager");

env.put(Context.SECURITY_CREDENTIALS, "password");

try {

// Create the initial directory context

DirContext ctx = new InitialDirContext(env);

// Ask for all attributes of the object

Attributes attrs = ctx.getAttributes("cn=Qusay Mahmoud");

// Find the surname ("sn") attribute of this object and print it

System.out.println("Last Name: " + attrs.get("sn").get());

// Close the context

ctx.close();

} catch (NamingException e) {

System.err.println("Problem getting attribute: " + e);

}

}

}

JNDI提供用于进行基本和高级(使用过滤器)搜索的API 。例如,使用一组入口必须具有的属性,以及要在其中执行搜索的目标上下文,便可以执行一次简单的搜索。下面的代码片断说明了如何在一棵子树中搜索一个具有uid=qmahmoud属性的入口。使用过滤器的高级搜索不在本文的讨论范围之内。

// ignore attribute name case

Attributes matchattribs = new BasicAttributes(true);

matchattribs.put(new BasicAttribute("uid", "qmahmoud"));

// search for objects with those matching attributes

NamingEnumeration answer = ctx.search("ou=People,o=https://www.360docs.net/doc/3b14024178.html,",

matchattribs);

while (answer.hasMore()) {

SearchResult sr = (SearchResult)answer.next();

// print the results you need

}

想要了解使用JNDI编写LDAP 客户端方面的更多信息,请参见Tips for LDAP Users。

JNDI 的CORBA COS命名服务提供程序

CORBA 公共对象服务(COS) 名称服务器用于存储CORBA对象引用。您可以使用COS命名包(org.o mg.CORBA.CosNaming)在CORBA 应用程序中访问它。

JNDI COS命名服务提供程序基于COS命名包实现了javax.naming.Context接口,这样CORBA 应用程序就能够使用JNDI访问COS 名称服务器。因此,使用JNDI 的CORBA 应用程序具有一个用于访问所有命名和目录服务的接口。这使得CORBA应用程序能够使用像LDAP这样的分布式企业级服务来存储对象引用。

要选择COS 命名服务提供程序,使用:

env.put(Context.INITIAL_CONTEXT_FACTORY,

"https://www.360docs.net/doc/3b14024178.html,CtxFactory");

要转换您的CORBA 应用程序以使用JNDI,考虑AddServer.java和AddClient.java,它们在另一篇文章中有更加详细的描述。

1.在客户端和服务器中均使用javax.naming,将:

import org.omg.CosNaming.*;

import org.omg.CosNaming.NamingContextPackage.*;

替换为:

import javax.naming.*;

2.在客户端和服务器中使用InitialContext代替NameService:

将:

org.omg.CORBA.Object objRef =

orb.resolve_initial_references("NameService"); NamingContextExt ncRef =

NamingContextExtHelper.narrow(objRef);

替换为:

Hashtable env = new Hashtable();

env.put("java.naming.corba.orb", orb);

Context ctx = new InitialContext(env);

3.使用lookup代替resolve:

将:

String name = "Add";

Add href = AddHelper.narrow(ncRef.resolve_str(name));

替换为:

Add href = AddHelper.narrow((org.omg.CORBA.Object)ctx.lookup("Add")); JNDI 的RMI 注册表服务提供程序

RMI 注册表服务提供程序允许JNDI 应用程序访问使用RMI注册表注册的远程对象。已知注册表所在的位置之后,提供程序使用绑定为注册在注册表中的对象创建一个命名上下文。接下来,这个上下文可以被绑定到另一个JNDI可访问的命名空间中,比如LDAP。这项新功能包含了java.rmi.Naming 类提供的功能。

这样使用RMI的主要优点是,客户端不再需要知道RMI注册表运行之处的主机名和端口号;它与位置无关。

下面的代码片断说明了如何将JNDI 与RMI一起使用:

// select the registry service provider as the initial context

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.rmi.registry.RegistryContextFactory");

// specify where the registry is running

env.put(Context.PROVIDER_URL, "rmi://server:1099");

// create an initial context that accesses the registry

Context ctx = new InitialContext(env);

// now, the names stored in registry can be listed

NamingEnumeration enum = ctx.list("");

// bind the registry context into LDAP directory

Context ldapctx =

(Context)ctx.lookup("ldap://server:port/o=comp,c=ca");

ldapctx.bind("cn=rmi", ctx);

JNDI 的DNS 服务提供程序

DNS服务提供程序使得基于JNDI的应用程序能够访问存储在DNS中的信息。DNS服务提供程序将DNS 命名空间呈现为JNDI 目录上下文的一棵树,而将DNS 资源记录呈现为JNDI 属性。

示例代码 4 演示了如何使用DNS 服务提供程序检索环境和IP地址(A记录)的信息。

示例代码4: TestDNS.java

import javax.naming.*;

import com.sun.jndi.dns.*;

import java.util.Hashtable;

public class TestDNS {

public static void main(String[] argv) {

Name cn = null;

String name = argv[0];

Hashtable env = new Hashtable();

env.put(Context.INITIAL_CONTEXT_FACTORY,

"com.sun.jndi.dns.DnsContextFactory");

env.put(Context.PROVIDER_URL, "dns://IP for DNS Server/");

try {

// Create the initial context

Context ctx = new InitialContext(env);

// print the fully qualified name (.)

System.out.println("Name in namespace:

"+ctx.getNameInNamespace());

// retrieve the parser associated with the named context

NameParser np = ctx.getNameParser(ctx.getNameInNamespace());

if (argv.length != 1) {

System.out.println("Usage: java TestDNS ");

System.exit(-1);

}

// parse the name into its components and print them

cn = np.parse(name);

System.out.println("Name is: "+cn.toString());

System.out.println("The parsed name has "+cn.size()+" components:");

for (int i=0; i

System.out.println(cn.get(i));

}

System.out.print("Trying to lookup ");

// get the prefix (domain) and suffix (hostname)

Name domain = cn.getPrefix(cn.size()-1);

Name host = cn.getSuffix(cn.size()-1);

System.out.println("DNS Host: "+host+" Domain: "+domain);

// retrieve the named object

Object obj = ctx.lookup(domain);

System.out.println(domain.toString()+" is bound to: "+obj);

// retrieve and print the environment in effect

System.out.println("Domain properties: "+

((Context)obj).getEnvironment());

// retrieve and print the IP address (the DNS A records)

System.out.println("IP for: "+cn+ " is: "+

((DnsContext)obj).getAttributes(host, new String[]{"A"}));

// we're done so close the context

ctx.close();

} catch (NamingException e) {

System.err.println("Problem looking up " + cn + ": " + e);

}

}

}

在您运行这个应用程序之前,确保您指定了DNS服务器的IP地址。

下面是一次示范运行:

prompt> java TestDNS https://www.360docs.net/doc/3b14024178.html,

Name in namespace: .

Name is: https://www.360docs.net/doc/3b14024178.html,

The parsed name has 4 components:

edu

mit

ai

prep

Trying to lookup DNS Host: prep Domain: https://www.360docs.net/doc/3b14024178.html,

https://www.360docs.net/doc/3b14024178.html, is bound to: com.sun.jndi.dns.DnsContext@b89838

Domain properties: {java.naming.provider.url=dns://IP for DNS Server/, java.namin

g.factory.initial=com.sun.jndi.dns.DnsContextFactory}

IP for: https://www.360docs.net/doc/3b14024178.html, is: {a=A: 199.232.41.9}

JNDI 和J2EE

JNDI 是J2EE平台的标准服务API之一。包含它的目的是为应用程序组件提供一个标准的API,用于引用资源和其他应用程序组件。J2EE还定义了一种标准的命名策略(逻辑和真实的名称),以和JNDI一起使用,这样就可以采用一种与部署环境无关的方式编写应用程序。您可以引用J2EE服务,具体方法是根据其逻辑名称在目录中查找它们。为了实现这一点,每个符合J2EE规范的系统均提供了一个称为环境的J NDI 服务,该环境包括:

?环境变量

?EJB 引用

?资源工厂引用

注意:在这里,我只讨论环境变量。想要了解EJB引用和资源工厂引用方面的更多信息,请参见这篇文章。

环境变量

应用程序组件的命名环境允许您定制应用程序组件,而不需要访问或修改组件的源代码。每个应用程序组件定义它自己的环境入口的集合。同一个容器中,一个应用程序组件的所有实例共享同一个入口。注意,不允许应用程序组件实例在运行时修改环境。

声明环境变量

应用程序组件提供程序必须声明从应用程序的组件代码访问的所有环境入口。它们是在部署描述器(例如T omcat中的web.xml)中通过使用 标签来声明的. 标签的元素有:

?:环境入口的可选描述。

?: 环境入口名。

?:期望的环境变量类型。它可以是以下Java 类型之一:Boolean、Byte、Do uble、Character、Float、Integer、Long、Short、String 。

?: 必须匹配所提供类型的环境入口值。

?. 这个值可以稍后改变,但是如果它没有被设定,那么在部署期间必须为它指定一个值。

示例代码5中的例子给出了两个环境入口的声明。要为一个新环境指定一个声明,您只要把它添加给您的web应用程序描述器(web.xml) 即可。

示例代码5: 声明环境变量

welcome message

greetings

https://www.360docs.net/doc/3b14024178.html,ng.String

Welcome to the Inventory Control

System

maximum number of products

inventory/max

https://www.360docs.net/doc/3b14024178.html,ng.Integer

27

每个标签描述一个环境入口。所以在这个例子中,定义了两个环境入口。第一个叫做greeti ngs, 是String 类型,初始的默认值为:Welcome to the Inventory Control System。第二个入口叫做inventory/max,是Integer类型,初始的默认值为27。

现在,应用程序组件实例可以使用JNDI定位环境入口. 它使用不带参数的构造器创建了一个javax.nam ing.InitialContext对象。接着,它通过InitialContext查找命名环境,所使用的是以java:c omp/env打头的JNDI URL。示例代码6 说明了一个应用程序组件如何访问它的环境入口。

示例代码6: 访问环境入口

// obtain the application component's environment

// naming context

javax.naming.Context ctx =

new javax.naming.InitialContext();

javax.naming.Context env =

ctx.lookup("java:comp/env");

// obtain the greetings message

//configured by the deployer

String str = (String) env.lookup("greetings");

// use the greetings message

System.out.println(greetings);

// obtain the maximum number of products

//configured by the deployer

Integer maximum = (Integer) env.lookup(

AndroidJava命名规范

Android Java命名规范 1、包(packages): 采用反域名命名规则,全部使用小写字母。一级包名为com,二级包名为xx(可以是公司或则个人的随便),三级包名根据应用进行命名,四级包名为模块名或层级名 2、类(classes):名词,采用大驼峰命名法,尽量避免缩写,除非该缩写是众所周知的,比如HTML,URL,如果类名称中包含单词缩写,则单词缩写的每个字母均应大写。

3、方法(methods):动词或动名词,采用小驼峰命名法例如:onCreate(), run() 4、变量:名词,采用小驼峰命名法 5 资源文件(图片drawable文件夹下):全部小写,采用下划线命名法,加前缀区分命名模式:控件名称_逻辑名称/common_逻辑名称

6、资源布局文件(XML文件(layout布局文件)): 全部小写,采用下划线命名法 1).contentview命名, Activity默认布局,以去掉后缀的Activity类进行命名。不加后缀: 功能模块.xml 例如:main.xml、more.xml、settings.xml 或则:activity_功能模块.xml 例如:activity_main.xml、activity_more.xml 2).Dialog命名:dialog_描述.xml 例如:dlg_hint.xml 2).PopupWindow命名:ppw_描述.xml 例如:ppw _info.xml 3). 列表项命名list_item_描述.xml 例如:list_item_city.xml 4).包含项:include_模块.xml 例如:include_head.xml、include_bottom.xml 5).adapter的子布局:功能模块_item.xml 例如:main_item.xml、 7、动画文件(anim文件夹下):全部小写,采用下划线命名法,加前缀区分。 Android编码规范建议: 1.Java代码中不出现中文; 2.代码中不出现字符串,所有的字符串定义到string.xml中; 3.图片尽量分拆成多个可重用的图片; 4.使用静态变量方式实现界面间共享要慎重; 5.Log(TAG,详细描述):TAG以常量的方式定义为该类的类名; 6.不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突; 7.activity中在一个View.OnClickListener中处理所有的逻辑; 8.strings.xml中使用%1$s实现字符串的通配; 9.如果多个Activity中包含共同的UI处理,那么可以提炼一个CommonActivity,把通用部分叫由它来处理,其他activity只要继承它即可; 10.如果使用eclipse工具: 1. Format使用Android源码自定义的xml

java项目各部分命名规则

学习Java的童鞋们都知道,Java的包、类、借口、方法、变量、常量;JavaEE 的三层模型等都有一套约定俗成的命名规则。 我学习每种语言都会关注相应的命名规则,一则体现自己比较专业;二来方便后检查,看到名称就知道是属于什么类型、占用多少内存、使用是否正确等;三又可以供其他人参考。 当然,学习Java也不例外,每次新建Java Project的时候都会想一下命名方式,尤其是对Java Package的命名。起初学习Java的时候都会推敲一番,该怎么命名所建立的Java Package,后来给自己约定俗成了,推敲少了,但命名确更规范了。 下面正式进入主题,讲讲我对Java Package命名规则的一些思考。 Java的包名都有小写单词组成,类名首字母大写;包的路径符合所开发的系统模块的定义,比如生产对生产,物资对物资,基础类对基础类。以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现。 由于Java面向对象的特性,每名Java开发人员都可以编写属于自己的Java Package,为了保障每个Java Package命名的唯一性,在最新的Java编程规范中,要求开发人员在自己定义的包名前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以多数开发人员采用自己公司在互联网上的域名称作为自己程序包的唯一前缀。例如:com.sun.swt.……。 从而,我们知道,一般公司命名为“com.公司名.项目名.模块名....”。 那,我们个人的项目又怎么命名呢? 经过我对“个人的”单词搜索,有“individual、personal、private、one-man”,进一步对以上4个单词词意的分析,并在保证了唯一性,使用每个单词的前4个字母作为前缀,正好和“com”也做了区分。如下: indi : 个体项目,指个人发起,但非自己独自完成的项目,可公开或私有项目,copyright主要属于发起者。 包名为“indi.发起者名.项目名.模块名.……”。 pers : 个人项目,指个人发起,独自完成,可分享的项目,copyright主要属于个人。 包名为“pers.个人名.项目名.模块名.……”。 priv : 私有项目,指个人发起,独自完成,非公开的私人使用的项目,copyright 属于个人。 包名为“priv.个人名.项目名.模块名.……”。 onem : 与“indi”相同,推荐使用“indi”。 另外,我为了区分团队项目和前面所说项目的区分,还有了一下扩展: team :

java编程规范+数据库命名规范

Java编程规范 本编程规范建立在标准的Java编程规范的基础上,如和标准的Java编程规范有冲突,以本编程规范为准。 1.1 程序结构 包名 引入包/类名 类注释 类 常量//常量注释 构造器注释 构造器 构造器注释 构造器 方法注释 方法 方法注释 方法 1.2 命名规范 命名规范使得程序更易理解,可读性更强。并且能够提供函数和标识符的信息。 文件命名规范: java程序使用如下的文件名后缀: 文件类型后缀 Java 源文件.java Java 字节码文件.class 对系统的文件命名方式有待于根据实际业务决定。 包命名规范: 包名应该唯一,它的前缀可以为任何小写的ASCII字符,包名按照公司内部的命名规范,这些规范指出了某种目录名,主要包括部门,项目,机器,或者登录名。 命名规则为: app.系统名.模块名.xxx.xxx 包命名举例: app.oa.interceptor.xxx app.oa.sys.xxx 类命名规范: 类名应该是名词,并且是大小写混合的。首字母要大写。尽量保证类名简单并且描述性强。避免使用只取单词首字母的简写或者单词的缩写形式,除非缩写形式比单词的完整形式更常用(例如:URL或者HTML)。文件名必须和public的类名保持一致,注意大小写(JBuilder 等一些编译器可以忽略大小写,要特别注意)。如是实现类命名后缀+Impl。 类命名举例: classLoginAction; classUserServiceImpl; 接口命名规范:

接口命名方式与类命名方式相同。 接口命名举例: interfaceIUserService; interfaceSysYhjsDAO; 方法命名规范; 方法名应该为动词,并且是大小写混合的。首字母要小写,方法名的第 二个单词的第一个字母大写。 方法命名举例: String getNoticeNo(); Collection findByCondition(String); 变量命名规范 变量,以及所有的类实例应为首字母小写的大小写混合形式。变量名的第二个单词 的首字母大写。变量名的首字母不能为下划线或者$符。 变量名应该尽可能的短小,但要有意义。变量名应该便于记忆,也就是说变量名应 该尽可能的做到见名知意。除了暂时使用的变量外(一般用于循环变量),应该避免使 用只有一个字母的变量名。对于临时变量一般说来:i,j,k,m,n代表整型变量。c,d,e代表字符型变量。 变量命名举例: String dataType; String name; inti; char c; 常量命名规范: 声明为类常量的变量或者ANSI常量应该全部为大写字母,并且每个单词间用下划 线“_”隔开。为了便于调试,应避免使用ANSI常量。 常量命名举例: static final int MIN_WIDTH = 4; 1.3 注释规范 Java 提供了两种类型的注释:程序注释和文档注释。程序注释是由分隔符/*…*/,和// 隔开的部分,这些注释和C++ 中的注释一样。文档注释(即“doc 注释”)是Java 独有的。由分隔符/**…*/隔开。使用javadoc工具能够将文档注释抽取出来形成HTML 文件。程序注释主要是对程序的某部分具体实现方式的注释。文档注释是对程序的描述性注释,主要是提供给不需要了解程序具体实现的开发者使用。注释应该是代码的概括性描述,提供不易直接从代码中得到的信息,并且只包含对阅读和理解程序有用的信息。例如注释中包含相应的包如何编译或者在哪个目录下,而不应该包括这个包驻留在哪儿的信息。注释中可以描述一些精妙的算法和一些不易理解的设计思想,但应该避免那些在程序代码中很清楚的表达出来的信息。尽可能的避免过时的信息。错误的注释比没有注释更有害。经常性的注释有时也反映出代码质量的低下。 …程序注释: 程序注释有四种格式:块注释格式,单行注释,跟随注释,行尾注释 ?块注释格式 块注释主要用于描述:文件、方法、数据结构和算法。一般在文件或者方法定义的 之前使用。也可以用在方法定义里面,如果块注释放在函数或者方法定义里,它必须与它所描述的代码具有相同的缩进形式。

编码规范

编码规范 1.编写目的 本规范的目的在于编写可靠的、一致的、便于理解的JAVA源代码,并且写出的代码被其他人阅读,所有的JAVA代码保持良好的致性,容易在以后的阶段中进行维护和升级。同时,也是为了通过一定时间的实践,增加我们的软件产品的投入产出量,以提高我们的工作效率。 2.适应范围 适用于JAVA程序开发人员,或后续开发人员。可以方便系统的开发与维护,使系统开发与维护可以顺利展开。 3.代码命名一般原则 我们开发的是一个JSP新闻发布系统,用的编码方式是JAVA,因此用的命名总原则是: 3.1.用全英文单词命名的方式,准确地描述变量、属性、类等。 如:使用firstNname、grandTotal、等命名就比x1、y1、fn等更容易让人理解其含义,尽管它们的长度要大一些。 3.2.采用一些更加准确的术语来命名。 例如:如果我们的用户称他们的clients为customers ,那么我们就应该用customer来命名,而不是采用client来命名。这是一些细微的地方,但也希望能注意。 3.3.采用大小写混合的方式来命名,以便命名有很好的可读性。 在JAVA代码中,将采用如下原则:类或接口命名中每个单词的首字母均大写,而单词的剩余部分均小写。其它像变量、成员方法、属性等除第一个单词全部小写以外,其它单词的首写字母均大写,而单词的剩余部分均小写。 3.4.尽量少用单词的缩写形式,但如果一定要用,则选择大家通用的缩写方式,并且要在本JAVA源代码中坚持用它,而不要一会用这种缩写方式,一会用那种 缩写方式。 比如,如果要用“number”的缩写方式,则可用“no”或“num”两种缩写方式,而不要用“nu”这种大家不常用的缩写方式,并且要保持不变。 3.5.尽量避免太长的命名,一般以少于20个字符为宜。

华为Java语言编码规范标准

Java语言编码规范 Prepared by 拟制Date 日期 yyyy-mm-dd Reviewed by 评审人Date 日期 yyyy-mm-dd Approved by 批准Date 日期 yyyy-mm-dd

Revision Record 修订记录

Table of Contents 目录 1. 范围 (4) 2. 规范性引用文件 (4) 3. 术语和定义 (4) 4. 排版规范 (5) 4.1. 规则 (5) 4.2. 建议 (7) 5. 注释规范 (9) 5.1. 规则 (9) 5.2. 建议 (15) 6. 命名规范 (17) 6.1. 规则 (17) 6.2. 建议 (18) 7. 编码规范 (20) 7.1. 规则 (20) 7.2. 建议 (24) 8. JTEST规范 (26) 8.1. 规则 (26) 8.2. 建议 (27)

1.范围 本规范规定了使用Java语言编程时排版、注释、命名、编码和JTEST的规则和建议。 本规范适用于使用Java语言编程的产品和项目。 2.规范性引用文件 下列文件中的条款通过本规范的引用而成为本规范的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本规范,然而,鼓励根据本规范达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本规范。 3.术语和定义 规则:编程时强制必须遵守的原则。 建议:编程时必须加以考虑的原则。 格式:对此规范格式的说明。 说明:对此规范或建议进行必要的解释。 示例:对此规范或建议从正、反两个方面给出例子。

java类名命名规范

竭诚为您提供优质文档/双击可除 java类名命名规范 篇一:java各种命名规范 定义规范的目的是为了使项目的代码样式统一,使程序有良好的可读性。 包的命名(全部小写,由域名定义) java包的名字都是由小写单词组成。但是由于java面向对象编程的特性,每一名java程序员都可以编写属于自己的java包,为了保障每个java包命名的唯一性,在最新的java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程 序包的唯一前缀。 例如:net.frontfree.javagroup 类的命名(单词首字母大写) 根据约定,java类名通常以大写字母开头,如果类名称由多个单词组成,则每个单词的首字母均应为大写例如testpage;如果类名称中包含单词缩写,则这个缩写词的每个字母均应大写,如:xmlexample,还有一点命名技巧就是

由于类是设计用来代表对象的,所以在命名类时应尽量选择名词。 例如:graphics 方法的命名(首字母小写,字母开头大写) 方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。例如:drawimage 常量的命名(全部大写,常加下划线) 常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。 例如:max_Value 参数的命名 参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。 javadoc注释 java除了可以采用我们常见的注释方式之外,java语言规范还定义了一种特殊的注释,也就是我们所说的javadoc注释,它是用来记录我们代码中的api的。javadoc 注释是一种多行注释,以/**开头,而以*/结束,注释可以包含一些html标记符和专门的关键词。使用javadoc注释的好处是编写的注释可以被自动转为在线文档,省去了单独

Java命名规范

命名规范? 本规范主要针对java开发制定的规范 项目命名? 项目创建,名称所有字母均小写,组合方式为: com.leadal.$projectName.$component.$hiberarchy。 1.$projectName:项目名称 2.$component:模块名称 3.$hiberarchy:开发层次名称 例如: com.leadal.tims.exchange.dao 类文件夹命名? ?source代码模块 ?config配置文件模块 ?test 测试模块 包命名? ?规则 o全部小写。 o标识符用点号分隔开来。为了使包的名字更易读。如 com.leadal.shanty ?常用几个包名 o dao:数据层 o service:逻辑层 o model:持久类定义包 ?实现Serializable接口,创建serialVersionUID ?主键统一用id标识,Long类型 o web:表示层及控制层 o enums:枚举类型 o config:配置文件类包 o resource:资源文件包 类文件命名?

?尽量以英文进行类定义 ?所有类都以大写字母开头 ?组合词每个词以大写字母开头,不用下划线或其他符号 ?避免使用单词的缩写,除非它的缩写已经广为人知,如HTTP 变量命名? ?第一个字母小写,中间单词的第一个字母大写 ?不用_或&作为第一个字母。 ?尽量使用短而且具有意义的单词 ?单字符的变量名一般只用于生命期非常短暂的变量。i,j,k,m,n一般用于integers;c,d,e一般用于characters ?如果变量是集合,则变量名应用复数。 String myName; int[] students; int i; int n; char c; btNew; (bt是Button的缩写) 常量命名? ?所有常量名均全部大写,单词间以‘_’隔开 int MAX_NUM; 方法命名规则? ?规则 o第一个单词一般是动词。 o第一个字母是小些,但是中间单词的第一个字母是大写。

java关键字和java命名规范

Java关键字和java中的命名规范 Java关键字是java语言和java的开发和平台之间的约定,程序员只要按照约定使用关键字,java的开发平台就能认识他,并正确处理,展示出程序员想要的效果。 下面列出java关键字的含义: 1.abstract :表明类或类中的方法是抽象的; 2.assert: 声明断言; 3.boolean:基本数据类型之一,布尔类型; 4.break:提前跳出一个块; 5.byte:基本数据类型之一,字节类型; 6.case:在switch语句中,表明其中的一个分支; 7.catch :用于处理例外情况的,用来捕捉异常; 8.char :基本数据类型之一,字符类型; 9.class :类; 10.continue :回到一个块的开始处; 11.default :用在switch语句中,表明一个默认的分支; 12.do :用在“do while循坏语句中”; 13.double: 基本数据类型之一,双精度浮点型; 14.else :在条件语句之后,与if形成对应; 15.extends :用来表明一个类是另一个类的子类; 16.final :用来表明一个类不能派生出子类,或类中的方法不能被覆盖,或声明一个变量时常量 17.finally :用于处理异常情况,表示这一块无论如何都被执行; 18.float :基本数据类型之一,单精度浮点数据类型 19.for :一种循坏结构的引导词; 20.if :条件语句的引导词; 21.Implements:表明一个类实现了给定的接口; 22.import: 表明要访问指定的类或包; 23.instanceof: 用来测试一个对象是否是一个指定类的实例; 24.int: 基本数据类型之一,整形; 25.interface:接口; 26.long: 基本数据类型之一,长整形; 27.native:用来声明一个方法是由与机器相关的语言(如C/C++/FORTRAN)实现的; 28.new:用来申请新对象; 29.package:包; 30.private: 一种访问方式:私有模式; 31.protected:一种访问方式:保护模式; 32.public: 一种访问方式,公共模式; 33.return:从方法中返回值; 34.short :基本数据类型之一,短整数类型; 35.static: 表明域或方法是静态的,即该域或方法是属于类的;

Java编码规范(命名规则).

1. Java 命名约定 除了以下几个特例之外,命名时应始终采用完整的英文描述符。此外,一般应采用小写字母,但类名、接口名以及任何非初始单词的第一个字母要大写。 1.1一般概念 n 尽量使用完整的英文描述符 n 采用适用于相关领域的术语 n 采用大小写混合使名字可读 n 尽量少用缩写,但如果用了,要明智地使用,且在整个工程中统一 n 避免使用长的名字(小于 15个字母是个好主意 n 避免使用类似的名字,或者仅仅是大小写不同的名字 n 避免使用下划线(除静态常量等 1.2示范 包(Package采用完整的英文描述符,应该都是由小写字母组成。对于全局包,将你的 Internet 域名反转并接上包名。 j ava.aw t,com.ambysof t.www.persistence 类(Class采用完整的英文描述符,所有单词的第一个字母大写。 Customer, SavingsAccount 接口(Interface采用完整的英文描述符说明接口封装,所有单词的第一个字母大写。习惯上,名字后面加上后缀 able, ible 或者 er,但这不是必需的。Contactable,Prompter 组件/部件(Component使用完整的英文描述来说明组件的用途,末端应接上组件类型。 okButton, customerList,f ileMenu 异常(Exception通常采用字母 e 表示异常。 e

类变量字段采用完整的英文描述,第一个字母小写,任何中间单词的首字母大写。 firstName, lastName 实参/参数同字段/属性的命名规则 public void setFirstName(String firstName{ this.firstName = f irstName;} 局部变量同字段/属性的命名规则 获取成员函数被访问字段名的前面加上前缀 get。 getFirstName(, getLastName( 布尔型的获取成员函数所有的布尔型获取函数必须用单词 is做前缀。isPersistent(, isString( 设置成员函数被访问字段名的前面加上前缀 set。 setFirstName(, setLastName(,setWarpSpeed( 普通成员函数采用完整的英文描述说明成员函数功能,第一个单词尽可能采用一个生动的动词,第一个字母小写。 openFile(, add Account( 静态常量字段(static final全部采用大写字母,单词之间用下划线分隔。 MIN_B ALANCE, DEF AULT_DATE 循环计数器通常采用字母 i,j,k 或者 counter 都可以接受。 i, j, k, counter 数组数组应该总是用下面的方式来命名:obj ectType[]。 byte[] buff er; 2. Java 注释约定 一个很好的可遵循的有关注释的经验法则是:问问你自己,你如果从未见过这段代码,要在合理的时间内有效地明白这段代码,你需要哪些信息。 2.1. 一般概念 n 注释应该增加代码的清晰度

JAVA编程规范试题

JA V A编程规范试题 一、判断题(每题2分,共28分) 1、if, for, do, while, case, switch, default 等语句自占一行,且if, for, do, while, switch, case等语句的执行语句无论多少都要加括号{}。× 2、包的注释内容要求包括:简述本包的作用、详细描述本包的内容、产品模块名称和版本、公司版权、生成日期等。× 3、类注释部分,描述部分说明该类或者接口的功能、作用、使用方法和注意事项,每次修改后增加作者、新版本号和当天的日期,@since 表示从那个版本开始就有这个类或者接口,@deprecated 表示不建议使用该类或者接口。× 4、对于方法内部用throw语句抛出的异常,必须在方法的注释中标明;对于所调用的其他方法所抛出的异常,在注释中要求说明所有的异常;对于非RuntimeException,即throws 子句声明会抛出的异常,必须在方法的注释中标明。× 5、类名和接口使用完整的英文单词描述,每个英文单词的首字母使用大写、其余字母使用小写的大小写混合法。× 6、com.huawei.四级部门名称.项目名称,符合包命名规范。√ 7、不能用异常来做一般流程处理的方式,不要过多地使用异常,异常的处理效率比条件分支低,而且异常的跳转流程难以预测。√ 8、划分类的时候,应该尽量把逻辑处理、数据和显示分离,实现类功能的多样化。× 9、一个方法不应抛出太多类型的异常,如果程序中需要分类处理异常,则将异常根据分类组织成继承关系。√ 10、switch 语句中的case 关键字要和后面的常量保持一个空格;如果有特殊的需要要在switch语句中定义case以外的标签,需要在注释中说明。× 11、没有被覆盖的友好方法和没有子类的友好类应该定义成final。√ 12、简单的类可以通过名字比较两个对象的类,推荐使用getClass()或者instanceof()。× 13、不要调用Thread 类的resume(), suspend(),sleep(), stop() 方法。× 14、判断方法是否是重载,只关注方法名、参数个数、参数类型,不关注方法返回值;√ 二、单选题(每题2分,共36分) 1、下面的选项与公司的排版规范不相符的是B A.如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在Java语言中括号已是最清晰的标志了。 B. DatabaseKey servicekey = null; key = getServiceKey(); currentEventsCount = getCurrentEventsCount(); if (currentEventsCount > 0 ) { //...program code } C. if ( writeToFile ) { writeFileThread.interrupt(); }

JAVA命名规则

1. Package 的命名 Package 的名字应该都是由小写单词组成。package com.neu.util 2. Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成,对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。 public class ThisAClassName{} 3. Class 变量的命名 变量的名字必须用一个小写字母开头。后面的单词用大写字母开头,如userName , thisAClassMethod 4. Static Final 变量的命名 static Final 变量的名字应该都大写,并且指出完整含义。 public static final String DB_CONFIG_FILE_PATH ="com.neu.etrain.dbconfig"; 5. 数组的命名 数组应该总是用下面的方式来命名: byte[ ] buffer; 而不是:byte buffer[]; 6, 方法的参数 使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字: SetCounter(int size){ this.size = size; } 7, {} 对 {} 中的语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的: if (i>0) { i ++ }; // 错误, { 和} 在同一行 if (i>0) { i ++ }; // 正确, { 单独作为一行 } 语句永远单独作为一行. } 语句应该缩进到与其相对应的{ 那一行相对齐的位置。

8.括号 左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格. 下面的例子说明括号和空格的错误及正确使用: CallProc( AParameter ); // 错误 CallProc(AParameter); // 正确 9, Java的语法与C++ 及为相似,那么,你知道Java 的注释有几种吗?是两种? // 注释一行 注释若干行 不完全对,除了以上两种之外,还有第三种,文档注释: 注释若干行,并写入javadoc 文档 Java代码规范 --注释 @author LEI @version 1.10 2005-09-01 1 注释文档的格式 注释文档将用来生成HTML格式的代码报告,所以注释文档必须书写在类、域、构造函数、方法、定义之前。注释文档由两部分组成——描述、块标记。 例如: public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } 前两行为描述,描述完毕后,由@符号起头为块标记注视。 2 注释的种类 2.1 文件头注释 文件头注释以结束,需要注明该文件创建时间,文件名,命名空间信息。

java实体类命名规范

竭诚为您提供优质文档/双击可除java实体类命名规范 篇一:java各种命名规范 定义规范的目的是为了使项目的代码样式统一,使程序有良好的可读性。 包的命名(全部小写,由域名定义) java包的名字都是由小写单词组成。但是由于java面向对象编程的特性,每一名java程序员都可以编写属于自己的java包,为了保障每个java包命名的唯一性,在最新的java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程 序包的唯一前缀。 例如:net.frontfree.javagroup 类的命名(单词首字母大写) 根据约定,java类名通常以大写字母开头,如果类名称由多个单词组成,则每个单词的首字母均应为大写例如testpage;如果类名称中包含单词缩写,则这个缩写词的每个字母均应大写,如:xmlexample,还有一点命名技巧就是

由于类是设计用来代表对象的,所以在命名类时应尽量选择名词。 例如:graphics 方法的命名(首字母小写,字母开头大写) 方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。例如:drawimage 常量的命名(全部大写,常加下划线) 常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。 例如:max_Value 参数的命名 参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。 javadoc注释 java除了可以采用我们常见的注释方式之外,java语言规范还定义了一种特殊的注释,也就是我们所说的javadoc注释,它是用来记录我们代码中的api的。javadoc 注释是一种多行注释,以/**开头,而以*/结束,注释可以包含一些html标记符和专门的关键词。使用javadoc注释的好处是编写的注释可以被自动转为在线文档,省去了单独

java命名规范

java项目命名规范2009-07-27 13:31规范等级说明 级别I: 默认登记要求所有项目中的所有成员遵守。 级别II: 建议所有项目中的所有成员遵守。 级别III: 鼓励各个项目根据实际情况执行。 1.格式与命名规范(Formating and Naming Conventions) 1.1 缩进 使用Tab缩进,而不是空格键--将缩进2,4,8字符的选择权留给阅读者。 1.2 换行 每行120字符--因为已是1024*768的年代。 if,for,while语句只有单句时,如果该句可能引起阅读混淆,需要用" {"和"}"括起来,否则可以省略。 //错误,需要使用花括号{}括起来 if (condition) if(condition) doSomething(); else doSomething(); 1.3 命名规则 遇到缩写如XML时,仅首字母大写,即loadXmlDocument()而不是loadXMLDocument() Package名必须全部小写,尽量使用单个单词 Interface名可以是一个名词或形容词(加上'able','ible', or 'er'后缀),如Runnable,Accessible。 为了基于接口编程,不采用首字母为I或加上IF后缀的命名方式,如IBookDao,BookDaoIF。 局部变量及输入参数不要与类成员变量同名(get/set方法与构造函数除外) 1.4 声明 修饰符应该按照如下顺序排列:public, protected, private, abstract, static, final, transient, volatile, synchronized, native, strictfp。 类与接口的声明顺序(可用Eclipse的source->sort members功能自动排列): 静态成员变量/ Static Fields 静态初始化块/ Static Initializers 成员变量/ Fields 初始化块/ Initializers 构造器/ Constructors 静态成员方法/ Static Methods 成员方法/ Methods 类型(内部类) / Types(Inner Classes) 同等的类型,按public, protected, private的顺序排列。 2.注释规范(Document Convertions)

JAVA编程规范大全之命名规范

JAVA编程规范大全之命名规范 命名规范 定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性) Package 的命名 Package 的名字应该都是由一个小写单词组成。 Class 的命名 Class 的名字必须由大写字母开头而其他字母都小写的单词组成 Class 变量的命名 变量的名字必须用一个小写字母开头。后面的单词用大写字母开头。 Static Final 变量的命名 Static Final 变量的名字应该都大写,并且指出完整含义。 参数的命名 参数的名字必须和变量的命名规范一致。 数组的命名 数组应该总是用下面的方式来命名: byte[] buffer; 而不是: byte buffer[]; 方法的参数 使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字: SetCounter(int size){ this.size = size; } Java 文件样式 所有的Java(*.java) 文件都必须遵守如下的样式规则 版权信息 版权信息必须在java 文件的开头,比如:

/** * Copyright ? 2000 Shanghai XXX Co. Ltd. * All right reserved. */ 其他不需要出现在javadoc 的信息也可以包含在这里。 Package/Imports package 行要在import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母顺序排列。如果import 行中包含了同一个包中的不同子目录,则应该用* 来处理。 package https://www.360docs.net/doc/3b14024178.html,.stats; import java.io.*; import java.util.Observable; import hotlava.util.Application; 这里java.io.* 使用来代替InputStream and OutputStream 的。 Class 接下来的是类的注释,一般是用来解释类的。 /** * A class representing a set of packet and byte counters * It is observable to allow it to be watched, but only * reports changes when the current set is complete */ 接下来是类定义,包含了在不同的行的extends 和implements public class CounterSet extends Observable implements Cloneable Class Fields 接下来是类的成员变量: /** * Packet counters */ protected int[] packets;

java的包类方法变量命名规范

1.Java中的命名规则 2. 3. 4.在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的。 比如,大小写的区分,使用不同字母开头等等。但究其本,追其源,在为一个资源其名称的时候,应该本着描述性以及唯一性这两大特征来命名,才能保证资源之间不冲突,并且每一个都便于记忆。 5. 6.包的命名 7. 8.Java包的名字都是由小写单词组成。但是由于Java面向对象编程的特性,每一 名Java程序员都可以编写属于自己的Java包,为了保障每个Java包命名的唯一性,在最新的Java编程规范中,要求程序员在自己定义的包的名称之前加上唯一的前缀。 由于互联网上的域名称是不会重复的,所以程序员一般采用自己在互联网上的域名称作为自己程序包的唯一前缀。 9.例如: net.frontfree.javagroup 10. 11.类的命名 12. 13.类的名字必须由大写字母开头而单词中的其他字母均为小写;如果类名称由多 个单词组成,则每个单词的首字母均应为大写例如TestPage;如果类名称中包含单词缩写,则这个所写词的每个字母均应大写,如:XMLExample,还有一点命名技巧就是由于类是设计用来代表对象的,所以在命名类时应尽量选择名词。 14.例如: Circle 15. 16.方法的命名 17. 18.方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开 头。 19.例如: sendMessge 20. 21.常量的命名 22. 23.常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名 称由多个单词组成,则应该用下划线来分割这些单词。 24.例如: MAX_V ALUE 25. 26.参数的命名 27. 28.参数的命名规范和方法的命名规范相同,而且为了避免阅读程序时造成迷惑,请在 尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。 29. 30.Javadoc注释 31.

java编码规范测验题答案

java编码规范测验题答案

————————————————————————————————作者:————————————————————————————————日期:

一、单选题 1. 如下关于集合类的描述错误的是B A. 含有集合意义的属性命名,尽量包含其复数的意义 B. 集合中的数据不需要释放,垃圾回收器会自动回收 C. 集合必须指定模板类型 D. 使用集合类时要设置初始化容量 2. 关于线程以下说法错误的有B A. 新起一个线程,都要使用Thread.setName(“…”)设置线程名 B. 在JDK1.5或更新的版本中,若字符串拼接发生在单线程环境,使用StringBuffer C. 对多线程访问的变量、方法,必须加锁保护,避免出现多线程并发访问引起的问题 D. 线程使用时,要在代码框架中使用线程池,避免创建不可复用的线程;禁止在循环中创建新线程,否则会引起JVM资源耗尽 3. 下面哪个是推荐使用的对称密码算法B A. DES B. AES C. SHA D. RSA

4. 以下说法正确的有C A. 程序中的一些状态多直接用数字表示,如函数执行成功return 1 B. 对于表示函数执行错误,多用约定的错误码来标识 C. 用有意义的静态变量或者枚举来代替数字型的程序状态,如函数执行成功return SUCCESS D. 程序中的魔鬼数字并不可怕,需要所有开发人员努力理解这些数字的含义 5. 下列错误使用异常的做法是D A. 在程序中使用异常处理还是使用错误返回码处理,根据是否有利于程序结构来确定,并且异常和错误码不应该混合使用,推荐使用异常 B. 一个方法不应抛出太多类型的异常。throws/exception子句标明的异常最好不要超过三个 C. 异常捕获尽量不要直接catch (Exception ex),应该把异常细分处理 D. 程序内抛出的异常本身就可说明异常的类型、抛出条件,可不填写详细的描述信息。捕获异常后用exception.toString()取到详细信息后保存 6. 关于命名规范,以下说法错误的有D A. 属性名使用意义完整的英文描述,第一个单词的字母使用小写,剩余单词首字母大写其余字母小写的大小写混合法。属性名不能与方法名相同 B. 方法名使用类意义完整的英文描述:第一个单词的字母使用小写、剩余单词首字母大写其余字母小写的大小写混合法 C. 方法中,存取属性的方法采用setter 和getter方法,动作方法采用动词和动宾结构

java语言编程规范

Java语言编程规范 1说明 本规范规定了使用Java语言编程时排版、注释、命名、编码和习惯建议。 2适用说明 本规范作为业界通用的规范,适用于使用Java语言编程的部门和产品。对于各个细分语言,可以在本规范的基础上制定出额外的规范。 1术语和定义 规则:编程时强制必须遵守的原则。 建议:编程时必须加以考虑的原则。 格式:对此规范格式的说明。 说明:对此规范或建议进行必要的解释。 示例:对此规范或建议从正、反两个方面给出例子。

II.排版规范 A.规则 1. *程序块要采用缩进风格编写,缩进的空格数为4个。 说明:对于由开发工具自动生成的代码可以有不一致。 2. *较长的语句、表达式或参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划 分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。 示例: if (filename != null && new File(logPath + filename).length() < LogConfig.getFileSize()) { ... // program code } public static LogIterator read(String logType, Date startTime, Date endTime, int logLevel, String userName, int bufferNum) 3. *不允许把多个短语句写在一行中,即一行只写一条语句 示例:如下例子不符合规范。 LogFilename now = null; LogFilename that = null; 应如下书写 LogFilename now = null; LogFilename that = null; 4. *if, for, do, while, case, switch, default 等语句自占一行,且if, for, do, while等语句的执行语句无论 多少都要加括号{}。 示例:如下例子不符合规范。 if(writeToFile) writeFileThread.interrupt(); 应如下书写: if(writeToFile) {

相关文档
最新文档