重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
java控制台输出由print( ) 和 println( )来完成最为简单。这两种方法由rintStream(System.out引用的对象类型)定义。尽管System.out是一个字节流,用它作为简单程序的输出是可行的。因为PrintStream是从OutputStream派生的输出流,它同样实现低级方法write(),write()可用来向控制台写数据。PrintStream 定义的write( )的最简单的形式如下:
成都创新互联公司一直在为企业提供服务,多年的磨炼,使我们在创意设计,成都全网营销到技术研发拥有了开发经验。我们擅长倾听企业需求,挖掘用户对产品需求服务价值,为企业制作有用的创意设计体验。核心团队拥有超过10年以上行业经验,涵盖创意,策化,开发等专业领域,公司涉及领域有基础互联网服务西部信息服务器租用、手机APP定制开发、手机移动建站、网页设计、网络整合营销。
void write(int byteval)
该方法按照byteval指定的数目向文件写字节。尽管byteval 定义成整数,但只有低位的8个字节被写入。下面的短例用 write()向屏幕输出字符“A”,然后是新的行。
// Demonstrate System.out.write().
class WriteDemo {
public static void main(String args[]) {
int b;
b = 'A';
System.out.write(b);
System.out.write('\n');
}
}
一般不常用write()来完成向控制台的输出(尽管这样做在某些场合非常有用),因为print()和println() 更容易用。
四、PrintWriter类
尽管Java允许用System.out向控制台写数据,但建议仅用在调试程序时或在例程中。对于实际的程序,Java推荐的向控制台写数据的方法是用PrintWriter流。PrintWriter是基于字符的类。用基于字符类向控制台写数据使程序更为国际化。PrintWriter定义了多个构造函数,这里所用到的一个如下:
PrintWriter(OutputStream outputStream, boolean flushOnNewline)
outputStream是OutputStream类的对象,flushOnNewline控制Java是否在println()方法被调用时刷新输出流。如果flushOnNewline为true,刷新自动发生,若为false,则不发生。
PrintWriter支持所有类型(包括Object)的print( )和println( )方法,这样,就可以像用ystem.out那样用这些方法。如果遇到不同类型的情况,PrintWriter方法调用对象的toString()方法并打印结果。用PrintWriter向外设写数据,指定输出流为System.out并在每一新行后刷新流。例如这行代码创建了与控制台输出相连的PrintWriter类。
PrintWriter pw = new PrintWriter(System.out, true);
下面的应用程序说明了用PrintWriter处理控制台输出的方法:
// Demonstrate PrintWriter
import java.io.*;
public class PrintWriterDemo {
public static void main(String args[]) {
PrintWriter pw = new PrintWriter(System.out, true);
pw.println("This is a string");
int i = -7;
pw.println(i);
double d = 4.5e-7;
pw.println(d);
}
}
该程序的输出如下:
This is a string
-7
4.5E-7
io包支持Java的基本I/O(输入/输出)系统,包括文件的输入/输出。对输入/输出的支持是来源于Java的内核API库,而不是语言关键字。
一、输入/输出基础
很多实际的Java应用程序不是基于文本的控制台程序。尽管基于文本的程序作为教学实例是很出色的,它们无法胜任JAVA在实际中的重要应用。Java对外设输入/输出的支持也是有限的,并且用起来有些笨拙——甚至是在简单的例子程序中。基于文本的控制台输入/输出对于Java程序并不是十分重要。
Java 提供了与文件和网络相关的强大的和灵活的输入/输出支持,Java的输入/输出系统是紧密相连并且是具有一致性的。
1.1 流的概念
Java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是在java.io包定义的类层次结构内部的。
1.2 字节流和字符流
要使用流类,必须导入Java.io包。Java 2 定义了两种类型的流:字节类和字符类。字节流(byte stream)为处理字节的输入和输出提供了方便的方法。例如使用字节流读取或书写二进制数据。字符流(character stream)为字符的输入和输出处理提供了方便。它们采用了统一的编码标准,因而可以国际化。在某些场合,字符流比字节流更有效。在最底层,所有的输入/输出都是字节形式的。基于字符的流只为处理字符提供方便有效的方法。下面是对字节流和字符流的概述。
1.2.1 字节流类
字节流由两个类层次结构定义。在顶层有两个抽象类:InputStream 和 OutputStream。每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件,网络连接,甚至是内存缓冲区。字节流类显示于表1-1中。
表1-1 字节流类
流类 含义
BufferedInputStream缓冲输入流
BufferedOutputStream缓冲输出流
ByteArrayInputStream从字节数组读取的输入流
ByteArrayOutputStream向字节数组写入的输出流
DataInputStream包含读取Java标准数据类型方法的输入流
DataOutputStream包含编写Java标准数据类型方法的输出流
FileInputStream读取文件的输入流
FileOutputStream写文件的输出流
FilterInputStream实现InputStream
FilterOutputStream实现OutputStream
InputStream描述流输入的抽象类
OutputStream描述流输出的抽象类
PipedInputStream输入管道
PipedOutputStream输出管道
PrintStream包含print()和println()的输出流
PushbackInputStream 支持向输入流返回一个字节的单字节的“unget”的输入流
RandomAccessFile支持随机文件输入/输出
SequenceInputStream两个或两个以上顺序读取的输入流组成的输入流
抽象类InputStream 和 OutputStream定义了实现其他流类的关键方法。最重要的两种方法是read()和write(),它们分别对数据的字节进行读写。两种方法都在InputStream 和OutputStream中被定义为抽象方法。它们被派生的流类重载。
1.2.2 字符流类
字符流类由两个类层次结构定义。顶层有两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。Java中这些类含有多个具体的子类。字符流类如表1-2所示。
表1-2 字符流的输入/输出类
抽象类Reader和Writer定义了几个实现其他流类的关键方法。其中两个最重要的是read()和write(),它们分别进行字符数据的读和写。这些方法被派生流类重载。
1.3 预定义流
所有的Java程序自动导入java.lang包。该包定义了一个名为System的类,该类封装了运行时环境的多个方面。System 同时包含三个预定义的流变量,in,out和err。这些成员在System中是被定义成public 和static型的,这意味着它们可以不引用特定的System对象而被用于程序的其他部分。
System.out是标准的输出流。默认情况下,它是一个控制台。System.in是标准输入,默认情况下,它指的是键盘。System.err指的是标准错误流,它默认是控制台。然而,这些流可以重定向到任何兼容的输入/输出设备。System.in 是inputStream的对象;System.out和System.err是PrintStream的对象。它们都是字节流,尽管它们用来读写外设的字符。但可以用基于字符的流来包装它们。
二、读取控制台输入
在Java 1.0中,完成控制台输入的惟一途径是字节流,使用该方法的老代码依然存在。今天,运用字节流读取控制台输入在技术上仍是可行的,但这样做需要用到不被赞成的方法,这种做法不值得推荐。Java 2中读取控制台输入的首选方法是字符流,它使程序容易符合国际标准并且易于维护。
Java没有像标准C的函数scanf()或C++输入操作符那样的统一的控制台输入方法。Java中,控制台输入由从System.in读取数据来完成。为获得属于控制台的字符流,在BufferedReader对象中包装System.in。BufferedReader 支持缓冲输入流查看批注。它最常见的构造函数如下:
BufferedReader(Reader inputReader)
这里,inputReader是链接被创建的BufferedReader实例的流。Reader是一个抽象类。它的一个具体的子类是InputStreamReader,该子类把字节转换成字符查看批注。为获得链接System.in的一个InputStreamReader的对象,用下面的构造函数:
InputStreamReader(InputStream inputStream)
因为System .in引用了InputStream 类型的对象,它可以用于inputStream。综上所述,下面的一行代码创建了与键盘相连的BufferedReader对象。
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
当该语句执行后,br是通过System.in生成的链接控制台的字符流。
2.1 读取字符
从BufferedReader读取字符,用read()。这里所用的read()版本如下:
int read( ) throws IOException
该方法每次执行都从输入流读取一个字符然后以整型返回。当遇到流的末尾时它返回-1。可以看到,它要引发一个IOException异常。下面的例程演示了read()方法,从控制台读取字符直到用户键入“q”:
// Use a BufferedReader to read characters from the console.
import java.io.*;
class BRRead {
public static void main(String args[])
throws IOException
{
char c;
BufferedReader br = new
BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter characters, 'q' to quit.");
// read characters
do {
c = (char) br.read();
System.out.println(c);
} while(c != 'q');
}
}
下面是程序运行:
Enter characters, 'q' to quit.
123abcq
1
2
3
a
b
c
q
2.2 读取字符串
从键盘读取字符串,使用readLine()。它是BufferedReader 类的成员。它的通常形式如下:
String readLine( ) throws IOException
它返回一个String对象。下面的例子阐述了BufferedReader类和readLine()方法;程序读取和显示文本的行直到键入“stop”:
// Read a string from console using a BufferedReader.
import java.io.*;
class BRReadLines {
public static void main(String args[])
throws IOException
{
// create a BufferedReader using System.in
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
String str;
System.out.println("Enter lines of text.");
System.out.println("Enter 'stop' to quit.");
do {
str = br.readLine();
System.out.println(str);
} while(!str.equals("stop"));
}
}
下面的例程生成了一个小文本编辑器。它创建了一个String对象的数组,然后依行读取文本,把文本每一行存入数组。它将读取到100行或直到按“stop”才停止。该例运用一个BufferedReader类来从控制台读取数据。
// A tiny editor.
import java.io.*;
class TinyEdit {
public static void main(String args[])
throws IOException
{
// create a BufferedReader using System.in
BufferedReader br = new BufferedReader(new
InputStreamReader(System.in));
String str[] = new String[100];
System.out.println("Enter lines of text.");
System.out.println("Enter 'stop' to quit.");
for(int i=0; i100; i++) {
str[i] = br.readLine();
if(str[i].equals("stop")) break;
}
System.out.println("\nHere is your file:");
// display the lines
for(int i=0; i100; i++) {
if(str[i].equals("stop")) break;
System.out.println(str[i]);
}
}
}
下面是输出部分:
Enter lines of text.
Enter ‘stop’ to quit.
This is line one.
This is line two.
Java makes working with strings easy.
Just create String objects.
stop
Here is your file:
This is line one.
This is line two.
Java makes working with strings easy.
Just create String objects.
操作简单,要求硬件配置低。
量级主要是看容器的依赖性所决定的,依赖性越小,越轻量,
Jim Rivera是 BEA 公司的一位技术主管,负责通过技术传播推广BEA 产品的应用。Jim 于1999 年加入BEA,担任 BEA WebLogic Server 6、7 和8 版本的技术产品经理。在这个岗位上,Jim 负责各种服务器组件的策略和路线图,包括 EJB、Web services、XML 和集群。Jim 在dev2dev 上有一个blog。dev2dev 通过电子邮件采访了 Jim,获得他对轻量级Java、应用程序框架和持久性框架,以及它们与应用服务器上企业计算的关系的看法。
轻量级Java
dev2dev: 您是如何定义“轻量级Java”的?
Jim: 我认为,在Java 应用程序开发环境中,“轻量级Java”主要是指两个东西:简化的编程模型和更具响应能力的容器。轻量级Java 旨在消除与传统 J2EE API 有关的不必要的复杂性和限制。它也将缩短应用程序的部署时间,这对于支持开发最佳实践(比如频繁单元测试)非常重要。
dev2dev: 对您来说哪种轻量级技术是最重要的,轻量级Java 对终端用户有什么帮助?
Jim: 很显然,控制反转 (IoC)模式在这个领域有着重大的影响。使用IoC,开发人员不需要编写复杂的代码来执行查询、处理基础架构异常或管理连接,就能够解决对象依赖性问题。这有助于简化代码、将业务逻辑与基础架构分离,从而使应用程序更易于维护。
轻量级Java 的另一个关键特征是,它不会强迫业务对象遵循平台特定接口。这允许开发人员在普通旧式Java 对象(POJO)中实现业务逻辑,从而提高生产率。
与具体的类相反,当把开发的最佳实践与界面相结合时,这些特性也使得对代码进行单元测试容易得多。由于业务逻辑实现在 POJO中,所以不再需要将对象部署到重量级容器中以在单元测试中练习它。因此,将对象宿主在诸如 JUnit 之类的简单测试环境中和为快速迭代单元测试“模拟”外部依赖性就变得微不足道了。
dev2dev: 作为一个技术传播者,您一定目睹了许多新的和已部署的技术。您是否看到了转向轻量级技术的趋势?
Jim: 当然。在早期的采用者当中,明确地存在转向诸如 Spring、Hibernate 和Beehive 之类框架的趋势。它在应用程序的构建方式上有了明显的不同,对未来 J2EE技术的方向有着积极的影响。例如,EJB 3.0就基本上是以使得轻量级Java盛行的概念为基础的。
重量级
dev2dev:人们在想起应用服务器供应商时,通常把它们置于“重量级阵营”。我想您正在努力改变这种状况,对吧?换言之,许多人认为应用程序供应商已经在实现重量级组件(比如 EJB 2.0)上付出了很大的代价,它们不愿意轻易放弃这些成果。
Jim: 首先,我认为没有理由放弃在 EJB 上的现有投资,因为在某些场景中它仍然是最好的技术,例如当您希望通过 RMI远程公开业务服务时。当然,诸如 EJB 之类的开放标准在保护客户投资方面的价值也不能低估。
已经说过,我觉得人们经常过分强调 EJB在应用服务器中的实际价值。尽管这一点未必对所有的应用服务器供应商都适用,但是 BEA 只投入了相对较少的一部分开发资源来支持 J2EE API。我们工作最主要的目标是为宿主应用程序构建最可靠、可伸缩和容错的内核。这些品质以及分布式事务服务、高速消息传递、遗留系统集成、高级 Web 服务、配置管理、诊断和故障排除和高级安全性,代表了 WebLogic Server 的真正价值,而且对总体拥有成本(TCO)有着巨大的影响。幸运的是,这些附加值对基于Spring 或Beehive 的应用程序的相关性和适用性与采用EJB 构建的应用程序是一样的。虽然轻量级Java 技术使得应用程序的开发和维护更容易,但是它们不会代替真正高端应用服务器的品质。实际上,我们认为轻量级Java 与WebLogic Server 是一致的。
dev2dev: BEA 有没有一个轻量级 Java 策略?BEA 实现轻量级 Java 的方法是什么?
Jim: 我们的策略是接纳所有有利于提高开发人员生产率、在市场上为部署这些技术提供最佳平台的技术。轻量级 Java有助于降低开发成本,WebLogic Server 则有助于降低运营成本,它们是一个非常强大的组合。
应用程序框架
dev2dev:由BEA赞助的Beehive项目显然是一个轻量级 Java组件模型。您能否谈谈关于 Beehive 的情况,以及它在你们的整个策略中的地位?
Jim: Beehive是一个应用程序框架,致力于使J2EE 应用程序和基于SOA 的应用程序的开发更容易,它基于我们发布WebLogic Workshop 的经验。它基于 POJO 和用于配置依赖性、服务质量等的元数据提供一个编程模型。元数据以 J2SE 5.0 代码注解和外部 XML文件的形式获得支持。存在一些用于访问 J2EE资源、定义业务和 Web 服务以及基于 MVC模式开发 Web 应用程序的组件。在我们努力提高开发人员生产率、巩固 Java 整体市场的过程中,Beehive 是非常关键的一部分。
dev2dev: Beehive 可以被认为是一个“应用程序框架”。在Spring Framework中提供了一种非常流行的轻量级 Java 方法。Spring(以及其他类似的框架)对于 BEA 有多重要?
Jim: 任何能够帮助我们的客户提高生产率的东西都对我们非常重要。我们欢迎并且接纳这些技术,在适当的时候也可以在技术层面上集成或者共享这些技术。
dev2dev: 你们考虑过明确支持这些框架吗?
Jim: 就像我原来说过的,WebLogic Server具有很多方面的特性,能够提供基于轻量级 Java 技术的应用程序。许多都是隐含的,然而在某些情况下,最小量的集成工作就能为轻量级 Java 开发人员提供重要的价值。举个例子,当今存在的一些适配器允许 Spring 应用程序使用 WebLogic Server 的分布式事务能力,无需改变任何应用程序代码。我们正在调查许多其他的机会,当然也一直在倾听客户的需求。
dev2dev: 我们已经看到轻量级框架对EJB 3 的一些影响。您认为这会扩展到J2EE的其他方面吗?
Jim: 是的。我认为 JSR 175(即Java元数据)对于简化 J2EE 编程模型是一种关键的支持技术。EJB 3.0使用了它,而且它也是 JSR 181(即Web Services 元数据,一个BEA 倡导的规范)的基础。没有理由相信它会就此停止。
轻量级持久性
dev2dev: IoC 容器看起来是轻量级 Java 的中心。另外的一个关键因素是POJO 和轻量级持久性。您能针对这个问题谈谈看法吗?
Jim: 同样,共同的主题是简化编程模型。没有比POJO更简单的了。当然,企业开发要求我们有能力应用附加的品质,比如持久性规则、事务语义和 POJO 的安全约束。盛行很广的方式是在元数据中定义这些品质,要么作为代码注解,要么放在外部文件中。
dev2dev: 您是否觉得因为有多种方法用于完成持久性这样的事情而存在一些危险?比如,我们很快将会有EJB 2、EJB 3、JDO、Hibernate,等等。
Jim: 我认为这只是成熟领域的一个实际情况。多年来,J2EE 规范没有完全涵盖这个特定的领域,自然就会导致其他规范的出现。就我所知道的在 JCP中发生的事情,我们似乎正在走向统一。这对于整个行业来说是一件好事。
未来
dev2dev: 您能预见一下轻量级 Java和 BEA 的未来吗?
Jim: 我们将会继续活跃于这个领域中,既通过诸如 Apache Beehive、XMLBeans、Eclipse和JCP 之类的渠道推动创新,又吸收诸如 Spring 这样的其他领先技术,并且为了客户的利益而展开协作。
艾伯特.爱因斯坦曾经说过:“一切都应该尽可能地简单,但是不能更简单。”确实如此,简化一门理论的基本假设,使我们可以专注于真正关键的地方,这正是一直以来对科学真理的追求。企业软件开发同样如此。
提供一个将复杂的事物(例如,事务、安全或持久性)对开发者进行隐藏的应用框架是简化企业软件开发的关键。一个设计良好的框架可以提高代码重用率、开发者的生产力及软件的质量。然而,现有J2EE1.4的EJB2.1框架被普遍认为设计差,且过于复杂。不满于EJB2.1的框架结构,Java开发者尝试了各种各样的中间件服务传递方法。最引人注目的是,以下两个框架引起了开发者极大兴趣并得到了大量正面的反馈。他们以未来企业Java应用所选框架的姿态展现。
Spring框架虽然很流行但并不是一个标准的开源框架。它主要由Interface21 Inc开发和控制。Spring框架结构是基于依赖注入(Dependency Injection (DI))的设计模式。它可以独立或在现有的应用服务器上运行,而且大量地使用了xml配置文件
EJB3.0是由Java Community Process (JCP)制订的标准框架,为所有主要的J2EE厂商支持。JBoss已经提供了试用版EJB3.0标准的开源或商业性质实现。EJB3.0充分利用了Java的注释
这两个框架结构都有一个共同核心设计理念:将中间件服务传递给耦合松散的POJOS (Plain Old Java Objects, 简单洁净Java对象)。 这样的框架利用截取执行上下文或在运行时将服务对象注入POJO来把应用服务“缠绕”到POJO。POJO本身并不关心这种“缠绕”,对这种框架结构也没有什么依赖。因此,开发者可专注于业务逻辑和脱离框架的POJO单元测试。除此之外, 由于POJO并不须要继承框架的类或实现其接口,开发者能够极其灵活地搭建继承结构和建造应用。
然而,在拥有同一理念的同时,两个框架结构使用不同的方式来传递POJO服务。许多书籍或文章都将Spring 或EJB3.0和EJB2.1做了比较,但是对Spring 和EJB3.0的比较并没有仔细研究过。在本文中,我将对Srping和EJB3.0框架背后的关键不同处进行考察,并讨论其优缺点。本文的观点也适用于其它更少为人知的框架,因为他们都是对“耦合松散的POJO”的设计。希望这篇文章可以帮助你选择适合你需求的最好框架。
厂商无关性
开发者选择Java平台其中最引人注目的理由之一:厂商无关性。EJB3.0正是一套设计为厂商无关的开放性标准。EJB3.0标准为所有企业Java社团里开源或商业性质厂商所开发和支持。它将开发者与应用服务器实现完全隔离。例如,JBoss的 EJB3.0实现基于Hibernate,Oracle的基于TopLink,但是开发者并不须要学习Hibernate- 或TopLink的具体API来使应用可在Jboss或Oracle上运行。厂商无关性使EJB3.0与现今其它POJO中间件框架区别开来。
但是,正如许多EJB3.0评论家迅速所指出的,在本文撰写时EJB3.0标准还没有到达一个最终版本。大概还有一到两年的时间EJB3.0才能广泛地为所有主要J2EE厂商所支持。即使你的应用服务器本身不支持EJB3.0,你仍然可以通过下载安装”内嵌的”EJB3.0产品来运行EJB3.0的应用。例如,JBoss的内嵌EjB3.0是开源产品且可以在任何J2SE5.0兼容的环境运行(例如, 在任何Java服务器上),此产品正处于软件测试阶段。其它厂商不久也将发布自己的内嵌EJB3.0产品,特别是针对标准中关于数据持久性的部分。
另一方面,Spring一直以来都是非标准的技术,在未来可预知的一段时间内这种情况将持续下去。虽然你可以在任何应用服务器上使用Spring框架,Spring应用会被锁入在Spring本身和你选择整合进Spring的具体服务中。
Spring框架是一个开源项目,但同时它有一个XML格式的配置文件和编程接口。当然任何一个非标准的产品都会有这种“锁入”(lock-in)的情况,并不是Spring特有的。但Spring应用的长期生存能力仍然还得托Spring这个项目的福(或者是Interface21公司,它雇佣了大部分Spring核心开发人员)。除此之外,假如你用到任何一个具体的Spring服务,例如,Spring事务管理器或则Spring MVC,你也会被锁入到这些API里。
Spring的应用对终端用户是不可知的。例如,对数据持久服务,Spring框架兼容不同的DAO和JDBC的模版帮助类,如Hibernate, iBatis, 和 JDO。所以假如你需要为spring应用切换在数据持久化服务(例如从JBDC到Hibernate),你需要修改你的代码以适合新的模版帮助类。
服务整合
从一个很高的角度上看,Spring框架处于应用服务器和服务库的上方。服务整合的代码(如,数据访问模板和帮助类)属于框架,并暴露于应用开发者。相反,EJB3.0框架与应用服务器高度整合,服务整合代码也包装在一个标准接口后面。
因此,实现EJB3.0的厂商可以大大地优化整体性能和提升开发者的体验。例如,在JBoss EJB3.0的实现中,当你在用EntityManager持久化一个Entity Bean时,后台的Hibernate会话事务已经自动地帮定到调用方法的JTA 的事务上,在JTA 事务提交的同时Hibernate会话事务也提交了。你甚至可以使用一个简单的 @PersistenceContext 注释(稍候例子演示)将EntityManager和它后台的Hibernate事务绑定到一个stateful session bean的应用事务中。在一个会话中应用事务横跨多个线程,这在事务性网页应用很有用,例如,多页面的购物车。
由于高度整合的EJB3.0的框架,使简单、集成的编程接口成为可能。Oracle EJB3.0框架和其后台的Toplink持久化服务也同样程度地整合。
另一个EJB3.0整合服务的绝好例子就是集群支持。假如你在一个服务器集群上部署了一个EJB3.0的应用,所有容错(fail-over)、负载均衡、分布式缓冲和状态复制都已经自动为应用所获得可用。后台的集群支持被隐藏在EJB3.0的框架后面,对EJB3.0开发者来说这些都是完全透明不可见的。
在Spring里,很难优化框架和服务之间的通讯。例如,为了使用Spring里的声明事务服务来管理Hibernate事务,你必须显示地在XML文件中配置Spring TransactionManager和Hibernate SessionFactory对象。Spring必须电显示地管理横跨多个HTTP请求的事务。除此之外,没有别的方法均衡Spring应用里的集群。
服务组合的弹性
由于Spring的服务整合代码作为编程接口的一部份暴露在外,应用开发者有按自己需求装配服务的弹性。这个特点使你能够组合自己的轻量级应用服务器。Spring的一个普遍用法就是将Tomcat和Hibernate组合在一起支持数据库驱动的web应用。在这种情况,Spring本身提供事务服务,Hibernat提供持久化服务——这种设置创建了一个袖珍型的应用服务器。
EJB3.0应用服务器典型地不提供这种根据需求任你挑捡服务的弹性空间。大多数时间,你得到的只是一系列包装好的特性,其中一些你可能根本就不需要。但是如果应用服务器像JBoss一样提供一个模块性的内部设计,那么你可以只取其中一部分,而把不必要的部分剥去。在任何情况,去自定义一个功能强大的应用服务器是没有什么价值的。
当然,假如应用已经超过单个点,那么你应该加入常用服务器上的服务,例如,资源池(resource pooling),消息队列(message queuing)和集群(clustering)。就总体的资源消耗而言,Spring解决方法和其他EJB3.0解决方法一样是重量级的。
在Spring框架里,具有弹性的服务装配使得将虚拟对象而不是真正的业务对象绑定到应用中做脱离容器的单元测试更简单。在EJB3.0应用中,大多数组件都是简单POJO,他们可以很容易地在容器外被测试。但是对于与容器服务相关的对象(例如持久化实实体管理器EntityManager)建议用容器内测试。因为这样会比虚拟对象测试方法更简单,强壮及准确。
XML Vs.注解
从应用开发者的观点上来看,Spring的编程开发接口主要基于XML配置文件而EJB3.0广泛地应用Java注解。XML可以表达复杂的关系,但是它也冗长且不够健壮;注解简单明了,但是很难在注解里表达复杂或继承性的关系。
Spring选择XML或EJB3.0选择注解都是有他们两者框架后的体系结构决定的。因为注解只能容纳很少的配置信息,只有整合前的框架(重头戏都在框架里)才可以把广泛地使用注解作为配置选择。正如我们所讨论过的,EJB3.0刚好符合这个要求,而Spring作为一个普通的DI框架并不符合。
当然,EJB3.0和Spring都相互取长补短,在某种程度上他们都支持XML和注解。例如,在EJB3.0中,XML配置文件作为一个可选的重载机制来改变注解的默认行为。注解也可以配置一些Spring服务。
通过例子是学习XML和注解方式之间差异的最好方法。在下面几个环节里,让我们来看看Spring和EJB3.0是怎样提供关键服务给应用的。
声明性服务
Spring和EJB3.0都将运行时服务(例如,事务、安全、日志和配置服务)绑定到应用。因为这些服务于应用的业务逻辑是没有直接联系,他们只是由应用本身管理。换句话说,这些服务在运行时由容器透明地应用到应用中。开发者或是管理者配置容器,准确地告诉它什么时候怎样应用这些服务。
EJB3.0运用Java注解来配置声明性服务,而Sring使用XML配置文件。在大多数情况下,EJB3.0注解方式对于这种服务更简单明了。这里有一个在EJB3.0中将事务服务运用到POJO的例子。
public class Foo }
你也可以为一个代码段声明多个属性,应用多个服务。这是一个在EJB3.0里同时应用事务和安全服务到POJO的例子
1.下载JAVA程序,电脑上下载的JAVA分两种,1.rar压缩包,rar压缩包解压后包含2个文件:JAR和JAD .2.JAR压缩包。rar压缩包比较简单解压就可以了,至于JAR就要生成JAD文件了,怎么生成呢!下载JAD生成器,迅雷搜一下一大把,懒得下或下不到的就到“手机乐园“在线生成(网址就不发了,百度搜索下)。
2.把JAR和JAD文件一起传入手机内存卡,方法 4种,1数据线,2读卡器,3蓝牙,4红外线。常用的是1和2,3和4我家电脑不支持我不懂,讲下数据线,三星手机要连接USB要下载安装PC套件,没有的买个碟子安装或网上下载,有读卡器的就读卡器,把下载好了的JAR和JAD文件通过USB传到手机内存卡 Other files文件夹里,没有的就建一个。传好后就把卡放回手机。
3.启动JAVA安装,待机状态下输入*#9998*4678255# .手机显示已启动即可。
4.进入手机内存卡的“Other files”夹里,选中JAD后按选项,手机提示是否安装,选择OK .
5.安装完的游戏自动储存在JAVA世界 .其他文件夹中的JAR和JAD即可删除了.留着也行以备不小心删了软件可以重新安装。
安装方法就是这样的,根据多次安装失败经历,把安装JAVA失败的状况做了一下总结:
1.一定要用英文字符或数字为JAR和JAD文件命名,而且命名长度不要太长,越短越好。如果用中文字符起名的话可是安不进去文件的.
2.JAVA程序的JAR文件大小,不要超过手机所限制的大小,否则也是安装不了.
3.如果前2个条件都满足,安装JAVA还是发生错误,则只保留JAR文件,删除JAD文件.下载JAD生成器重新生成jad文件,再安装试试.
4.还有一些安装时候容易搞错的地方,JAR和JAD文件记得一定是传入手机内存卡的"Other files",待机状态下输入指令的时候,手机会提示"已启动",这时候是开启JAVA安装,再次输入指令,提示"未启动",JAVA安装也就关闭了.
5.如果条件满足以上所述,还安装不起JAVA,就是手机不支持该JAVA程序了.