JNDI的基本应用

32 篇文章 0 订阅

一、 JNDI的基本应用

JNDI是Java Naming and Directory Interface(JAVA命名和目录接口)的英文简写,它是为JAVA应用程序提供命名和目录访问服务的API(Application Programing Interface,应用程序编程接口)。

1.命名的概念与应用

JNDI中的命名(Naming),就是将Java对象以某个名称的形式绑定(binding)到一个容器环境(Context)中,以后调用容器环境(Context)的查找(lookup)方法又可以查找出某个名称所绑定的Java对象。读者也许会感到奇怪:自己创建一个Java对象,将其绑定到JNDI容器环境中后又查询出来,这有什么意思?在真实的项目应用中,通常是由系统程序或框加程序先将资源对象绑定到JNDI环境中,以后在该系统或框架中运行的模块程序就可以从JNDI环境中查找这些资源对象了。例如,Tomcat服务器在启动时可以创建一个连接到某种数据库系统的数据源(DataSource)对象,并将该数据源(DataSource)对象绑定到JNDI环境中,以后在这个Tomcat服务器中运行的Servlet和JSP程序就可以从JNDI环境中查询出这个数据源(DataSource)对象进行使用,而不用关心数据源(DataSource)对象是如何创建出来的,这种方式极大地增强了系统的可维护性,当数据库系统的连接参数发生变更时,这只是Tomcat系统管理员一个人要关心的事情,而与所有的应用程序开发人员无关。

容器环境(Context)本身也是一个Java对象,它也可以通过一个名称绑定到另一个容器环境(Context)中。将一个Context对象绑定到另外一个Context对象中,这就形成了一种父子级联关系,多个Context对象最终可以级联成一种树状结构,树中的每个Context对象中都可以绑定若干个Java对象,如图6.10所示。

图6.10

图6.10中的每个方框分别代表一个Context对象,它们绑定的名称分别为a、b、c、d、e,b和c是a的子Context,d是b的子Context,e又是d的子Context。图9.x中的各个方框内的每个小椭圆分别代表一个Java对象,它们也都有一个绑定的名称,这些绑定名称分别为dog、pig、sheet等,在同一个Context不能绑定两个相同名称的Java对象,在不同的Context中可以出现同名的绑定对象。可见,Context树的级联结构与文件系统中的目录结构非常类似,Context与其中绑定的Java对象的关系也非常类似于文件系统中的目录与文件的关系。从图6.10中可以看到,要想得到Context树中的一个Java对象,首先要得到其所在的Context对象,只要得到了一个Context对象,就可以调用它的查询(lookup)方法来获得其中绑定的Java对象。另外,调用某个Context对象的lookup方法也可以获得Context树中的任意一个Context对象,这只需要在lookup方法中指定相应的Context路径即可。在JNDI中不存在着“根”Context的概念,也就是说,执行JNDI操作不是从一个“根”Context对象开始,而是可以从Context树中的任意一个Context开始。无论如何,程序必须获得一个作为操作入口的Context对象后才能执行各种JNDI命名操作,为此,JNDI API中提供了一个InitialContext类来创建用作JNDI命名操作的入口Context对象。Context是一个接口,Context对象实际上是Context的某个实现类的实例对象,选择这个具体的Context实现类并创建其实例对象的过程是由一个Context工厂类来完成的,这个工厂类的类名可以通过JNDI的环境属性java.naming.factory.initial指定,也可以根据Context的操作方法的url参数的Schema来选择。

2.目录的概念与应用

JNDI中的目录(Directory)与文件系统中的目录概念有很大的不同,JNDI中的目录(Directory)是指将一个对象的所有属性信息保存到一个容器环境中。JNDI的目录(Directory)原理与JNDI的命名(Naming)原理非常相似,主要的区别在于目录容器环境中保存的是对象的属性信息,而不是对象本身,所以,目录提供的是对属性的各种操作。事实上,JNDI的目录(Directory)与命名(Naming)往往是结合在一起使用的,JNDI API中提供的代表目录容器环境的类为DirContext,DirContext是Context的子类,显然它除了能完成目录相关的操作外,也能完成所有的命名(Naming)操作。DirContext是对Context的扩展,它在Context的基础上增加了对目录属性的操作功能,可以在其中绑定对象的属性信息和查找对象的属性信息。JNDI中的目录(Directory)的结构示意图如图6.11所示。

图6.11

图6.11中的每个最外层的方框分别代表一个DirContext对象,它们绑定的名称分别为a、b,b是a的子DirContext。图6.11中的各个最外层的方框内的每个小椭圆分别代表一个Java对象,各个里层的方框分别代表一个对象的属性。从名称为a的DirContext中的内容可以看到,一个DirContext容器环境中即可以绑定对象自身,也可以绑定对象的属性信息,绑定的对象和绑定的属性是完全独立的两个事物,即使它们的绑定名称相同,它们的操作也是完全独立的。另外,一个属性可以有多个属性值,例如,dog对象的category属性就设置了两个属性值:meat和pet。从名称为b的DirContext中的内容可以看到,一个DirContext容器环境中也可以只绑定对象的属性信息,而不绑定任何对象自身。与Context的操作原理类似,JNDI API中提供了一个InitialDirContext类来创建用作JNDI命名与目录属性操作的入口DirContext对象。

3. 用于DNS查询的JNDI服务程序

JNDI API是面向应用程序开发人员的编程接口,它在运行时需要调用某个具体的JNDI服务程序,JNDI API与JNDI服务程序之间的关系,犹如JDBC与JDBC驱动程序之间的关系。从JDK 1.3开始,JDK中就集成了JNDI API,从JDK 1.4开始的版本又集成了用于DNS查询的JNDI服务程序,所以,如果我们使用JDK 1.4及更高的JDK版本来开发DNS信息查询程序时,不需要下载和安装JNDI API和用于DNS查询的JNDI服务程序。SUN公司提供的用于查询DNS信息的JNDI服务程序,将某个域名的DNS信息以属性的形式绑定到代表该域名的DirContext对象上。打开JDK帮助文档的首页,在其中搜索“jndi”关键字,可以看到一条“jndi”的超链接,单击这个超链接,就可以进入“Java Naming and Directory Interface”的帮助页面,如图6.12所示。

图6.12

单击图6.12中的“The DNS Service Provider”超链接,进入DNS服务程序的帮助页面。只要我们具备JDNI编程的一些基本知识,再加上该帮助文档页提供的信息,我们就知道如何调用这个DNS服务程序来获得某个域的DNS信息和MX记录了。

下面编写一个试验性的JNDI程序,这个程序用于帮助我们熟悉和掌握JNDI API的使用,也帮助我们了解DNS的JNDI服务程序以怎样的形式返回DNS信息。

动手实践:使用JNDI API获取DNS信息

()按例程6-5编写一个名为DNSQuery.java的程序,这个程序使用JNDI API来获得某个域的DNS信息,并从中提取出域的一台SMTP服务器的名称,其中的很多代码都是为了帮助我们熟悉JNDI API的使用和了解DNS的JNDI服务程序返回的DNS信息内容而加入的。运行这个程序时,需要指定一个或两个参数,第一个参数是必须的,为要查询的域名,第二个参数是可选的,为查询时所使用的DNS服务器的IP地址,如果没有指定第二个参数,DNS的JNDI服务程序将使用底层操作系统上设置的DNS服务器。

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;

public class DNSQuery 
{
	public static void main(String[] args) throws NamingException 
	{
		/*第一个参数指定要查询的域或主机名,第二个参数指定查询的DNS服务器,
		为了程序的简单易读性,省略了严格的参数错误检查*/
		String domain = args[0];
		String dnsServer = args.length<2 ? "" : ("//" + args[1]);
		
		//通过环境属性来指定Context的工厂类
		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY, 
					"com.sun.jndi.dns.DnsContextFactory");
		env.put(Context.PROVIDER_URL, "dns:" + dnsServer);
		DirContext ctx = new InitialDirContext(env);
		//分别获取包含所有属性和只包含Mx属性的Attributes对象
		Attributes attrsAll = ctx.getAttributes(domain);	
		Attributes attrsMx = ctx.getAttributes(domain, new String[]{"MX"});	
		
		/*上面的整段程序代码也可以用下面这段程序代码来替代,下面这段程序
		代码通过查询URL中的Schema信息来自动选择Context的工厂类*/
		/*
		DirContext ctx = new InitialDirContext();
		Attributes attrsAll = ctx.getAttributes("dns:" + dnsServer + "/" + domain);
		Attributes attrsMx = ctx.getAttributes(
			"dns:" + dnsServer + "/" + domain, new String[]{"MX"});			
		*/
		
		System.out.println("打印出域" + domain + 
								"的Attributes对象中的信息:");
		System.out.println(attrsAll);
		System.out.println("--------------------------");
		System.out.println("打印只检索域" + domain + 
								"的MX记录的Attributes对象:");		
		System.out.println(attrsMx);
				
		System.out.println("--------------------------");
		System.out.println("逐一打印出Attributes对象中的各个属性:");			
		NamingEnumeration attributes = attrsAll.getAll();
		while(attributes.hasMore()) 
		{	
			System.out.println(attributes.next());
		}
				
		System.out.println("--------------------------");
		//直接调用get方法从attrsMx集合检索MX属性
		System.out.println("直接检索Attributes对象中的MX属性:");		
		Attribute attrMx = attrsAll.get("MX");
		System.out.println(attrMx);	
		
		System.out.println("--------------------------");			
		//获取Mx属性中的第一个值:
		System.out.println("获取Mx属性中的第一个值:");
		String recordMx = (String)attrMx.get();
		System.out.println(recordMx);
		//从Mx属性的第一个值中提取邮件服务器地址
		System.out.println("从MX属性值中提取的邮件服务器地址:");
		String smtpServer = recordMx.substring(
							recordMx.indexOf(" ") + 1);
		System.out.println(smtpServer);
}

例程6-5  DNSQuery.java

(2)在Windows命令行窗口中编译DNSQuery.java程序后,接着在命令行窗口中执行如下命令:

ipconfig /all

如果ipconfig命令显示的结果中包含有DNS Server的信息,那么我们接着就可以使用如下命令来启动执行DNSQuery类:

java  DNSQuery  sina.com

上面的命令的运行结果如图6.13。

图6.13

()假设在上一步用ipconfig命令查看到的本地计算机上配置的DNS Server为202.106.46.151,那么,我们接着执行如下命令:

java  DNSQuery  sina.com  202.106.46.151

这个命令执行完后,也能显示出图6.13中的信息。我们接着故意将上面命令中的DNS服务器参数指定为一个错误的IP地址进行执行,修改后的命令语句如下所示:

java  DNSQuery  sina.com  192.168.1.151

这个命令执行完后的结果如图6.14所示:

图6.14

如果计算机只能通过代理服务器连接到Internet,那么在该计算机上直接执行如下命令:

java  DNSQuery  sina.com

这也将导致图6.14中的错误。如果要想在通过代理服务器上网的情况下,正确执行上面的程序,可以采用如下命令:

java -DsocksProxyHost=162.105.1.200 -DsocksProxyPort=808 

DNSQuery  sina.com  202.106.46.151

由于上面的命令太长,在排版时分成了两行来书写,读者在输入上面这条命令时,不要手工换行。读者应该根据自己的实际情况,修改其中的代理服务器地址、代理端口号和DNS服务器的地址。

6.7.3 编写具有SMTP服务器功能的邮件发送程序

编写具有SMTP服务器功能的邮件发送程序的首要任务就是要能根据收件人地址获得其所在的SMTP服务器名称,也就是要能从DNS服务器上查询出收件人所在域的MX记录,并解析出MX记录中的SMTP服务器名称。获得收件人地址所在的SMTP服务器名称后,应用程序就可以直接连接上该SMTP服务器发送邮件,发送邮件时不需要进行用户认证。

:动手实践:以SMTP服务器方式发送邮件

(1)按例程6-6编写一个名为SMTPSender.java的程序,这个程序向属于多个不同域的收件人发送邮件,它直接连接到每个收件人所在域的SMTP服务器进行邮件发送。

import javax.naming.Context;

import javax.naming.NamingException;

import javax.naming.directory.Attribute;

import javax.naming.directory.Attributes;

import javax.naming.directory.DirContext;

import javax.naming.directory.InitialDirContext;



import java.util.Properties;

import java.util.Date;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.Message;

import javax.mail.internet.MimeMessage;





public class SMTPSender

{

public static void main(String[] args) throws Exception

{

//下面是邮件要群发给的多个收件人地址

String [] to = {"it315_test@sohu.com","it315_test@sina.com",

"it315_test@163.com","it315_test@126.com"};

     

//创建Session对象

Properties props = new Properties();

/*mail.smtp.localhost属性用于设置SMTP协议的EHLO命令中的

主机名,其他SMTP服务器可能需要使用这个主机名确定发件SMTP

服务器的身份,这个信息可以从JavaMail的javadocs文档中的

com.sun.mail.smtp包的帮助页面内查看到。

*/

props.setProperty("mail.smtp.localhost","mail.itcast.cn");

Session session = Session.getInstance(props);

session.setDebug(true);



Message msg = createMessage(session);

for(int i=0; i<to.length; i++)

{

try

{

sendMessage(session,msg,to[i]);

}

catch(Exception e)

{

e.printStackTrace();

}

}

}



public static Message createMessage(Session session)

throws Exception

{



String from = "it315_test@sina.com ";//发件人地址

String subject = "SMTPSender demo";//邮件主题

String body = "SMTPSender demo";//邮件内容



//创建代表邮件的MimeMessage对象,不包含收件人地址

MimeMessage msg = new MimeMessage(session);

msg.setFrom(new InternetAddress(from));

msg.setSentDate(new Date());

msg.setSubject(subject);

msg.setText(body);

return msg;

}



public static void sendMessage(Session session,Message msg,String to)

throws Exception

{

//设置邮件内容的收件人并生成邮件消息内容

msg.setRecipients(Message.RecipientType.TO,

InternetAddress.parse(to));

msg.saveChanges();



//连接收件人地址所在的SMTP服务器并发送邮件

Transport transport = session.getTransport("smtp");

String domain = to.substring(to.indexOf("@")+1);

String smtpServer = getSmtpServer(domain,null);

transport.connect(smtpServer,null,null);

transport.sendMessage(msg,

           msg.getRecipients(Message.RecipientType.TO));

transport.close();

}



public static String getSmtpServer(String domain,String dnsServer)

throws Exception

{

DirContext ctx = new InitialDirContext();

Attributes attrsMx = null;

if(dnsServer != null)

{

attrsMx = ctx.getAttributes("dns:" + "//" + dnsServer +

"/" + domain, new String[]{"MX"});

}

else

{

attrsMx = ctx.getAttributes("dns:" + "/" + domain, new String[]{"MX"});

}



String recordMx = (String)attrsMx.get("MX").get();

String smtpServer = recordMx.substring(

recordMx.indexOf(" ") + 1);

return smtpServer;

}

}

例程6-6  SMTPSender.java

实际的SMTP服务器程序要比上面的程序复杂得多,它们每天要向大量的其他SMTP服务器发送大量的邮件,当它们连接上一台其他的SMTP服务器并发送一封邮件后,是否要立即与这个服务器断开连接呢?这就是一个比较难以处理的问题了,如果不断开连接,而随后一段时间内又没有要发送给该SMTP服务器的邮件了,这样就造成网络连接资源浪费;如果发送一封邮件后立即断开与该SMTP服务器的连接,而随后的邮件又是要发送到的该SMTP服务器,又要重新与该SMTP服务器建立连接,这样明显是一种低效率的方法。关于这个问题,有兴趣的读者可以去看一些开源的SMTP服务器程序的源代码,我们就不再这里讨论如何解决这些问题了。

(2)在Windows命令行窗口中编译并运行这个java程序,通常情况下,这个程序发送邮件的过程都会以失败告终,如图6.15所示。

图6.15

出现图6.15中的错误是因为现在的大多数SMTP服务器都增加了一些防垃圾邮件的措施,如果邮件发送程序以SMTP服务器的身份向它们发送邮件,它们要求运行该邮件发送程序的计算机必须在Internet上注册了主机名(也就是A记录),并且这台计算机的IP地址没有被列入进它们的黑名单,而我和读者们使用的计算机往往都无法满足这些条件。

对于sina这样的大型网站,它们提供了完全独立的SMTP服务器来分别与普通邮件客户端程序和其他SMTP服务器进行通信。邮件客户端程序连接的SMTP服务器是smtp.sina.com.cn,smtp.sina.com.cn服务器总是要求对方进行用户身份验证。其他smtp服务器连接的sina的SMTP服务器是sina.com域中MX记录所对应的计算机,例如,sinamx.sina.com.cn,这些注册成了MX记录的计算机不要求对方进行用户身份验证,但也采取各种方式来防止对方发送垃圾邮件。显然,smtp.sina.com.cn是不能被注册为MX记录的,因为它需要对方传递用户身份信息,其他SMTP无法根本无法与之正常通信。

对于小型网站,它们用同一台SMTP服务器来与普通邮件客户端程序和其他SMTP服务器进行通信,它们通常根据对方在ehlo命令中提供的主机名是否与该计算机的ip地址反向解析到的主机名一致来判断对方是普通的邮件客户端程序,还是其他SMTP服务器。如果对方在ehlo命令中指定的主机名与对方的IP地址不匹配,小型网站的SMTP服务器程序则认为对方是普通的邮件客户端程序,需要对方传递用户认证信息;如果对方在ehlo命令中指定的主机名与对方的IP地址匹配,小型网站的SMTP服务器程序则认为对方也是一台SMTP服务器,不需要对方提供用户认证信息即可直接发送邮件。

  • 30
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
内容为J2EE应用开发详解中的源代码 第1章 Java Web应用开发简介 1   1.1 Java EE应用概述 1   1.2 Java EE概念 1   1.2.1 Java EE多层模型 1   1.2.2 Java EE体系结构 2   1.3 Java EE的核心API与组件 4   1.4 Web服务器和应用服务器 13   1.5 小结 16   第2章 建立开发平台 17   2.1 构建开发环境 17   2.1.1 安装JDK 17   2.1.2 安装Tomcat 21   2.1.3 安装Eclipse 23   2.2 配置开发环境 23   2.3 小结 26   第3章 Java的反射机制 27   3.1 Java反射API 27   3.2 加载类的实例 29   3.2.1 加载class对象的两种方式 29   3.2.2 Class.forName()加载类的实例 30   3.2.3 loadClass获得类的实例 31   3.3 操作类的字段 31   3.3.1 获取对象的属性 31   3.4 操作类的方法 34   3.4.1 运行时调用对象的方法 34   3.4.2 无参构造函数 36   3.4.3 带参构造函数 37   3.5 动态代理 39   3.6 反射机制在Hibernate中的应用 42   3.7 小结 46   第4章 Servlet技术 47   4.1 Servlet简介 47   4.1.1 Servlet的特点 47   4.1.2 Servlet的优势 48   4.1.3 Servlet的工作过程 49   4.1.4 Servlet的生命周期 50   4.2 开发和部署一个简单的Servlet 51   4.3 Servlet常用API介绍 53   4.3.1 Servlet实现相关 54   4.3.2 Servlet配置相关 54   4.3.3 Servlet异常相关 55   4.3.4 请求和响应相关 55   4.3.5 会话跟踪 56   4.3.6 Servlet上下文 57   4.3.7 Servlet协作 57   4.3.8 Filter 58   4.4 使用Servlet处理客户端请求 58   4.5 会话跟踪 61   4.5.1 使用Cookie进行会话跟踪 61   4.5.2 使用URL重写进行会话跟踪 62   4.5.3 使用隐藏表单域进行会话跟踪 63   4.6 小结 65   第5章 JSP技术 67   5.1 JSP简介 67   5.2 JSP页面的结构 68   5.3 脚本元素 68   5.3.1 Scriptlet元素 69   5.3.2 Expression元素 69   5.3.3 Declaration元素 70   5.4 指令 73   5.4.1 page指令 73   5.4.2 include指令 75   5.5 动作 76   5.5.1 Resource动作 76   5.5.2 JavaBean动作 78   5.6 隐式对象 78   5.6.1 request对象 78   5.6.2 response对象 78   5.6.3 application对象 78   5.6.4 out对象 79   5.6.5 page对象 79   5.6.6 session对象 79   5.6.7 exception对象 80   5.6.8 pageContext对象 80   5.6.9 config对象 80   5.7 JSP自定义标签 81   5.8 小结 84   第6章 XML、CSS和XSLT 85   6.1 XML 85   6.1.1 什么是XML 85   6.1.2 XML的产生 85   6.1.3 XML的用途 86   6.1.4 XML元素 87   6.1.5 XML属性 87   6.1.6 XML语法规则 89   6.1.7 XML检验 91   6.2 CSS 92   6.3 XSLT 94   6.4 小结 96   第7章 Ajax简介 97   7.1 Ajax简介 97   7.2 Ajax技术核心 100   7.2.1 XMLHttpRequest对象的常用方法 100   7.2.2 标准的XMLHttpRequest属性 101   7.3 一个简单的Ajax实例 101   7.4 小结 104   第8章 Struts2框架 105   8.1 Web应用的发展 105   8.2 Struts2的起源和体系结构 106   8.3 Struts2核心部分详解 108   8.3.1 核心控制器FilterDispatcher 108   8.3.2 业务逻辑控制器Action 111   8.3.3 业务逻辑组件 116   8.3.4 Struts2表示层 118   8.3.5 Struts2配置文件 119   8.4 Action的配置方式 121   8.4.1 动态方法调用 121   8.4.2 设置action元素的method属性 122   8.4.3 使用通配符配置action 122   8.4.4 默认action 123   8.5 拦截器Interceptor 123   8.5.1 拦截器的定义 124   8.5.2 拦截器的实现原理 124   8.5.3 Struts2的内置拦截器 124   8.5.4 拦截器的配置和使用 125   8.5.5 自定义拦截器 126   8.6 一个简单的Struts2应用 130   8.7 小结 140   第9章 JSF 141   9.1 JSF技术简介 141   9.1.1 JSF与MVC模式 141   9.1.2 JSF应用程序配置 142   9.2 一个简单的JSF应用 142   9.2.1 JSF应用程序开发步骤 143   9.2.2 用户登录实例 143   9.3 JSF应用程序架构 147   9.3.1 JSF请求处理生命周期 147   9.3.2 JSF事件驱动模型 148   9.3.3 JSF导航模型 149   9.4 JSF的组成 152   9.4.1 UI组件 152   9.4.2 JSF标签 154   9.5 统一EL 156   9.5.1 表达式和函数 156   9.5.2 操作符 157   9.5.3 保留字 158   9.5.4 内置对象 158   9.6 Backing Bean 158   9.7 创建自定义组件 162   9.8 小结 164   第10章 JavaBean 165   10.1 JavaBean简介 165   10.1.1 JavaBean的特点 166   10.1.2 JavaBean的元素及属性 167   10.1.3 JavaBean的分类 168   10.2 创建JavaBean 168   10.2.1 JavaBean的规格说明 168   10.2.2 创建一个简单的JavaBean 168   10.3 在JSP中使用JavaBean 169   10.4 使用JavaBean连接数据库 172   10.5 小结 177   第11章 EJB 179   11.1 EJB简介 179   11.1.1 EJB的特点 179   11.1.2 EJB类型与组成 180   11.1.3 EJB 3.0的新特性 181   11.2 元数据注释和部署描述符 181   11.2.1 元数据注释 181   11.2.2 部署描述符 182   11.3 EJB支持JNDI 183   11.3.1 JNDI的概念 183   11.3.2 使用JNDI 186   11.4 会话Bean 191   11.4.1 会话Bean的分类 191   11.4.2 会话Bean的组成 195   11.4.3 会话Bean的生命周期 196   11.4.4 创建无状态会话Bean 197   11.4.5 创建有状态会话Bean 198   11.5 消息驱动Bean和消息服务 199   11.5.1 JMS 200   11.5.2 消息驱动Bean的生命周期 202   11.5.3 创建消息驱动Bean 202   11.6 实体Bean 203   11.6.1 实体Bean的特性 204   11.6.2 实体Bean的分类及组成 204   11.6.3 EJB 3.0中的实体Bean 206   11.7 EJB事务 208   11.7.1 基于容器管理事务 209   11.7.2 基于Bean管理的事务 210   11.8 EJB拦截器 212   11.9 EJB定时服务 214   11.10 EJB安全管理 214   11.11 小结 216   第12章 RMI 217   12.1 RMI简介 217   12.1.1 RMI的架构 218   12.1.2 RMI的组成及实现 218   12.1.3 RMI的优点 219   12.2 一个RMI的简单实例 219   12.3 小结 226   第13章 Web服务概论 227   13.1 SOA简介 227   13.2 Web服务简介 229   13.3 Web服务的核心技术 230   13.3.1 SOAP 232   13.3.2 WSDL 235   13.3.3 UDDI 236   13.4 小结 236   第14章 CORBA 237   14.1 CORBA的需求 237   14.2 CORBA的架构 237   14.2.1 IDL 239   14.2.2 ORB 240   14.2.3 IIOP 241   14.2.4 BOA 241   14.3 CORBA服务 241   14.4 创建CORBA应用 243   14.5 CORBA与RMI 246   14.5.1 CORBA和RMI的区别 246   14.5.2 CORBA和RMI的互操作 247   14.6 小结 248   第15章 Spring框架 249   15.1 Spring 2.0的体系结构 249   15.2 Ioc容器 250   15.2.1 BeanFactory 250   15.2.2 ApplicationContext 252   15.2.3 Beans的生命周期过程 253   15.2.4 Beans的进阶管理 254   15.3 依赖注入 259   15.3.1 Constructor注入 259   15.3.2 Setter注入 261   15.3.3 Method注入 263   15.4 Spring AOP技术 266   15.4.1 装备(advices) 267   15.4.2 Spring AOP的传统用法 275   15.4.3 基于@AspectJ注释的AOP 277   15.4.4 基于aop命名空间的AOP 279   15.5 小结 282   第16章 数据库技术和JDBC技术 283   16.1 关系数据库和SQL 283   16.2 关系数据库的工作环境 284   16.3 基于JDBC的数据访问技术 285   16.3.1 JDBC概述 285   16.3.2 数据库驱动程序 287   16.3.3 使用JDBC查询数据库 291   16.3.4 常用的JDBC类和方法 294   16.3.5 数据库连接池中使用JDBC 297   16.4 小结 302   第17章 ORM与Java持久化机制 303   17.1 ORM概述 303   17.2 域模型 304   17.3 实体域对象的持久化模式 304   17.4 JPA 305   17.4.1 实体 306   17.4.2 EntityManager 309   17.5 持久化查询语言 313   17.6 常用的JPA注释 316   17.7 小结 318   第18章 Hibernate 319   18.1 Hibernate体系结构 319   18.2 Hibernate核心接口 321   18.3 一个简单的Hibernate例子 321   18.4 详解Hibernate配置文件 325   18.4.1 Hibernate的两种配置方式 325   18.4.2 配置数据库连接池 327   18.5 HQL简介 328   18.6 小结 330   第19章 权限管理系统(Struts+Spring+Hiberante+Ajax) 331   19.1 需求分析 331   19.2 系统总体流程设计 331   19.3 系统设计 332   19.4 系统总体解析 336   19.5 系统功能解析 364   19.5.1 管理员登录 364   19.5.2 模块管理 374   19.5.3 角色数据操作 383   19.5.4 资源操作 391   19.5.5 用户管理 394   19.6 小结 404   第20章 航空订票系统(JSF/Richfaces+EJB+JPA) 405   20.1 需求分析 405   20.2 基本设计理念 406   20.3 系统设计 407   20.3.1 系统用例分析 407   20.3.2 持久化数据分析 413   20.3.3 系统操作序列描述 413   20.3.4 业务接口设计 419   20.4 数据库设计 421   20.4.1 数据库规划 421   20.4.2 具体数据库表 423   20.4.3 SQL代码 426   20.5 系统实现 431   20.5.1 工程开发环境的建立 431   20.5.2 EJB Entity开发 435   20.5.3 EJB Session开发 443   20.5.4 Message-Driven Bean开发 447   20.5.5 JSF/Richfaces开发 448   20.5.6 远程连接 455   20.5.7 系统配置 456   20.6 系统运行 462   20.6.1 服务器的选择 462   20.6.2 系统的部署 462   20.6.3 系统的运行 463   20.7 小结 466
web服务器和应用服务器全文共6页,当前为第1页。web服务器和应用服务器全文共6页,当前为第1页。WEB服务器和使用服务器的区别: web服务器和应用服务器全文共6页,当前为第1页。 web服务器和应用服务器全文共6页,当前为第1页。 1.WEB服务器: 理解WEB服务器,首先你要理解什么是WEB?WEB你可以简单理解为你所看到的HTML页面就是WEB的数据元素,处理这些数据元素的使用软件就叫WEB服务器,如IIS、apache。 WEB服务器和客户端打交道,它要处理的主要信息有:session、request、response、HTML、JS、CS等。 2.使用服务器: 使用服务器如JSP,处理的是非常规性WEB页面(JSP文件),他动态生成WEB页面,生成的WEB页面在发送给客户端(实际上当使用服务器处理完一个JSP请求并完成JSP生成HTML后它的任务就结束了,其余的就是WEB处理的过程了)。 WEB服务器和使用服务器的联系: 1.WEB服务器一般是通用的,而使用服务器一般是专用的,如Tomcat只处理Java使用程序而不能处理ASPX或PHP。而Apache是一个WEB服务器f(HTTP服务器),后来连接Tomcat使用服务器来支持java。 二、另述 WEB服务器、使用程序服务器、HTTP服务器有何区别?IIS、Apache、Tomcat、Weblogic、WebSphere都各属于哪种服务器,这些问题困惑了很久,今天终于梳理清楚了: Web服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。和客户端的网络浏览器配合。因为Web服务器主要支持的协议就是HTTP,所以通常情况下HTTP服务器和WEB服务器是相等的(有没有支持除HTTP之外的协议的web服务器,作者没有考证过),说的是一回事。 使用程序服务器(简称使用服务器),我们先看一下微软对它的定义:"我们把使用程序服务器定义为"作为服务器执行共享业务使用程序的底层的系统软件"。 就像文件服务器为很多用户提供文件一样,使用程序服务器让多个用户可以同时使用使用程序(通常是客户创建的使用程序)" 通俗的讲,Web服务器传送(serves)页面使浏览器可以浏览,然而使用程序服务器提供的是客户端使用程序可以调用(call)的方法(methods)。确切一点,你可以说:Web服务器专门处理HTTP请求(request),但是使用程序服务器是通过很多协议来为使用程序提供(serves)商业逻辑 (business logic)。 以Java EE为例,Web服务器主要是处理静态页面处理和作为 Servlet容器,解释和执行servlet/JSP,而使用服务器是运行业务逻辑web服务器和应用服务器全文共6页,当前为第2页。web服务器和应用服务器全文共6页,当前为第2页。的,主要是EJB、 JNDI和JMX API等J2EE API方面的,还包含事务处理、数据库连接等功能,所以在企业级使用中,使用服务器提供的功能比WEB服务器强大的多。 web服务器和应用服务器全文共6页,当前为第2页。 web服务器和应用服务器全文共6页,当前为第2页。 以这样的定义,IIS、Apache都可以属于Web服务器,Weblogic、WebSphere都属于使用服务器。 Apache:在Web服务器中,Apache是纯粹的Web服务器,经常和Tomcat配对使用。它对HTML页面具有强大的解释能力,但是不能解释嵌入页面内的服务器端脚本代码(JSP/Servlet。 Tomcat:早期的Tomcat是一个嵌入Apache内的JSP/Servlet解释引擎Apache+Tomcat就相当于IIS+ASP。后来的Tomcat已不再嵌入Apache内,Tomcat进程独立于Apache进程运行。 而且,Tomcat已经是一个独立的Servlet和JSP容器,业务逻辑层代码和界面交互层代码可以分离了。因此,有人把Tomcat叫做轻量级使用服务器。 IIS:微软早期的IIS,就是一个纯粹的Web服务器。后来,它嵌入了ASP引擎,可以解释VBScript和JScript服务器端代码了,这时,它就可以兼作使用服务器。当然,它和J2EE使用服务器根本无法相比,但是,从功能上说,从原理上说,它勉强可以称之为使用服务器。确切地说,它是兼有一点使用服务器功能的Web服务器。 综上:Apache是纯粹的web服务器,而Tomcat和IIS因为具有了解释执行服务器端代码的能力,可以称作为轻量级使用服务器或带有服务器功能的Web服务器。 Weblogic、WebSphere因为能提供强大的J2EE功能,毫无疑问是绝对的使用服务器。 对于处于中间位置的Tomcat,它可以配合纯Web服务
要在Tomcat中配置JNDI,你可以按照以下步骤进行操作: 1. 打开Tomcat的配置文件`tomcat/conf/server.xml`。 2. 在`<GlobalNamingResources>`元素中配置全局资源,例如数据库连接池。例如,你可以添加一个`<Resource>`元素来定义一个连接池: ```xml <GlobalNamingResources> <Resource name="jdbc/myDataSource" auth="Container" type="javax.sql.DataSource" maxTotal="100" maxIdle="30" maxWaitMillis="10000" username="your_username" password="your_password" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/your_database"/> </GlobalNamingResources> ``` 在上面的示例中,我们定义了一个名为`jdbc/myDataSource`的资源,它是一个`javax.sql.DataSource`类型的数据库连接池。 3. 在`<Context>`元素中引用全局资源。在你的Web应用程序的上下文配置文件(通常是`META-INF/context.xml`)中,你可以使用`<ResourceLink>`元素引用全局资源。例如: ```xml <Context> <ResourceLink name="jdbc/myLocalDataSource" global="jdbc/myDataSource" type="javax.sql.DataSource"/> </Context> ``` 在上面的示例中,我们将全局资源`jdbc/myDataSource`映射到本地资源`jdbc/myLocalDataSource`。 4. 在你的应用程序中使用JNDI查找资源。你可以通过在代码中使用JNDI查找资源来获取连接池实例。例如,在Java中可以这样做: ```java Context initContext = new InitialContext(); Context envContext = (Context) initContext.lookup("java:/comp/env"); DataSource dataSource = (DataSource) envContext.lookup("jdbc/myLocalDataSource"); Connection connection = dataSource.getConnection(); ``` 在上面的示例中,我们通过JNDI查找资源`jdbc/myLocalDataSource`来获取`javax.sql.DataSource`实例,并从中获取数据库连接。 请注意,这只是一个基本的示例,具体的配置和使用方法可能会因你的需求和环境而有所不同。你可以根据你的实际情况进行相应的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵然间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值