??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲а∨天堂久久精品9966,亚洲激情小视频,欧美性久久久http://www.aygfsteel.com/simie/category/23720.htmlzh-cnFri, 13 Jul 2007 02:10:42 GMTFri, 13 Jul 2007 02:10:42 GMT60Java EE/J2EE基本概念http://www.aygfsteel.com/simie/archive/2007/07/12/129810.html和田?/dc:creator>和田?/author>Thu, 12 Jul 2007 05:28:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/12/129810.htmlhttp://www.aygfsteel.com/simie/comments/129810.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/12/129810.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/129810.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/129810.htmlJ2EE可以说指Java在数据库信息pȝ上实玎ͼ数据库信息系l从早期?/span>dBase、到Delphi/VB{?/span>C/Sl构Q发展到B/SQ?/span>Browser览?/span>/Server服务器)l构Q?/span>J2EE主要是指B/Sl构的实现?/span>

J2EE又是一U框架和标准Q框架类?/span>API、库的概念,但是要超出它们?/span>

J2EE是一个虚的大的概念,J2EE标准主要有三U子技术标准:WEB技术?/span>EJB技术和JMSQ谈?/span>J2EE应该说最l要落实到这三个子概念上?/span>

q三U技术的每个技术在应用旉涉及两个部分Q容器部分和应用部分Q?/span>Web容器也是?/span>Jsp/Servlet容器Q你如果要开发一?/span>Web应用Q无论是~译或运行,都必要?/span>Jsp/Servlet库或API支持Q除?/span>JDK/J2SE以外Q?/span>

Web技术中除了Jsp/Servlet技术外Q还需?/span>JavaBeans?/span>Java Class实现一些功能或者包装携带数据,所?/span>Web技术最初简UCؓJsp/Servlet+JavaBeanspȝ?/span>

谈到JavaBeans技术,涉及到lg构g技术(componentQ,q是Java的核心基部分Q很多Y件设计概念(设计模式Q都是通过JavaBeans实现的?/span>

JavaBeans不属?/span>J2EE概念范畴中,如果一?/span>JavaBeans对象?/span>Web技术(也就?/span>Jsp/ServletQ调用,那么JavaBeansp行在J2EE?/span>Web容器中;如果它被EJB调用Q它p行在EJB容器中?/span>

EJBQ企?/span>JavaBeansQ是普?/span>JavaBeans的一U提升和规范Q因Z业信息系l开发中需要一个可伸羃的性能和事务、安全机Ӟq样能保证企业系l^滑发展,而不是发展到一U规模重新更换一套Y件系l?/span>

J2EE集群原理: http://www.jdon.com/jive/article.jsp?forum=121&thread=22282

xQ?/span>JavaBeanslg发展?/span>EJB后,q不是说以前的那U?/span>JavaBeans形式消׃Q这p然Ş成了两种JavaBeans技术:EJB?/span>POJOQ?/span>POJO完全不同?/span>EJB概念Q指的是普?/span>JavaBeansQ而且q个JavaBeans不依附某U框Ӟ或者干脆可以说Q这?/span>JavaBeans是你个应用程序单独开发创建的?/span>

J2EE应用pȝ开发工h很多Q如JBuilder?/span>Eclipse{,q些IDE首先?/span>Java开发工P也就是说Q它们首要基本功能是可以开发出JavaBeans?/span>Java classQ但是如果要开发出J2EEpȝQ就要落实到要么?/span>Web技术或EJB技术,那么有可能要一些专门模块功能,最重要的是Q因?/span>J2EEpȝ区分为容器和应用两个部分Q所以,在Q何开发工具中开?/span>J2EE都需要指?/span>J2EE容器?/span>

J2EE容器分ؓWEB容器?/span>EJB容器Q?/span>Tomcat/Resin?/span>Web容器Q?/span>JBoss?/span>EJB容器+Web容器{,其中Web容器直接使用Tomcat实现的。所以你开发的Web应用E序可以在上面两U容器运行,而你开发的Web+EJB应用则只可以?/span>JBoss服务器上q行Q商业?/span>Websphere/Weblogic{和JBoss属于同一U性质?/span>

J2EE容器也称?/span>J2EE服务器,大部分时它们概念是一致的?/span>

如果你的J2EE应用pȝ的数据库q接是通过JNDI获得Q也是说是从容器中获得Q那么你?/span>J2EE应用pȝ基本与数据库无关Q如果你在你?/span>J2EE应用pȝ耦合了数据库JDBC驱动的配|,那么你的J2EE应用pȝ有数据库概念色彩,作ؓ一个成熟需要推q的J2EE应用pȝQ不推荐和具体数据库耦合Q当然这其中如何保证J2EE应用pȝq行性能又是体现你的设计水^了?/span>

高质量的Java企业pȝ

衡量J2EE应用pȝ设计开发水q高低的标准是Q解耦性;你的应用pȝ各个功能是否能够dqQ是否不怺依赖Q也只有q样Q才能体现可l护性、可拓展性的软g设计目标?/span>

Z辑ֈq个目的Q诞生各U框架概念,J2EE框架标准一个系l划分ؓWEB?/span>EJB主要部分Q当然我们有时不是以q个具体技术区分,而是从设计上抽象现层、服务层和持久层Q这三个层次从一个高度将J2EE分离开来,实现解耦目的?/span>

因此Q我们实际编E中Q也要将自己的功能向q三个层ơ上靠,做到大方向清楚,泾渭分明Q但是没有技术上U束限制要做到这Ҏ很不Ҏ的,因此我们q是必须借助J2EE具体技术来实现Q这Ӟ你可以?/span>EJB规范实现服务层和持久层,Web技术实现表现层Q?/span>

EJBZ么能服务层?/span>Jsp/Servlet手中分离出来Q因为它?/span>JavaBeans~码有强制的U束Q现在有一U对JavaBeansq束,使用Ioc模式实现的(当然EJB 3.0也采取这U方式)Q在Ioc模式诞生前,一般都是通过工厂模式来对JavaBeansU束QŞ成一个服务层Q这也是?/span>Jiveq样开源论坛设计原理之一?/span>

由此Q将服务层从表现层中分离出来目前有两U可选架构选择Q管理普?/span>JavaBeansQ?/span>POJOQ框?/span>(?/span>Spring?/span>JdonFramework)以及理EJB?/span>EJB框架Q因?/span>EJB不只是框Ӟq是标准Q而标准可以扩展发展,所以,q两U区别将来是可能模糊Q被U_同一个标准了?/span>

但是Q通常标准制定是ؓ某个目的服务的,总要牺牲一些换取另外一些,所以,q两U架构会长时间ƈ存?/span>

前面谈了服务层框Ӟ使用服务层框架可以将JavaBeans?/span>Jsp/Servlet中分d来,而用表现层框架则可以将Jsp中剩余的JavaBeans完全分离Q这部分JavaBeans主要负责昄相关Q一般是通过标签库(taglibQ实玎ͼ不同框架有不同自q标签库,Struts是应用比较广泛的一U表现层框架?/span>

q样Q表现层和服务层的分L通过两种框架辑ֈ目的Q剩余的是持久层框架了Q通过持久层的框架数据库存储从服务层中分d来是其目的,持久层框架有两种方向Q直接自q?/span>JDBC{?/span>SQL语句Q如iBatisQ;使用O/R Mapping技术实现的Hibernate?/span>JDO技术;当然q有EJB中的实体Bean技术?/span>

持久层框架目前呈现百花齐放,各有优缺点的现状Q所以正如表现层框架一P目前没有一个框架被指定为标准框Ӟ当然Q表现层框架现在又出来了一?/span>JSFQ它代表的页面组件概忉|一个新的发展方向,但是复杂的实现让人有些忘而却步?/span>

最后,你的J2EE应用pȝ如果采取上面提到的表现层、服务层和持久层的框架实玎ͼ基本可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系l了?/span>

q要注意的是: 开发出一个高质量?/span>J2EEpȝq需要正的业务需求理解,那么域徏模提供了一U比较切实可行的正确理解业务需求的ҎQ相兌l知识可?/span>UML角度l合理解?/span>

当然Q如果你惌计自q行业框架Q那么第一步从设计模式开始吧Q因计模式提供你一个实?/span>JavaBeans或类之间解耦参考实现方法,当你学会了系l基本单?/span>JavaBeans或类之间解耦时Q那么系l模块之间的解耦你可能掌握,q而你可以实现行业框架的提炼了,q又是另外一个发展方向了?/span>

以上理念可以ȝZ句话Q?/span>

J2EE开发三件宝: Domain ModelQ域建模Q?/span>patternsQ模式)?/span>frameworkQ框Ӟ?/span>



]]>
JAR 文g揭密http://www.aygfsteel.com/simie/archive/2007/07/08/128852.html和田?/dc:creator>和田?/author>Sun, 08 Jul 2007 02:17:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/08/128852.htmlhttp://www.aygfsteel.com/simie/comments/128852.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/08/128852.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/128852.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/128852.html大多?Java E序员都熟悉?JAR 文g的基本操作。但是只有少数程序员了解 JAR 文g格式?强大功能。在本文中,作者探讨了JAR 格式的许多功能和优势Q包括打包、可执行?JAR 文g、安全性和索引?

JAR 文g是什么?

JAR 文g格式以流行的 ZIP 文g格式为基Q用于将许多个文件聚集ؓ一个文件。与 ZIP 文g不同的是QJAR 文g不仅用于压羃和发布,而且q用于部|和装库、组件和插gE序Qƈ可被像编译器?JVM q样的工L接用。在 JAR 中包含特D的文gQ如 manifests 和部|描q符Q用来指C工具如何处理特定的 JAR?/p>

一?JAR 文g可以用于Q?/p>

  • 用于发布和用类?
  • 作ؓ应用E序和扩展的构徏单元
  • 作ؓlg、applet 或者插件程序的部v单位
  • 用于打包与组件相兌的辅助资?

JAR 文g格式提供了许多优势和功能Q其中很多是传统的压~格式如 ZIP 或?TAR 所没有提供的。它们包括:

  • 安全性?/strong>可以?JAR 文g内容加上数字化签名。这P能够识别{֐的工具就可以有选择Cؓ您授予Y件安全特权,q是其他文g做不到的Q它q可以检代码是否被改q?
  • 减少下蝲旉?/strong> 如果一?applet 捆绑C?JAR 文g中,那么览器就可以在一?HTTP 事务中下载这?applet 的类文g和相关的资源Q而不是对每一个文件打开一个新q接?
  • 压羃?/strong>JAR 格式允许您压~文件以提高存储效率?
  • 传输q_扩展?/strong> Java 扩展框架(Java Extensions Framework)提供了向 Java 核心q_d功能的方法,q些扩展是用 JAR 文g打包?Java 3D ?JavaMail 是?Sun 开发的扩展例子)?
  • 包密?/strong>存储?JAR 文g中的包可以选择q行 密封Q以增强版本一致性和安全性。密一个包意味着包中的所有类都必d同一 JAR 文g中找到?
  • 包版本控制?/strong>一?JAR 文g可以包含有关它所包含的文件的数据Q如厂商和版本信息?
  • 可移植性?/strong>处理 JAR 文g的机制是 Java q_核心 API 的标准部分?

压羃的和未压~的 JAR

jar 工具(有关l节参阅 jar 工具 )在默认情况下压羃文g。未压羃?JAR 文g一般可以比压羃q的 JAR 文g更快地装载,因ؓ在装载过E中要解压羃文gQ但是未压羃的文件在|络上的下蝲旉可能更长?

META-INF 目录

大多?JAR 文g包含一?META-INF 目录Q它用于存储包和扩展的配|数据,如安全性和版本信息。Java 2 q_识别q解?META-INF 目录中的下述文g和目录,以便配置应用E序、扩展和c装载器Q?/p>

  • MANIFEST.MF?/strong>q个 manifest 文g定义了与扩展和包相关的数据?
  • INDEX.LIST?/strong> q个文g?jar 工具的新选项 -i 生成Q它包含在应用程序或者扩展中定义的包的位|信息。它?JarIndex 实现的一部分Qƈq装蝲器用于加速类装蝲q程?
  • xxx.SF?q是 JAR 文g的签名文件。占位符 xxx标识了签名者?
  • xxx.DSA?与签名文件相兌的签名程序块文gQ它存储了用于签?JAR 文g的公q名?

jar 工具

Z?JAR 文g执行基本的Q务,要用作为Java Development Kit 的一部分提供?Java Archive Tool ( jar 工具)。用 jar 命o调用 jar 工具。表 1 昄了一些常见的应用Q?

?1. 常见?jar 工具用法

功能 命o
用一个单独的文g创徏一?JAR 文g jar cf jar-file input-file...
用一个目录创Z?JAR 文g jar cf jar-file dir-name
创徏一个未压羃?JAR 文g jar cf0 jar-file dir-name
更新一?JAR 文g jar uf jar-file input-file...
查看一?JAR 文g的内?/td> jar tf jar-file
提取一?JAR 文g的内?/td> jar xf jar-file
从一?JAR 文g中提取特定的文g jar xf jar-file archived-file...
q行一个打包ؓ可执?JAR 文g的应用程?/td> java -jar app.jar





回页?/font>


可执行的 JAR

一?可执行的 jar 文g是一个自包含?Java 应用E序Q它存储在特别配|的JAR 文g中,可以?JVM 直接执行它而无需事先提取文g或者设|类路径。要q行存储在非可执行的 JAR 中的应用E序Q必d它加入到您的c\径中Qƈ用名字调用应用程序的ȝ。但是用可执行?JAR 文gQ我们可以不用提取它或者知道主要入口点可以运行一个应用程序。可执行 JAR 有助于方便发布和执行 Java 应用E序?

创徏可执?JAR

创徏一个可执行 JAR 很容易。首先将所有应用程序代码放C个目录中。假讑ֺ用程序中的主cL com.mycompany.myapp.Sample 。您要创Z个包含应用程序代码的 JAR 文gq标识出ȝ。ؓ此,在某个位|?不是在应用程序目录中)创徏一个名?manifest 的文Ӟq在其中加入以下一行:

Main-Class: com.mycompany.myapp.Sample
            

然后Q像q样创徏 JAR 文gQ?/p>
jar cmf manifest ExecutableJar.jar application-dir
            

所要做的就是这些了 -- 现在可以?java -jar 执行q个 JAR 文g ExecutableJar.jar?

一个可执行?JAR 必须通过 menifest 文g的头引用它所需要的所有其他从?JAR。如果用了 -jar 选项Q那么环境变?CLASSPATH 和在命o行中指定的所有类路径都被 JVM 所忽略?

启动可执?JAR

既然我们已经自q应用E序打包C一个名?ExecutableJar.jar 的可执行 JAR 中了Q那么我们就可以用下面的命o直接从文件启动这个应用程序:

java -jar ExecutableJar.jar
            





回页?/font>


包密?/span>

密封 JAR 文g中的一个包意味着在这个包中定义的所有类都必d同一?JAR 文g中找到。这使包的作者可以增强打包类之间的版本一致性。密还提供了防止代码篡改的手段?/p>

要密包Q需要在 JAR ?manifest 文g中ؓ包添加一?Name _然后加上gؓ“true”?Sealed 头。与可执行的 JAR 一P可以在创?JAR Ӟ通过指定一个具有适当头元素的 manifest 文g密封一?JARQ如下所C:

Name: com/samplePackage/
            Sealed: true
            

Name 头标识出包的相对路径名。它以一?#8220;/”l束以与文g名区别。在 Name 头后面第一个空行之前的所有头都作用于?Name 头中指定的文件或者包。在上述例子中,因ؓ Sealed 头出现在 Name 头后q且中间没有IQ所?Sealed 头将被解释ؓ只应用到?com/samplePackage 上?

如果试图从密包所在的 JAR 文g以外的其他地方装载密包中的一个类Q那?JVM 抛Z?SecurityException ?

扩展打包
扩展?Java q_增加了功能,?JAR 文g格式中已l加入了扩展机制。扩展机制?JAR 文g可以通过 manifest 文g中的 Class-Path 头指定所需要的其他 JAR 文g?

假设 extension1.jar ?extension2.jar 是同一个目录中的两?JAR 文gQextension1.jar ?manifest 文g包含以下_

Class-Path: extension2.jar
            

q个头表?extension2.jar 中的cL extension1.jar 中的cȝ 扩展c?/em>。extension1.jar 中的cd以调?extension2.jar 中的c,q且不要?extension2.jar 处在c\径中?

在装载用扩展机制的 JAR ӞJVM 会高效而自动地在 Class-Path 头中引用?JAR d到类路径中。不q,扩展 JAR 路径被解释ؓ相对路径Q所以一般来_扩展 JAR 必须存储在引用它?JAR 所在的同一目录中?

例如Q假讄 ExtensionClient 引用了类 ExtensionDemo ,它捆l在一个名?ExtensionClient.jar ?JAR 文g中,而类 ExtensionDemo 则捆l在 ExtensionDemo.jar 中。ؓ了 ExtensionDemo.jar 可以成ؓ扩展Q必d ExtensionDemo.jar 列在 ExtensionClient.jar ?manifest ?Class-Path 头中Q如下所C:

Manifest-Version: 1.0
            Class-Path: ExtensionDemo.jar
            

在这?manifest ?Class-Path 头的值是没有指定路径?ExtensionDemo.jarQ表?ExtensionDemo.jar ?ExtensionClient JAR 文g处在同一目录中?





回页?/font>


JAR 文g中的安全?/span>

JAR 文g可以?jarsigner 工具或者直接通过 java.security API {֐。一个签名的 JAR 文g与原来的 JAR 文g完全相同Q只是更C它的 manifestQƈ?META-INF 目录中增加了两个文gQ一个签名文件和一个签名块文g?

JAR 文g是用一个存储在 Keystore 数据库中的证书签名的。存储在 keystore 中的证书有密码保护,必须?jarsigner 工具提供q个密码才能?JAR 文g{֐?



?1. Keystore 数据?
Keystore 数据? src=

JAR 的每一位签名者都由在 JAR 文g?META-INF 目录中的一个具?.SF 扩展名的{֐文g表示。这个文件的格式cM?manifest 文g -- 一l?RFC-822 头。如下所C,它的l成包括一个主要部分,它包括了q名者提供的信息、但是不特别针对M特定?JAR 文g,q有一pd的单独的,q些也必须包含?menifest 文g中。在验证一个签名的 JAR Ӟ签名文件的摘要g?JAR 文g中的相应计的摘要D行比较?/p>

清单 1. {֐ JAR 中的 Manifest ?signature 文g
Contents of signature file META-INF/MANIFEST.MF
            Manifest-Version: 1.0
            Created-By: 1.3.0 (Sun Microsystems Inc.)
            Name: Sample.java
            SHA1-Digest: 3+DdYW8INICtyG8ZarHlFxX0W6g=
            Name: Sample.class
            SHA1-Digest: YJ5yQHBZBJ3SsTNcHJFqUkfWEmI=
            Contents of signature file META-INF/JAMES.SF
            Signature-Version: 1.0
            SHA1-Digest-Manifest: HBstZOJBuuTJ6QMIdB90T8sjaOM=
            Created-By: 1.3.0 (Sun Microsystems Inc.)
            Name: Sample.java
            SHA1-Digest: qipMDrkurQcKwnyIlI3Jtrnia8Q=
            Name: Sample.class
            SHA1-Digest: pT2DYby8QXPcCzv2NwpLxd8p4G4=
            

数字{֐

一个数字签名是.SF {֐文g的已{֐版本。数字签名文件是二进制文Ӟq且?.SF 文g有相同的文g名,但是扩展名不同。根据数字签名的cd -- RSA、DSA 或?PGP -- 以及用于{֐ JAR 的证书类型而有不同的扩展名?/p>

Keystore

要签名一?JAR 文gQ必首先有一个私钥。私钥及其相关的公钥证书存储在名?keystores 的、有密码保护的数据库中。JDK 包含创徏和修?keystores 的工兗keystore 中的每一个密钥都可以用一个别名标识,它通常是拥有这个密钥的{֐者的名字?

所?keystore ?密钥和信ȝ证书?都是用唯一别名讉K的。别名是在用 keytool -genkey 命o生成密钥?公钥和私?q在 keystore 中添加项时指定的。之后的 keytool 命o必须使用同样的别名引用这一V?

例如Q要用别?#8220;james”生成一个新的公?U钥对ƈ公钥包装到自签名的证书中,要用下q命令:

keytool -genkey -alias james -keypass jamespass
            -validity 80 -keystore jamesKeyStore
            -storepass jamesKeyStorePass
            

q个命o序列指定了一个初始密?#8220;jamespass”Q后l的命o在访?keystore “jamesKeyStore”中与别名“james”相关联的U钥Ӟ需要这个密码。如?keystore“jamesKeyStore”不存在,?keytool 会自动创建它?

jarsigner 工具

jarsigner 工具使用 keystore 生成或者验?JAR 文g的数字签名?

假设像上qC子那样创Z keystore “jamesKeyStore”Qƈ且它包含一个别名ؓ“james”的密钥,可以用下面的命o{֐一?JAR 文gQ?/p>
jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass
            -keypass jamespass -signedjar SSample.jar Sample.jar james
            

q个命o用密?#8220;jamesKeyStorePass”从名?#8220;jamesKeyStore”?keystore 中提出别名ؓ“james”、密码ؓ“jamespass”的密钥,q对 Sample.jar 文g{֐、创Z个签名的 JAR -- SSample.jar?/p>

jarsigner 工具q可以验证一个签名的 JAR 文gQ这U操作比{֐ JAR 文g要简单得多,只需执行以下命oQ?

jarsigner -verify SSample.jar
            

如果{֐?JAR 文g没有被篡改过Q那?jarsigner 工具׃告诉?JAR 通过验证了。否则,它会抛出一?SecurityException Q?表明哪些文g没有通过验证?

q可以用 java.util.jar ?java.security API 以编E方式签?JAR(有关l节参阅 参考资?/font>)。也可以使用?Netscape Object Signing Tool q样的工兗?





回页?/font>


JAR 索引

如果一个应用程序或?applet 捆绑到多?JAR 文g中,那么c装载器׃用一个简单的U性搜索算法搜索类路径中的每一个元素,qɾc装载器可能要下载ƈ打开许多?JAR 文gQ直到找到所要的cL者资源。如果类装蝲器试囑֯找一个不存在的资源,那么在应用程序或?applet 中的所?JAR 文g都会下蝲。对于大型的|络应用E序?appletQ这会导致启动缓慢、响应迟~ƈ费带宽?/p>

?JDK 1.3 以后QJAR 文g格式开始支持烦引以优化|络应用E序中类的搜索过E,特别?applet。JarIndex 机制攉?applet 或者应用程序中定义的所?JAR 文g的内容,q将q些信息存储到第一?JAR 文g中的索引文g中。下载了W一?JAR 文g后,applet c装载器用收集的内容信息高效地装?JAR 文g。这个目录信息存储在?JAR 文g?META-INF 目录中的一个名?INDEX.LIST 的简单文本文件中?/p>

创徏一?JarIndex
可以通过?jar 命o中指?-i 选项创徏一?JarIndex。假设我们的目录l构如下图所C:



?2. JarIndex
JarIndex Demo

您将使用下述命o?JarIndex_Main.jar、JarIndex_test.jar ?JarIndex_test1.jar 创徏一个烦引文Ӟ

jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar
            

INDEX.LIST 文g的格式很单,包含每个已烦引的 JAR 文g中包含的包或者类的名字,如清?2 所C:



清单 2. JarIndex INDEX.LIST 文gCZ
JarIndex-Version: 1.0
            JarIndex_Main.jar
            sp
            JarIndex_test.jar
            Sample
            SampleDir/JarIndex_test1.jar
            org
            org/apache
            org/apache/xerces
            org/apache/xerces/framework
            org/apache/xerces/framework/xml4j
            





回页?/font>


l束?/span>

JAR 格式q远出了一U压~格式,它有许多可以改进效率、安全性和l织 Java 应用E序的功能。因些功能已l徏立在核心q_ -- 包括~译器和c装载器 -- 中了Q所以开发h员可以利?JAR 文g格式的能力简化和改进开发和部vq程?



参考资?

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • 参阅 jar 实用E序的命令行选项的文档?


  • Raffi Krikorian ?ONJava 上发表的文章提供了有?programmatically signing a JAR file的帮助?


  • q篇关于 Java Archive Tool的文档解释了创徏和操?JAR 文g可以使用的选项?


  • 文章“ Java Web Start”( developerWorksQ?001 q?9 ?描述了如何用这U技术,以便允许应用E序可以指定所需?JAR 文gq动态下载它们?


  • 有关 J2EE 服务器(比如 IBM WebSphere Application ServerQ?JAR 文g格式的不同方式,请参?#8220; What are Java Archive (JAR) files?


  • JAR 格式?WAR (Web Archive) 格式的基QWAR用于?J2EE 容器中部|?Servlet ?JSP 应用E序。更多内容请参阅“ What are WAR files?”?


  • JAR 格式也是 EAR (Enterprise Archive) 格式的基QEAR 用于?J2EE 容器中部|?EJB。更多内容请参阅“ What are Enterprise Archive (EAR) files?”?


  • ?developerWorks Java 技术专?上可以找到数癄关于 Java ~程的各个方面的文章?



作者简?/span>

Photo of Pagadala Suresh

Pagadala J. Suresh ?IBM Global Services India 的Y件工E师。他擅长的领域包?Java 技术、WebSphere Application Server ?WebSphere Studio Application Developer (WSAD)、Ariba Buyer。他参与?WebSphere ?IBM Redbook 目。可以通过 pjsuresh@in.ibm.com ?Pagadala 联系?


Photo of Palaniyappan Thiagarajan

Palaniyappan Thiagarajan 是位于印度班加罗的 IBM Global Services India 的Y件工E师。他是IBM 认证?IBM WebSphere Application Server V3.5 ?IBM DB2 UDB V7.1 Family Fundamentals 专家。可以通过 tpalaniy@in.ibm.com ?Palaniyappan 联系?



]]>
JavaBeans E序开发从入门到精通教E?/title><link>http://www.aygfsteel.com/simie/archive/2007/07/03/127856.html</link><dc:creator>和田?/dc:creator><author>和田?/author><pubDate>Tue, 03 Jul 2007 07:14:00 GMT</pubDate><guid>http://www.aygfsteel.com/simie/archive/2007/07/03/127856.html</guid><wfw:comment>http://www.aygfsteel.com/simie/comments/127856.html</wfw:comment><comments>http://www.aygfsteel.com/simie/archive/2007/07/03/127856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/simie/comments/commentRss/127856.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/simie/services/trackbacks/127856.html</trackback:ping><description><![CDATA[JavaBeans的属?nbsp;<br><br>JavaBeans的属性与一般JavaE序中所指的属性,或者说与所有面向对象的E序设计语言中对象的属性是一个概念,在程序中的具体体现就是类中的变量。在JavaBeans设计中,按照属性的不同作用又细分ؓ四类QSimple, Index, Bound与Constrained属性?nbsp;<br><br>1. Simple属?nbsp;<br><br>一个简单属性表CZ个伴随有一对get/setҎQC语言的过E或函数在JavaE序中称?Ҏ"Q的变量。属性名与和该属性相关的get/setҎ名对应。例如:如果有setX和getXҎQ则暗指有一个名?X"的属性。如果有一个方法名为isXQ则通常暗指"X"是一个布属性(即X的gؓtrue或falseQ。例如在下面q个E序中: <br><br><br>public class alden1 extends Canvas { <br>string ourString= "Hello"; //属性名为ourStringQ类型ؓ字符?nbsp;<br>public alden1(){     //alden1()是alden1的构造函敎ͼ <br>与C++中构造函数的意义相同 <br>setBackground(Color.red); <br>setForeground(Color.blue); <br>} <br>/* "set"属?/ <br>public void setString(String newString) { <br>ourString=newString; <br>} <br>/* "get"属?nbsp;*/ <br>public String getString() { <br>return ourString; <br>} <br>} <br><br><br><br><br>2. Indexed属?nbsp;<br><br>一个Indexed属性表CZ个数l倹{用与该属性对应的set/getҎ可取得数l中的数倹{该属性也可一ơ设|或取得整个数组的倹{例Q?nbsp;<br><br><br>public class alden2 extends Canvas { <br>int[] dataSet={1,2,3,4,5,6}; // dataSet是一个indexed属?nbsp;<br>public alden2() { <br>setBackground(Color.red); <br>setForeground(Color.blue); <br>} <br>/* 讄整个数组 */ <br>public void setDataSet(int[] x){ <br>dataSet=x; <br>} <br>/* 讄数组中的单个元素?nbsp;*/ <br>public void setDataSet(int index, int x){ <br>dataSet[index]=x; <br>} <br>/* 取得整个数组?nbsp;*/ <br>public int[] getDataSet(){ <br>return dataSet; <br>} <br>/* 取得数组中的指定元素?nbsp;*/ <br>public int getDataSet(int x){ <br>return dataSet[x]; <br>} <br>} <br><br><br><br><br>3. Bound属?nbsp;<br><br>一个Bound属性是指当该种属性的值发生变化时Q要通知其它的对象。每ơ属性值改变时Q这U属性就点火一个PropertyChange事g(在JavaE序中,事g也是一个对?。事件中装了属性名、属性的原倹{属性变化后的新倹{这U事件是传递到其它的BeansQ至于接收事件的Beans应做什么动作由其自己定义。当PushButton的background属性与Dialog的background属性bindӞ若PushButton的background属性发生变化时QDialog的background属性也发生同样的变化?nbsp;例: <br><br><br>public class alden3 extends Canvas{ <br>String ourString= "Hello"; <br>//ourString是一个bound属?nbsp;<br>private PropertyChangeSupport changes = new PropertyChangeSupport(this); <br>/** 注:Java是纯面向对象的语aQ?nbsp;<br>如果要用某U方法则必须指明是要使用哪个对象的方法, <br>在下面的E序中要q行点火事g的操作, <br>q种操作所使用的方法是在PropertyChangeSupportcM的?nbsp;<br>所以上面声明ƈ实例化了一个changes对象Q?nbsp;<br>在下面将使用changes的firePropertyChangeҎ来点火ourString的属性改变事件?/ <br><br>public void setString(string newString){ <br>String oldString = ourString; <br>ourString = newString; <br>/* ourString的属性值已发生变化Q于是接着点火属性改变事?nbsp;*/ <br>changes.firePropertyChange("ourString",oldString,newString); <br>} <br>public String getString(){ <br>return ourString; <br>} <br>/** 以下代码是ؓ开发工h使用的?nbsp;<br>我们不能预知alden3与哪些其它的Beansl合成ؓ一个应用, <br>无法预知若alden3的ourString属性发生变化时有哪些其它的lg与此变化有关Q?nbsp;<br>因而alden3q个Beans要预留出一些接口给开发工P <br>开发工具用这些接口, <br>把其它的JavaBeans对象与alden3挂接?/ <br><br>public void addPropertyChangeListener(PropertyChangeLisener l){ <br>changes.addPropertyChangeListener(l); <br>} <br>public void removePropertyChangeListener(PropertyChangeListener l){ <br>changes.removePropertyChangeListener(l); <br>} <br><br><br><br><br>通过上面的代码, <br><br>开发工兯用changes的addPropertyChangeListenerҎ <br><br>把其它JavaBeans注册入ourString属性的监听者队列l中, <br><br>l是一个Vector数组Q可存储MJava对象?nbsp;<br><br>开发工具也可用changes的removePropertyChangeListenerҎQ?nbsp;<br><br>从l中注销指定的对象, <br><br>使alden3的ourString属性的改变不再与这个对象有兟?nbsp;<br><br>当然Q当E序员手写代码编制程序时Q?nbsp;<br><br>也可直接调用q两个方法, <br><br>把其它Java对象与alden3挂接?nbsp;<br><br>4. Constrained属?nbsp;<br><br>一个JavaBeans的constrained属性,是指当这个属性的D发生变化Ӟ与这个属性已建立了某U连接的其它Java对象可否军_性值的改变。constrained属性的监听者通过抛出PropertyVetoException来阻止该属性值的改变。例Q下面程序中的constrained属性是PriceInCents?nbsp;<br><br><br>public class JellyBeans extends Canvas{ <br>private PropertyChangeSupport changes=new PropertyChangeSupport(this); <br>private VetoableChangeSupport Vetos=new VetoableChangeSupport(this); <br>/*与前qchanges相同Q?nbsp;<br>可用VetoableChangeSupport对象的实例Vetos中的ҎQ?nbsp;<br>在特定条件下来阻止PriceInCents值的改变?/ <br><br><br>...... <br>public void setPriceInCents(int newPriceInCents) throws PropertyVetoException { <br>/*Ҏ名中throws PropertyVetoException的作用是当有 <br>其它Java对象否决PriceInCents的改变时Q?nbsp;<br>要抛Z外?/ <br>/* 先保存原来的属性?/ <br><br>int oldPriceInCents=ourPriceInCents; <br>/**点火属性改变否决事?/ <br>vetos.fireVetoableChange("priceInCents",new Integer(OldPriceInCents), <br>new Integer(newPriceInCents)); <br><br>/**若有其它对象否决priceInCents的改变, <br>则程序抛Z外,不再l箋执行下面的两条语句, <br>Ҏl束。若无其它对象否决priceInCents的改变, <br>则在下面的代码中把ourPriceIncents赋予新| <br>q点火属性改变事?/ <br><br>ourPriceInCents=newPriceInCents; <br>changes.firePropertyChange("priceInCents", <br>new Integer(oldPriceInCents), <br>new Integer(newPriceInCents)); <br>} <br><br>/**与前qchanges相同Q?nbsp;<br>也要为PriceInCents属性预留接口, <br>使其它对象可注册入PriceInCents否决改变监听者队列中Q?nbsp;<br>或把该对象从中注销 <br><br>public void addVetoableChangeListener(VetoableChangeListener l) <br>{ vetos.addVetoableChangeListener(l); <br>} <br>public void removeVetoableChangeListener(VetoableChangeListener l){ <br>vetos.removeVetoableChangeListener(l); <br>} <br>...... <br>} <br><br><br><br><br>从上面的例子中可看到Q一个constrained属性有两种监听者:属性变化监听者和否决属性改变的监听者。否军_性改变的监听者在自己的对象代码中有相应的控制语句Q在监听到有constrained属性要发生变化Ӟ在控制语句中判断是否应否册个属性值的改变?nbsp;<br><br>MQ某个Beans的constrained属性值可否改变取决于其它的Beans或者是Java对象是否允许q种改变。允怸否的条g由其它的Beans或Java对象在自qcMq行定义?nbsp;<br><br>JavaBeans的事?nbsp;<br><br>事g处理是JavaBeans体系l构的核心之一。通过事g处理机制Q可让一些组件作Z件源Q发出可被描q环境或其它lg接收的事件。这P不同的组件就可在构造工具内l合在一Plg之间通过事g的传递进行通信Q构成一个应用。从概念上讲Q事件是一U在"源对??监听者对?之间Q某U状态发生变化的传递机制。事件有许多不同的用途,例如在Windowspȝ中常要处理的鼠标事g、窗口边界改变事件、键盘事件等。在Java和JavaBeans中则是定义了一个一般的、可扩充的事件机Ӟq种机制能够Q?nbsp;<br><br>对事件类型和传递的模型的定义和扩充提供一个公共框Ӟq合于广泛的应用?nbsp;<br><br>与Java语言和环境有较高的集成度?nbsp;<br><br>事g能被描述环境捕获和点火?nbsp;<br><br>能其它构造工具采取某U技术在设计时直接控制事Ӟ以及事g源和事g监听者之间的联系?nbsp;<br><br>事g机制本n不依赖于复杂的开发工兗特别地Q还应当Q?nbsp;<br><br>能够发现指定的对象类可以生成的事件?nbsp;<br><br>能够发现指定的对象类可以观察Q监听)到的事g?nbsp;<br><br>提供一个常规的注册机制Q允许动态操U事件源与事件监听者之间的关系?nbsp;<br><br>不需要其它的虚拟机和语言卛_实现?nbsp;<br><br>事g源与监听者之间可q行高效的事件传递?nbsp;<br><br>能完成JavaBeans事g模型与相关的其它lg体系l构事g模型的中立映?nbsp;<br><br>JavaBeans事g模型的主要构成有Q?nbsp;事g从事件源到监听者的传递是通过对目标监听者对象的JavaҎ调用q行的。对每个明确的事件的发生Q都相应地定义一个明的JavaҎ。这些方法都集中定义在事件监听者(EventListenerQ接口中Q这个接口要l承java.util.EventListener。实C事g监听者接口中一些或全部Ҏ的类是事g监听者?nbsp;伴随着事g的发生,相应的状态通常都封装在事g状态对象中Q该对象必须l承自java.util.EventObject。事件状态对象作为单参传递给应响应该事g的监听者方法中?nbsp;发出某种特定事g的事件源的标识是Q遵从规定的设计格式Z件监听者定义注册方法,q接受对指定事g监听者接口实例的引用?nbsp;有时Q事件监听者不能直接实C件监听者接口,或者还有其它的额外动作Ӟp在一个源与其它一个或多个监听者之间插入一个事仉配器类的实例,来徏立它们之间的联系?nbsp;<br><br>事g状态对象(Event State ObjectQ?nbsp;<br><br>与事件发生有关的状态信息一般都装在一个事件状态对象中Q这U对象是java.util.EventObject的子cR按设计习惯Q这U事件状态对象类的名应以Eventl尾。例如: <br><br><br>public class MouseMovedExampleEvent extends java.util.EventObject <br><br>{ protected int x, yQ?nbsp;<br>/* 创徏一个鼠标移动事件MouseMovedExampleEvent */ <br>  MouseMovedExampleEvent(java.awt.Component source, Point location) { <br>super(source); <br>x = location.x; <br>y = location.y; <br>} <br>/* 获取鼠标位置*/ <br>public Point getLocation() { <br>return new Point(x, y); <br>}} <br><br><br><br><br>事g监听者接口(EventListener InterfaceQ与事g监听?nbsp;<br><br>׃Java事g模型是基于方法调用,因而需要一个定义ƈl织事g操纵Ҏ的方式。JavaBeans中,事g操纵Ҏ都被定义在承了java.util.EventListenercȝEventListener接口中,按规定,EventListener接口的命名要以Listenerl尾。Q何一个类如果xU在EventListener接口中定义的Ҏ都必M实现q个接口方式q行。这个类也就是事件监听者。例如: <br><br><br>/*先定义了一个鼠标移动事件对?/ <br>   public class MouseMovedExampleEvent <br>extends java.util.EventObject { <br>// 在此cM包含了与鼠标Ud事g有关的状态信?nbsp;<br>     ... <br>   } <br>   /*定义了鼠标移动事件的监听者接?/ <br>   interface MouseMovedExampleListener <br>extends java.util.EventListener { <br>/*在这个接口中定义了鼠标移动事件监听者所应支持的Ҏ*/ <br>void mouseMoved(MouseMovedExampleEvent mme); <br>} <br><br>在接口中只定义方法名Q?nbsp;<br>Ҏ的参数和q回值类型?nbsp;<br>如:上面接口中的mouseMovedҎ?nbsp;<br>具体实现是在下面的ArbitraryObjectcM定义的?nbsp;<br><br>class ArbitraryObject implements MouseMovedExampleListener { <br>    public void mouseMoved(MouseMovedExampleEvent mme) <br>  { ... } <br>?nbsp;<br>ArbitraryObject是MouseMovedExampleEvent事g的监听者?nbsp;<br><br><br><br><br>事g监听者的注册与注销 <br><br>Z各种可能的事件监听者把自己注册入合适的事g源中Q徏立源与事件监听者间的事件流Q事件源必须Z件监听者提供注册和注销的方法。在前面的bound属性介l中已看Cq种使用q程Q在实际中,事g监听者的注册和注销要用标准的设计格式Q?nbsp;<br><br><br>public void add< ListenerType>(< ListenerType> listener)Q?nbsp;<br>public void remove< ListenerType>(< ListenerType> listener)Q?nbsp;<br><br><br><br><br>例如Q?nbsp;<br><br>首先定义了一个事件监听者接口: <br><br><br>public interface <br>ModelChangedListener extends java.util.EventListener { <br>void modelChanged(EventObject e); <br>} <br><br><br><br><br>接着定义事g源类Q?nbsp;<br><br><br>public abstract class Model { <br>private Vector listeners = new Vector(); // 定义了一个储存事件监听者的数组 <br><br>/*上面设计格式中的< ListenerType>在此处即是下面的ModelChangedListener*/ <br><br>public synchronized void addModelChangedListener(ModelChangedListener mcl) <br>   { listeners.addElement(mcl); }//把监听者注册入listeners数组?nbsp;<br>public synchronized void removeModelChangedListener(ModelChangedListener mcl) <br>     { listeners.removeElement(mcl); //把监听者从listeners中注销 <br>     ?nbsp;<br>   /*以上两个Ҏ的前面均冠以synchronizedQ?nbsp;<br>是因行在多线E环境时Q?nbsp;<br>可能同时有几个对象同时要q行注册和注销操作Q?nbsp;<br>使用synchronized来确保它们之间的同步?nbsp;<br>开发工hE序员用这两个Ҏ建立源与监听者之间的事g?/ <br><br>protected void notifyModelChanged() { <br>/**事g源用本Ҏ通知监听者发生了modelChanged事g*/ <br>    Vector l; <br>     EventObject e = new EventObject(this); <br>/* 首先要把监听者拷贝到l数组中, <br>ȝEventListeners的状态以传递事件?nbsp;<br>q样来确保在事g传递到所有监听者之前, <br>已接收了事g的目标监听者的对应Ҏ暂不生效?/ <br>     synchronized(this) { <br>       l = (Vector)listeners.clone(); <br>     } <br>     for (int i = 0; i < l.size(); i++) { <br>     /* 依次通知注册在监听者队列中的每个监听者发生了modelChanged事gQ?nbsp;<br>     q把事g状态对象e作ؓ参数传递给监听者队列中的每个监听?/ <br>((ModelChangedListener)l.elementAt(i)).modelChanged(e); <br>     } <br>    } <br>    } <br><br><br><br><br>在程序中可见事g源ModelcL式地调用了接口中的modelChangedҎQ实际是把事件状态对象e作ؓ参数Q传递给了监听者类中的modelChangedҎ?nbsp;<br><br>适配c?nbsp;<br><br>适配cLJava事g模型中极光要的一部分。在一些应用场合,事g从源到监听者之间的传递要通过适配cL"转发"。例如:当事件源发出一个事Ӟ而有几个事g监听者对象都可接收该事gQ但只有指定对象做出反应Ӟp在事件源与事件监听者之间插入一个事仉配器类Q由适配器类来指定事件应该是由哪些监听者来响应?nbsp;<br><br>适配cLZ事g监听者,事g源实际是把适配cM为监听者注册入监听者队列中Q而真正的事g响应者ƈ未在监听者队列中Q事件响应者应做的动作由适配cd定。目前绝大多数的开发工具在生成代码Ӟ事g处理都是通过适配cLq行的?nbsp;<br><br>JavaBeans用户?nbsp;<br><br>JavaBeans开发者可以给一个Beansd用户化器QCustomizerQ、属性编辑器QPropertyEditorQ和BeansInfo接口来描qC个Beans的内容,Beans的用者可在构造环境中通过与Beans附带在一Lq些信息来用户化Beans的外观和应做的动作。一个Beans不必都有BeansCustomizer、PrpertyEditor和BeansInfoQ根据实际情况,q些是可选的Q当有些Beans较复杂时Q就要提供这些信息,以Wizard的方式Beans的用者能够用户化一个Beans。有些简单的Beans可能q些信息都没有,则构造工具可使用自带的透视装置Q透视出Beans的内容,q把信息昄到标准的属性表或事件表中供使用者用户化BeansQ前几节提到的Beans的属性、方法和事g名要以一定的格式命名Q主要的作用是供开发工具对Beansq行透视。当然也是给E序员在手写E序中用Beans提供方便Q他能观其名、知其意?nbsp;<br><br>用户化器接口QCustomizer InterfaceQ?nbsp;<br><br>当一个Beans有了自己的用户化器时Q在构造工具内可展现q属性表。在定义用户化器时必要实现java.Beanss.Customizer接口。例如,下面是一?按钮"Beans的用户化一器: <br><br><br>public class OurButtonCustomizer <br>extends Panel implements Customizer { <br>... ... <br>/*当实现象OurButtonCustomizerq样的常规属性表Ӟ <br>一定要在其中实现addProperChangeListener <br>和removePropertyChangeListener,q样Q?nbsp;<br>构造工具可用这些功能代码ؓ属性事件添加监听者?/ <br>... ... <br>private PropertyChangeSupport changes=new PropertyChangeSupport(this); <br>public void addPropertyChangeListener(PropertyChangeListener l) { <br>changes.addPropertyChangeListener(l); <br>public void removePropertyChangeListener(PropertyChangeListener l) { <br>changes.removePropertyChangeListener(l); <br>} <br>... ... <br><br><br><br><br>属性编辑器接口QPropertyEditor InterfaceQ?nbsp;<br><br>一个JavaBeans可提供PropertyEditorc,为指定的属性创Z个编辑器。这个类必须l承自java.Beanss.PropertyEditorSupportcR构造工具与手写代码的程序员不直接用这个类Q而是在下一节的BeansInfo中实例化q调用这个类。例Q?nbsp;<br><br><br>public class MoleculeNameEditor extends java.Beanss.PropertyEditorSupport { <br>public String[] getTags() { <br>String resule[]={ <br>"HyaluronicAcid","Benzene","buckmisterfullerine", <br>"cyclohexane","ethane","water"}; <br>return resule;} <br>} <br><br><br><br><br>上例中是为Tags属性创Z属性编辑器Q在构造工具内Q可从下拉表g选择MoleculeName的属性应?HyaluronicAid"或是"water"?nbsp;<br><br>BeansInfo接口 <br><br>每个BeanscM可能有与之相关的BeansInfoc,在其中描qCq个Beans在构造工具内出现时的外观。BeansInfo中可定义属性、方法、事Ӟ昄它们的名Uͼ提供单的帮助说明?nbsp;例如Q?nbsp;<br><br><br>public class MoleculeBeansInfo extends SimpleBeansInfo { <br>public PropertyDescriptor[] getPropertyDescriptors() { <br>try { <br>PropertyDescriptor pd=new PropertyDescriptor("moleculeName",Molecule.class); <br>/*通过pd引用了上一节的MoleculeNameEditorc?取得q返回moleculeName属?/ <br>pd.setPropertyEditorClass(MoleculeNameEditor.class); <br>PropertyDescriptor result[]={pd}; <br>return result; <br>} catch(Exception ex) { <br>System.err.println("MoleculeBeansInfo: unexpected exeption: "+ex); <br>return null; <br>} <br>} <br>} <br><br><br><br><br>JavaBeans持久?nbsp;<br><br>当一个JavaBeans在构造工具内被用户化Qƈ与其它Beans建立q接之后Q它的所有状态都应当可被保存Q下一ơ被loadq构造工具内或在q行Ӟ应当是上一ơ修改完的信息。ؓ了能做到q一点,要把Beans的某些字D늚信息保存下来Q在定义Beans时要使它实现java.io.Serializable接口。例如: <br><br>public class Button <br>implements java.io.Serializable { <br>} <br><br><br><br>实现了序列化接口的Beans中字D늚信息被自动保存。若不想保存某些字段的信息则可在q些字段前冠以transient或static关键字,transient和static变量的信息是不可被保存的。通常Q一个Beans所有公开出来的属性都应当是被保存的,也可有选择C存内部状态?nbsp;Beans开发者在修改软gӞ可以d字段Q移走对其它cȝ引用Q改变一个字D늚private/protected/public状态,q些都不影响cȝ存储l构关系。然而,当从cM删除一个字D,改变一个变量在cMpM的位|,把某个字D|成transient/staticQ或原来是transient/staticQ现改ؓ别的Ҏ时Q都引起存储关pȝ变化?nbsp;<br><br>JavaBeans的存储格?nbsp;<br><br>JavaBeanslg被设计出来后Q一般是以扩展名为jar的Zip格式文g存储Q在jar中包含与JavaBeans有关的信息,q以MANIFEST文g指定其中的哪些类是JavaBeans。以jar文g存储的JavaBeans在网l中传送时极大地减了数据的传输数量,q把JavaBeansq行时所需要的一些资源捆l在一P本章主要了JavaBeans的一些内部特性及其常规设计方法,参考的是JavaBeans规范1.0A版本。随着世界各大ISV对JavaBeans来多的支持,规范在一些细节上q在不断演化Q但基本框架不会再有大的变动? <img src ="http://www.aygfsteel.com/simie/aggbug/127856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/simie/" target="_blank">和田?/a> 2007-07-03 15:14 <a href="http://www.aygfsteel.com/simie/archive/2007/07/03/127856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE到底是什么?http://www.aygfsteel.com/simie/archive/2007/07/02/127655.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 11:19:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127655.htmlhttp://www.aygfsteel.com/simie/comments/127655.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127655.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127655.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127655.html目前所有的B/Spȝ应用可以分ؓQ有状?statefull)和无状?stateless)两大cd?有状态是指在整个pȝ的处理过E中要保留记住一些信息,而无状态则相反Q每ơrequest都是独立的连接,不需要在每个request之间׃n数据{等?

对于q两U应用,通常W一考虑是性能要最优,性能是我们选择IT技术的主要依据之一?/p>

到最大化的性能Q对于JavapȝQ以前通常的作法是使用对象池,q样节约对象生成时的性能开销Q也是说系l启动时Q预先生成一定数目的对象实例在内存中Q需要用时Q从对象池中取出实例Q用完,归还对象池,对于有状态的应用Q可以用相x久化QpersistenceQ策略来保存状态?/p>

下一步,如何q行讉K对象池将是非帔R要,java的多U程技术ؓ我们提供了实现可能,U程的创建销毁也是可能非常耗时的,那么Q无疑象使用对象池一P我们必须使用U程池来实现多线Eƈ行计的最优化?/p>

使用U程池和对象池,每次客户端请求发生一ơ就从线E池中借用一个线E,处理完这个请求就线E返回线E池Q同P使用U程快速的讉K对象Q对象也是从对象池中借用Q用完就q回对象池?整个q样的架构设计在性能上是最优的?/p>

有了性能保证Q安全机制、事务机制、集?cluster)技术也是选择IT技术的主要依据?/p>

J2EE是q样一个实Cq多U考量的综合标准框架系l,在具体用中Q也许我们对所有这些考量的要求ƈ不都一样重视,比如Q如果纯_追求性能是第一Q可以忽视事务机Ӟ那么Q完整的J2EE技术也许就q不适合你?/p>

那么我们先看看J2EE是如何从性能上保证我们的应用pȝ以最快速度q行的,也就是说J2EE中必然应该有上述U程池和对象池的实现技术,servlet实际是基于线E池的更好的U程容器QEJB是基于对象池的更好的对象容器?/p>

看看Servler的架构图Q?/p>

 

当client1发生h时servlet容器会从U程池中分配一个线E给q个request.


再看看EJB的架构图Q?/p>



instance Pool作ؓ一个对象实例池Q维持着EJB实例Q当然这个对象池是用生命周期的,单的?EJB=对象?q程对象?/p>

但是QEJBq整合了相当的其它增强功能,如安?事务机制{,q些对于一般应用都是必需的,当然你还必须Ҏ你的需要来选择是否使用J2EEQ如果你的应用对安全 事务机制没有要求Q直接用线E池和对象池技术肯定获得最好的性能?/p>

所以,ҎServler和EJB的原理,我们已经可以规划我们的应用,什么可以放在servletQ或什么需要放在EJB中实玎ͼ

U程的本质决定了servlet只适合一些轻量的应用Q如分析单XML文档, 通过JDBC讉K数据源,使用JMS或JavaMail处理单的信息MessageQ或使用JTS/JTA处理单的事务机制Q注意这些用词都??的,一旦复杂了Q就要用EJB了?/p>

下面从客L和服务器端两个方面来具体考量q两个技术的使用Q这里的客户端不一定是指最l客LQ因为J2EE是多层结构,中间层可能在多个服务器上实现Q如果一个服务器上的服务是供另外一个服务器上的应用讉K的,那么后者我们也UCؓ客户端?/p>

Ҏ应用的复杂程度和要求不同Q分下列情况Q?/p>

1.在WEB层可以实现的一些应?/p>

如果你的pȝ没有很复杂的事务处理Q或讉K很多企业原有的资源,那么可以借助javabeanq样的一些Help性质的类来实C的应用,但是Q这LҎ不是最q净clean, 最有效efficient, 或最有扩展性的scalable?/p>

否则Q将所有核心计放|入EJB中?/p>

2.所有的复杂商务计算核心都在EJB中完?/p>

如果你的客户端和服务器端之间有防火墙Q那么目前能够无障碍通过防火墙的协议只有Http?Web Service也是Zhttp是q个道理)Q既然用http了,而Servlet是基于Http协议的,那么需要通过servlet来访问EJBQ这是我们最普遍的应用情c?/p>

但是Q如果你的客L和服务器端可以放|在一个网l内Q之间没有防火墙Q那么就不必使用ServletQ直接用Java调用RMI来访问EJBQ这h能是最好的Q这时的Servlet大概只有用于控制Jsp的页面的输出?MVC模式中的控制作用)?/p>

如果是非java客户端,可以通过CORBAlg来访问EJB?/p>

3.如果你的应用寚w度要求很高Q要求非常快Q对于事务处理等斚w几乎无要?/p>

直接使用J2SEQ加上线E池和对象池技术,会使你的javapȝ性能发挥极致。Jakarta.Apache.org有这两种技术的源码Q线E池可以从Servlet容器Tomcat的源码中发现?/p>

]]>
~写你自q单点dQSSOQ服务(转蝲http://www.aygfsteel.com/simie/archive/2007/07/02/127526.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 05:10:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127526.htmlhttp://www.aygfsteel.com/simie/comments/127526.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127526.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127526.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127526.html阅读全文

]]>
Java Web目开发到底需要掌握哪些技术?Q{载)http://www.aygfsteel.com/simie/archive/2007/07/02/127516.html和田?/dc:creator>和田?/author>Mon, 02 Jul 2007 04:58:00 GMThttp://www.aygfsteel.com/simie/archive/2007/07/02/127516.htmlhttp://www.aygfsteel.com/simie/comments/127516.htmlhttp://www.aygfsteel.com/simie/archive/2007/07/02/127516.html#Feedback0http://www.aygfsteel.com/simie/comments/commentRss/127516.htmlhttp://www.aygfsteel.com/simie/services/trackbacks/127516.html
 
lJava语言
l面向对象分析设计思想
l设计模式和框架结?/span>
lXML语言
l|页脚本语言
l数据?/span>
l应用服务?/span>
l集成开发环?/span>
 
下面我们具体地看每个技?
1、Java语言

Java
语言体系比较庞大Q包括多个模块。从WEB目应用角度讲有JSP、Servlet、JDBC、JavaBean(Application)四部分技术?/span>
 
Q?Q?/span>Java Database Connectivity (JDBC)技?/span>
?span>Java Web应用开发中Q数据库理pȝQRDBMSQ的使用是不可缺的?/span>JDBC(Java Database Connectivity) 是一U用于执?span> SQL 语句?Java API。它׃l用 Java ~程语言~写的类和接口组成。JDBC 为工?数据库开发h员提供了一个标准的APIQ他们能够用纯Java API 来编写数据库应用E序?/span>
单地_JDBC 可做三g事:
l与数据库建立q接Q?/div>
l发?span> SQL 语句Q?/span>
l处理l果?/div>
 
 Q?Q?/span>Servlet技?/span>
Servlet是运行在服务器端的程序,可以被认为是服务器端?span>applet。servlet被Web服务器(例如TomcatQ加载和执行Q就如同applet被浏览器加蝲和执行一栗servlet从客L(通过Web服务?接收hQ执行某U操作,然后q回l果?/span>
 
Servlet的主要优点包?/div>
lServlet是持久的?span>servlet只需Web服务器加载一ơ,而且可以在不同请求之间保持服?例如一ơ数据库q接)?/span>
lServlet是与q_无关的。如前所qͼservlet是用Java~写的,它自然也l承了Java的^台无x?/span>
lServlet是可扩展的。由?span>servlet是用Java~写的,它就具备了Java所能带来的所有优炏VJava是健壮的、面向对象的~程语言Q它很容易扩展以适应你的需求。servlet自然也具备了q些特征?/span>
lServlet是安全的。从外界调用一?span>servlet的惟一Ҏ是通过Web服务器。这提供了高水^的安全性保障,其是在你的Web服务器有防火墙保护的时候?/span>
lServlet可以在多U多L客户Z使用。由?span>servlet是用Java~写的,所以你可以很方便地在HTML中用它们?/span>
 
Q?Q?/span>JavaServer Pages(JSP) 技?/span>
JSP是从Servlet上分d来的一部分,化了开发,加强了界面设计。JSP定位在交互网늚开发。运用Java语法Q但功能较Servlet׃很多Qƈ且高U开发中只充当用L面部分?/span>JSP容器收到客户端发出的hӞ首先执行其中的程序片D,然后执行结果以HTML格式响应l客L。其中程序片D可以是Q操作数据库、重新定向网以及发?E-Mail {等Q这些都是徏立动态网站所需要的功能。所有程序操作都在服务器端执行,|络上传送给客户端的仅是得到的结果,与客L的浏览器无关Q因此,JSP UCؓServer-Side Language?/span>
 
JavaServer Pages的主要优点包?/div>
●一ơ编写,各处执行(Write o­nce, Run Anywhere)Ҏ?/span>
作ؓJava q_的一部分QJavaServer Pages 技术拥有Java语言“一ơ编写,各处执行”的特炏V随着来多的供货商JavaServer Pages 技术添加到他们的品中Q您可以针对自己公司的需求,做出审慎评估后,选择W合公司成本及规模的服务器,假若未来的需求有所变更Ӟ更换服务器^台ƈ不媄响之前所投下的成本、h力所开发的应用E序?/span>
?搭配可重复用的lg
JavaServer Pages技术可依赖于重复用跨q_的组Ӟ如:JavaBean或Enterprise JavaBeanlgQ来执行更复杂的q算、数据处理。开发h员能够共享开发完成的lgQ或者能够加些组件的功能Q让更多用户或是客户团体使用。基于善加利用组件的ҎQ可以加快整体开发过E,也大大降低公司的开发成本和人力?/span>
?采用标签化页面开?/div>
Web |页开发h员不一定都是熟?span>Java 语言的程序员。因此,JSP 技术能够将许多功能装hQ成Z个自定义的标{,q些功能是完全根据XML 的标准来制订的,即JSP 技术中的标{ֺ(Tag Library)。因此,Web 面开发h员可以运用自定义好的标签来达成工作需求,而无d写复杂的Java 语法Q让Web 面开发h员亦能快速开发出一动态内容网c?/span>
今后Q第三方开发h员和其他人员可以为常用功能徏立自q标签库,?span>Web |页开发h员能够用熟悉的开发工P如同HTML 一L标签语法来执行特定功能的工作?/span>
?span> N-tier 企业应用架构的支?/span>
有鉴于网际网l的发展Qؓ因应未来服务来繁杂的要求Q且不再受地域的限制Q因此,
必须攑ּ以往Client-Server的Two-tier 架构Q进而{向更具威力、弹性的分散性对象系l。由于JavaServer Page 技术是Java 2 Platform Enterprise Edition (J2EE)集成中的一部分Q它主要是负责前端显C经q复杂运后之结果内容,而分散性的对象pȝ则是主要依赖EJB ( Enterprise JavaBean )和JNDI ( Java Naming and Directory Interface )构徏而成?/span>

Q?Q?/span>JavaBean(Application)
应用lg技?/span>
Application
是Java应用E序Q在WEB目和一些开发中主要应用JavaBean。它是Application的一部分Q逻辑q算能力很强Q能极大的发挥Java语言的优炏V?/span>JavaBean 被称为是Java lg技术的核心。JavaBean 的结构必L一定的命名U定。JavaBean能提供常用功能ƈ且可以重复用,q得开发h员可以把某些关键功能和核心算法提取出来封装成Z个组件对象,q样增加了代码的重用率和系l的安全性?/span>

高的WEB目会应用到以上所有技术,它们之间联合使用和协作开发会提高开发的效率和系l的性能?nbsp;

2?/strong>面向对象分析设计思想

Java
语言是完全面向对象的语言Q所以在目设计时会有很大的帮助Q在设计时应量舍弃以往的面向过E的设计方式?

在分析项目业务关pȝ时候,应用一些UML(Unified Modeling Language)?例如常用的用例图(use case diagram)Q类?class diagram)Q时序图(sequence diagram){等,会有很大的帮助,q样能尽快找Z务逻辑主要面对的对象,然后Ҏ个对象进行行为划分,最后再实现对象之间的集成和通信?/span>

3、设计模式和框架l构
Java从语a角度来讲不是很难Q但是从整体设计角度来讲我们q需要了解一些高U应用框架。如果要设计一个良好的框架l构Q单单只掌握Java语言q远不够。这涉及到一个设计模式,q有和设计模式相关的一些知识?

设计模式在Java目实施q程更是重中之重。主要在与两层的设计模式、三层的设计模式和N层的设计模式。它直接军_着目的应用、部|和实际开发设计?

在普通的WEB目中很多采用两层的开发结构。JSP+Servlet或JSP+JavaBean。当对开发要求高的项目中使用很多的还是MVC的三层开发结构,也就是JSP+Servlet+JavaBean。它能分有效的分逻辑开发,使开发h员能专注于各自的开发。同时也能时整个开发结构流E更清晰Q但是需要比较高的开发配合度?
在项目中Q我们经怋用著名的Model-View-Controller(MVC)架构?/span>MVC架构是随着smalltalk language语言的发展提出的Q它是一个著名的用户界面设计架构。经典的MVC架构把一个组Ӟ可认为是整个应用E序的一个模块)划分成三部分l?Model理q个模块中所用到的数据和业务逻辑。而View 理模块如何昄l用PController 军_如何处理用户和该模块交互式时候生的事g 如用LM个按钮等?

4、XML
语言

在服务器和设计模式结构中会应用到自定义文Ӟ而且在应用高U设计时也会定义自用的标{,现在行的是用XMLd义配|,所以XML语言应该有一定掌握?/span>
当前Q?span>Java 2q_企业版(J2EEQ架构在厂商市场和开发者社Z倍受推崇。作ZU工P可扩展标记语aQXMLQ简化了数据交换、进E间消息交换q一cȝ事情Q因而对开发者逐渐变得有吸引力Qƈ开始流行v来。自Ӟ在J2EE架构中访问或集成XML解决Ҏ的想法也很诱人。因是强大pȝ架构同高度灵zȝ数据理Ҏ的结合?/span>

XML的应用似乎是无穷无尽的,但它们大致上可以分ؓ三大c:
1、简单数据的表示和交换(针对XML的简单APIQSAXQ和文档对象模型QDOMQ语法解析,不同的文档类型定义(DTDsQ和概要QschemasQ)
2、用L面相兟뀁表C相关的上下文(可扩展样式表语言Q?span>XSLQ,可扩展样式表语言转换QXSLTQ)
3、面向消息的计算Q?span>XML-RPCQ远E过E调用)Q基于SOAP协议的Web 服务QWeb ServicesQ,电子化业务XMLQebXMLQ)

5、网脚本语a
 
Z提高WEB目的整体性能Q提高hZ互的友好界面Q网늚脚本语言是很有用处的Q有的时候可以解军_大的N或提高程序的性能和应用性?

|页脚本语言的执行都是在客户端执行的Q速度很很快,q且大多的操作与服务器没有交互运,所以在一些应用中非常理想。在设计WEB目的应用中Q网늚脚本语言L不能忽视的作用,所以如果设计WEB目的应用中Q对JavaScript应有一定的了解?/span>
 
JavaScript是一U基于对?span>(Object Based)和事仉?Event Driven)q具有安全性能QSecureQ的脚本语言。用它的目的是与HTML文本标记语a、Java 脚本语言QJava程序)一起实现在一个Web面中链接多个对象,与Web客户交互作用。从而可以开发客L的应用程序等。它是通过嵌入或调入在标准的HTML语言中实现的。它h以下几个基本特点Q?/span>
1.它是一U脚本编写语a
JavaScript是一U脚本语aQ它采用程序段的方式实现编E。像其它脚本语言一?JavaScript同样已是一U解释性语a,它提供了一个易的开发过E?
它的基本l构形式与C、C++、VB十分cM。但它不像这些语a一P需要先~译Q而是在程序运行过E中被逐行地解释。它与HTML标识l合在一P从而方便用L使用操作?
2. Z对象的语a?span>
 JavaScript是一U基于对象的语言Q同时以可以看作一U面向对象的。这意味着它能q用自己已经创徏的对象。因此,许多功能可以来自于脚本环境中对象的方法与脚本的相互作用?
3.单?span>
 JavaScript的简单性主要体现在Q首先它是一U基于Java基本语句和控制流之上的简单而紧凑的设计, 从而对于学习Java是一U非常好的过渡。其ơ它的变量类型是采用q型,q未使用严格的数据类型?
4.安全?span>
 JavaScript是一U安全性语aQ它不允许访问本地的盘Qƈ不能数据存入到服务器上Q不允许对网l文档进行修改和删除Q只能通过览器实C息浏览或动态交互。从而有效地防止数据的丢失?
5. 动态?span>
 JavaScript是动态的Q它可以直接对用h客户输入做出响应Q无ȝqWeb服务E序。它对用L响应Q是采用以事仉动的方式q行的。所谓事仉动,是指在主页(Home Page)中执行了某种操作所产生的动作,q?#8220;事g”(Event)。比如按下鼠标、移动窗口、选择菜单{都可以视ؓ事g。当事g发生后,可能会引L应的事g响应?

6、开发工?/font>
Q?Q、数据库
在主要的应用中,数据库相关的环节应用很多Q所以对数据库应该有一定了解。不能单单只了解一U数据库Q因为在很多实际开发中会提出很多数据库解决ҎQ所以只有在了解多种数据库的情况下才能有一个比较方案?/span>
对于数据库应该了解他的性能和一些基本的操作常识Q还有该数据库的特点。而针对与Java语言WEB目的数据库开发则主要是对JDBC的应用,q有数据库事务处理和q接池等高概念的应用?br>
Q?Q?/span>Web服务?/span>
 
同数据库一P应该了解该服务器的性能Q特点和一些常识?/span>
在应用方面,Web服务器主要是针对于配|和部vQ对目录的配|,调试Q对配置文g属性的修改Q对讉K权限和ƈ发性的控制QJavacȝ部v{?/span>

Q?Q?/span>集成开发环境(IDEQ:
公欲善其事, 必先利其?#8221;. 对于Web应用开发h员来Ԍ好的集成开发环境(IDEQIntegrated Development EnviromentQ是非常重要的。目前在市场上占d位置的一个集成开发工具就是Eclipse.
 (转蝲文章请保留出处:Java?www.javajia.com))

]]> վ֩ģ壺 | | | | ϳ| ƽ| ̨| | ʹ| | | ͨ| Դ| Ͽ| | | | | ϴ| | | | | | | ˮ| | | | | | ˮ| ȫ| Ϫ| ڻ| Ͱ| ξ| | | | |