博文
ant详解(2008-11-10 14:42:00)
摘要:Ant基本使用指南
1 Ant是什么?
Apache Ant 是一个基于 Java的生成工具。
生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式)。随着应用程序的生成过程变得更加复杂,确保在每次生成期间都使用精确相同的生成步骤,同时实现尽可能多的自动化,以便及时产生一致的生成版本
2下载、安装Ant
安装Ant
下载.zip文件,解压缩到c:\ant1.3(后面引用为%ANT_HOME%)
2.1在你运行Ant之前需要做一些配置工作。
·将bin目录加入PATH环境变量。
·设定ANT_HOME环境变量,指向你安装Ant的目录。在一些OS上,Ant的脚本可以猜测ANT_HOME(Unix和Windos NT/2000)-但最好不要依赖这一特性。
·可选地,设定JAVA_HOME环境变量(参考下面的高级小节),该变量应该指向你安装JDK的目录。
注意:不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序,而lib/ext目录是为JDK扩展使用的(如JCE,JSSE扩展)。而且通过扩展装入的类会有安全方面的限制。
2.2运行Ant
运行Ant非常简单,当你正确地安装Ant后,只要输入ant就可以了。
没有指定任何参数时,Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile,直至到达文件系统的根。要想让Ant使用其他的buildfile,可以用参数 -buildfile file,这里file指定了你想使用的buildfile。
可以指定执行一个或多个target。当省略target时,Ant使用标签<project>的default属性所指定的target。
命令行选项总结:
ant [options] [target [target2 [target3] ...]]
Options:
-help print this message
-projecthelp print project help information
......
jndi学习(2008-11-10 11:52:00)
摘要:JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一,不少专家认为,没有透彻理解JNDI的意义和作用,就没有真正掌握J2EE特别是EJB的知识。
那么,JNDI到底起什么作用?
要了解JNDI的作用,我们可以从“如果不用JNDI我们怎样做?用了JNDI后我们又将怎样做?”这个问题来探讨。
没有JNDI的做法:
程序员开发时,知道要开发访问MySQL数据库的应用,于是将一个对 MySQL JDBC 驱动程序类的引用进行了编码,并通过使用适当的 JDBC URL 连接到数据库。
就像以下代码这样:
Java code
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver",
true, Thread.currentThread().getContextClassLoader());
conn=DriverManager.getConnection("jdbc:mysql://MyDBServer?user=qingfeng&password=mingyue");
......
conn.close();
}
catch(Exception e) {
e.printStackTrace();
}
finally {
if(conn!=null) {
try {
conn.close();
} catch(SQLException e) {}
}
}
这是传统的做法,也是以前非Java程序员(如Delphi、VB等)常见的做法。这种做法一般在小规模的开发过程中不会产生问题,只要程序员熟悉Java语言、了解JDBC技术和MySQL,可以很快开发出相应的应用程序。
没有JNDI的做法存在的问题:
1、数据库服务器名称MyDBServer 、用户名和口令都可能需要改变,由此引发JDBC URL需要修改;
2、数据库可能改用别的产品,如改......
ant入门(2008-11-08 21:34:00)
摘要:1. Ant是一种基于Java的Build工具.基本特性:
(1)基于Java的实现。具有良好的跨平台性,同时可以通过增加新的Java类来扩展Ant的功能,而无需去了解不同平台上不同的脚本语言。
(2)基于XML的配置文件。Ant以XML树来描述Target/Task的关系,文件结构清晰、易读易写,并且利用XML对格式的控制来避免由于配置文件的错误造成的Build操作失败。
2. 建立工程的目录
常用目录:
(1)bin 公共的二进制文件,以及运行脚本
(2)build 临时创建的文件,如类文件等
(3)dist 目标输出文件,如生成Jar文件等。
(4)doc/javadocs 文档。
(5)lib 需要导出的Java包
(6)src 源文件
(7)web web应用
3. 编写Build文件
Build.xml 由三层标记表示,一层包一层。
第一层project,描述整个项目,也就是ant要做的事情整个过程概括。
第二层target,目标,对象,你可以理解成一个任务单元,或者任务集,因为它就是把一些任务包括到一起。
第三层task,也就是任务了,ant定义了很多任务标记,这个可以在ant的doc里面找到
下面以Tomcat 5.0环境下的一个简单应用为例看一下ant 的使用
建立目录结构:
helloapp
|- src
|- web
|---|- WEB-INF
|---|---|- classes
|---|---|- lib
lib 下放这个应用的所有需要的jar文件
src 下就是我们的原代码了
classes 是代码编译后存放的位置
web 就是我们常用的webapp的目录结构
我们要做的是:
(1)把所需的jar文件考到lib下,在web下编写jsp,html页面,在src下编写java源文件和properties文件,把web.xml,struts-config.xml,tld文件放入WEB-INF
(2)编译src下的java源文件,放入classes
(3)把src下的所......
spring注入方式的分类和比较(2008-09-12 11:47:00)
摘要:Type1 接口注入
我们常常借助接口来将调用者与实现者分离。如:
public class ClassA {
private InterfaceB clzB;
public init() {
Ojbect obj =
Class.forName(Config.BImplementation).newInstance();
clzB = (InterfaceB)obj;
}
……
}
上面的代码中,ClassA依赖于InterfaceB的实现,如何获得InterfaceB实现类的实例?传统的方法是在代码中创建InterfaceB实现类的实例,并将起赋予clzB。
而这样一来,ClassA在编译期即依赖于InterfaceB的实现。为了将调用者与实现者在编译期分离,于是有了上面的代码,我们根据预先在配置文件中设定的实现类的类名,动态加载实现类,并通过InterfaceB强制转型后为ClassA所用。
这就是接口注入的一个最原始的雏形。
而对于一个Type1型IOC容器而言,加载接口实现并创建其实例的工作由容器完成,如J2EE开发中常用的Context.lookup(ServletContext.getXXX),都是Type1型IOC的表现形式。
Apache Avalon是一个典型的Type1型IOC容器。
Type2构造子注入
构造子注入,即通过构造函数完成依赖关系的设定,如:
public class DIByConstructor {
private final DataSource dataSource;
private final String message;
public DIByConstructor(DataSource ds, String msg) {
this.dataSource = ds;
this.message = msg;
}
……
}
可以看到,在Type2类型的依赖注入机制中,依赖关系是通过类构造函数建立,容器通过调用类的构造方法,将其所需的依赖关系注入其中。
PicoContainer(另一种实现了依赖注入模式的轻量级容器)首先实现了Type2类型的依赖注入模式。
Type3设......
三步学会Java Socket编程(2007-03-23 14:04:00)
摘要:
第一步 充分理解Socket
1.什么是socket
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。
重要的Socket API:
java.net.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法,其它方法大家可以见JDK-1.3文档。
. Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
. getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例,。
. getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
2.如何开发一个Server-Client模型的程序
开发原理:
服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议......
Eclipse平台入门之二:开发环境与实例(2007-03-16 20:42:00)
摘要:接着上一篇文章Eclipse平台入门之一:什么是Eclipse,我们将开始介绍Java 开发环境(JDE)。
为试验一下 Java 开发环境,我们将创建并运行一个“Hello, world”应用程序。使用 Java 透视图,右键单击“Hello”项目,选择 New=>Class,如图 2 所示。在随后出现的对话框中,键入“Hello”作为类名称。在“Which method stubs would you like to create?”下面,选中“public static void main(String[] args)”复选框,然后按 Finish。
图 2. 在 Java 透视图中创建新类
这样将在编辑器区域创建一个包含 Hello 类和空的 main() 方法的 .java 文件,如图 3 所示。然后向该方法添加如下代码(注意其中 i 的声明是有意省略了的):
图 3. Java 编辑器中的 Hello 类
您会在键入时注意到 Eclipse 编辑器的一些特性,包括语法检查和代码自动完成。在 2.1 版(我曾下载 M2 版来试用过)中,当您键入开括号或双引号时,Eclipse 会自动提供配对的符号,并将光标置于符号对之内。
在其他情况下,您可以通过按 Ctrl-Space 来调用代码自动完成功能。代码自动完成提供了上下文敏感的建议列表,您可通过键盘或鼠标来从列表中选择。这些建议可以是针对某个特定对象的方法列表,也可以是基于不同的关键字(比如 for 或 while)来展开的代码片断。
语法检查依赖增量编译。每当您保存代码,它就在后台接受编译和语法检查。默认情况下,语法错误将以红色下划线显示,一个带白 “X” 的红点将出现在左边沿。其他错误在编辑器的左边沿通过灯泡状的图标来指示;这些就是编辑器或许能为您修复的问题——即所谓的Quick Fix(快速修复)特性。
上面的代码例子在 for 语句后面有一个灯泡状图标,因为 i 的声明被省略了。双击该图标将调出建议的修复列表。在此例中,它将提供创建一个类字段 i、一个局部变量 i 或一个方法参数 i 的建议;单击其中的每一个建议都会显示将要生成的代码。图 4 显示了该建议列表和建议创建一个局部变量之后生成的代码。
图 4. Q......
Eclipse平台入门之一:什么是Eclipse(2007-03-16 20:39:00)
摘要:本文为您提供关于 Eclipse 平台的概述,包括起源和体系结构。本文首先简要讨论 Eclipse 的开放源代码性质及其对多种编程语言的支持,然后通过一个简单的程序例子展示 Java 开发环境。本文还将考查以插件扩展形式可用的一些软件开发工具,并展示一个用于 UML 建模的插件扩展。
Eclipse 是什么?
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT)。
虽然大多数用户很乐于将 Eclipse 当作 Java IDE 来使用,但 Eclipse 的目标不仅限于此。Eclipse 还包括插件开发环境(Plug-in Development Environment,PDE),这个组件主要针对希望扩展 Eclipse 的软件开发人员,因为它允许他们构建与 Eclipse 环境无缝集成的工具。由于 Eclipse 中的每样东西都是插件,对于给 Eclipse 提供插件,以及给用户提供一致和统一的集成开发环境而言,所有工具开发人员都具有同等的发挥场所。
这种平等和一致性并不仅限于 Java 开发工具。尽管 Eclipse 是使用 Java 语言开发的,但它的用途并不限于 Java 语言;例如,支持诸如 C/C++、COBOL 和 Eiffel 等编程语言的插件已经可用,或预计会推出。Eclipse 框架还可用来作为与软件开发无关的其他应用程序类型的基础,比如内容管理系统。
基于 Eclipse 的应用程序的突出例子是 IBM 的 WebSphere Studio Workbench,它构成了 IBM Java 开发工具系列的基础。例如,WebSphere Studio Application Developer 添加了对 JSP、servlet、EJB、XML、Web 服务和数据库访问的支持。
Eclipse 是开放源代码的软件
开放源代码软件是这样一种软件,它们在发布时附带了旨在确保将某些权利授予用户的许可证。当然,最明显的权利就是源代码必须可用,以便用......
转帖]JAVA开发者应该去的20个英文网站(2007-03-16 20:29:00)
摘要:
http://www.javaalmanac.com
Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.
http://www.onjava.com
O'Reilly的Java网站. 每周都有新文章.
http://java.sun.com
官方的Java开发者网站 - 每周都有新文章发表.
http://www.developer.com/java
由Gamelan.com 维护的Java技术文章网站.
http://www.java.net
Sun公司维护的一个Java社区网站.
http://www.builder.com
Cnet的Builder.com网站 - 所有的技术文章, 以Java为主.
http://www.ibm.com/developerworks/java
IBM的Developerworks技术网站; 这是其中的Java技术主页.
http://www.javaworld.com
最早的一个Java站点. 每周更新Java技术文章.
http://www.devx.com/java
DevX维护的一个Java技术文章网站.
http://www.fawcette.com/javapro
JavaPro在线杂志网站.
http://www.sys-con.com/java
Java Developers Journal的在线杂志网站.
http://www.javadesktop.org
位于Java.net的一个Java桌面技术社区网站.
http://www.theserverside.com
这是一个讨论所有Java服务器端技术的网站.
http://www.jars.com
提供Java评论服务. 包括各种framewor......
Java、Swing以及面向对象思想(转)(2007-03-16 20:14:00)
摘要:
2007-01-08 21:28:14 来自: 卡卡西 (上海)
Java是面向对象语言的典范,学习Java的意思不仅仅是指学习Java语言,还要包括无比广阔的Java技术和思想。其他计算机语言如C,你完全可以在学会了C语言之后,说我会C,但在Java这儿却只是个开始。Java的语言很简单,很容易入门,但是真正的Java牛人是拿着Java这把雨伞走遍了 Java技术世界的角角落落的人,他必须有着无比广阔的Java技术和思想。面向对象的语言尤其像Java都有一个极其深厚的平台,语言只是你利用这个平台的工具,而这个平台为基础的技术和思想才是你要不断学习和掌握的。
Swing是Java完美展现了面向对象思想的精华,可以说各种著名的设计模式都可以从其中清晰的找到,所以学习Swing的过程也是提高你面向对象编程技术的过程。甚至你能从中领悟更高层次的编程哲学。当然对于那些不习惯面向对象思想,或者虽然使用面向对象语言却并没有深刻理解的人来说,Swing的确是很复杂,很困难,这是因为这些人还没有从面向过程、回调函数等为主要特征的传统界面工具的思想和习惯中摆脱开来。可以说传统界面开发工具编程思想和习惯严重束缚了他们,使得他们在学习Swing这种极具面向对象精神的工具时觉得很困难。
我记得以前上学时老师说,学习面向对象语言比较慢的人往往是那些C/PASCAL等传统过程语言非常精通的牛人。如果你以前没有传统计算机语言的基础,也许你学习面向对象语言的速度更快。这是因为面向对象语言的模型更能贴切地描述现实世界事物的模型,而传统过程性语言的编程思想往往束缚了你往真实世界转换。
这使我想起金庸小说里面武林高手往往很难练成某项绝顶内功,而身无任何武功基础的主人公却往往能在极短的时间内练成这项武功,就是这个道理:复杂无用的武术招式往往是没有用的,真正的绝顶武功恰恰是最平凡不过的道理,武林高手被虚幻的假相迷惑在以往的招式中,却习惯不了武功的最真实、最简单的道理。
Swing和传统语言的界面工具之间的关系恰恰像面向对象思想与传统面向过程思想之间的关系,如果一个人有太深厚的MFC经历,他往往觉得Swing难以掌握,......
JAVA多线程详解(2007-03-10 10:55:00)
摘要:一:理解多线程
多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。
多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时"。如果系统只有一个CPU,那么真正的"同时"是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。
多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此带来的线程调度,同步等问题,将在以后探讨。
二:在Java中实现多线程
我们不妨设想,为了创建一个新的线程,我们需要做些什么?很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切!
真是神奇!Java是如何做到这一点的?通过类!作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程,我们以后的讨论都将围绕这个类进行。
那么如何提供给 Java 我们要线程执行的代码呢?让我们来看一看 Thread 类。Thread 类最重要的方法是 run() ,它为Thread 类的方法 start() 所调用,提供我们的线程所要执行的代码。为了指定我们自己的代码,只需要覆盖它!
方法一:继承 Thread 类,覆盖方法 run(),我们在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。下面是一个例子:
public class MyThread extends Thread {
int count= 1, number;
public MyThread(int num) {
number = num;
System.out.println("创建线程 " + number);
}
public void run() {
while(true) {
System......