<?xml version="1.0" encoding="utf-8" ?>
<!-- generator="crazycoder cms 1.0(beta)" -->
<rss version="2.0" xmlns:sns="http://www.crazycoder.cn/rss/news">
	<channel>
		<title>j2ee开发</title>
		<description></description>
		<link>http://CrazyCoder.cn/Tag/9731/Index.html</link>
		<lastBuildDate>2010-07-31</lastBuildDate>
		<generator>CrazyCoder 1.0(beta)</generator>
		<language>zh-cn</language>
		<copyright>Copyright 1996 - 2008 疯狂代码  All Rights Reserved.</copyright>
		<pubDate>2010-07-31</pubDate>
		<item>
			<title><![CDATA[cms系统j2ee:如何开发出高质量J2EE系统]]></title>
			<link>http://CrazyCoder.cn/BlogDigest/Article75451.html</link>
			<description>
				<![CDATA[

					<div class="postTitle">
<h1>如何开发出高质量J2EE系统</h1>
<div class="postInfo">2009年07月24日&nbsp;&nbsp;<!--//文章浏览次数显示，需要插件支持。没安装不显示、不影响主题使用--> </div>
</div>
<div class="entry">

<p>J2EE学习者越来越多，J2EE本身技术不断在发展，涌现出各种概念，本文章试图从一种容易理解的角度对这些概念向初学者进行解释，以便掌握学习J2EE学习方向。</p>
<p>首先我们需要知道Java和J2EE是两个不同概念，Java不只是指一种语言，已经代表与微软不同的另外一个巨大阵营，所以Java有时是指一种软件系统的流派，当然目前主要是.NET和Java两大主流体系。</p>
<p>J2EE可以说指Java在数据库信息系统上实现，数据库信息系统从早期的dBase、到Delphi/VB等C/S结构，发展到B/S（Browser浏览器/Server服务器）结构，而J2EE主要是指B/S结构的实现。</p>

<p>J2EE又是一种框架和标准，框架类似API、库的概念，但是要超出它们。如果需要详细了解框架，可先从设计模式开始学习。</p>
<p>J2EE是一个虚的大的概念，J2EE标准主要有三种子技术标准：WEB技术、EJB技术和JMS，谈到J2EE应该说最终要落实到这三个子概念上。</p>
<p>这三种技术的每个技术在应用时都涉及两个部分：容器部分和应用部分，Web容器也是指Jsp/Servlet容器，你如果要开发一个Web应用，无论是编译或运行，都必须要有Jsp/Servlet库或API支持（除了JDK/J2SE以外）。</p>
<p>Web技术中除了Jsp/Servlet技术外，还需要JavaBeans或Java Class实现一些功能或者包装携带数据，所以Web技术最初裸体简称为Jsp/Servlet+JavaBeans系统。</p>
<p>谈到JavaBeans技术，就涉及到组件构件技术（component），这是Java的核心基础部分，很多软件设计概念（设计模式）都是通过JavaBeans实现的。</p>
<p>JavaBeans不属于J2EE概念范畴中，如果一个JavaBeans对象被Web技术（也就是Jsp/Servlet）调用，那么JavaBeans就运行在J2EE的Web容器中；如果它被EJB调用，它就运行在EJB容器中。</p>
<p>EJB（企业JavaBeans）是普通JavaBeans的一种提升和规范，因为企业信息系统开发中需要一个可伸缩的性能和事务、安全机制，这样能保证企业系统平滑发展，而不是发展到一种规模重新更换一套软件系统。</p>
<p>至此，JavaBeans组件发展到EJB后，并不是说以前的那种JavaBeans形式就消失了，这就自然形成了两种JavaBeans技术：EJB 和POJO，POJO完全不同于EJB概念，指的是普通JavaBeans，而且这个JavaBeans不依附某种框架，或者干脆可以说：这个 JavaBeans是你为这个应用程序单独开发创建的。</p>
<p>J2EE应用系统开发工具有很多：如JBuilder、Eclipse等，这些IDE首先是Java开发工具，也就是说，它们首要基本功能是可以开发出JavaBeans或Java class，但是如果要开发出J2EE系统，就要落实到要么是Web技术或EJB技术，那么就有可能要一些专门模块功能(如eclipse需要 lomboz插件)，最重要的是，因为J2EE系统区分为容器和应用两个部分，所以，在任何开发工具中开发J2EE都需要指定J2EE容器。</p>
<p>J2EE容器分为WEB容器和EJB容器，Tomcat/Resin是Web容器；JBoss是EJB容器+Web容器等，其中Web容器直接使用 Tomcat实现的。所以你开发的Web应用程序可以在上面两种容器运行，而你开发的Web+EJB应用则只可以在JBoss服务器上运行，商业产品 Websphere/Weblogic等和JBoss属于同一种性质。</p>
<p>J2EE容器也称为J2EE服务器，大部分时它们概念是一致的。</p>
<p>如果你的J2EE应用系统的数据库连接是通过JNDI获得，也就是说是从容器中获得，那么你的J2EE应用系统基本与数据库无关，如果你在你的J2EE 应用系统耦合了数据库JDBC驱动的配置，那么你的J2EE应用系统就有数据库概念色彩，作为一个成熟需要推广的J2EE应用系统，不推荐和具体数据库耦合，当然这其中如何保证J2EE应用系统运行性能又是体现你的设计水平了。</p>
<p>衡量J2EE应用系统设计开发水平高低的标准就是：解耦性；你的应用系统各个功能是否能够彻底脱离？是否不相互依赖，也只有这样，才能体现可维护性、可拓展性的软件设计目标。</p>
<p>为了达到这个目的，诞生各种框架概念，J2EE框架标准将一个系统划分为WEB和EJB主要部分，当然我们有时不是以这个具体技术区分，而是从设计上抽象为表现层、服务层和持久层，这三个层次从一个高度将J2EE分离开来，实现解耦目的。</p>
<p>因此，我们实际编程中，也要将自己的功能向这三个层次上靠，做到大方向清楚，泾渭分明，但是没有技术上约束限制要做到这点是很不容易的，因此我们还是必须借助J2EE具体技术来实现，这时，你可以使用EJB规范实现服务层和持久层，Web技术实现表现层；</p>
<p>EJB为什么能将服务层从Jsp/Servlet手中分离出来，因为它对JavaBeans编码有强制的约束，现在有一种对JavaBeans弱约束，使用Ioc模式实现的（当然EJB 3.0也采取这种方式），在Ioc模式诞生前，一般都是通过工厂模式来对JavaBeans约束，形成一个服务层，这也是是Jive这样开源论坛设计原理之一。</p>
<p>由此，将服务层从表现层中分离出来目前有两种可选架构选择：管理普通JavaBeans（POJO）框架(如Spring、 JdonFramework)以及管理EJB的EJB框架，因为EJB不只是框架，还是标准，而标准可以扩展发展，所以，这两种区别将来是可能模糊，被纳入同一个标准了。　但是，个人认为：标准制定是为某个目的服务的，总要牺牲一些换取另外一些，所以，这两种架构会长时间并存。</p>
<p>这两种架构分歧也曾经诞生一个新名词：完全POJO的系统也称为轻量级系统(lightweight)，其实这个名词本身就没有一个严格定义，更多是一个吸引人的招牌，轻量是指容易学习容易使用吗？按照这个定义，其实轻量Spring等系统并不容易学习；而且EJB 3.0（依然叫EJB）以后的系统是否可称为轻量级了呢？</p>
<p>前面谈了服务层框架，使用服务层框架可以将JavaBeans从 Jsp/Servlet中分离出来，而使用表现层框架则可以将Jsp中剩余的JavaBeans完全分离，这部分JavaBeans主要负责显示相关，一般是通过标签库（taglib）实现，不同框架有不同自己的标签库，Struts是应用比较广泛的一种表现层框架。</p>
<p>这样，表现层和服务层的分离是通过两种框架达到目的，剩余的就是持久层框架了，通过持久层的框架将数据库存储从服务层中分离出来是其目的，持久层框架有两种方向：直接自己编写JDBC等SQL语句（如iBatis）；使用O/R Mapping技术实现的Hibernate和JDO技术；当然还有EJB中的实体Bean技术。</p>
<p>持久层框架目前呈现百花齐放，各有优缺点的现状，所以正如表现层框架一样，目前没有一个框架被指定为标准框架，当然，表现层框架现在又出来了一个JSF，它代表的页面组件概念是一个新的发展方向，但是复杂的实现让人有些忘而却步。</p>
<p>在所有这些J2EE技术中，虽然SUN公司发挥了很大的作用，不过总体来说：网络上有这样一个评价：SUN的理论天下无敌；SUN的产品用起来撞墙；对于初学者，特别是那些试图通过或已经通过SUN认证的初学者，赶快摆脱SUN的阴影，立即开溜，使用开源领域的产品来实现自己的应用系统。</p>
<p>最后，你的J2EE应用系统如果采取上面提到的表现层、服务层和持久层的框架实现，基本你也可以在无需深刻掌握设计模式的情况下开发出一个高质量的应用系统了。</p>
<p>还要注意的是: 开发出一个高质量的J2EE系统还需要正确的业务需求理解，那么域建模提供了一种比较切实可行的正确理解业务需求的方法，相关详细知识可从UML角度结合理解。</p>
<p>当然，如果你想设计自己的行业框架，那么第一步从设计模式开始吧，因为设计模式提供你一个实现JavaBeans或类之间解耦参考实现方法，当你学会了系统基本单元JavaBean或类之间解耦时，那么系统模块之间的解耦你就可能掌握，进而你就可以实现行业框架的提炼了，这又是另外一个发展方向了。</p>
<p>以上理念可以总结为一句话：<br />J2EE开发三件宝: Domain Model（域建模）、patterns（模式）和framework（框架）。</p>
<p>推荐一套高质量的J2EE开源系统： JPestore</p>
</div>
					 <a href="/mypdf/75451.pdf" title="查看 cms系统j2ee:如何开发出高质量J2EE系统 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>博文摘选</category>
			<pubDate>2009-09-27</pubDate>
			<guid>http://CrazyCoder.cn/BlogDigest/Article75451.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee配置:J2EE开发环境配置个人总结]]></title>
			<link>http://CrazyCoder.cn/Java/Article7793.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          						<img src='/icons/4377yi.gif' />连两 3天<img src='/icons/4377dou.gif' />虽然不能说<img src='/icons/4377yi.gif' />刻不停<img src='/icons/4377de.gif' />在搞<img src='/icons/4377dou.gif' />但也几乎已经虚脱了<img src='/icons/4377dou2.gif' />还好终于搞定<img src='/icons/4377dou.gif' />乘着劲我觉得很有必要终结<img src='/icons/4377yi.gif' />下<img src='/icons/4377dou2.gif' /><br/>我使用<img src='/icons/4377de.gif' />是eclipse3.0<img src='/icons/4377de.gif' />IDE<img src='/icons/4377dou.gif' />自然在学习到j2ee部分必须要装很多插件<img src='/icons/4377dou.gif' />而且有很多版本对应问题<img src='/icons/4377dou.gif' /><img src='/icons/4377yi.gif' />般提供插件下载<img src='/icons/4377de.gif' />网站WebSite都会有介绍说明<img src='/icons/4377dou.gif' />请留意<img src='/icons/4377dou2.gif' />此文建立在jdk和eclipse已正确安装并使用<img src='/icons/4377de.gif' />前提下<img src='/icons/4377dou.gif' />并且所用软件Software均为免费且广为认可<img src='/icons/4377de.gif' /><img src='/icons/4377dou2.gif' />(eclipse3.0.1+tomcat5.0.16+tomcatPluginV31+emf-sdo-runtime-2.0.1+org.objectweb.lomboz_3.0.1.N20050106)<br/>我第<img src='/icons/4377yi.gif' />个安装<img src='/icons/4377de.gif' />是jsp服务器tomcat5.0<img src='/icons/4377dou.gif' />可以在http://tomcat.apache.org/下载<img src='/icons/4377dou.gif' />这个<img src='/icons/4377de.gif' />安装比较简单<img src='/icons/4377dou.gif' />安装完成后只需在系统环境变量中添加CATALINA_HOME=F:JavaTomcat5.0(我<img src='/icons/4377de.gif' />安装目录)就行了<img src='/icons/4377dou2.gif' />的后可以运行bin目录下<img src='/icons/4377de.gif' />startup.bat(直接双击或在DOS中运行)并在浏览器中以地址http://localhost:8080/测试就OK了<img src='/icons/4377dou2.gif' />为使tomcat能和eclipse整合到<img src='/icons/4377yi.gif' />起<img src='/icons/4377dou.gif' />还需要下载并安装tomcat插件tomcatPlugin(下载地址http://www.sysdeo.com/eclipse/tomcatplugin<br/>)<img src='/icons/4377dou2.gif' />正常<img src='/icons/4377de.gif' />话ec启动后会新出现 3个功能菜单startTomcat,stopTomcat和reatartTomcat,还必须在窗口首选项中导入tomcat<img src='/icons/4377de.gif' />安装路径<img src='/icons/4377dou2.gif' /><br/><br/>大家使用link方式对各种插件进行统<img src='/icons/4377yi.gif' /><img src='/icons/4377de.gif' />组织管理<img src='/icons/4377dou.gif' />网上有很多对这种思路方法<img src='/icons/4377de.gif' />讲解<img src='/icons/4377dou.gif' />希望能明白它<img src='/icons/4377de.gif' />工作方式以举<img src='/icons/4377yi.gif' />反 3以后区别<img src='/icons/4377de.gif' />插件也就能轻易安装而不再需要上网查了<img src='/icons/4377dou2.gif' />和将插件压缩包直接解压到eclipse<img src='/icons/4377de.gif' />plugins下类似<img src='/icons/4377dou.gif' />ec在启动时都会寻找并装载eclipseplugins目录下<img src='/icons/4377de.gif' />插件<img src='/icons/4377dou2.gif' />若将插件单独管理(即所谓<img src='/icons/4377de.gif' />link方式)<img src='/icons/4377dou.gif' />则在磁盘上任意位置解压<img src='/icons/4377yi.gif' />个插件包后应保证eclipseplugins目录<img src='/icons/4377dou.gif' />有些插件解压后需要我们自己创建eclipse目录<img src='/icons/4377dou2.gif' />的后在ec下<img src='/icons/4377de.gif' />links文件夹(可能需要自己新建)下创建指向某<img src='/icons/4377yi.gif' />插件位置<img src='/icons/4377de.gif' />link文件(如tomcat.link),其中编辑path=&lt;插件目录中<img src='/icons/4377de.gif' />eclipse<img src='/icons/4377de.gif' />父目录&gt;<img src='/icons/4377dou.gif' />注意分隔符应为“\\\"或“/”<img src='/icons/4377dou2.gif' />的后应先删除eclipseconfiguration下<img src='/icons/4377de.gif' />org.eclipse.update文件后再启动eclipse以便对工作区间进行更新<img src='/icons/4377dou2.gif' />的后在窗口首选项中进行<img src='/icons/4377yi.gif' />些必要<img src='/icons/4377de.gif' />参数设定<img src='/icons/4377dou2.gif' />以上是安装所有插件<img src='/icons/4377de.gif' />通用思路方法<img src='/icons/4377dou2.gif' /><br/>在安装第 2个插件Lomboz的前想过myEclipse,听说是个优秀功能强大<img src='/icons/4377de.gif' />东东<img src='/icons/4377dou.gif' />但由于myec是要money<img src='/icons/4377de.gif' />而且俺学校<img src='/icons/4377de.gif' />网速可受不了这玩意儿100多M<img src='/icons/4377de.gif' />天文数字<img src='/icons/4377dou.gif' />而且郁闷<img src='/icons/4377de.gif' />是官方网下软件Software还需要先注册帐号<img src='/icons/4377dou2.gif' />所以还是决定用lomboz(只是听说这个<img src='/icons/4377de.gif' />配置麻烦<img src='/icons/4377de.gif' />多)<img src='/icons/4377dou.gif' />我在JR下载了lomboz3.01版6.33M<img src='/icons/4377dou.gif' />我也差不多被它忽悠得差不多了<img src='/icons/4377dou2.gif' />看着网上教程<img src='/icons/4377de.gif' />时候就感觉不对<img src='/icons/4377dou.gif' />我这lomboz比教程所描述<img src='/icons/4377de.gif' />少了<img src='/icons/4377yi.gif' />个features目录<img src='/icons/4377dou.gif' />结果<img src='/icons/4377yi.gif' />切都乱套<img src='/icons/4377dou.gif' />直到今天才发现官方网(http://forge.objectweb.org/project/showfiles.php?group_id=97)下载<img src='/icons/4377de.gif' />是6.93M<img src='/icons/4377dou.gif' />内容当然就是完整<img src='/icons/4377de.gif' />了<img src='/icons/4377dou2.gif' />而且在此的前竟不知道在装lomboz前还需先装好另<img src='/icons/4377yi.gif' />插件emf(地址http://download.eclipse.org/tools/emf/scripts/downloads.php#goto2.1.0I)<img src='/icons/4377dou2.gif' />按以上思路方法安装了插件后都需要删除eclipseconfiguration下<img src='/icons/4377de.gif' />org.eclipse.update后再启动eclipse进行设置<img src='/icons/4377dou2.gif' /><br/>在窗口首选项中<img src='/icons/4377de.gif' />设置<img src='/icons/4377dou.gif' />对于lomboz我复制了网上<img src='/icons/4377de.gif' /><img src='/icons/4377yi.gif' />些资料如下:<br/>4:设置Lomboz<br/>在Preferences窗口中选定Lomboz<img src='/icons/4377dou.gif' />然后把右边面板中<img src='/icons/4377de.gif' />JDKTools.jar选择为你安装好JDK后<img src='/icons/4377dou.gif' />在JAVA_HOMELIB目录下面<img src='/icons/4377de.gif' />tools.jar文件就可以了<img src='/icons/4377dou.gif' /><img src='/icons/4377yi.gif' />定不要搞错了<img src='/icons/4377dou.gif' />如果你<img src='/icons/4377de.gif' />JDK是安装在F:J2SDK下面<img src='/icons/4377dou.gif' />那么这里<img src='/icons/4377de.gif' />值就应该是F:J2SDKlib	ools.jar<img src='/icons/4377dou.gif' />是其它<img src='/icons/4377de.gif' />都不对<img src='/icons/4377dou2.gif' />其它<img src='/icons/4377de.gif' />保持为默认值<img src='/icons/4377dou2.gif' /><br/>接着把Lomboz这<img src='/icons/4377yi.gif' />项展开<img src='/icons/4377dou.gif' />关键要设置<img src='/icons/4377de.gif' />地方是ServerDefinitions这<img src='/icons/4377yi.gif' />项<img src='/icons/4377dou.gif' />另外两项CodeGeneration和JSPEditor可以不管<img src='/icons/4377dou2.gif' />展开Lomboz<img src='/icons/4377de.gif' />ServerDefinitions后<img src='/icons/4377dou.gif' />在Servertypes里选择ApacheTomcatv4.1.0(这是按照我<img src='/icons/4377de.gif' />机器上<img src='/icons/4377de.gif' />配置进行设置<img src='/icons/4377de.gif' /><img src='/icons/4377dou.gif' />如果你安装<img src='/icons/4377de.gif' />是其它版本<img src='/icons/4377de.gif' />TOMCAT<img src='/icons/4377dou.gif' />你就要选择对应<img src='/icons/4377de.gif' />选项)<img src='/icons/4377dou.gif' />主要设置如下:<br/>Properties<br/>ApplicationServerDirectory:这是我<img src='/icons/4377de.gif' />TOMCAT4.1.30<img src='/icons/4377de.gif' />安装目录<img src='/icons/4377dou.gif' />我装在F:	omcat下面<img src='/icons/4377dou.gif' />所以它<img src='/icons/4377de.gif' />值就是F:/tomcat<br/>Address:127.0.0.1<br/>Port:80(<img src='/icons/4377yinwei.gif' />我在TOMCAT中把8080改为80了<img src='/icons/4377dou.gif' />所以这里就是80了<img src='/icons/4377dou.gif' />以你<img src='/icons/4377de.gif' />TOMCAT<img src='/icons/4377de.gif' />监听端口为准)<br/>ClasspathVariableName:TOMCAT_HOME(可以修改成其它<img src='/icons/4377de.gif' /><img src='/icons/4377zifu.gif' />串)<br/>ClasspathVariable:F:/tomcat(TOMCAT<img src='/icons/4377de.gif' />安装目录)<br/>然后点击Apply按钮<img src='/icons/4377dou2.gif' /><br/>ServerClasspath:<br/>JDK_TOOLS<br/>${<img src='/icons/4377class.gif' />PathVariableName}/bin/bootstrap.jar<br/>${<img src='/icons/4377class.gif' />PathVariableName}/common/servlet.jar<br/>${<img src='/icons/4377class.gif' />PathVariableName}/common/jasper-runtime.jar<br/>然后点击Apply按钮<img src='/icons/4377dou2.gif' /><br/><br/>ClientClasspath:<br/>这里为空<img src='/icons/4377dou.gif' />什么也没有<img src='/icons/4377dou2.gif' /><br/><br/>ProjectClasspath:<br/>JDK_TOOLS<br/>${<img src='/icons/4377class.gif' />PathVariableName}/bin/bootstrap.jar<br/>${<img src='/icons/4377class.gif' />PathVariableName}/common/servlet.jar 
		
          
              
          <br/>
        <br/>
          <br/>${<img src='/icons/4377class.gif' />PathVariableName}/common/jasper-runtime.jar<br/>然后点击Apply按钮<img src='/icons/4377dou2.gif' /><br/>这里<img src='/icons/4377de.gif' />ServerClasspath:和ProjectClasspath:我设置<img src='/icons/4377de.gif' />是<img src='/icons/4377yi.gif' />样<img src='/icons/4377de.gif' /><img src='/icons/4377dou2.gif' /><br/><br/>5:修改文件<br/>把Eclipse_homepluginscom.objectlearn.jdt.j2ee_3.0.1servers下面对应<img src='/icons/4377de.gif' />server文件打开<img src='/icons/4377dou.gif' />比如我安装<img src='/icons/4377de.gif' />TOMCAT是4.1.30版<img src='/icons/4377de.gif' /><img src='/icons/4377dou.gif' />那么就把tomcat410.server这个文件打开<img src='/icons/4377dou.gif' />把里面<img src='/icons/4377de.gif' />-Djava.endorsed.dirs=\"${serverRootDirectory}/bin;${serverRootDirectory}/common/endorsed\"<br/>改成<br/>-Djava.endorsed.dirs=\"${serverRootDirectory}/common/endorsed\"<br/><img src='/icons/4377yi.gif' />共有两处<img src='/icons/4377dou.gif' />都要修改<img src='/icons/4377dou.gif' />修改完的后保存<img src='/icons/4377dou.gif' />退出<img src='/icons/4377dou.gif' />重新启动Eclipse<img src='/icons/4377dou.gif' />这<img src='/icons/4377yi.gif' />步很重要<img src='/icons/4377dou.gif' /><img src='/icons/4377yi.gif' />定要做<img src='/icons/4377dou.gif' />不然<img src='/icons/4377de.gif' />话你在Lomboz中启动TOMCAT<img src='/icons/4377de.gif' />时候会再现很多莫明其妙<img src='/icons/4377de.gif' />异常<img src='/icons/4377de.gif' /><br/><br/>6:调出Lomboz各个菜单<br/>启动Eclipse<img src='/icons/4377dou.gif' />然后点击windows-&gt;CustomizePerspective,在出现<img src='/icons/4377de.gif' />对话框中<img src='/icons/4377de.gif' />Shortcuts页面中首先选中左边面板中<img src='/icons/4377de.gif' />LombozJ2EEWizards<img src='/icons/4377dou.gif' />这时右边<img src='/icons/4377de.gif' />面板中会出现很多选项<img src='/icons/4377de.gif' /><img src='/icons/4377dou.gif' />同时也把它们各项前面<img src='/icons/4377de.gif' />对钩打上<img src='/icons/4377dou2.gif' /><br/>然后在这个Shortcuts面板中改变Submenus:<img src='/icons/4377de.gif' />值<img src='/icons/4377dou.gif' />选择ShowView<img src='/icons/4377dou.gif' />接着在出现<img src='/icons/4377de.gif' />面板<img src='/icons/4377de.gif' />左边里选中LombozJ2EE<img src='/icons/4377dou.gif' />同时也要把它前面<img src='/icons/4377de.gif' />方框中打上对钩<img src='/icons/4377dou2.gif' /><br/>最后是更换CustomizePerspective对话框中<img src='/icons/4377de.gif' />面板到Commands这<img src='/icons/4377yi.gif' />页:<br/>在Commands这<img src='/icons/4377yi.gif' />页中选定LombozActions同时也把它们各项前面<img src='/icons/4377de.gif' />对钩打上<img src='/icons/4377dou2.gif' /><br/>所有<img src='/icons/4377de.gif' />设置完毕<img src='/icons/4377dou2.gif' /><br/>这样<img src='/icons/4377yi.gif' />切做完的后<img src='/icons/4377dou.gif' />Eclipse和Lomboz<img src='/icons/4377de.gif' />环境就配置好了<img src='/icons/4377dou.gif' />你可以进行开发各种<img src='/icons/4377chengxu.gif' />了<img src='/icons/4377dou2.gif' /><br/><br/><br/>以上是我在自己实际应用中整理总结并整理<img src='/icons/4377de.gif' /><img src='/icons/4377yi.gif' />点心得体会<img src='/icons/4377dou.gif' />部分资源来自网络<img src='/icons/4377dou2.gif' />希望对大家有所帮助<img src='/icons/4377dou.gif' />若有任何有误<img src='/icons/4377de.gif' />地方希望大家指正<img src='/icons/4377dou2.gif' />  <a href="/mypdf/7793.pdf" title="查看 j2ee配置:J2EE开发环境配置个人总结 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article7793.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:J2EE开发过程中的异常处理]]></title>
			<link>http://CrazyCoder.cn/Java/Article7229.html</link>
			<description>
				<![CDATA[

			
            <div>参考：<a href='http://www.crazycoder.cn/'>[http://www.crazycoder.cn/]</a>在java里有3种异常类型:</DIV><div>参考：<a href='http://www.crazycoder.cn/'>[http://www.crazycoder.cn/]</a>1.  检查型异常,这样的异常继承于Excetpion,就是在编译期间需要检查,如果该异常被throw,那么在该异常所在的method后必须显示的throws,调用该method的地方也必须捕获该异常,否则编译器会抛出异常.ejb里的RemoteException是一个这样的异常.</DIV><div>参考：<a href='http://www.crazycoder.cn/'>[http://www.crazycoder.cn/]</a>2. 运行时异常,就是在运行期间系统出现的异常,该类异常继承于RuntimeException,该类异常在编译时系统不进行检查,如NullPointerExcetpion,NumberFormatException.</DIV><DIV>3. 系统错误,一般是JVM出现异常时抛出的异常,如OutofMemoryError,这样的异常在J2EE开发中是不用关心的.</DIV><DIV>在J2EE开发中,检查型异常被滥用以至于过一段时间程序员自己都看不懂抛出这样的异常,.里面封装的这些错误信息是干什么用的,更可怕的是有好多有用的信息找不到了.比如SQLException和RemoteException这样的异常我们没必要再进行封装,这样的异常只对我们调试程序有用,而对客户来说它就是一个”系统错误”而已.异常处理有一个简单的原则,你什么时候需要封装自己的检查型异常?就是你很清楚自己抛出这个异常的用途时,比如用户输入用户名和密码要登录,但用户名和密码不匹配,你就要定义一个检查型异常,客户端通过捕获该异常,然后把相应的错误信息反馈给客户.而其它的自己未预期的错误或者异常比如SQLException,只需封装到EJBException中,ejb container会把它的信息追加到RemoteException里,这样客户端捕获RemoteException后把它写到系统日志里,就很容易进行调试.</DIV><DIV>关于错误代码,一般反馈给客户的错误代码有两种类型:</DIV><DIV>1. 应用程序级错误,这些错误是由客户自身的原因引起的,比如输入信息有误,没有操作该功能的权限.对于这样情况,系统应给用户一个明确的提示.</DIV><DIV>2. 系统级异常,比如”未连接到服务器”,”服务器忙”,”未连接到数据库”,”系统错误”,这样的错误给客户带来的后果是不能进行操作,那么下面的戏该由系统管理员和系统开发者去演了.</DIV>个人觉得检查型异常对应于应用程序级错误,运行时异常对应于系统级异常.<IMG height=1 src=\"http://www.xue5.com/itedu/down_info.asp?id=44441\" width=1 border=0>             <a href="/mypdf/7229.pdf" title="查看 j2ee开发:J2EE开发过程中的异常处理 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2008-09-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article7229.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:J2EE开发购物网站的应用(2)]]></title>
			<link>http://CrazyCoder.cn/Java/Article7071.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
           2、<STRONG>配置weblogic服务</STRONG><br/><br/>用JBuilder可以整合weblogic<img src='/icons/43115dou.gif' />这样可以把在JBuilder下开发<img src='/icons/43115de.gif' />EJB或打包成WAR<img src='/icons/43115de.gif' />网站WebSite直接发布到weblogic！<br/><br/>首先在tools下选择Configure Servers<img src='/icons/43115dou.gif' />在下面<img src='/icons/43115de.gif' />user Home下<img src='/icons/43115dou.gif' />你可以看到“webLogic Application Server 6.X-7.0”项<img src='/icons/43115dou.gif' />点击它<img src='/icons/43115dou.gif' />在右边会出现Server Settings <img src='/icons/43115dou.gif' />将Enable server打上勾<img src='/icons/43115dou.gif' />在下面<img src='/icons/43115de.gif' />General下选择home directory和Working directory<img src='/icons/43115dou2.gif' />然后点Custom项<img src='/icons/43115dou.gif' />选择JDK <img src='/icons/43115install.gif' />ation directory<img src='/icons/43115dou2.gif' /><br/><br/>BEA home directory<img src='/icons/43115dou2.gif' /><br/><br/>接着输入密码和设定<img src='/icons/43115de.gif' />Do<img src='/icons/43115main.gif' /> name和Server name这些都是你安装weblogic时设定<img src='/icons/43115de.gif' /><img src='/icons/43115dou.gif' />如果目录选择正确<img src='/icons/43115dou.gif' />在下面<img src='/icons/43115de.gif' />version下会自动出现你<img src='/icons/43115de.gif' />weblogci<img src='/icons/43115de.gif' />版本号<img src='/icons/43115dou2.gif' />点击OK即完成！<br/><br/>下面<img src='/icons/43115dou.gif' />我们做<img src='/icons/43115yi.gif' />个试验<img src='/icons/43115dou.gif' />看看weblogic是不是和Jbuilder整合了！首先<img src='/icons/43115dou.gif' />我们新建<img src='/icons/43115yi.gif' />个工程<img src='/icons/43115dou.gif' />选Application<img src='/icons/43115dou.gif' />在name里填写你<img src='/icons/43115de.gif' />工程名<img src='/icons/43115dou.gif' />接着按完成即可<img src='/icons/43115dou2.gif' />在新建工程项目时顺便看<img src='/icons/43115yi.gif' />看Server是不是用<img src='/icons/43115de.gif' />Weblogic<br/><br/>然后再选新建<img src='/icons/43115dou.gif' />在出现<img src='/icons/43115de.gif' />ObJect Gallery下选Web<img src='/icons/43115dou.gif' /><img src='/icons/43115yinwei.gif' />我们是要发布WEB应用<img src='/icons/43115dou.gif' />所以选取Web Application<img src='/icons/43115dou.gif' />为它命个名<img src='/icons/43115dou.gif' />这将是网站WebSite包<img src='/icons/43115de.gif' />名字<img src='/icons/43115dou.gif' />指定它<img src='/icons/43115de.gif' />工作目录后选择Generate war<img src='/icons/43115dou.gif' />点OK即可<img src='/icons/43115dou2.gif' />接下来<img src='/icons/43115dou.gif' />我们要新建<img src='/icons/43115yi.gif' />个JSP文件<img src='/icons/43115dou.gif' /><img src='/icons/43115yi.gif' />样点新建<img src='/icons/43115dou.gif' />在WEB下选择JAVAServer Page<img src='/icons/43115dou.gif' />按它<img src='/icons/43115de.gif' />默认点下<img src='/icons/43115yi.gif' />步即可<img src='/icons/43115dou.gif' />它会自动创建<img src='/icons/43115yi.gif' />个JAVABEAN<img src='/icons/43115dou2.gif' /><br/><br/>首先<img src='/icons/43115dou.gif' />我们要把自动生成<img src='/icons/43115de.gif' />这个BEAN编译为<img src='/icons/43115class.gif' /><img src='/icons/43115dou.gif' />选中它<img src='/icons/43115dou.gif' />点右键<img src='/icons/43115dou.gif' />在出现<img src='/icons/43115de.gif' />菜单选Rebuild编译<img src='/icons/43115dou.gif' />然后编译你<img src='/icons/43115de.gif' />Web Application<img src='/icons/43115dou.gif' />它会自动生成WAR包<img src='/icons/43115dou.gif' />点这个包发布即可发布网站WebSite<img src='/icons/43115dou2.gif' />接下来打开浏览器输入 http://127.0.0.1:7001/tds/index.Jsp 即可看到该页面<img src='/icons/43115dou2.gif' /> <br/><br/><STRONG> 3、创建数据库</STRONG><br/><br/>Oracle 8i和Oracle 9i确实有些不<img src='/icons/43115yi.gif' />样<img src='/icons/43115dou.gif' />不过在界面上区别不大<img src='/icons/43115dou.gif' />还是以我<img src='/icons/43115de.gif' />Oracle 8i为例为大家讲解<img src='/icons/43115yi.gif' />下吧！既然是实战<img src='/icons/43115dou.gif' />首先我们为自己新建<img src='/icons/43115yi.gif' />个开发用户<img src='/icons/43115dou.gif' />并创建<img src='/icons/43115yi.gif' />个表<img src='/icons/43115dou2.gif' />在oracle里创建新用户和表<img src='/icons/43115de.gif' />思路方法比较多<img src='/icons/43115dou.gif' />只要你有管理员<img src='/icons/43115de.gif' />权限<img src='/icons/43115dou.gif' />首先用最简单<img src='/icons/43115de.gif' /><img src='/icons/43115dou2.gif' />在Oracle 8i<img src='/icons/43115de.gif' /><img src='/icons/43115chengxu.gif' />组中启动DBA Studio<img src='/icons/43115chengxu.gif' />项<img src='/icons/43115dou.gif' />在出现<img src='/icons/43115de.gif' />数据库链接信息中输入管理用户名和口令即可<img src='/icons/43115dou.gif' />当然<img src='/icons/43115dou.gif' />在oracle中<img src='/icons/43115dou.gif' />你可以用用户名斜杠口令<img src='/icons/43115de.gif' />思路方法登陆<img src='/icons/43115dou.gif' />连接身份选SYSDBA<img src='/icons/43115dou2.gif' /><br/><br/>创建用户:在登陆后<img src='/icons/43115dou.gif' />单击安全<img src='/icons/43115dou.gif' />在第<img src='/icons/43115yi.gif' />项<img src='/icons/43115dou.gif' />你就会看到用户<img src='/icons/43115dou.gif' />用右键你可以创建新用户<img src='/icons/43115dou.gif' />或者给用户授于角色<img src='/icons/43115dou.gif' />区别<img src='/icons/43115de.gif' />角色拥有区别<img src='/icons/43115de.gif' />权限！Oracle 8i预定义<img src='/icons/43115de.gif' />角色<img src='/icons/43115dou.gif' />我在下面会讲<img src='/icons/43115dou2.gif' /><br/><br/>咱们先断开system<img src='/icons/43115de.gif' />数据库连接<img src='/icons/43115dou.gif' />可以在文件中选择<img src='/icons/43115dou.gif' />也可以用右键<img src='/icons/43115dou2.gif' />然后用我们创建<img src='/icons/43115de.gif' />用户来登陆<img src='/icons/43115dou.gif' />并且在方案中找到表<img src='/icons/43115dou.gif' />然后就可以直接创建<img src='/icons/43115dou.gif' />由于是图形可视化<img src='/icons/43115dou.gif' />而且又是全中文<img src='/icons/43115de.gif' /><img src='/icons/43115dou.gif' />我就不缀述了！大家可以多试试！<br/><br/>用SQLPLUS工具创建用户和数据库:在oracle中可以使用sqlplus这个工具来书写SQL语句<img src='/icons/43115dou.gif' />对于SQL高手来说<img src='/icons/43115dou.gif' />这是发挥才能<img src='/icons/43115de.gif' />好地方<img src='/icons/43115dou2.gif' />咱们来试试吧<img src='/icons/43115dou.gif' />首先<img src='/icons/43115yi.gif' />样要先登陆<img src='/icons/43115dou.gif' />为了创建新用户<img src='/icons/43115dou.gif' />咱们仍以system来登陆<img src='/icons/43115dou2.gif' />在主机<img src='/icons/43115zifu.gif' />串中填入数据标识(oradb)<br/><br/>在登陆进去后<img src='/icons/43115dou.gif' />出现“SQL&gt;”我们就可以在它后面书写SQL语句<img src='/icons/43115dou.gif' />grant connect<img src='/icons/43115dou.gif' />resouce to maxuan ident<img src='/icons/43115if.gif' />ied by max<img src='/icons/43115dou.gif' />这<img src='/icons/43115yi.gif' />句是创建用户maxuan<img src='/icons/43115dou.gif' />口令为max<img src='/icons/43115dou.gif' />并赋予connect<img src='/icons/43115dou.gif' />resource权限<img src='/icons/43115dou.gif' />在出现授权成功后<img src='/icons/43115dou.gif' />我们用conn maxuan/max这句来以maxuan连接数据库<img src='/icons/43115dou.gif' />这时<img src='/icons/43115de.gif' />角色已经不是DBA了！接下来<img src='/icons/43115de.gif' />是些基本<img src='/icons/43115de.gif' />SQL建表语句<img src='/icons/43115dou.gif' />不用多说了<img src='/icons/43115dou.gif' />在sqlplus中<img src='/icons/43115dou.gif' />每条语句结束用分号标识<img src='/icons/43115dou.gif' />在完成后<img src='/icons/43115dou.gif' />我们可以用quit或exit命令断开<img src='/icons/43115dou2.gif' /><br/><br/>这里我说几个Oracle 8i<img src='/icons/43115de.gif' />预定义角色<img src='/icons/43115dou2.gif' /><br/><br/>1、CONNECT角色: 授于最终用户<img src='/icons/43115de.gif' />典型最基本<img src='/icons/43115de.gif' />权利<br/><br/>ALTER SESSION --修改会话<br/><br/>CREATE CLUSTER --建立聚簇<br/><br/>CREATE DATABASE LINK --建立数据库链接<br/><br/>CREATE SEQUENCE --建立序列<br/><br/>CREATE SESSION --建立会话<br/><br/>CREATE SYNONYM --建立同义词<br/><br/>CREATE VIEW --建立视图<br/><br/>2、RESOURCE角色: 是授予开发人员<img src='/icons/43115de.gif' /><br/><br/>CREATE CLUSTER --建立聚簇<br/><br/>CREATE PROCEDURE --建立过程<br/><br/>CREATE SEQUENCE --建立序列<br/><br/>CREATE TABLE --建表<br/><br/>CREATE TRIGGER --建立触发器<br/><br/>CREATE TYPE --建立类型<br/><br/>3、DBA角色:拥有系统所有系统级权限<br/><br/>4、IMP_FULL_DATABASE角色、EXP_FULL_DATABASE角色:<br/><br/>BACKUP ANY TABLE --备份任何表<br/><br/>EXECUTE ANY PROCEDURE --执行任何操作<br/><br/>SELECT ANY TABLE --查询任何表<br/><br/>5、DELETE_CATALOG_ROLE角色:<br/><br/>授予用户这个角色<img src='/icons/43115dou.gif' />用户就可以从表sys.aud$中删除记录<img src='/icons/43115dou.gif' />sys.aud$表中记录着审计后<img src='/icons/43115de.gif' />记录<img src='/icons/43115dou.gif' />使用这个角色可以简化审计踪迹管理<img src='/icons/43115dou2.gif' /><br/><br/>6、SELECT_CATALOG_ROLE角色、EXECUTE_CATALOG_ROLE角色:<br/><br/>SELECT_CATALOG_ROLE角色具有从数据字典查询<img src='/icons/43115de.gif' />权利<img src='/icons/43115dou.gif' />EXECUTE_CATALOG_ROLE角色具有从数据字典中执行部分过程和<img src='/icons/43115hanshu.gif' /><img src='/icons/43115de.gif' />权利<img src='/icons/43115dou2.gif' /><br/><br/>在前面我们掌握了些基本<img src='/icons/43115de.gif' />oracle操作<img src='/icons/43115dou.gif' />如创建、授权用户<img src='/icons/43115dou.gif' />创建数据库等<img src='/icons/43115dou2.gif' />在OEM(Oracle Enterprise Manager)可视化<img src='/icons/43115de.gif' />窗口环境中<img src='/icons/43115dou.gif' />虽然我们也可以很方便地做这些事<img src='/icons/43115dou.gif' />但是事实上<img src='/icons/43115dou.gif' />用SQL语言书写在开发上更有效率！oracle提供<img src='/icons/43115de.gif' />SQL*Plus就是个不错<img src='/icons/43115de.gif' />工具<img src='/icons/43115dou.gif' />如果大家喜欢窗口<img src='/icons/43115de.gif' />开发环境<img src='/icons/43115dou.gif' />用SQLPlus Worksheet也行<img src='/icons/43115dou2.gif' />SQL(Structure Query Language)语言是结构化查询语言<img src='/icons/43115dou.gif' />是数据库<img src='/icons/43115de.gif' />核心语言<img src='/icons/43115dou.gif' />是面向集合<img src='/icons/43115de.gif' />描述性非过程化语言<img src='/icons/43115dou2.gif' /><br/><br/>SQL语言共分为 4大类:数据查询语言DQL<img src='/icons/43115dou.gif' />数据操纵语言DML<img src='/icons/43115dou.gif' />数据定义语言DDL<img src='/icons/43115dou.gif' />数据库控制语言DCL<img src='/icons/43115dou2.gif' /><br/><br/>1、数据查询语言DQL<img src='/icons/43115de.gif' />基本结构是由select子句<img src='/icons/43115dou.gif' />from子句<img src='/icons/43115dou.gif' />where子句组成<img src='/icons/43115de.gif' />查询块:<br/><br/>  select &lt;字段名表&gt; from &lt;表或视图名&gt;where &lt;查询条件&gt;<br/><br/> <br/> <br/>2、数据操纵语言DML完成在数据库中确定、修改、添加、删除某<img src='/icons/43115yi.gif' />数据值<img src='/icons/43115de.gif' />任务(以下是部分常用DML语句): <br/><br/>insert 增加数据行到表 <br/><br/>delete 从表中删除数据行 <br/><br/>Update 更改表中数据 <br/><br/>3、数据定义语言DDL完成定义数据库<img src='/icons/43115de.gif' />结构<img src='/icons/43115dou.gif' />包括数据库本身、数据表、目录、视图等数据库元素(以下是部分常用DDL语句) <br/><br/>create table 创建表 <br/> 
		
          
              
          <br/>
        <br/>
          <br/>create index 创建索引 <br/><br/>create view 创建视图 <br/><br/>alter table 增加表列<img src='/icons/43115dou.gif' />重定义表列<img src='/icons/43115dou.gif' />更改存储分配 <br/><br/>drop table 删除表 <br/><br/>drop index 删除索引 <br/><br/>4、数据库控制语言DCL用来授予或回收访问数据库<img src='/icons/43115de.gif' />某种特权<img src='/icons/43115dou.gif' />并控制数据库操纵事务发生<img src='/icons/43115de.gif' />时间及效果<img src='/icons/43115dou.gif' />对数据库实行监视等<img src='/icons/43115dou2.gif' />如: <br/><br/>grant 将权限或角色授予用户或其它角色 <br/><br/>revoke 回收用户权限 <br/><br/>roll 回滚<img src='/icons/43115dou.gif' />是当某个对话更改了数据库中<img src='/icons/43115de.gif' />数据后<img src='/icons/43115dou.gif' />由于某种原因用户不想提交此更改时<img src='/icons/43115dou.gif' />oracle所采取<img src='/icons/43115de.gif' />保护操作<img src='/icons/43115dou2.gif' />这是<img src='/icons/43115yi.gif' />个把信息恢复到用户使update、insert、delete前最后提交<img src='/icons/43115de.gif' />状态<img src='/icons/43115dou2.gif' /> <br/><br/>commit 提交<img src='/icons/43115dou2.gif' />在完成数据库<img src='/icons/43115de.gif' />插入<img src='/icons/43115dou.gif' />删除和修改操作时<img src='/icons/43115dou.gif' />只有当事务提交到数据库才算完成<img src='/icons/43115dou.gif' />有提交前只有操作数据库<img src='/icons/43115de.gif' />本人才能看到<img src='/icons/43115dou.gif' />别人只有在最后提交完成才可以看到<img src='/icons/43115dou2.gif' />接下来<img src='/icons/43115dou.gif' />我们在SQL*Plus中实战<img src='/icons/43115yi.gif' />下<img src='/icons/43115dou.gif' />为我们下面将要做<img src='/icons/43115de.gif' />打好基础<img src='/icons/43115dou2.gif' />用system登陆到SQL*Plus后<img src='/icons/43115dou.gif' />我们做如下操作: <br/><br/>  SQL&gt;create user maxuan ident<img src='/icons/43115if.gif' />ied by max;#创建口令为max<img src='/icons/43115de.gif' />用户maxuanSQL&gt;grant connect<img src='/icons/43115dou.gif' />resource to maxuan; #为用户maxuan授权SQL&gt;conn maxuan/max;#以用户maxuan进行连接L&gt;create table test(a number);#建立<img src='/icons/43115yi.gif' />个名为test<img src='/icons/43115de.gif' />表<img src='/icons/43115dou.gif' />只有字段名为A<img src='/icons/43115de.gif' /><img src='/icons/43115yi.gif' />列<img src='/icons/43115dou.gif' />数据类型为数字SQL&gt;insert <img src='/icons/43115int.gif' />o test values(1); #插入<img src='/icons/43115yi.gif' />条记录SQL&gt;select * from test; #查询记录<img src='/icons/43115dou.gif' />此时A列<img src='/icons/43115de.gif' />第<img src='/icons/43115yi.gif' />行为1SQL&gt;update test <img src='/icons/43115set.gif' /> a=2; #更改记录<img src='/icons/43115dou.gif' />此时A列<img src='/icons/43115de.gif' />第<img src='/icons/43115yi.gif' />行已改为2SQL&gt;commit;#提交SQL&gt;delete from test;#删除test表中所有<img src='/icons/43115de.gif' />记录<img src='/icons/43115dou.gif' />此时test表中没有记录SQL&gt;roll; #回滚到提交前<img src='/icons/43115dou.gif' />此时再查询test表<img src='/icons/43115dou.gif' />A列第<img src='/icons/43115yi.gif' />行值又回复到2<br/><br/> <br/> <br/><br/><br/>  <a href="/mypdf/7071.pdf" title="查看 j2ee开发:J2EE开发购物网站的应用(2) 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article7071.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:J2EE开发购物网站的应用(1)]]></title>
			<link>http://CrazyCoder.cn/Java/Article7070.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          <STRONG><img src='/icons/65543yi.gif' />、搭建开发平台</STRONG><br/><br/>本文从实战出发<img src='/icons/65543dou.gif' />所以有关<img src='/icons/65543yi.gif' />些概念性<img src='/icons/65543de.gif' />问题就不多讲了<img src='/icons/65543dou.gif' />首先准备下面<img src='/icons/65543de.gif' />家伙:<br/><br/>1.oracle<br/><br/>2.weblogic<br/><br/>3.Jbuilder<br/><br/>其它:struts-console-2.2(用作struts视图开发)PowerBulider(方便数据库操作)Dreamweaver(美化前台页面)开发平台为Windows2000<img src='/icons/65543dou2.gif' />以下以<img src='/icons/65543yi.gif' />般性<img src='/icons/65543de.gif' />配置为例详细介绍搭建J2EE<img src='/icons/65543de.gif' />开发平台<img src='/icons/65543dou2.gif' /><br/><br/>用机配置:P4赛扬1.7G<img src='/icons/65543dou.gif' />256MB 20GHDD 操作系统:Windowsdows2000 SP3<br/><br/>数据库:oracle 8i<br/><br/>J2EE应用平台:weblogic 6.1 sp2<br/><br/>EJB<img src='/icons/65543dou.gif' />JSP<img src='/icons/65543dou.gif' />JAVABEAN开发:Jbuilder 7 weblogic版<br/><br/><STRONG>第<img src='/icons/65543yi.gif' />步<img src='/icons/65543dou.gif' />安装配置oracle数据库</STRONG><br/><br/>安装oracle最新版<img src='/icons/65543de.gif' />9i什么事都没有<img src='/icons/65543dou.gif' />但如果你在P4<img src='/icons/65543de.gif' />机器上装8i可能就会出现问题<img src='/icons/65543dou.gif' />点了安装的后没有反应(P4赛扬也存在这个问题)<img src='/icons/65543dou2.gif' />如果您是P4<img src='/icons/65543de.gif' />机器又要装8i<img src='/icons/65543de.gif' />话<img src='/icons/65543dou.gif' />那么先按如下思路方法做<img src='/icons/65543dou2.gif' /><br/><br/>(1)创建<img src='/icons/65543yi.gif' />临时目录<img src='/icons/65543dou.gif' />并将Oracle8i<img src='/icons/65543de.gif' />安装源<img src='/icons/65543chengxu.gif' />拷贝到此目录<img src='/icons/65543dou2.gif' /><br/><br/>找到目录stage\\Components\\oracle.swd.Jre\\1.1.7.30\\1\\DataFiles\\Expanded\\Jre\\Windows32\\bin下<img src='/icons/65543de.gif' /> symcJit.dll <img src='/icons/65543de.gif' />文件<img src='/icons/65543dou.gif' />并改名为 symcJit.old<img src='/icons/65543dou2.gif' />注意OEM目录下还有<img src='/icons/65543yi.gif' />个symcJit.dll文件要改名<img src='/icons/65543dou2.gif' /><br/><br/>(2)搜索到oraparam.ini文件<img src='/icons/65543dou.gif' />打开它<img src='/icons/65543dou.gif' />改变行RE_MEMORY_OPTIONS=-mx48m<img src='/icons/65543de.gif' />参数为 JRE_MEMORY_OPTIONS=-noJit -ms16m -mx32m <br/><br/>(3)其它<img src='/icons/65543de.gif' />参数保持不变<img src='/icons/65543dou2.gif' /><br/><br/>(4)执行本地硬盘<img src='/icons/65543install.gif' />\\Windows32\\<img src='/icons/65543set.gif' />up.exe目录下<img src='/icons/65543de.gif' />Setup.exe文件<img src='/icons/65543dou2.gif' />此时<img src='/icons/65543diaoyong.gif' /><img src='/icons/65543de.gif' />是修改过<img src='/icons/65543de.gif' />参数文件oraparam.ini<img src='/icons/65543dou2.gif' /><br/><br/>(5)安装时选择自定义模式<img src='/icons/65543dou.gif' />并且不创建数据库<img src='/icons/65543dou2.gif' /><br/><br/>(7)Oracle8i安装完成后<img src='/icons/65543dou.gif' />安装目录中<img src='/icons/65543de.gif' />下列每<img src='/icons/65543yi.gif' />个文件都有需要作相应修改<img src='/icons/65543dou2.gif' />(如果不修改点任何应用都没有反应)<br/><br/>  assistants\\dbca\\dbassist.cl assistants\\dbma\\dbmig.cl assistants\\<img src='/icons/65543if.gif' />a\\<img src='/icons/65543if.gif' />a.cl bin\\elogin.cl bin\\owm.cl ldap\\oidamdin\\oidadmin.cl network\\tools\\netasst.cl network\\tools\\netca.cl owm\\<img src='/icons/65543install.gif' />\\instelogin.cl owm\\<img src='/icons/65543install.gif' />\\instowm.cl<br/><br/> <br/> <br/><br/><br/>用编辑工具依次打开上述文件<img src='/icons/65543dou.gif' />增加参数 -noJit<img src='/icons/65543dou.gif' />以dbassist.cl文件为例示意如下:<br/><br/>  Command=(\"C:\\Program Files\\Oracle\\Jre\\1.1.7\\BIN\\JREW\" -noJit -<img src='/icons/65543class.gif' />path ....)<br/><br/> <br/> <br/>用相同<img src='/icons/65543de.gif' />思路方法修改所列出<img src='/icons/65543de.gif' />每<img src='/icons/65543yi.gif' />个.cl 文件内容<img src='/icons/65543dou2.gif' />修改完后运行database administrator下<img src='/icons/65543de.gif' />Database Configuration Assistant就可以创建数据库了<img src='/icons/65543dou.gif' />这可是<img src='/icons/65543yi.gif' />个漫长<img src='/icons/65543de.gif' />过程<img src='/icons/65543dou.gif' />在创建数据库时要创建全局标识<img src='/icons/65543dou.gif' />搞个好记<img src='/icons/65543de.gif' />就行<img src='/icons/65543dou.gif' />以后好配置数据库连接<img src='/icons/65543dou2.gif' />创建完后<img src='/icons/65543dou.gif' />默认<img src='/icons/65543de.gif' />DBA用户名为system<img src='/icons/65543dou.gif' />密码为manager<img src='/icons/65543dou2.gif' /><br/><br/><STRONG>第 2步<img src='/icons/65543dou.gif' />安装配置weblogic 6.1SP2<img src='/icons/65543dou.gif' />并连接oracle</STRONG><br/><br/>Windows平台<img src='/icons/65543de.gif' />weblogic基本上都可以直接安装<img src='/icons/65543dou.gif' />但要注意不要把它装到带有空格<img src='/icons/65543de.gif' />目录里如Program Files<img src='/icons/65543dou.gif' />或是中文目录中<img src='/icons/65543dou.gif' />默认为c:\\bea<img src='/icons/65543dou.gif' />按默认点下<img src='/icons/65543yi.gif' />步<img src='/icons/65543dou.gif' />就可以完成安装<img src='/icons/65543dou.gif' />这个基本没有意外！(最简单<img src='/icons/65543de.gif' />安装操作)<img src='/icons/65543dou.gif' />最后要记住设<img src='/icons/65543de.gif' />管理密码!为了调试方便<img src='/icons/65543dou.gif' />不将weblogic设为自动服务启动<img src='/icons/65543dou2.gif' />设定您<img src='/icons/65543de.gif' />管理密码<img src='/icons/65543dou.gif' />进入控制台<img src='/icons/65543dou.gif' />启动服务都需要<img src='/icons/65543dou2.gif' />为了方便<img src='/icons/65543dou.gif' />我将目录安到了D盘<img src='/icons/65543dou.gif' />并将do<img src='/icons/65543main.gif' />改为maxuan<img src='/icons/65543dou.gif' />server改为max<img src='/icons/65543dou.gif' />接下来我们将配置JDBC连接oracle数据库<img src='/icons/65543dou2.gif' /><br/><br/>首先打开D:\\bea\\wlserver6.1\\config\\maxuan(maxuan为我改后<img src='/icons/65543de.gif' />名字<img src='/icons/65543dou.gif' />默认<img src='/icons/65543de.gif' />为mydo<img src='/icons/65543main.gif' />)<img src='/icons/65543dou.gif' />用文本编辑器如:记事本或editplus打开startWebLogic.cmd<img src='/icons/65543dou.gif' />找到“<img src='/icons/65543set.gif' /> PATH=”这<img src='/icons/65543yi.gif' />行<img src='/icons/65543dou.gif' />加入“.\\bin\\oci817_8”<img src='/icons/65543dou.gif' />如本人<img src='/icons/65543de.gif' />为“<img src='/icons/65543set.gif' /> PATH=.\\bin;.\\bin\\oci817_8;%PATH%”<br/><br/>为了使启动weblogic不需要每次都输入密码<img src='/icons/65543dou.gif' />在“<img src='/icons/65543set.gif' /> WLS_PW=”输入安装时所设定<img src='/icons/65543de.gif' />密码即可<img src='/icons/65543dou2.gif' /><br/><br/>双击startWebLogic.cmd或在<img src='/icons/65543chengxu.gif' />中直接运行Start Default Server启动weblogic服务(注意不要将这个窗口关了)<br/><br/>启动weblogic 然后在<img src='/icons/65543chengxu.gif' />中运行Start Default Console<img src='/icons/65543dou.gif' />进入控制台操作<img src='/icons/65543dou.gif' />在出现<img src='/icons/65543de.gif' />对话框中输入管理用户名system<img src='/icons/65543dou.gif' />密码为你设<img src='/icons/65543de.gif' />密码即可进入！<br/><br/>点开左边<img src='/icons/65543de.gif' />Services<img src='/icons/65543dou.gif' />你可以看到JDBC；<br/><br/>点开它<img src='/icons/65543dou.gif' />点击在下面<img src='/icons/65543de.gif' />Connection Pools<img src='/icons/65543dou.gif' />右边会出现配置项目<img src='/icons/65543dou.gif' />点击Configure a <img src='/icons/65543new.gif' /> JDBC Connection Pool出现配置项<img src='/icons/65543dou.gif' />在Configuration下<img src='/icons/65543de.gif' />General标签下配置:<br/><br/>name:这里我填写<img src='/icons/65543de.gif' />是“mytest”；<br/><br/>URL填写为“Jdbc:weblogic:oracle”；<br/><br/>Driver Classname:填写为“weblogic.Jdbc.oci.Driver”；<br/><br/>Properties(key=value):填写为:<br/><br/>user=system<br/><br/>password=manager<br/><br/>server=oradb<br/><br/>这里<img src='/icons/65543de.gif' />oradb即是所安装<img src='/icons/65543de.gif' />oracle所创建<img src='/icons/65543de.gif' />数据库<img src='/icons/65543de.gif' />全局标识<img src='/icons/65543dou2.gif' />user和password我用<img src='/icons/65543de.gif' />是默认<img src='/icons/65543de.gif' />DBA<img src='/icons/65543dou.gif' />你可以用自己创建<img src='/icons/65543de.gif' />用户名和密码<img src='/icons/65543dou2.gif' />点击Apply按钮完成<img src='/icons/65543dou2.gif' />点击Targets下<img src='/icons/65543de.gif' />Servers标签<img src='/icons/65543dou.gif' />把Available下<img src='/icons/65543de.gif' />Tgets-Server移到Chosen下<img src='/icons/65543dou.gif' />然后点Apply按钮<img src='/icons/65543dou2.gif' /><br/><br/>接着配置下面<img src='/icons/65543de.gif' />Data Sources<img src='/icons/65543dou.gif' />在右边用“Configure a <img src='/icons/65543new.gif' /> JDBC Data Source”创建新<img src='/icons/65543de.gif' />Data Sources<img src='/icons/65543dou.gif' />这里<img src='/icons/65543de.gif' />Name和Pool Name均填上面<img src='/icons/65543de.gif' />设定“mytest”<img src='/icons/65543dou.gif' />JNDI Name填写“oradb”<img src='/icons/65543dou.gif' />同上面<img src='/icons/65543yi.gif' />样<img src='/icons/65543dou.gif' />点击Targets下<img src='/icons/65543de.gif' />Servers标签<img src='/icons/65543dou.gif' />把Available下<img src='/icons/65543de.gif' />Targets-Server移到Chosen下<img src='/icons/65543dou.gif' />然后点Apply按钮<img src='/icons/65543dou2.gif' /><br/><br/>这时点开Start Default Server窗口应当看到已经启动JDriver/Oracle了！<br/><br/><STRONG>第 3步<img src='/icons/65543dou.gif' />安装配置JBuilder 7</STRONG><br/><br/>这里我安装<img src='/icons/65543de.gif' />是weblogic版<img src='/icons/65543dou2.gif' />安装JBuilder不要把它装到带有空格<img src='/icons/65543de.gif' />目录里如Prograih Files<img src='/icons/65543dou.gif' />或是中文目录中<img src='/icons/65543dou.gif' />不然编译时会出错<img src='/icons/65543de.gif' /><img src='/icons/65543dou2.gif' />安装很简单<img src='/icons/65543dou.gif' />不必多言<img src='/icons/65543dou.gif' />这里着重讲<img src='/icons/65543yi.gif' />下配置<br/><br/>小窍门技巧<img src='/icons/65543yi.gif' />:大家觉得JBuilder运行时也许很慢<img src='/icons/65543dou.gif' /><img src='/icons/65543yinwei.gif' />Jbuilder默认使用32MB内存<img src='/icons/65543dou.gif' />如果你<img src='/icons/65543de.gif' />内存够大<img src='/icons/65543de.gif' />话<img src='/icons/65543dou.gif' />可以加大<img src='/icons/65543yi.gif' />点<img src='/icons/65543dou.gif' />具体办法如下:<br/><br/>在JBuilder安装目录BIN下找到Jbuilder.config文件<img src='/icons/65543dou.gif' />编辑它<img src='/icons/65543dou.gif' />改变Vmparams 后<img src='/icons/65543de.gif' />参数<img src='/icons/65543dou.gif' />启动JBuilder<img src='/icons/65543dou.gif' />在Help下<img src='/icons/65543de.gif' />About Jbuilder下可以看到Java heap已经增加了<img src='/icons/65543dou.gif' />运行也快了许多<img src='/icons/65543dou.gif' />起码以后可以编译较大<img src='/icons/65543de.gif' />文件<img src='/icons/65543dou2.gif' /> 
		
          
              
          <br/>
        <br/>
          <br/><br/>小窍门技巧 2:运行JBuilder时<img src='/icons/65543dou.gif' />发现编写代码很不方便<img src='/icons/65543dou.gif' />所选<img src='/icons/65543de.gif' />代码和实际所见<img src='/icons/65543de.gif' />总是差<img src='/icons/65543yi.gif' />个<img src='/icons/65543dou.gif' />这是<img src='/icons/65543yinwei.gif' />字体<img src='/icons/65543de.gif' />原因<img src='/icons/65543dou.gif' />解决思路方法如下<img src='/icons/65543dou.gif' />在Tools<img src='/icons/65543de.gif' />Editor Options下<img src='/icons/65543de.gif' />Display里<img src='/icons/65543dou.gif' />将Editor font里<img src='/icons/65543de.gif' />Font Family改为新宋体即可<img src='/icons/65543dou2.gif' /><br/><br/><br/>  <a href="/mypdf/7070.pdf" title="查看 j2ee开发:J2EE开发购物网站的应用(1) 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article7070.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:J2EE开发购物网站的应用(4)]]></title>
			<link>http://CrazyCoder.cn/Java/Article7069.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          admin表结构(管理员列表) <br/><br/>  字段名称 数据类型 允许空 主键/外键 备注admin_id INTEGER(自动编号) 否 主键 管理员ID标记adminname varchar2(20) 否 管理员名称password varchar2(20) 否 管理员密码<br/><br/> <br/> <br/><br/><br/>设计完表结构后<img src='/icons/58359dou.gif' />我们就要开始创建了<img src='/icons/58359dou2.gif' />创建表我想已经不是什么难事了<img src='/icons/58359dou.gif' />那么我们要注意<img src='/icons/58359de.gif' />是product、item、orders这 3个表的间<img src='/icons/58359de.gif' />关联<img src='/icons/58359dou.gif' />还有自动编号<img src='/icons/58359dou2.gif' /> <br/><br/>下面是完整<img src='/icons/58359de.gif' />SQL语句<img src='/icons/58359dou.gif' />在后面我会给出详细<img src='/icons/58359de.gif' />介绍说明<img src='/icons/58359dou.gif' />你可以在SQL*Plus里对照着输入<img src='/icons/58359dou.gif' />也可以将它存为SQL脚本文件<img src='/icons/58359dou.gif' />在SQL*Plus或SQLPlus Worksheet里执行<img src='/icons/58359dou2.gif' />当然也可以把代码直接拷贝到SQL*Plus里执行！ <br/><br/>  rem ///BY MAXUAN 开始///create table item(type_id <img src='/icons/58359int.gif' />eger not null<img src='/icons/58359dou.gif' />type varchar2(30)<img src='/icons/58359dou.gif' />constra<img src='/icons/58359int.gif' /> item_pk primary key(type_id));create table product(product_id <img src='/icons/58359int.gif' />eger not null<img src='/icons/58359dou.gif' />title varchar2(30) not null<img src='/icons/58359dou.gif' /> type_id <img src='/icons/58359int.gif' />eger not null<img src='/icons/58359dou.gif' />info varchar2(80)<img src='/icons/58359dou.gif' />price number(16<img src='/icons/58359dou.gif' />2) not null<img src='/icons/58359dou.gif' />constra<img src='/icons/58359int.gif' /> product_pk primarykey (product_id)<img src='/icons/58359dou.gif' />constra<img src='/icons/58359int.gif' /> product_fk foreign key(type_id) references item(type_id));create table orders(order_id <img src='/icons/58359int.gif' />eger not null<img src='/icons/58359dou.gif' />name varchar2(20) not null<img src='/icons/58359dou.gif' />address varchar2(100)<img src='/icons/58359dou.gif' />tel number(16)<img src='/icons/58359dou.gif' />email varchar2(30) not null<img src='/icons/58359dou.gif' />btime date<img src='/icons/58359dou.gif' />product_id <img src='/icons/58359int.gif' />eger not null<img src='/icons/58359dou.gif' />uword varchar2(100)<img src='/icons/58359dou.gif' />constra<img src='/icons/58359int.gif' /> orders_pk primary key(order_id)<img src='/icons/58359dou.gif' />constra<img src='/icons/58359int.gif' /> orders_fk foreignkey(product_id) references product(product_id));create table admin(admin_id <img src='/icons/58359int.gif' />eger not null<img src='/icons/58359dou.gif' />adminname varchar2(20) not null<img src='/icons/58359dou.gif' />password varchar2(20) not null<img src='/icons/58359dou.gif' />constra<img src='/icons/58359int.gif' /> admin_pk primary key(admin_id));create sequence type_idincrement by 1 start with 1;create sequence product_id increment by 1 start with 1;create sequence order_id increment by 1 start with 1;create sequence admin_id increment by 1 start with 1;rem ///BY MAXUAN 结束///<br/><br/> <br/> <br/><br/><br/>介绍说明<img src='/icons/58359yi.gif' />:建立表的间<img src='/icons/58359de.gif' />关联 <br/><br/>product、item、orders 3个表通过公共域<img src='/icons/58359dou.gif' />通常称为键域(Key Field)进行关联<img src='/icons/58359dou.gif' />存在两种类型<img src='/icons/58359de.gif' />键:主键(Primary key)和外部键(Foreign key)<img src='/icons/58359dou2.gif' />主键使表中<img src='/icons/58359de.gif' />数据行保持唯<img src='/icons/58359yi.gif' /><img src='/icons/58359dou.gif' />在表product中<img src='/icons/58359dou.gif' />product_id为主键<img src='/icons/58359dou.gif' />表orders中也包含有product_id<img src='/icons/58359dou.gif' />此时<img src='/icons/58359de.gif' />product_id就是外部键<img src='/icons/58359dou2.gif' /><img src='/icons/58359yi.gif' />个表<img src='/icons/58359de.gif' />外部键从其它表中获取信息<img src='/icons/58359dou2.gif' /> <br/><br/>介绍说明 2:有关自动编号 <br/><br/>在access中有自动编号<img src='/icons/58359de.gif' />数据类型<img src='/icons/58359dou.gif' />MSSQL和MYSQL也都有自动增长<img src='/icons/58359de.gif' />数据类型<img src='/icons/58359dou.gif' />插入记录时不用操作此字段<img src='/icons/58359dou.gif' />会自动获得数据值<img src='/icons/58359dou.gif' />而oracle没有自动增长<img src='/icons/58359de.gif' />数据类型<img src='/icons/58359dou.gif' />我们需要建立<img src='/icons/58359yi.gif' />个自动增长<img src='/icons/58359de.gif' />序列号<img src='/icons/58359dou.gif' />插入记录时要把序列号<img src='/icons/58359de.gif' />下<img src='/icons/58359yi.gif' />个值赋于此字段<img src='/icons/58359dou.gif' />可以预见<img src='/icons/58359de.gif' />是<img src='/icons/58359dou.gif' />有此功能<img src='/icons/58359dou.gif' />我们可以把数据从ACCESS、MSSQL或MYSQL迁移到oracle了<img src='/icons/58359dou2.gif' /> <br/><br/>  create sequence type_id incrementby 1 start with 1;<br/><br/> <br/> <br/><br/><br/>这句中<img src='/icons/58359dou.gif' />type_id为序列号<img src='/icons/58359de.gif' />名称<img src='/icons/58359dou.gif' />每次增长为1<img src='/icons/58359dou.gif' />起始序号为1<img src='/icons/58359dou2.gif' /> 好了<img src='/icons/58359dou.gif' />咱们<img src='/icons/58359de.gif' />数据库已经建好了<img src='/icons/58359dou.gif' />而且从中也了解到<img src='/icons/58359yi.gif' />些基本<img src='/icons/58359de.gif' />相关知识<img src='/icons/58359dou2.gif' /><br/>  <a href="/mypdf/7069.pdf" title="查看 j2ee开发:J2EE开发购物网站的应用(4) 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article7069.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:J2EE开发购物网站的应用(3)]]></title>
			<link>http://CrazyCoder.cn/Java/Article7068.html</link>
			<description>
				<![CDATA[

			
            <STRONG>oracle的数据类型</STRONG><BR><BR>在数据库中创建数据表的时候，我们需要定义表中所有字段的类型，数据类型大致分为：character，numberic，date，lob和raw等，这些是最基本的数据类型。当然在oracle中也允许自定义数据类型。<BR><BR>在oracle中提供的character数据类型:<BR><BR>char():固定长度字符串，最大长度为2000字节，如果不指定长充，缺省为1个字节长。<BR><BR>varchar2():可变长度的字符串，最大长度为4000字节，具体定义时指明最大长度，这咱类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。如果数据长度没有达到最大值，oracle会根据数据大小自动调节字段长度。是最长用的数据类型。<BR><BR>nchar():根据字符集而定的固定长度字符串，最大长度2000字节。<BR><BR>nvarchar2():根据字符集而定的可变长度字符串，最大长度4000字节。<BR><BR>long:可变长字符列，最大长度限制为2GB，用于不需要作字符串搜索的长串数据。此类型是一个遗留下来的而且将来不会被支持的数据类型，逐渐被BLOB，CLOB，NCLOB等大的数据类型所取代。<BR><BR>numberic数据类型用来存储负的和正的整数，分数和浮点型数据，在oracle中提供的numberic数据类型：<BR><BR>number:可变长的数值列，允许0、正值及负值，m是所有的有效数字的位数，n是小数点以后的位数。<BR><BR>在oracle中提供的date数据类型:<BR><BR>date:缺省格式是dd-mon-yy(日-月-年)<BR><BR>在oracle中提供的lob数据类型:blob、clob、nclob：三种大型对象(lob)，用来保存较大的图形文件或带格式的文本文件，如word文档，以及音频、视频等非文本文件，最大长充是4GB。晕些数据存储在数据库内部保存。<BR><BR>bfile:在数据库外部保存的大型二进制对象文件，最大长度是4GB，这种外部的LOB类型，通过数据库记录变化情况，但是数据的具体保存是在数据库外部进行的。<BR><BR>在oracle中提供的raw数据类型:<BR><BR>raw():可变长二进制数据，具体定义字段时必须指明最大长度，这种格式用来保存较小的图形文件或带格式的文本文件，它也是一种较老的数据类型，将被lob数据类型所取代。<BR><BR>long raw:可变长二进制数据，最大长度是2GB，可以用来保存较大的图形或带格式的文本文件，以及音频、视频等非文本文件，这也是一种较老的数据类型，将被lob数据类型所取代。<BR><BR>其它的数据类型：<BR><BR>rowid:这是oracle数据表中的一个伪例，它是数据表中每行数据内在的唯一标识<BR><BR>integer:整数类型<BR><BR><STRONG>四、创建购物网站后台数据库<BR><BR></STRONG><BR><BR>现在我们回到用J2EE体系开发购物网站的主题，开始实战建购物网站的后台数据库。为了实现购物网站的基本的功能，我们需要建立四个表：商品列表(products)、商品类型表(item)、订单列表(orders)和管理员列表(admin)。表结构如下所示：<BR><BR>item表结构（商品类型表)<BR><BR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6><PRE>字段名称 数据类型 允许空 主键/外键 备注 type_id INTEGER(自动编号) 否 主键 商品类别ID标记type varchar2(30) 否 商品类别名称product表结构(商品列表)字段名称 数据类型 允许空 主键/外键 备注product_id INTEGER(自动编号) 否 主键 商品ID标记title varchar2(30) 否 商品名称type_id INTEGER 否 外键 商品类别标记info varchar2(80) 是 商品简介price number(16，2) 否 商品价格</PRE></TD></TR></TBODY></TABLE>orders表结构(订单列表)<BR><BR><TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=2 width=400 align=center borderColorLight=black border=1><TBODY><TR><TD class=code bgColor=#e6e6e6><PRE>字段名称 数据类型 允许空 主键/外键 备注order_id INTEGER(自动编号) 否 主键 订单ID标记name varchar2(20) 否 顾客姓名address varchar2(100) 是 发货地址tel number(16) 是 联系电话email varchar2(30) 否 联系emailbtime date 是 订购日期product_id INTEGER 否 外键 商品标记uword varchar2(100) 是 顾客留言</PRE></TD></TR></TBODY></TABLE>             <a href="/mypdf/7068.pdf" title="查看 j2ee开发:J2EE开发购物网站的应用(3) 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2008-09-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article7068.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:使用JAVA开发CORBA应用-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6860.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          BA技术介绍 　　<br/><br/>简单地说<img src='/icons/67497dou.gif' />CORBA允许应用的间相互通信<img src='/icons/67497dou.gif' />而不管它们存在于哪里以及是谁设计<img src='/icons/67497de.gif' /><img src='/icons/67497dou2.gif' />CORBA1.1于1991年由OMG发布<img src='/icons/67497dou.gif' />其中定义了接口定义语言(IDL)以及在对象请求代理(ORB)中实现客户对象和服务器对象的间交互<img src='/icons/67497de.gif' />应用编程接口(API)<img src='/icons/67497dou2.gif' />CORBA2.0于1994年发布<img src='/icons/67497dou.gif' />规定了各个供应商的间<img src='/icons/67497de.gif' />ORB<img src='/icons/67497de.gif' />通信规则<img src='/icons/67497dou2.gif' />　　<br/><br/>CORBA标准主要分为 3个部分:接口定义语言(IDL)、对象请求代理(ORB)以及ORB的间<img src='/icons/67497de.gif' />互操作协议IIOP<img src='/icons/67497dou2.gif' />　　<br/><br/>ORB是对象的间建立Client/Server关系<img src='/icons/67497de.gif' />中间件<img src='/icons/67497dou2.gif' />使用ORB<img src='/icons/67497dou.gif' />客户可以透明地<img src='/icons/67497diaoyong.gif' /><img src='/icons/67497yi.gif' />个服务对象上<img src='/icons/67497de.gif' />思路方法<img src='/icons/67497dou.gif' />这个服务对象可以在本地<img src='/icons/67497dou.gif' />也可以在通过网络连接<img src='/icons/67497de.gif' />其他机器上<img src='/icons/67497dou2.gif' />ORB截获这<img src='/icons/67497yi.gif' /><img src='/icons/67497diaoyong.gif' />同时负责查找实现服务<img src='/icons/67497de.gif' />对象并向其传递参数、<img src='/icons/67497diaoyong.gif' />思路方法返回最终结果<img src='/icons/67497dou2.gif' />客户并不知道服务对象位于什么地方<img src='/icons/67497dou.gif' />它<img src='/icons/67497de.gif' />编程语言和操作系统是什么<img src='/icons/67497dou.gif' />也不知道不属于对象接口<img src='/icons/67497de.gif' />其他系统部分<img src='/icons/67497dou2.gif' />这样<img src='/icons/67497dou.gif' />ORB在异构分布环境下为区别机器上<img src='/icons/67497de.gif' />应用提供了互操作性<img src='/icons/67497dou.gif' />并无缝地集成了多种对象系统<img src='/icons/67497dou2.gif' />　　<br/><br/>在开发传统<img src='/icons/67497de.gif' />Client/Server应用时<img src='/icons/67497dou.gif' />开发者使用他们自己设计<img src='/icons/67497de.gif' />或<img src='/icons/67497yi.gif' />个公认<img src='/icons/67497de.gif' />标准来定义用于设备的间通信<img src='/icons/67497de.gif' />协议<img src='/icons/67497dou2.gif' />协议<img src='/icons/67497de.gif' />定义依赖于实现语言、网络传输和许多其他原因<img src='/icons/67497dou.gif' />而ORB<img src='/icons/67497de.gif' />出现简化了这<img src='/icons/67497yi.gif' />过程<img src='/icons/67497dou2.gif' />使用ORB时<img src='/icons/67497dou.gif' />协议是使用接口定义语言(IDL)定义<img src='/icons/67497de.gif' /><img src='/icons/67497dou.gif' />而IDL是独立于语言<img src='/icons/67497de.gif' /><img src='/icons/67497dou2.gif' />并且ORB提供很强<img src='/icons/67497de.gif' />灵活性<img src='/icons/67497dou.gif' />它使<img src='/icons/67497chengxu.gif' />员选择最适合<img src='/icons/67497de.gif' />操作系统、执行环境<img src='/icons/67497dou.gif' />甚至系统各个组件也可以采用区别<img src='/icons/67497de.gif' />编程语言实现<img src='/icons/67497dou2.gif' />更重要<img src='/icons/67497de.gif' />是<img src='/icons/67497dou.gif' />它允许现有组件<img src='/icons/67497de.gif' />集成<img src='/icons/67497dou2.gif' />在<img src='/icons/67497yi.gif' />个基于ORB<img src='/icons/67497de.gif' />解决方案中<img src='/icons/67497dou.gif' />开发者可以使用和创建新对象<img src='/icons/67497yi.gif' />样<img src='/icons/67497de.gif' />IDL对遗留系统进行建模<img src='/icons/67497dou.gif' />他们创建“包装”代码以在标准化<img src='/icons/67497de.gif' />软件Software总线和遗留系统接口的间传递信息<img src='/icons/67497dou2.gif' />　　<br/><br/>使用CORBA<img src='/icons/67497dou.gif' />用户可以透明地访问信息<img src='/icons/67497dou.gif' />并不需要知道信息存在于什么软件Software中、使用什么硬件平台<img src='/icons/67497dou.gif' />以及位于企业网络<img src='/icons/67497de.gif' />什么地方<img src='/icons/67497dou2.gif' />作为面向对象系统<img src='/icons/67497de.gif' />通信核心<img src='/icons/67497dou.gif' />CORBA为今天<img src='/icons/67497de.gif' />计算环境带来了真正<img src='/icons/67497de.gif' />互操作性<img src='/icons/67497dou2.gif' /> <br/><br/>■CORBA和JAVA<img src='/icons/67497de.gif' />相互关系 　　<br/><br/>CORBA不只意味着对象请求代理(ORB)<img src='/icons/67497dou.gif' />它还是非常全面<img src='/icons/67497de.gif' />分布式对象平台<img src='/icons/67497dou2.gif' />CORBA使JAVA应用可以跨越网络、语言以及操作系统<img src='/icons/67497dou.gif' />并为JAVA提供了<img src='/icons/67497yi.gif' />组分布服务<img src='/icons/67497dou.gif' />如分布式自我观察、动态发现、事务、关系、安全和命名等<img src='/icons/67497dou2.gif' />　　<br/><br/>JAVA不仅是<img src='/icons/67497yi.gif' />种语言<img src='/icons/67497dou.gif' />它还是<img src='/icons/67497yi.gif' />个动态代码系统<img src='/icons/67497dou.gif' />它对运行对象来说是<img src='/icons/67497yi.gif' />个可移植<img src='/icons/67497de.gif' />虚拟机(JVM)<img src='/icons/67497dou2.gif' />JAVA为开发、管理、发布Client/Server应用提供了更简单<img src='/icons/67497de.gif' />方式<img src='/icons/67497dou2.gif' />人们可以通过将应用放在<img src='/icons/67497yi.gif' />个Web服务器上将这<img src='/icons/67497yi.gif' />应用发布给成千上万个用户<img src='/icons/67497dou.gif' />而不必关心它<img src='/icons/67497de.gif' />安装和升级<img src='/icons/67497dou2.gif' />JAVA还非常适合服务器<img src='/icons/67497de.gif' />开发<img src='/icons/67497dou.gif' />它可以动态地将服务代码移向最需要它们<img src='/icons/67497de.gif' />地方<img src='/icons/67497dou2.gif' />　　<br/><br/>JAVA将会使CORBA对象能够运行在从主机、网络计算机到蜂窝电话等可编程<img src='/icons/67497de.gif' />各种机器上<img src='/icons/67497dou.gif' />并简化了大型CORBA系统<img src='/icons/67497de.gif' />代码发布<img src='/icons/67497dou2.gif' />对客户和服务对象来说JAVA是很理想<img src='/icons/67497de.gif' />编程语言<img src='/icons/67497dou.gif' />JAVA内置<img src='/icons/67497de.gif' />多线程、垃圾收集和<img src='/icons/67497cuowu.gif' />处理使编写健壮<img src='/icons/67497de.gif' />网络对象变得很容易<img src='/icons/67497dou2.gif' />　　<br/><br/>这两种对象模型可以很好地相互补充<img src='/icons/67497dou.gif' />CORBA处理网络<img src='/icons/67497de.gif' />透明性<img src='/icons/67497dou.gif' />JAVA处理实现<img src='/icons/67497de.gif' />透明性<img src='/icons/67497dou.gif' />CORBA为JAVA可移植应用环境提供了<img src='/icons/67497yi.gif' />个分布式<img src='/icons/67497de.gif' />结构<img src='/icons/67497dou2.gif' /> <br/><br/>■使用JAVA开发CORBA应用 　　<br/><br/>下面让我简要介绍<img src='/icons/67497yi.gif' />下开发CORBA<img src='/icons/67497de.gif' />步骤<img src='/icons/67497dou2.gif' />　　<br/><br/>使用JAVA开发CORBA应用需要如下 5个步骤:　　<br/><br/>使用IDL创建接口 (About.idl)<br/>　　下面<img src='/icons/67497de.gif' />OMG IDL描述<img src='/icons/67497yi.gif' />个CORBA对象<img src='/icons/67497dou2.gif' /><br/>　　module About<br/>　　{<br/>　　 <img src='/icons/67497int.gif' />erface Show<br/>　　 {<br/>　　 <img src='/icons/67497string.gif' /> ShowName<img src='/icons/67497kh.gif' />;<br/>　　 };<br/>　　};<br/>　　将其存为Show.idl<img src='/icons/67497dou2.gif' />　　<br/>编译接口并生成CORBA支持文件<br/>　　我们用以下命令编译这个 IDL 接口:<br/>　　 idltojava Show.idl<br/>　　idltojava是SUN公司<img src='/icons/67497de.gif' />IDL编译器<img src='/icons/67497dou.gif' />可以免费从SUN公司站点上下载<img src='/icons/67497dou2.gif' /><br/>　　<img src='/icons/67497yinwei.gif' />idltojava在编译IDL文件的前<img src='/icons/67497dou.gif' />需要进行预编译<img src='/icons/67497dou.gif' />而如果你<img src='/icons/67497de.gif' />机器上没有预编译器<img src='/icons/67497dou.gif' />可以使用以下命令:<br/>　　idltojava -fno-cpp Show.idl<br/>　　编译后将在当前目录下生成About子目录<img src='/icons/67497dou.gif' />其中会包括<img src='/icons/67497yi.gif' />些支持文件<img src='/icons/67497dou.gif' />如有兴趣可以看<img src='/icons/67497yi.gif' />下<img src='/icons/67497dou.gif' />但<img src='/icons/67497yi.gif' />定不要修改<img src='/icons/67497dou2.gif' />　　<br/>实现服务器 (ShowServer.java)<br/>　　ShowServer<img src='/icons/67497de.gif' /><img src='/icons/67497main.gif' /><img src='/icons/67497kh.gif' /> 思路方法<img src='/icons/67497dou.gif' />可完成以下任务:<br/>　　<br/>创建<img src='/icons/67497yi.gif' />个 ORB 例子 <br/>创建<img src='/icons/67497yi.gif' />个服务对象例子(CORBA About 对象<img src='/icons/67497de.gif' />实现)并通知 ORB <br/>获取<img src='/icons/67497yi.gif' />个命名上下文<img src='/icons/67497de.gif' />CORBA对象引用<img src='/icons/67497dou.gif' />在该命名上下文中注册新<img src='/icons/67497de.gif' />CORBA对象 <br/>在命名上下文中将新对象注册在“About”名下 <br/>等待对新对象<img src='/icons/67497de.gif' /><img src='/icons/67497diaoyong.gif' /><br/>　　实现服务器源<img src='/icons/67497chengxu.gif' />如下:<br/>　　import About.;<br/>　　import org.omg.CosNaming.;<br/>　　import org.omg.CosNaming.NamingContextPackage.;<br/>　　import org.omg.CORBA.;<br/>　　<img src='/icons/67497class.gif' /> ShowObject extends _ShowImplBase<br/>　　{<br/>　　 public String ShowName<img src='/icons/67497kh.gif' /><br/>　　 {<br/>　　 <img src='/icons/67497return.gif' /> &quot;\\nMy name is Seymour!!\\n&quot;;<br/>　　 }<br/>　　}<br/>　　public <img src='/icons/67497class.gif' /> ShowServer {<br/>　　 public <img src='/icons/67497static.gif' /> void <img src='/icons/67497main.gif' />(String args<img src='/icons/67497zhk2.gif' />)<br/>　　 {<br/>　　 try{<br/>　　 // 创建和<img src='/icons/67497chushi.gif' />化 ORB<br/>　　 ORB orb = ORB.init(args, null);<br/>　　 // 创建服务对象并将其向 ORB 注册<br/>　　 ShowObject ShowRef = <img src='/icons/67497new.gif' /> ShowObject<img src='/icons/67497kh.gif' />;<br/>　　 orb.connect(ShowRef);<br/>　　 // 获取根命名上下文<br/>　　 org.omg.CORBA.Object objRef = orb.resolve_initial_references(&quot;NameService&quot;);<br/>　　 NamingContext ncRef = NamingContextHelper.narrow(objRef);<br/>　　 // 绑定命名中<img src='/icons/67497de.gif' />对象引用<br/>　　 NameComponent nc = <img src='/icons/67497new.gif' /> NameComponent(&quot;About&quot;, &quot;&quot;);<br/>　　 NameComponent path<img src='/icons/67497zhk2.gif' /> = {nc};<br/>　　 ncRef.rebind(path, ShowRef);<br/>　　 // 等待来自客户机<img src='/icons/67497de.gif' /><img src='/icons/67497diaoyong.gif' /><br/>　　 java.lang.Object sync = <img src='/icons/67497new.gif' /> java.lang.Object<img src='/icons/67497kh.gif' />;<br/>　　 synchronized (sync) {<br/>　　 sync.wait<img src='/icons/67497kh.gif' />;<br/>　　 }<br/>　　 } catch (Exception e) {<br/>　　 <img src='/icons/67497System.gif' />.err.pr<img src='/icons/67497int.gif' />ln(&quot;ERROR: &quot; + e);<br/>　　 e.pr<img src='/icons/67497int.gif' />StackTrace(<img src='/icons/67497System.gif' />.out);<br/>　　 }<br/>　　 }<br/>　　}<br/>　　<br/>实现客户机 (ShowClient.java)<br/>　　下面<img src='/icons/67497de.gif' />应用<img src='/icons/67497chengxu.gif' />客户机将完成以下任务:<br/>　　<br/>创建<img src='/icons/67497yi.gif' />个ORB； <br/>获取<img src='/icons/67497yi.gif' />个指向命名上下文<img src='/icons/67497de.gif' />引用； <br/>在命名上下文中查找“Show”并获得指向该 CORBA 对象<img src='/icons/67497de.gif' />引用；  
		
          
              
          <br/>
        <br/>
          <br/><img src='/icons/67497diaoyong.gif' />对象<img src='/icons/67497de.gif' /> ShowName<img src='/icons/67497kh.gif' /> 操作并打印结果<img src='/icons/67497dou2.gif' /><br/>　<br/>　　import About.;<br/>　　import org.omg.CosNaming.;<br/>　　import org.omg.CORBA.;<br/>　　public <img src='/icons/67497class.gif' /> ShowClient<br/>　　{<br/>　　 public <img src='/icons/67497static.gif' /> void <img src='/icons/67497main.gif' />(String args<img src='/icons/67497zhk2.gif' />)<br/>　　 {<br/>　　 try{<br/>　　 // 创建和<img src='/icons/67497chushi.gif' />化 ORB<br/>　　 ORB orb = ORB.init(args, null);<br/>　　 // 获取根命名上下文<br/>　　org.omg.CORBA.Object objRef = orb.resolve_initial_references(&quot;NameService&quot;);<br/>　　NamingContext ncRef = NamingContextHelper.narrow(objRef);<br/>　　//解析命名中<img src='/icons/67497de.gif' />对象引用<br/>　　NameComponent nc = <img src='/icons/67497new.gif' /> NameComponent(&quot;About&quot;, &quot;&quot;);<br/>　　NameComponent path<img src='/icons/67497zhk2.gif' /> = {nc};<br/>　　About.Show ShowRef = ShowHelper.narrow(ncRef.resolve(path));<br/>　　// <img src='/icons/67497diaoyong.gif' /> Show 服务对象并打印结果<br/>　　 String show = ShowRef.ShowName<img src='/icons/67497kh.gif' />;<br/>　　 <img src='/icons/67497System.gif' />.out.pr<img src='/icons/67497int.gif' />ln(show);<br/>　　 } catch (Exception e) {<br/>　　 <img src='/icons/67497System.gif' />.out.pr<img src='/icons/67497int.gif' />ln(&quot;ERROR : &quot; + e) ;<br/>　　 e.pr<img src='/icons/67497int.gif' />StackTrace(<img src='/icons/67497System.gif' />.out);<br/>　　 }<br/>　　 }<br/>　　}<br/>构建和运行ShowName<img src='/icons/67497chengxu.gif' />　　<br/>编译 .java 文件<img src='/icons/67497dou.gif' />包括 stub 和 skeleton(在About目录中):<br/>javac .java About/.java 　　 <br/>启动<img src='/icons/67497yi.gif' />个MS-DOS命令解释器<img src='/icons/67497dou.gif' />输入以下命令<img src='/icons/67497dou.gif' />确保名字服务器处于运行状态:<br/>tnameserv -ORBInitialPort 1050 　 <br/>启动另<img src='/icons/67497yi.gif' />个MS-Dos命令解释器<img src='/icons/67497dou.gif' />输入以下命令<img src='/icons/67497dou.gif' />启动Show服务器:<br/>java ShowServer -ORBInitialPort 1050 <br/>再启动<img src='/icons/67497yi.gif' />个MS-Dos命令解释器Show应用<img src='/icons/67497chengxu.gif' />客户机:<br/>java ShowClient -ORBInitialPort 1050<br/>　　<br/>这时屏幕上会出现“My name is Seymour!”<img src='/icons/67497de.gif' />字样<img src='/icons/67497dou.gif' />介绍说明实验已经成功了<img src='/icons/67497dou2.gif' /><br/>　　本举例<img src='/icons/67497chengxu.gif' />在Windows 98、Java 1.2.2平台下实现<img src='/icons/67497dou2.gif' /><br/><br/>  <a href="/mypdf/6860.pdf" title="查看 j2ee开发:使用JAVA开发CORBA应用-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6860.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:PASX简化Java开发-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6803.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          经编写了<img src='/icons/23852yi.gif' />个<img src='/icons/23852chengxu.gif' /><img src='/icons/23852dou.gif' />却在复检<img src='/icons/23852de.gif' />时候发现它<img src='/icons/23852de.gif' />配置过程很不合理？你是否曾经使用过配置文件<img src='/icons/23852dou.gif' />却发现它们不能满足描述应用<img src='/icons/23852chengxu.gif' /><img src='/icons/23852de.gif' />需要？你是否为了解决几个特殊问题而创建过临时配置补丁<img src='/icons/23852dou.gif' />却把花费更多时间、开发普遍适用方案<img src='/icons/23852de.gif' />希望寄托到了未来？ <br/><br/>    如果你<img src='/icons/23852de.gif' />回答是肯定<img src='/icons/23852de.gif' /><img src='/icons/23852dou.gif' />那么<img src='/icons/23852dou.gif' />你和大多数其他Java<img src='/icons/23852chengxu.gif' />员<img src='/icons/23852yi.gif' />样幸运<img src='/icons/23852dou.gif' />有<img src='/icons/23852yi.gif' />些工具能够帮助你解决这些问题<img src='/icons/23852dou2.gif' />如果你<img src='/icons/23852de.gif' />回答是否定<img src='/icons/23852de.gif' /><img src='/icons/23852dou.gif' />有关属性文件局限<img src='/icons/23852de.gif' />讨论也许能够让你信服——还有更好<img src='/icons/23852de.gif' />思路方法可供使用<img src='/icons/23852dou2.gif' /> <br/><br/>    属性文件是Java编程和运行环境<img src='/icons/23852de.gif' /><img src='/icons/23852yi.gif' />个重要组成部分<img src='/icons/23852dou2.gif' />然而<img src='/icons/23852dou.gif' />当<img src='/icons/23852yi.gif' />个<img src='/icons/23852chengxu.gif' />员需要<img src='/icons/23852de.gif' />功能远远超过Properties类提供<img src='/icons/23852de.gif' />简单名字-值对时<img src='/icons/23852dou.gif' />他需要有更丰富<img src='/icons/23852de.gif' />表现手法<img src='/icons/23852dou2.gif' />通常<img src='/icons/23852dou.gif' />Java<img src='/icons/23852chengxu.gif' />员扩展属性文件<img src='/icons/23852de.gif' />思路方法是为属性本身<img src='/icons/23852de.gif' />名字或值(或两者同时)增加额外<img src='/icons/23852de.gif' />语义信息<img src='/icons/23852dou2.gif' />很多时候<img src='/icons/23852dou.gif' />这种看来有效<img src='/icons/23852de.gif' />思路方法会使问题越来越复杂<img src='/icons/23852dou2.gif' /> <br/><br/>    为介绍说明问题<img src='/icons/23852dou.gif' />请利用属性把<img src='/icons/23852yi.gif' />系列<img src='/icons/23852de.gif' />值赋给单个名字<img src='/icons/23852dou2.gif' />让我们假定你想要管理<img src='/icons/23852yi.gif' />组名称服务器<img src='/icons/23852dou.gif' />可能采用<img src='/icons/23852de.gif' />属性文件内容如下: <br/><br/>hosts_1=ns.foo.com <br/>hosts_2=ns.bar.com <br/>hosts_3=ns.acme.com <br/> <br/><br/>    代码很简单<img src='/icons/23852dou2.gif' />改变名字-值对中名字<img src='/icons/23852de.gif' />含义的后<img src='/icons/23852dou.gif' />你可以轻松地编写出把“hosts_”开头<img src='/icons/23852de.gif' />名字当成“hosts”列表中<img src='/icons/23852yi.gif' />个元素<img src='/icons/23852de.gif' /><img src='/icons/23852chengxu.gif' /><img src='/icons/23852dou2.gif' /> <br/><br/>    下面<img src='/icons/23852dou.gif' />我们来看看<img src='/icons/23852yi.gif' />个更复杂<img src='/icons/23852de.gif' />例子<img src='/icons/23852dou2.gif' />假设你有同<img src='/icons/23852yi.gif' />Bean类InternetHost<img src='/icons/23852de.gif' />两个区别例子:例子A关联到<img src='/icons/23852yi.gif' />个Web服务器<img src='/icons/23852de.gif' />列表；例子B关联到<img src='/icons/23852yi.gif' />个名称服务器<img src='/icons/23852de.gif' />列表<img src='/icons/23852dou2.gif' />要从同<img src='/icons/23852yi.gif' />个文件配置这两个例子<img src='/icons/23852dou.gif' /><img src='/icons/23852yi.gif' />种可能<img src='/icons/23852de.gif' />方案如下: <br/><br/>name_hosts_1=ns.foo.com <br/>name_hosts_2=ns.bar.com <br/>name_hosts_3=ns.acme.com <br/>web_hosts_1=www.foo.com <br/>web_hosts_2=www.bar.com <br/>web_hosts_3=www.acme.com <br/> <br/><br/>    这种思路方法行得通<img src='/icons/23852dou.gif' />但总是给人以拼拼凑凑<img src='/icons/23852de.gif' />感觉<img src='/icons/23852dou2.gif' />如果你还不相信<img src='/icons/23852de.gif' />话<img src='/icons/23852dou.gif' />稍微增加<img src='/icons/23852yi.gif' />点问题<img src='/icons/23852de.gif' />复杂性:让这些列表中<img src='/icons/23852de.gif' />某个元素自己也成为<img src='/icons/23852yi.gif' />个列表；或者<img src='/icons/23852dou.gif' />使得下划线<img src='/icons/23852zifu.gif' />(“_”)在名字-值对中合法<img src='/icons/23852dou2.gif' />在这些情况下<img src='/icons/23852dou.gif' />简单<img src='/icons/23852de.gif' />属性文件变得非常复杂<img src='/icons/23852dou2.gif' /> <br/><br/>    作为<img src='/icons/23852yi.gif' />个细心<img src='/icons/23852de.gif' />读者<img src='/icons/23852dou.gif' />你可能已经发现<img src='/icons/23852dou.gif' />InternetHost各个例子<img src='/icons/23852de.gif' />命名方式逐渐模糊<img src='/icons/23852dou2.gif' />为了把前 3个属性赋值给例子A<img src='/icons/23852dou.gif' />把后 3个属性赋值给例子B<img src='/icons/23852dou.gif' />你必须用某种和具体例子无关<img src='/icons/23852de.gif' />思路方法告诉例子它们该用哪<img src='/icons/23852yi.gif' />组属性值<img src='/icons/23852dou2.gif' />如果用直接编码<img src='/icons/23852de.gif' />方式<img src='/icons/23852dou.gif' />让例子A寻找以“name_”开头<img src='/icons/23852de.gif' />属性<img src='/icons/23852dou.gif' />让例子B寻找以“Web_”开头<img src='/icons/23852de.gif' />属性<img src='/icons/23852dou.gif' />那么<img src='/icons/23852dou.gif' />这两个例子将不再属于同<img src='/icons/23852yi.gif' />对象类<img src='/icons/23852dou2.gif' /> <br/><br/>    最后<img src='/icons/23852de.gif' />例子还显示出另外<img src='/icons/23852yi.gif' />个问题<img src='/icons/23852dou2.gif' />这就是<img src='/icons/23852dou.gif' />如何来<img src='/icons/23852diaoyong.gif' />例子A？简单地叫它“A”？到哪里去寻找它？它是本地例子还是远程接口？是否存在指向它<img src='/icons/23852de.gif' />全局静态引用？如是<img src='/icons/23852dou.gif' />如何访问例子B(或者<img src='/icons/23852dou.gif' />那是否是“B”)？ <br/><br/>    解决这些问题<img src='/icons/23852de.gif' />方案是使用<img src='/icons/23852yi.gif' />个组件配置和命名框架<img src='/icons/23852dou2.gif' />有许多工具能够帮助你完成这个任务<img src='/icons/23852dou.gif' />其中的<img src='/icons/23852yi.gif' />就是PASX<img src='/icons/23852dou2.gif' />PASX是<img src='/icons/23852yi.gif' />个源代码开放<img src='/icons/23852de.gif' />Java工具<img src='/icons/23852dou.gif' />它通过XML进行配置<img src='/icons/23852dou.gif' />通过JNDI实现命名<img src='/icons/23852dou2.gif' />PASX框架用XML配置用户定义<img src='/icons/23852de.gif' />服务、JNDI名称空间、JDBC连接池、事件树、工作队列和系统日志<img src='/icons/23852dou2.gif' /> <br/><br/>    PASX利用XML进行配置<img src='/icons/23852dou.gif' /><img src='/icons/23852yinwei.gif' />XML比简单<img src='/icons/23852de.gif' />属性列表具有更丰富<img src='/icons/23852de.gif' />描述能力<img src='/icons/23852dou2.gif' />为了理解为何XML更适合完成这类任务<img src='/icons/23852dou.gif' />请再次考虑第<img src='/icons/23852yi.gif' />个例子<img src='/icons/23852dou2.gif' />如果用PASX定义<img src='/icons/23852de.gif' />标记重新描述<img src='/icons/23852dou.gif' />则结果应该如下: <br/><br/>&lt;List&gt;<br/>  &lt;String&gt;ns.foo.com&lt;/String&gt;<br/>  &lt;String&gt;ns.bar.com&lt;/String&gt;<br/>  &lt;String&gt;ns.acme.com&lt;/String&gt;<br/>&lt;/List&gt; <br/> <br/><br/>    虽然代码更加冗长<img src='/icons/23852dou.gif' />但它<img src='/icons/23852de.gif' />含义比原来要清楚得多<img src='/icons/23852dou2.gif' />由于<img src='/icons/23852yi.gif' />些列表可能被排序<img src='/icons/23852dou.gif' />元素在XML文档中出现<img src='/icons/23852de.gif' />次序决定了它们在最终数据结构中<img src='/icons/23852de.gif' />次序<img src='/icons/23852dou2.gif' />属性文件最终用来构造Properties对象<img src='/icons/23852dou.gif' />它<img src='/icons/23852de.gif' />名字必须指示出元素<img src='/icons/23852de.gif' />索引<img src='/icons/23852dou.gif' /><img src='/icons/23852yinwei.gif' />Properties对象直接从Hashtable派生得到<img src='/icons/23852dou2.gif' /> <br/><br/>    用XML描述时<img src='/icons/23852dou.gif' />第 2个属性举例如下所示:<br/><br/><br/>&lt;List name=&quot;name-servers&quot;&gt;<br/>  &lt;String&gt;ns.foo.com&lt;/String&gt;<br/>  &lt;String&gt;ns.bar.com&lt;/String&gt;<br/>  &lt;String&gt;ns.acme.com&lt;/String&gt;<br/>&lt;/List&gt;<br/>&lt;List name=&quot;web-servers&quot;&gt;<br/>  &lt;String&gt;www.foo.com&lt;/String&gt;<br/>  &lt;String&gt;www.bar.com&lt;/String&gt;<br/>  &lt;String&gt;www.acme.com&lt;/String&gt;<br/>&lt;/List&gt; <br/> <br/><br/>    还记得举例 2的后提出<img src='/icons/23852de.gif' />难题吗？让列表中<img src='/icons/23852de.gif' />某个元素成为<img src='/icons/23852yi.gif' />个子列表<img src='/icons/23852dou.gif' />让其中<img src='/icons/23852yi.gif' />个列表成为元素名字可以包含下划线<img src='/icons/23852de.gif' />映射结构<img src='/icons/23852dou2.gif' />下面是它<img src='/icons/23852de.gif' />答案: <br/><br/>&lt;List name=&quot;name-servers&quot;&gt;<br/>  &lt;String&gt;ns.foo.com&lt;String&gt;<br/>  &lt;List&gt;<br/>    &lt;String&gt;ns1.bar.com&lt;/String&gt;<br/>    &lt;String&gt;ns2.bar.com&lt;/String&gt;<br/>  &lt;/List&gt;<br/>  &lt;String&gt;ns.acme.com&lt;/String&gt;<br/>&lt;/List&gt;<br/>&lt;Map name=&quot;web-servers&quot;&gt;<br/>  &lt;String name=&quot;most_visited&quot;&gt;www.foo.com&lt;String&gt;<br/>  &lt;String name=&quot;most_<img src='/icons/23852byte.gif' />s&quot;&gt;www.bar.com&lt;/String&gt;<br/>&lt;/Map&gt; <br/> <br/><br/>    在PASX中<img src='/icons/23852dou.gif' />组件(<img src='/icons/23852yi.gif' />个类或者<img src='/icons/23852yi.gif' />组有着密切关系<img src='/icons/23852de.gif' />类)是实现PASXService接口<img src='/icons/23852de.gif' />Java Bean<img src='/icons/23852dou2.gif' />它们由XML &lt;Service&gt;标记定义<img src='/icons/23852dou.gif' />这个标记用来命名组件<img src='/icons/23852de.gif' />单个例子<img src='/icons/23852dou2.gif' />赋予例子“A”名称服务器列表以及赋予例子“B”Web服务器列表<img src='/icons/23852de.gif' />XML代码如下所示: <br/><br/>&lt;Service name=&quot;A&quot; <img src='/icons/23852class.gif' />=&quot;my.InternetHost&quot;&gt;<br/>  &lt;List name=&quot;hosts&quot;&gt;<br/>    &lt;String&gt;ns.foo.com&lt;/String&gt;<br/>    &lt;String&lt;ns.bar.com&lt;/String&gt;<br/>    &lt;String&lt;ns.acme.com&lt;/String&gt;<br/>  &lt;/List&gt;<br/>&lt;/Service&gt;<br/>&lt;Service name=&quot;B&quot; <img src='/icons/23852class.gif' />=&quot;my.InternetHost&quot;&gt;<br/>  &lt;List name=&quot;hosts&quot;&gt;<br/>    &lt;String&gt;web.foo.com&lt;/String&gt;<br/>    &lt;String&gt;web.bar.com&lt;/String&gt;<br/>    &lt;String&gt;web.acme.com&lt;/String&gt;<br/>  &lt;/List&gt;<br/>&lt;/Service&gt; <br/> <br/><br/>    PASX定义了<img src='/icons/23852yi.gif' />系列<img src='/icons/23852de.gif' />标准XML标记<img src='/icons/23852dou.gif' />用来声明List、Map、Integer、String、Boolean等类型<img src='/icons/23852de.gif' />属性<img src='/icons/23852dou2.gif' />然而<img src='/icons/23852dou.gif' />PASXService类还可以经由名称空间和XML模式使用它自己<img src='/icons/23852de.gif' />XML标记<img src='/icons/23852dou2.gif' />XML模式允许组件开发者定义自己<img src='/icons/23852de.gif' />标记<img src='/icons/23852dou.gif' />允许XML解析器验证PASX所定义标记和组件开发者所定义标记<img src='/icons/23852de.gif' />合法性<img src='/icons/23852dou2.gif' />下面<img src='/icons/23852de.gif' />举例模式定义了<img src='/icons/23852yi.gif' />个&lt;Server&gt;标记<img src='/icons/23852dou.gif' />它必须有hostName和portNumber属性<img src='/icons/23852dou2.gif' />&lt;Server&gt;标记必须作为&lt;Cluster&gt;标记<img src='/icons/23852de.gif' />子元素至少出现<img src='/icons/23852yi.gif' />次<img src='/icons/23852dou.gif' />但可以出现多次<img src='/icons/23852dou2.gif' />&lt;Cluster&gt;标记必须作为&lt;ServerFarm&gt;标记<img src='/icons/23852de.gif' />子元素出现至少<img src='/icons/23852yi.gif' />次<img src='/icons/23852dou.gif' />但可以出现多次<img src='/icons/23852dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/><br/>&lt;?xml version=&quot;1.0&quot;?&gt;<br/>&lt;schema xmlns=&quot;http://www.w3.org/2000/10/XMLSchema&quot; <br/>    xmlns:pce=&quot;http://pasx.org/PASX/CUSTOM-EXAMPLE&quot; <br/>    targetNamespace=&quot;http://pasx.org/PASX/CUSTOM-EXAMPLE&quot; elementFormDefault=&quot;qual<img src='/icons/23852if.gif' />ied&quot; &gt;<br/><br/>  &lt;annotation&gt;<br/>    &lt;documentation&gt;<br/>    A custom schema example to be using with PASX (PCE)<br/>    &lt;/documentation&gt;<br/>  &lt;/annotation&gt;<br/><br/>  &lt;element name=&quot;Server&quot;&gt;<br/>    &lt;complexType content=&quot;empty&quot;&gt;<br/>      &lt;attribute<br/>        name=&quot;hostName&quot; <br/>        use=&quot;required&quot; <br/>        type=&quot;<img src='/icons/23852string.gif' />&quot;/&gt;<br/>      &lt;attribute<br/>        name=&quot;portNumber&quot;<br/>        use=&quot;required&quot; <br/>        type=&quot;positiveInteger&quot;/&gt;<br/>    &lt;/complexType&gt;<br/>  &lt;/element&gt;<br/><br/>  &lt;element name=&quot;Cluster&quot;&gt;<br/>    &lt;complexType&gt;<br/>      &lt;sequence&gt;<br/>        &lt;element<br/>          ref=&quot;pce:Server&quot; minOccurs=&quot;1&quot; maxOccurs=&quot;unbounded&quot;/&gt;<br/>      &lt;/sequence&gt;<br/>      &lt;attribute<br/>        name=&quot;name&quot; <br/>        use=&quot;required&quot; <br/>        type=&quot;<img src='/icons/23852string.gif' />&quot;/&gt;<br/>    &lt;/complexType&gt;<br/>  &lt;/element&gt;<br/><br/>  &lt;element name=&quot;ServerFarm&quot;&gt;<br/>    &lt;complexType&gt;<br/>      &lt;sequence&gt;<br/>        &lt;element<br/>          ref=&quot;pce:Cluster&quot; minOccurs=&quot;1&quot; maxOccurs=&quot;unbounded&quot;/&gt;<br/>      &lt;/sequence&gt;<br/>      &lt;attribute<br/>        name=&quot;name&quot;<br/>        use=&quot;required&quot; <br/>        type=&quot;<img src='/icons/23852string.gif' />&quot;/&gt;<br/>    &lt;/complexType&gt;<br/>  &lt;/element&gt;<br/><br/>  &lt;element name=&quot;PCE&quot;&gt;<br/>    &lt;complexType&gt;<br/>      &lt;sequence&gt;<br/>        &lt;element<br/>          ref=&quot;pce:ServerFarm&quot; minOccurs=&quot;1&quot; maxOccurs=&quot;unbounded&quot;/&gt;<br/>      &lt;/sequence&gt;<br/>    &lt;/complexType&gt;<br/>  &lt;/element&gt;<br/><br/>&lt;/schema&gt; <br/> <br/><br/>    详细介绍XML模式文档(XSD)<img src='/icons/23852de.gif' />构造思路方法已经超出了本文<img src='/icons/23852de.gif' />范围<img src='/icons/23852dou2.gif' />重要<img src='/icons/23852de.gif' />是必须认识到<img src='/icons/23852dou.gif' />PASXService组件<img src='/icons/23852de.gif' />开发者可以使用<img src='/icons/23852yi.gif' />组定制标记<img src='/icons/23852dou2.gif' />更妙<img src='/icons/23852de.gif' />是<img src='/icons/23852dou.gif' />开发者无需编写任何验证代码<img src='/icons/23852dou.gif' />就可以确保XML不仅格式良好而且合法(这<img src='/icons/23852yi.gif' />切由解析器完成)<img src='/icons/23852dou2.gif' />下面声明<img src='/icons/23852de.gif' />&lt;Service&gt;标记用到了前面<img src='/icons/23852de.gif' />模式: <br/><br/>&lt;Service <br/>  <img src='/icons/23852class.gif' />=&quot;org.pasx.examples.CustomConfigExample&quot;<br/>  name=&quot;examples.customConfigExample&quot; &gt;<br/><br/>  &lt;pce:PCE xmlns=&quot;http://pasx.org/PASX/CUSTOM-EXAMPLE&quot; <br/>  xmlns:pce=&quot;http://pasx.org/PASX/CUSTOM-EXAMPLE&quot; <br/>  xsi:schemaLocation=&quot;http://pasx.org/PASX/CUSTOM-EXAMPLE /org/pasx/examples/custom-example.xsd&quot; &gt;<br/><br/>    &lt;ServerFarm name=&quot;farm0&quot;&gt;<br/>      &lt;Cluster name=&quot;cluster0&quot;&gt;<br/>        &lt;Server hostName=&quot;app0.foo.com&quot; portNumber=&quot;8080&quot; /&gt;<br/>        &lt;Server hostName=&quot;app1.foo.com&quot; portNumber=&quot;8080&quot; /&gt;<br/>      &lt;/Cluster&gt;<br/>      &lt;Cluster name=&quot;cluster1&quot;&gt;<br/>        &lt;Server hostName=&quot;app2.foo.com&quot; portNumber=&quot;8080&quot; /&gt;<br/>        &lt;Server hostName=&quot;app3.foo.com&quot; portNumber=&quot;8080&quot; /&gt;<br/>      &lt;/Cluster&gt;<br/>    &lt;/ServerFarm&gt;<br/>    &lt;ServerFarm name=&quot;farm1&quot;&gt;<br/>      &lt;Cluster name=&quot;cluster0&quot;&gt;<br/>        &lt;Server hostName=&quot;app4.foo.com&quot; portNumber=&quot;8080&quot; /&gt;<br/>        &lt;Server hostName=&quot;app5.foo.com&quot; portNumber=&quot;8080&quot; /&gt;<br/>      &lt;/Cluster&gt;<br/>      &lt;Cluster name=&quot;cluster1&quot;&gt;<br/>        &lt;Server hostName=&quot;app6.foo.com&quot; portNumber=&quot;8080&quot; /&gt;<br/>        &lt;Server hostName=&quot;app7.foo.com&quot; portNumber=&quot;8080&quot; /&gt;<br/>      &lt;/Cluster&gt;<br/>    &lt;/ServerFarm&gt;<br/><br/>  &lt;/pce:PCE&gt;<br/><br/>&lt;/Service&gt; <br/> <br/><br/>    PASXService类如何使用XML配置信息实际上由类<img src='/icons/23852de.gif' />开发者决定<img src='/icons/23852dou2.gif' />在配置类<img src='/icons/23852de.gif' />时候<img src='/icons/23852dou.gif' />它通过configure思路方法处理声明它<img src='/icons/23852de.gif' />XML元素(&lt;Service&gt;)<img src='/icons/23852dou2.gif' />configure思路方法<img src='/icons/23852de.gif' />特征如下: <br/><br/>public void configure(org.jdom.Element config,<br/>  Context context, ServiceManager caller) <br/> <br/><br/>    注意Element参数是<img src='/icons/23852yi.gif' />个对JDOM Element<img src='/icons/23852de.gif' />引用<img src='/icons/23852dou.gif' />而不是<img src='/icons/23852yi.gif' />个DOM Element<img src='/icons/23852de.gif' />引用<img src='/icons/23852dou2.gif' />JDOM比DOM更适合Java处理<img src='/icons/23852dou2.gif' />但是<img src='/icons/23852dou.gif' />如果你需要DOM版本<img src='/icons/23852dou.gif' />JDOM包提供了转换它们<img src='/icons/23852de.gif' />思路方法<img src='/icons/23852dou2.gif' />使用定制元素时<img src='/icons/23852dou.gif' />类<img src='/icons/23852de.gif' />开发者必须使用JDOM API访问解析后<img src='/icons/23852de.gif' />XML<img src='/icons/23852dou2.gif' />然而<img src='/icons/23852dou.gif' />由于使用了XML模式<img src='/icons/23852dou.gif' />类开发者要关心<img src='/icons/23852de.gif' />只是如何使用JDOM数据结构中<img src='/icons/23852de.gif' />信息<img src='/icons/23852dou.gif' />但无需编写代码去验证数据结构<img src='/icons/23852de.gif' />合法性(例如<img src='/icons/23852dou.gif' />&lt;Cluster&gt;元素只包含&lt;Server&gt;元素)<img src='/icons/23852dou2.gif' /> <br/><br/>    如果PASXService<img src='/icons/23852de.gif' />开发者决定只用PASX定义<img src='/icons/23852de.gif' />XML标记<img src='/icons/23852dou.gif' />且遵从Java Bean获取和设置Bean属性<img src='/icons/23852de.gif' />模式<img src='/icons/23852dou.gif' />那么<img src='/icons/23852dou.gif' />他可以使用<img src='/icons/23852yi.gif' />个称为XMLBeanUtil<img src='/icons/23852de.gif' />工具类<img src='/icons/23852dou2.gif' />这个类利用Bean<img src='/icons/23852de.gif' />“内省”机制<img src='/icons/23852dou.gif' />实现Bean属性和PASX所定义XML标记的间<img src='/icons/23852de.gif' />匹配和赋值<img src='/icons/23852dou2.gif' />它能够让代码编写变得非常轻松<img src='/icons/23852dou2.gif' />例如: <br/><br/>public void configure( Element config,<br/>  Context context, ServiceManager caller )<br/>{ xbu = <img src='/icons/23852new.gif' /> XMLBeanUtil( context ); xbu.populate( config, this );<br/>}  
		
          
              
          <br/>
        <br/>
          <br/> <br/><br/>    如果某个PASXService组件由<img src='/icons/23852yi.gif' />组关系密切<img src='/icons/23852de.gif' />小型Java类构成<img src='/icons/23852dou.gif' />populate思路方法可能被多次<img src='/icons/23852diaoyong.gif' /><img src='/icons/23852dou2.gif' />请考虑下面这个属性: <br/><br/>&lt;String name=&quot;lastName&quot;&gt;Bushaw&lt;/String&gt; <br/> <br/><br/>    对于这个XML片断<img src='/icons/23852dou.gif' />为了把lastName属性赋给两个区别<img src='/icons/23852de.gif' />Bean<img src='/icons/23852dou.gif' />populate思路方法可以被多次<img src='/icons/23852diaoyong.gif' />: <br/><br/>Person father = <img src='/icons/23852new.gif' /> Person<img src='/icons/23852kh.gif' />;<br/>Person mother = <img src='/icons/23852new.gif' /> Person<img src='/icons/23852kh.gif' />; xbu.populate( config, father ); xbu.populate( config, mother ); <br/> <br/><br/>    使用XML模式和定制标记<img src='/icons/23852de.gif' /><img src='/icons/23852yi.gif' />个优点是对预计配置<img src='/icons/23852de.gif' />验证<img src='/icons/23852dou2.gif' />换句话说<img src='/icons/23852dou.gif' />你可以编写<img src='/icons/23852yi.gif' />个XML模式<img src='/icons/23852dou.gif' />使得对于给定<img src='/icons/23852de.gif' />&lt;Host&gt;标记<img src='/icons/23852dou.gif' />PortNumber和ipAddress属性也必须同时指定<img src='/icons/23852dou2.gif' />定义PASX标记集<img src='/icons/23852de.gif' />模式不能这么做<img src='/icons/23852dou.gif' /><img src='/icons/23852yinwei.gif' />它不了解各个PASXService组件所需<img src='/icons/23852de.gif' />语义信息<img src='/icons/23852dou2.gif' />然而<img src='/icons/23852dou.gif' />XMLBeanUtil能够跟踪哪些Bean属性已经设置、哪些还没有设置<img src='/icons/23852dou.gif' />而且允许在配置<img src='/icons/23852de.gif' />时候指定<img src='/icons/23852yi.gif' />系列对属性<img src='/icons/23852de.gif' />约束<img src='/icons/23852dou2.gif' />PASXService类<img src='/icons/23852de.gif' />编写者可以根据爱好、需要和方便程度<img src='/icons/23852dou.gif' />选用任意<img src='/icons/23852yi.gif' />种思路方法<img src='/icons/23852dou2.gif' /> <br/><br/>    XMLBeanUtil把Bean属性分成 3类:Property(普通属性)<img src='/icons/23852dou.gif' />Dependent(依赖)<img src='/icons/23852dou.gif' />Compliment(遵从)<img src='/icons/23852dou2.gif' />如果这 3类属性<img src='/icons/23852de.gif' />Java类型是List或Map<img src='/icons/23852dou.gif' />则它们都可以作为<img src='/icons/23852yi.gif' />个集合体设置<img src='/icons/23852dou2.gif' />如果属性已经有值且被视为<img src='/icons/23852yi.gif' />个集合体<img src='/icons/23852dou.gif' />配置中<img src='/icons/23852de.gif' />List或Map被加入到现有<img src='/icons/23852de.gif' />属性；如果它不被视为<img src='/icons/23852yi.gif' />个集合体<img src='/icons/23852dou.gif' />则配置中<img src='/icons/23852de.gif' />List或Map将取代属性值<img src='/icons/23852dou2.gif' />下面<img src='/icons/23852de.gif' />configure思路方法例子示范了它<img src='/icons/23852de.gif' />使用方法<img src='/icons/23852dou2.gif' /> <br/><br/>public void configure( Element config,<br/>     Context context, ServiceManager caller )<br/>{ xbu = <img src='/icons/23852new.gif' /> XMLBeanUtil( context ); xbu.addProperty( &quot;hostName&quot;,<br/>    &quot;Host Name Of Mythical TCP Service&quot;, <br/>    true, false ); xbu.addDependent( &quot;portNumber&quot;,<br/>    &quot;Port Number Of Mythical TCP Service&quot;,<br/>    &quot;hostName&quot;, false ); xbu.addCompliment( &quot;serverFarm&quot;,<br/>    &quot;Back-end Server Farm&quot;, <br/>    &quot;nameServers&quot;, true ); xbu.addCompliment( &quot;nameServers&quot;,<br/>    &quot;Name Servers To Resolve Against&quot;,<br/>    &quot;serverFarm&quot;, true ); xbu.addProperty( &quot;person&quot;, <br/>    &quot;Person&quot;, true, false ); xbu.addProperty( &quot;binaryThing&quot;,<br/>    &quot;The binary input stream&quot;,<br/>    true, false ); xbu.addProperty( &quot;props&quot;,<br/>    &quot;Example Protomatter Properties&quot;,<br/>    true, false ); xbu.addProperty( &quot;xml&quot;,<br/>    &quot;An example JDOM XML Document&quot;,<br/>    true, false ); xbu.populate( config, this );<br/>} <br/> <br/><br/>    传递给addProperty、addDependent、addCompliment思路方法<img src='/icons/23852de.gif' />属性描述用于<img src='/icons/23852cuowu.gif' />信息<img src='/icons/23852dou2.gif' />XMLBeanUtil类<img src='/icons/23852de.gif' />checkService思路方法将检查属性是否已经正确设置<img src='/icons/23852dou2.gif' />如果还没有<img src='/icons/23852dou.gif' />它将抛出<img src='/icons/23852yi.gif' />个异常<img src='/icons/23852dou.gif' />在<img src='/icons/23852cuowu.gif' />信息中利用属性<img src='/icons/23852de.gif' />描述<img src='/icons/23852dou2.gif' />要查看完整<img src='/icons/23852de.gif' />例子<img src='/icons/23852dou.gif' />请参考BeanServiceExample类<img src='/icons/23852dou2.gif' /> <br/><br/>    作为<img src='/icons/23852yi.gif' />个细心<img src='/icons/23852de.gif' />读者<img src='/icons/23852dou.gif' />你可能已经发现<img src='/icons/23852dou.gif' />此前<img src='/icons/23852de.gif' />所有例子都没有提到JNDI<img src='/icons/23852dou2.gif' />即使是&lt;Service&gt;标记<img src='/icons/23852de.gif' />name属性也没有提到任何有关JNDI<img src='/icons/23852de.gif' />内容<img src='/icons/23852dou2.gif' />因此<img src='/icons/23852dou.gif' />你也许会疑惑PASX<img src='/icons/23852de.gif' />命名部分如何使用JNDI<img src='/icons/23852dou2.gif' /> <br/><br/>    默认情况下<img src='/icons/23852dou.gif' />PASX使用内存中<img src='/icons/23852de.gif' />称为PAS<img src='/icons/23852de.gif' />扁平JNDI服务提供者(它来自底层<img src='/icons/23852de.gif' />Protomatter包)<img src='/icons/23852dou2.gif' />这个服务提供者仅仅是<img src='/icons/23852yi.gif' />个带有JNDI接口<img src='/icons/23852de.gif' />Hashtable<img src='/icons/23852dou2.gif' />其他JNDI服务提供者可以通过URL命名指定甚至<img src='/icons/23852yi.gif' />起使用<img src='/icons/23852dou2.gif' />因此<img src='/icons/23852dou.gif' />从<img src='/icons/23852yi.gif' />个RMI注册器或者<img src='/icons/23852yi.gif' />个LDAP服务器(也就是rmi://localhost/creditCardAuthorizer或ldap://foo.com/uid=littlek,dc=foo,dc=com)指定<img src='/icons/23852yi.gif' />个URL是可能<img src='/icons/23852de.gif' /><img src='/icons/23852dou2.gif' /> <br/><br/>    在服务中使用JNDI<img src='/icons/23852de.gif' />默认JNDI动作是bind<img src='/icons/23852dou2.gif' />然而<img src='/icons/23852dou.gif' />通过可选<img src='/icons/23852de.gif' />action属性<img src='/icons/23852dou.gif' />动作也可以指定为rebind或lookup<img src='/icons/23852dou2.gif' />bind动作尝试把服务放入JNDI目录<img src='/icons/23852dou.gif' />但如果目录中已经包含具有指定名字<img src='/icons/23852de.gif' />服务<img src='/icons/23852dou.gif' />则操作失败<img src='/icons/23852dou2.gif' />rebind动作和bind动作基本相同<img src='/icons/23852dou.gif' />例外的处在于<img src='/icons/23852dou.gif' />rebind动作将覆盖已经存在<img src='/icons/23852de.gif' />服务入口<img src='/icons/23852dou2.gif' />无论是bind还是rebind动作<img src='/icons/23852dou.gif' />PASX都会例子化PASXService对象<img src='/icons/23852dou2.gif' />但对于lookup动作<img src='/icons/23852dou.gif' />对象从JNDI目录提取得到<img src='/icons/23852dou2.gif' /> <br/><br/>    &lt;Service&gt;标记中还有两个属性可能被用到:preRebind和postRebind<img src='/icons/23852dou2.gif' />preRebind属性指定<img src='/icons/23852yi.gif' />个名字或<img src='/icons/23852yi.gif' />个URL<img src='/icons/23852dou.gif' />它被用于在配置生效的前把对象重新绑定到JNDI目录<img src='/icons/23852dou2.gif' />类似地<img src='/icons/23852dou.gif' />postRebind属性具有同样<img src='/icons/23852de.gif' />功能<img src='/icons/23852dou.gif' />但区别<img src='/icons/23852de.gif' />是<img src='/icons/23852dou.gif' />它在配置的后出现<img src='/icons/23852dou2.gif' /> <br/><br/>    结合运用这些功能使得配置文件能够轻松地完成<img src='/icons/23852yi.gif' />些有用<img src='/icons/23852de.gif' />任务<img src='/icons/23852dou2.gif' />它如<img src='/icons/23852dou.gif' />你可以从LDAP服务器“反串行化”<img src='/icons/23852yi.gif' />个对象<img src='/icons/23852dou.gif' />通过XML配置它<img src='/icons/23852dou.gif' />然后把它放入内存<img src='/icons/23852dou.gif' />使得其他对象能够访问它<img src='/icons/23852dou2.gif' />考虑这样<img src='/icons/23852yi.gif' />个例子:某些业务过程<img src='/icons/23852de.gif' />终止日期驻留在LDAP服务器上<img src='/icons/23852dou2.gif' />下面<img src='/icons/23852de.gif' />标记代码从LDAP服务器获取终止日期<img src='/icons/23852dou.gif' />根据当前<img src='/icons/23852de.gif' />时区设置它<img src='/icons/23852dou.gif' />然后把它放入内存: <br/><br/>&lt;Service<br/>  name=&quot;ldap://foo.com/cn=expirationDate,o=foo.com&quot;<br/>  <img src='/icons/23852class.gif' />=&quot;my.UtilityDate&quot;<br/>  action=&quot;lookup&quot; postRebind=&quot;pas:expirationDate&quot;&gt;<br/>  &lt;Integer name=&quot;timeZone&quot; value=&quot;-6&quot;/&gt;<br/>&lt;/Service&gt; <br/> <br/><br/>    现在<img src='/icons/23852dou.gif' />其他服务可以通过&lt;NamedService&gt;标记引用这个经过配置<img src='/icons/23852de.gif' />服务了<img src='/icons/23852dou2.gif' />例如<img src='/icons/23852dou.gif' />考虑<img src='/icons/23852yi.gif' />个降价销售广告服务<img src='/icons/23852dou.gif' />它必须知道降价销售活动何时终止: <br/><br/>&lt;Service<br/>  name=&quot;pas:oriellySale&quot;<br/>  <img src='/icons/23852class.gif' />=&quot;my.SalesAdBanner&quot;&gt;<br/>  &lt;NamedService name=&quot;endDate&quot; serviceName=&quot;pas:expirationDate&quot;/&gt;<br/>&lt;/Service&gt; <br/> <br/><br/>    这并不是什么魔术<img src='/icons/23852dou2.gif' />&lt;NamedService&gt;标记只不过是根据serviceName属性<img src='/icons/23852dou.gif' />让PASX执行<img src='/icons/23852yi.gif' />个JNDI查找<img src='/icons/23852dou.gif' />然后把结果放入名为endDate<img src='/icons/23852de.gif' />Bean属性<img src='/icons/23852dou2.gif' />尽管如此<img src='/icons/23852dou.gif' />这种在配置时把<img src='/icons/23852yi.gif' />个对象连接到另<img src='/icons/23852yi.gif' />个对象<img src='/icons/23852de.gif' />思路方法很有用<img src='/icons/23852dou2.gif' />如果你开始使用这种方式<img src='/icons/23852dou.gif' />它可能改变你设计类<img src='/icons/23852de.gif' />习惯<img src='/icons/23852dou2.gif' /> <br/><br/>    PASX包含了各种各样用于JNDI<img src='/icons/23852de.gif' />工具<img src='/icons/23852dou2.gif' />其中包括状态和对象工厂<img src='/icons/23852dou.gif' />用于在目录中串行化和保存对象状态；还有两个服务提供者<img src='/icons/23852dou2.gif' />请参考JavaDoc了解有关它们<img src='/icons/23852de.gif' />更多信息<img src='/icons/23852dou2.gif' /> <br/><br/>    另外<img src='/icons/23852dou.gif' />PASX还包含<img src='/icons/23852yi.gif' />个完整<img src='/icons/23852de.gif' />例子包<img src='/icons/23852dou.gif' />包括源代码、JavaDoc和伴随PASX<img src='/icons/23852de.gif' />配置文件<img src='/icons/23852dou2.gif' />这些例子从简单<img src='/icons/23852de.gif' />配置举例开始<img src='/icons/23852dou.gif' />涵盖所有范围<img src='/icons/23852dou.gif' />直至多个JNDI目录<img src='/icons/23852de.gif' />混合应用<img src='/icons/23852dou2.gif' />请参考JavaDoc org.pasx.examples<img src='/icons/23852dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/><br/>    我希望<img src='/icons/23852dou.gif' />本文所介绍概念<img src='/icons/23852de.gif' />优点已经让你确信:下<img src='/icons/23852yi.gif' />次坐下来编写<img src='/icons/23852chengxu.gif' />时<img src='/icons/23852dou.gif' />不管其规模大小<img src='/icons/23852dou.gif' />你有必要考虑<img src='/icons/23852yi.gif' />下配置<img src='/icons/23852de.gif' />需求和思路方法问题<img src='/icons/23852dou2.gif' />本文所介绍<img src='/icons/23852de.gif' />概念属于中心主题<img src='/icons/23852dou.gif' />但PASX还包含本文没有介绍<img src='/icons/23852de.gif' />许多其他功能<img src='/icons/23852dou2.gif' />PASX为完成许多任务提供了大量标准<img src='/icons/23852de.gif' />服务和管理器<img src='/icons/23852dou.gif' />甚至还有<img src='/icons/23852yi.gif' />个Servlet框架<img src='/icons/23852dou.gif' />用户可以通过这个Servlet框架管理服务和管理器<img src='/icons/23852dou2.gif' /> <br/><br/>    最后<img src='/icons/23852dou.gif' />有<img src='/icons/23852yi.gif' />个称为Potomac<img src='/icons/23852de.gif' />工程<img src='/icons/23852dou2.gif' />Potomac是<img src='/icons/23852yi.gif' />个基于PASX<img src='/icons/23852de.gif' />源代码开放Java软件Software<img src='/icons/23852de.gif' />集合<img src='/icons/23852dou2.gif' />有了Potomac<img src='/icons/23852dou.gif' />所有你必须做<img src='/icons/23852de.gif' />就是解开压缩文件<img src='/icons/23852dou.gif' />这样你就有了使用PASX时所有必须<img src='/icons/23852de.gif' />Java组件<img src='/icons/23852dou.gif' />比如Protomatter和JDom<img src='/icons/23852dou.gif' />还有<img src='/icons/23852yi.gif' />些快速启动脚本和入门学习用<img src='/icons/23852de.gif' />配置文件<img src='/icons/23852dou2.gif' /><br/>  <a href="/mypdf/6803.pdf" title="查看 j2ee开发:PASX简化Java开发-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6803.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:开发J2EE应用的要领-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6755.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          <img src='/icons/77128dou.gif' />作为开发mission-critical<img src='/icons/77128de.gif' />企业级应用<img src='/icons/77128de.gif' /><img src='/icons/77128yi.gif' />整套规范标准<img src='/icons/77128de.gif' />整合平台<img src='/icons/77128dou2.gif' />其规范标准的多、内容的广<img src='/icons/77128dou.gif' />从而给开发J2EE应用带来了很多“麻烦”<img src='/icons/77128dou2.gif' />比如<img src='/icons/77128dou.gif' />为实现内容<img src='/icons/77128de.gif' />RDBMS存储<img src='/icons/77128dou.gif' />我们可能<img src='/icons/77128de.gif' />思路方法有JDBC、Entity Beans、JDO、O/R Mapping工具(TopLink、Hibernate)、XML-DBMS、JAXB等思路方法(其中<img src='/icons/77128yi.gif' />些思路方法不是J2EE规范标准所包含<img src='/icons/77128de.gif' />)<img src='/icons/77128dou2.gif' />因此<img src='/icons/77128dou.gif' />为实现 J2EE各层(至少有表示层、控制层、商业逻辑层等3层)以及层和层的间<img src='/icons/77128de.gif' />耦合<img src='/icons/77128dou.gif' />J2EE系统架构师需要考虑<img src='/icons/77128de.gif' />问题会很多<img src='/icons/77128dou2.gif' />加上<img src='/icons/77128dou.gif' />J2EE本身<img src='/icons/77128de.gif' />快速发展<img src='/icons/77128dou.gif' />给架构、开发具有工业强度<img src='/icons/77128de.gif' />J2EE应用带来<img src='/icons/77128yi.gif' />些难题<img src='/icons/77128dou2.gif' /><br/>同时<img src='/icons/77128dou.gif' />软件Software开发技术从来就没有“银弹”<img src='/icons/77128dou.gif' />所以J2EE技术也不是万能<img src='/icons/77128de.gif' /><img src='/icons/77128dou2.gif' />但是<img src='/icons/77128dou.gif' />如果我们在结合具体商业需求<img src='/icons/77128de.gif' />基础上<img src='/icons/77128dou.gif' />合理<img src='/icons/77128de.gif' />应用好J2EE技术<img src='/icons/77128dou.gif' />其结果可想而知<img src='/icons/77128dou2.gif' />本文试探从自己以往<img src='/icons/77128de.gif' />项目经验来探讨开发J2EE应用应该遵循<img src='/icons/77128de.gif' />几点准测入手<img src='/icons/77128dou.gif' />以起到抛砖引玉<img src='/icons/77128de.gif' />作用<img src='/icons/77128dou2.gif' />如果能达到这<img src='/icons/77128yi.gif' />点要求<img src='/icons/77128dou.gif' />则万分激动<img src='/icons/77128dou2.gif' /><br/>本文结合JBoss 3.2.1下<img src='/icons/77128de.gif' />J2EE应用开发为例展开论述<img src='/icons/77128dou2.gif' /><br/><br/>1<img src='/icons/77128dou.gif' />结合商业需求选择合理<img src='/icons/77128de.gif' />架构<br/><br/>如果脱离商业需求<img src='/icons/77128dou.gif' />而单独<img src='/icons/77128de.gif' />讨论技术本身<img src='/icons/77128de.gif' />优势是不够<img src='/icons/77128de.gif' /><img src='/icons/77128dou2.gif' />各项技术都有产生<img src='/icons/77128de.gif' />特定背景<img src='/icons/77128dou.gif' />其中很多都是来自工业需求而触动<img src='/icons/77128de.gif' /><img src='/icons/77128dou2.gif' /><img src='/icons/77128yi.gif' />般而言<img src='/icons/77128dou.gif' />企业信息系统(EIS)都要求自己稳定、安全、可靠、高效、便于维护<img src='/icons/77128dou2.gif' />同时<img src='/icons/77128dou.gif' />各个企业信息系统都有自己独特<img src='/icons/77128de.gif' />要求<img src='/icons/77128dou.gif' />可能有些时候需要考虑和原有遗留系统<img src='/icons/77128de.gif' />集成<img src='/icons/77128dou.gif' />所以了解各个企业信息系统具体<img src='/icons/77128de.gif' />商业需求对于整个系统<img src='/icons/77128de.gif' />架构显得很关键<img src='/icons/77128dou2.gif' /><br/>比如<img src='/icons/77128dou.gif' />如果待开发<img src='/icons/77128de.gif' />J2EE应用系统中使用到<img src='/icons/77128de.gif' />数据大部分来自于外在数据源；而这些数据可能是通过JDBC直接从外在数据源导入到待开发<img src='/icons/77128de.gif' />J2EE系统<img src='/icons/77128de.gif' />Database中<img src='/icons/77128dou2.gif' />对于这种情形<img src='/icons/77128dou.gif' />如果在开发过程中<img src='/icons/77128dou.gif' />仅仅使用JDBC来操作数据库<img src='/icons/77128dou.gif' />对于小强度(并发访问用户少、数据流量少)<img src='/icons/77128de.gif' />情形<img src='/icons/77128dou.gif' />显然是比较合适<img src='/icons/77128de.gif' />；但如果<img src='/icons/77128dou.gif' />并发访问用户较多、数据流量大<img src='/icons/77128dou.gif' />对Database层使用较为频繁<img src='/icons/77128de.gif' />情形<img src='/icons/77128dou.gif' />则显得有些力不从心<img src='/icons/77128dou2.gif' />因此<img src='/icons/77128dou.gif' />对于这种需求<img src='/icons/77128dou.gif' />我们可以考虑采用Entity Beans with Caches<img src='/icons/77128dou2.gif' />打个比方<img src='/icons/77128dou.gif' />在JBoss 3.2.1中对于Entity Beans<img src='/icons/77128de.gif' />Cache策略有多种<img src='/icons/77128dou.gif' />这时可以考虑使用<img src='/icons/77128dou.gif' /><img src='/icons/77128dou.gif' />即“Standard CMP 2.x EntityBean”<img src='/icons/77128dou.gif' />方式并采用“D”类型<img src='/icons/77128de.gif' />commit-option来保证Entity Beans<img src='/icons/77128de.gif' />内容和数据源<img src='/icons/77128de.gif' />同步<img src='/icons/77128dou.gif' />并使得系统<img src='/icons/77128de.gif' />性能得到大大改善(同直接使用JDBC相比)<img src='/icons/77128dou2.gif' />其中<img src='/icons/77128dou.gif' />可以将<img src='/icons/77128yi.gif' />些Entity Beans设置为read-only<img src='/icons/77128dou.gif' />以改善性能<img src='/icons/77128dou2.gif' /><br/>当然<img src='/icons/77128dou.gif' />在这里也可以采用其他<img src='/icons/77128yi.gif' />些O/R Mapping技术<img src='/icons/77128dou.gif' />比如TopLink<img src='/icons/77128dou2.gif' /><br/>再比如<img src='/icons/77128dou.gif' />考虑这样<img src='/icons/77128yi.gif' />种情形:如果待开发<img src='/icons/77128de.gif' />企业信息系统使用到<img src='/icons/77128de.gif' />数据都是由系统本身生成和操作<img src='/icons/77128de.gif' /><img src='/icons/77128dou.gif' />则建议采用:CMP Entity Beans技术<img src='/icons/77128dou2.gif' />Entity Beans给大家<img src='/icons/77128de.gif' />印象很坏<img src='/icons/77128dou.gif' />这可能和EJB 1.1给大家留下<img src='/icons/77128de.gif' />坏映象有关吧<img src='/icons/77128dou2.gif' />但是<img src='/icons/77128dou.gif' />EJB 2.0(或者说2.1)得到了很大<img src='/icons/77128de.gif' />改善<img src='/icons/77128dou.gif' />Local Interfaces、CMR、Read-Only、Session Fa&amp;ccedil;ade模式给Entity Beans注入了活力<img src='/icons/77128dou2.gif' />当然<img src='/icons/77128dou.gif' />并发用户多、数据流量很大时才会体现出使用Entity Beans<img src='/icons/77128de.gif' />优势<img src='/icons/77128dou2.gif' />其中<img src='/icons/77128dou.gif' />有<img src='/icons/77128yi.gif' />点很关键:要注重Entity Beans技术<img src='/icons/77128de.gif' />性能调优<img src='/icons/77128dou.gif' />各个应用服务器都有自己<img src='/icons/77128de.gif' /><img src='/icons/77128yi.gif' />套性能调优方案<img src='/icons/77128dou2.gif' />对于JBoss 3.2.1<img src='/icons/77128dou.gif' />配置文件standardjboss.xml提供了Entity Beans技术调优<img src='/icons/77128de.gif' />入口<img src='/icons/77128dou2.gif' />比如<img src='/icons/77128dou.gif' />Bean Lock策略<img src='/icons/77128de.gif' />合理使用对于Entity Beans<img src='/icons/77128de.gif' />调优就显得很重要<img src='/icons/77128dou2.gif' />这样使得<img src='/icons/77128dou.gif' />我们可以更加关注于系统<img src='/icons/77128de.gif' />商业逻辑<img src='/icons/77128dou.gif' />而不只是底层<img src='/icons/77128de.gif' />Database(EJB调优处于EJB Container中<img src='/icons/77128dou.gif' />因此我们处在J2EE性能<img src='/icons/77128de.gif' />高端<img src='/icons/77128dou.gif' />而不是底端<img src='/icons/77128dou.gif' />即Database层<img src='/icons/77128dou2.gif' />同时<img src='/icons/77128dou.gif' />Database层<img src='/icons/77128de.gif' />调优使得J2EE系统<img src='/icons/77128de.gif' />数据库移植性大打折扣<img src='/icons/77128dou2.gif' />)<img src='/icons/77128dou2.gif' /><br/>简而言的<img src='/icons/77128dou.gif' />要结合各个系统<img src='/icons/77128de.gif' />特定需求和状况给出具体<img src='/icons/77128de.gif' />技术架构方案<img src='/icons/77128dou.gif' />而不能孤单<img src='/icons/77128de.gif' />论述技术本身<img src='/icons/77128de.gif' />好坏<img src='/icons/77128dou2.gif' /><br/><br/>2<img src='/icons/77128dou.gif' />Framework<img src='/icons/77128de.gif' />合理选用<br/><br/>设计模式在J2EE应用系统中扮演着重要<img src='/icons/77128de.gif' />角色<img src='/icons/77128dou2.gif' />因此<img src='/icons/77128dou.gif' />有<img src='/icons/77128yi.gif' />个问题摆在大家面前<img src='/icons/77128dou.gif' />是自己来实现具体<img src='/icons/77128de.gif' />设计模式<img src='/icons/77128dou.gif' />还是借助于Third-party Framework<img src='/icons/77128dou2.gif' />如果贵公司不大<img src='/icons/77128dou.gif' />或者说公司不想在J2EE基础应用Framework投入很多精力<img src='/icons/77128dou.gif' />选用现有<img src='/icons/77128de.gif' />较为成熟<img src='/icons/77128de.gif' />、稳定、和现有J2EE Spec<img src='/icons/77128if.gif' />ication兼容<img src='/icons/77128de.gif' />技术框架会比较明智<img src='/icons/77128dou2.gif' /><br/><img src='/icons/77128yi.gif' />般而言<img src='/icons/77128dou.gif' />Framework本身<img src='/icons/77128dou.gif' />或者说J2EE平台本身都是实现并优化了具体<img src='/icons/77128de.gif' />设计模式、规则<img src='/icons/77128dou.gif' />比如业务代理、Service Locator(包括Web Tier和EJB Tier各自<img src='/icons/77128de.gif' />服务定位器<img src='/icons/77128dou.gif' />起到统<img src='/icons/77128yi.gif' />管理有限资源、Cache相关资源<img src='/icons/77128de.gif' />作用<img src='/icons/77128dou.gif' />便于系统移植)、Front Controller、DAO等等<img src='/icons/77128dou2.gif' />现有<img src='/icons/77128de.gif' />J2EE Framework比较丰富<img src='/icons/77128dou2.gif' />比如:<br/>Struts: 对于实现了Model 2类型<img src='/icons/77128de.gif' />Framework<img src='/icons/77128dou.gif' />对于现在以及将来(随着JSF规范标准、技术<img src='/icons/77128de.gif' />成熟)<img src='/icons/77128dou.gif' />选用她是<img src='/icons/77128yi.gif' />种明智的举<img src='/icons/77128dou2.gif' />目前<img src='/icons/77128dou.gif' />Struts已经发展到1.1版本<img src='/icons/77128dou2.gif' />其内在<img src='/icons/77128de.gif' />MVC主线、对后端数据操作方式没有限定、集合了Apache Jakarta项目组<img src='/icons/77128de.gif' />优秀相关项目<img src='/icons/77128de.gif' />精华<img src='/icons/77128dou.gif' />可谓是开发J2EE应用<img src='/icons/77128de.gif' />佳品<img src='/icons/77128dou2.gif' />同时<img src='/icons/77128dou.gif' />对于具有.NET Web Forms功能<img src='/icons/77128de.gif' />下<img src='/icons/77128yi.gif' />代J2EE平台技术JSF而言<img src='/icons/77128dou.gif' />Struts本身可考虑到和JSF<img src='/icons/77128de.gif' />兼容和集成性<img src='/icons/77128dou2.gif' />比如<img src='/icons/77128dou.gif' />通过JSP呈现表示层、Servlet呈现控制层、EJB呈现数据存储层<img src='/icons/77128dou2.gif' />各层的间<img src='/icons/77128dou.gif' />可以通过值对象、HTTP相关对象来通讯<img src='/icons/77128dou.gif' />实现J2EE相关技术<img src='/icons/77128de.gif' />完美应用<img src='/icons/77128dou2.gif' /><br/>Log4j: 我想对于习惯采用“<img src='/icons/77128System.gif' />.out.pr<img src='/icons/77128int.gif' />ln(“”);”<img src='/icons/77128de.gif' />读者而言<img src='/icons/77128dou.gif' />Log4j是大家<img src='/icons/77128de.gif' />福音<img src='/icons/77128dou2.gif' />尽管Java 2 Standard Edition也具备java.util.logging包来保证日志<img src='/icons/77128de.gif' />输出<img src='/icons/77128dou.gif' />但Log4j<img src='/icons/77128de.gif' />简单、高效、灵活已经成了很多项目<img src='/icons/77128de.gif' />选择<img src='/icons/77128dou2.gif' />日志<img src='/icons/77128dou.gif' />在某种程度上可以考验系统<img src='/icons/77128de.gif' />稳定性、正确性<img src='/icons/77128dou.gif' />所以采用可配置<img src='/icons/77128de.gif' />Log4j(目前<img src='/icons/77128dou.gif' />Log4j已经考虑到了和java.util.logging包<img src='/icons/77128de.gif' />兼容性)是不会错<img src='/icons/77128de.gif' /><img src='/icons/77128dou2.gif' />比如<img src='/icons/77128dou.gif' />JBoss 3.2.1本身就是借助于Log4j来管理日志<img src='/icons/77128de.gif' /><img src='/icons/77128dou2.gif' /><br/>realMethods: 可能有些读者还不知道这<img src='/icons/77128yi.gif' />款杀手锏<img src='/icons/77128dou2.gif' />那好<img src='/icons/77128dou.gif' />这里就简要作<img src='/icons/77128yi.gif' />介绍<img src='/icons/77128dou2.gif' />realMethods是<img src='/icons/77128yi.gif' />开发J2EE应用<img src='/icons/77128de.gif' />Framework<img src='/icons/77128dou.gif' />她区别于Struts (主要在于实现Model 2<img src='/icons/77128dou.gif' />J2EE应用前端)；realMethods对于J2EE应用<img src='/icons/77128de.gif' />各个层面都有详尽、高效<img src='/icons/77128de.gif' />支持<img src='/icons/77128dou2.gif' />同时<img src='/icons/77128dou.gif' />realMethods以前还是商用软件Software<img src='/icons/77128dou.gif' />现在已经成为了Open Source<img src='/icons/77128de.gif' />产品<img src='/icons/77128dou.gif' />因此现在可以参看其全部源代码<img src='/icons/77128dou2.gif' /><br/>BC4J: Oracle公司推出<img src='/icons/77128de.gif' />用于Java<img src='/icons/77128de.gif' />商业组件<img src='/icons/77128dou2.gif' />其内容和外在<img src='/icons/77128de.gif' />特点和优势<img src='/icons/77128dou.gif' />不言而寓<img src='/icons/77128dou2.gif' /><br/>当然<img src='/icons/77128dou.gif' />类似<img src='/icons/77128de.gif' />Framework很多很多<img src='/icons/77128dou2.gif' />作为开发J2EE应用<img src='/icons/77128de.gif' />团队(Team)而言<img src='/icons/77128dou.gif' />我们需要对各种Framework加以筛选<img src='/icons/77128dou.gif' />选择适合项目需求、团队(Team)、公司发展方向<img src='/icons/77128de.gif' />框架<img src='/icons/77128dou2.gif' /><br/><img src='/icons/77128yi.gif' />般情况下<img src='/icons/77128dou.gif' />待开发<img src='/icons/77128de.gif' />目标产品不宜采用过多<img src='/icons/77128de.gif' />Framework<img src='/icons/77128dou2.gif' />其<img src='/icons/77128yi.gif' /><img src='/icons/77128dou.gif' />J2EE各个技术发展很快<img src='/icons/77128dou.gif' />过多<img src='/icons/77128de.gif' />Framework使得系统<img src='/icons/77128de.gif' />后续升级、维护不利；其 2<img src='/icons/77128dou.gif' />可以借鉴其中<img src='/icons/77128de.gif' />好<img src='/icons/77128de.gif' /><img src='/icons/77128yi.gif' />面<img src='/icons/77128dou.gif' />比如研究realMethods实现<img src='/icons/77128de.gif' />相应<img src='/icons/77128de.gif' />设计模式<img src='/icons/77128dou.gif' />并改造她以适合我们<img src='/icons/77128de.gif' />项目需求；其 3<img src='/icons/77128dou.gif' />Framework本身会有变动<img src='/icons/77128dou.gif' />如果选用过多<img src='/icons/77128dou.gif' />会给开发团队(Team)加重负担<img src='/icons/77128dou.gif' />从而不利于项目管理(project management)<img src='/icons/77128dou2.gif' /> 
		
          
              
          <br/>
        <br/>
          <br/>有选择<img src='/icons/77128de.gif' />使用现有<img src='/icons/77128de.gif' />成熟Framework能提升大家<img src='/icons/77128de.gif' />开发效率、开发水平<img src='/icons/77128dou2.gif' /><br/><br/>3<img src='/icons/77128dou.gif' />开发模式<img src='/icons/77128de.gif' />选择<br/><br/>开发J2EE应用要求目标开发人员能够掌握其中<img src='/icons/77128de.gif' />各种技术<img src='/icons/77128dou2.gif' />但是<img src='/icons/77128dou.gif' />现实情况不是这样<img src='/icons/77128dou2.gif' />作为<img src='/icons/77128yi.gif' />个团队(Team)<img src='/icons/77128dou.gif' />每个人都有自己区别<img src='/icons/77128de.gif' />技能优势、兴趣以及悟性<img src='/icons/77128dou2.gif' />同时<img src='/icons/77128dou.gif' /> J2EE本身需要体现社会分工<img src='/icons/77128dou2.gif' /><img src='/icons/77128yi.gif' />般情况下<img src='/icons/77128dou.gif' />我们<img src='/icons/77128de.gif' />开发团队(Team)不会有Spec<img src='/icons/77128if.gif' />ication所要求<img src='/icons/77128de.gif' />各个开发角色<img src='/icons/77128dou2.gif' />现实往往只有3种(也可能是两种):美工、JSP<img src='/icons/77128chengxu.gif' />员、EJB<img src='/icons/77128chengxu.gif' />员<img src='/icons/77128dou2.gif' />面对这种分工<img src='/icons/77128dou.gif' />团队(Team)更要注重沟通、交流<img src='/icons/77128dou.gif' />注重代码<img src='/icons/77128de.gif' /><img src='/icons/77128yi.gif' />致性<img src='/icons/77128dou2.gif' /><br/><img src='/icons/77128yi.gif' />般情况下<img src='/icons/77128dou.gif' />团队(Team)要尽量采用版本控制工具管理代码、尽量做到每天都有<img src='/icons/77128yi.gif' />个完整<img src='/icons/77128de.gif' />运行版本<img src='/icons/77128dou2.gif' />经过<img src='/icons/77128yi.gif' />段时间<img src='/icons/77128dou.gif' />团队(Team)都会适应这种开发模式<img src='/icons/77128dou2.gif' />其中<img src='/icons/77128dou.gif' />版本控制工具<img src='/icons/77128yi.gif' />定要使用<img src='/icons/77128dou.gif' />便于代码<img src='/icons/77128de.gif' />管理、控制和备份<img src='/icons/77128dou2.gif' />这其中会牵扯到很多层面<img src='/icons/77128dou2.gif' />比如<img src='/icons/77128dou.gif' />开发工具<img src='/icons/77128de.gif' />选择要考虑到版本控制工具<img src='/icons/77128de.gif' />使用、建模工具<img src='/icons/77128de.gif' />合理使用有助于团队(Team)有效<img src='/icons/77128de.gif' />沟通和交流<img src='/icons/77128dou2.gif' /><br/>基于现有<img src='/icons/77128de.gif' />开发模式<img src='/icons/77128dou.gif' />个人认为这样3套方案不错<img src='/icons/77128dou2.gif' />第<img src='/icons/77128yi.gif' /><img src='/icons/77128dou.gif' />采用Together作为建模工具、采用JBuilder作为IDE工具、采用VSS(或者CVS)作为版本控制工具、采用 JBoss作为开发J2EE应用开发阶段<img src='/icons/77128de.gif' />服务器<img src='/icons/77128dou2.gif' />第 2<img src='/icons/77128dou.gif' />采用WebSphere Studio整套工具<img src='/icons/77128dou2.gif' />第 3<img src='/icons/77128dou.gif' />采用Eclipse(或者JCreator)、Ant、XDoclets作为开发工具<img src='/icons/77128dou2.gif' /><br/>当然<img src='/icons/77128dou.gif' />手工完成J2EE应用<img src='/icons/77128de.gif' />编写、编译、打包、部署、测试更能使开发者理解各个开发阶段<img src='/icons/77128de.gif' />具体细节<img src='/icons/77128dou2.gif' />但本人认为<img src='/icons/77128dou.gif' />只要开发者有这种关注具体细节<img src='/icons/77128de.gif' />态度<img src='/icons/77128dou.gif' />选用功能强大<img src='/icons/77128de.gif' />建模、开发工具是明智<img src='/icons/77128de.gif' /><img src='/icons/77128dou2.gif' />开发工具不能提高开发人员<img src='/icons/77128de.gif' />开发技能<img src='/icons/77128dou.gif' />但是她能够引导开发人员正确<img src='/icons/77128de.gif' />开发方向<img src='/icons/77128dou2.gif' />比如,JBuidler 9 Enterprise提供<img src='/icons/77128de.gif' />EJB精灵具有<img src='/icons/77128de.gif' />“Struts + EJB + Session Fa&amp;ccedil;ade + Value Object”等功能呈现了业界广泛应用<img src='/icons/77128de.gif' />J2EE构架方式<img src='/icons/77128dou2.gif' /><br/><br/>4<img src='/icons/77128dou.gif' />注重各个阶段<img src='/icons/77128de.gif' />测试工作<br/><br/>测试工作往往是很多项目经理(project manager)忽视<img src='/icons/77128dou.gif' />不愿意去花费时间、费用<img src='/icons/77128de.gif' />内容<img src='/icons/77128dou.gif' /><img src='/icons/77128yinwei.gif' />那样会增加项目<img src='/icons/77128de.gif' />成本<img src='/icons/77128dou2.gif' />但是<img src='/icons/77128dou.gif' />他们忽视了<img src='/icons/77128dou.gif' />项目<img src='/icons/77128de.gif' />完成质量往往对项目<img src='/icons/77128de.gif' />成本有很大<img src='/icons/77128de.gif' />关系<img src='/icons/77128dou2.gif' />比如<img src='/icons/77128dou.gif' />如果软件Software质量很差<img src='/icons/77128dou.gif' />并没有经历测试阶段<img src='/icons/77128dou.gif' />其后期部署、运行所带来<img src='/icons/77128de.gif' />费用会远远超过前期<img src='/icons/77128de.gif' />费用<img src='/icons/77128dou2.gif' /><br/>测试是分阶段<img src='/icons/77128de.gif' /><img src='/icons/77128dou2.gif' />单元测试<img src='/icons/77128dou.gif' />比如借助于JUnit<img src='/icons/77128dou.gif' />来保证功能正确等内容<img src='/icons/77128dou2.gif' />集成测试<img src='/icons/77128dou.gif' />来保证系统没有内存泄漏等内容<img src='/icons/77128dou2.gif' />其中<img src='/icons/77128dou.gif' />Optimizeite Suite Enterprise对于完成Profiler、Code Coverage、Thread Debugger等内容很有帮助<img src='/icons/77128dou2.gif' />我记得<img src='/icons/77128dou.gif' />我写<img src='/icons/77128de.gif' /><img src='/icons/77128yi.gif' />个Swing桌面应用存在内容泄漏<img src='/icons/77128dou.gif' />但是想了很多办法都没有解决问题<img src='/icons/77128dou2.gif' />后来<img src='/icons/77128dou.gif' />采用Profiler获得了答案<img src='/icons/77128dou2.gif' />因此<img src='/icons/77128dou.gif' />现在开发应用<img src='/icons/77128dou.gif' />我们很多时候都采用Optimizeite Suite Enterprise作为测试工具<img src='/icons/77128dou2.gif' />尤其是<img src='/icons/77128dou.gif' />在做集成测试过程中<img src='/icons/77128dou.gif' />检查系统<img src='/icons/77128de.gif' />内存泄漏、性能很有帮助<img src='/icons/77128dou2.gif' /><br/>测试是分类型<img src='/icons/77128de.gif' /><img src='/icons/77128dou2.gif' />压力测试、性能测试<img src='/icons/77128dou2.gif' />就目前对支持J2EE应用<img src='/icons/77128de.gif' />测试而言<img src='/icons/77128dou.gif' />并没有很好<img src='/icons/77128de.gif' />测试工具<img src='/icons/77128dou2.gif' />但是<img src='/icons/77128dou.gif' /><img src='/icons/77128yi.gif' />般情况下<img src='/icons/77128dou.gif' />借助于Rational Robot也能够取得不错<img src='/icons/77128de.gif' />效果<img src='/icons/77128dou2.gif' /><br/><br/>当然<img src='/icons/77128dou.gif' />成功开发J2EE应用<img src='/icons/77128de.gif' />原因有很多<img src='/icons/77128dou2.gif' />比如<img src='/icons/77128dou.gif' />Entity Beans<img src='/icons/77128de.gif' />成功应用很大程度上和底层Database<img src='/icons/77128de.gif' />设计有关系(如果表结构设计设计<img src='/icons/77128de.gif' />不合理<img src='/icons/77128dou.gif' />将导致Entity Beans性能<img src='/icons/77128de.gif' />急剧下降)；如何最大化挖掘、提升团队(Team)各个成员<img src='/icons/77128de.gif' />J2EE技能<img src='/icons/77128dou2.gif' />等等这些<img src='/icons/77128dou.gif' />设计面很广<img src='/icons/77128dou2.gif' /><br/><br/>  <a href="/mypdf/6755.pdf" title="查看 j2ee开发:开发J2EE应用的要领-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6755.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:用J2EE开发N层应用-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6742.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          A WebLogic应用服务器<img src='/icons/27198dou.gif' />提供对J2EE介绍 <br/><br/>内容介绍 <br/>Steven Gould在文中介绍了Java2平台企业版(J2EE)<img src='/icons/27198de.gif' />13种核心技术:JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail 和 JAF<img src='/icons/27198dou2.gif' />为了联系实际<img src='/icons/27198dou.gif' />Gould基于WebLogic应用服务器—来自BEA <img src='/icons/27198System.gif' />s公司<img src='/icons/27198de.gif' /><img src='/icons/27198yi.gif' />种广为应用<img src='/icons/27198de.gif' />产品—环境来介绍J2EE<img src='/icons/27198de.gif' />这些技术<img src='/icons/27198dou2.gif' /> <br/><br/>　 Java最初是在浏览器和客户端机器中粉墨登场<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' />当时<img src='/icons/27198dou.gif' />很多人质疑它是否适合做服务器端<img src='/icons/27198de.gif' />开发<img src='/icons/27198dou2.gif' />现在<img src='/icons/27198dou.gif' />随着对Java2平台企业版(J2EE)第 3方支持<img src='/icons/27198de.gif' />增多<img src='/icons/27198dou.gif' />Java被广泛接纳为开发企业级服务器端解决方案<img src='/icons/27198de.gif' />首选平台的<img src='/icons/27198yi.gif' /><img src='/icons/27198dou2.gif' /> <br/>J2EE平台由<img src='/icons/27198yi.gif' />整套服务(Services)、应用<img src='/icons/27198chengxu.gif' />接口(APIs)和协议构成<img src='/icons/27198dou.gif' />它对开发基于Web<img src='/icons/27198de.gif' />多层应用提供了功能支持<img src='/icons/27198dou2.gif' /> <br/>在本文中我将解释支撑J2EE<img src='/icons/27198de.gif' />13种核心技术:JDBC, JNDI, EJBs, RMI, JSP, Java servlets, XML, JMS, Java IDL, JTS, JTA, JavaMail 和 JAF<img src='/icons/27198dou.gif' />同时还将描述在何时、何处需要使用这些技术<img src='/icons/27198dou2.gif' />当然<img src='/icons/27198dou.gif' />我还要介绍这些区别<img src='/icons/27198de.gif' />技术的间是如何交互<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' /> <br/>此外<img src='/icons/27198dou.gif' />为了让您更好地感受J2EE<img src='/icons/27198de.gif' />真实应用<img src='/icons/27198dou.gif' />我将在WebLogic应用服务器—来自BEA <img src='/icons/27198System.gif' />s公司<img src='/icons/27198de.gif' /><img src='/icons/27198yi.gif' />种广为应用<img src='/icons/27198de.gif' />产品—环境下来介绍这些技术<img src='/icons/27198dou2.gif' />不论对于WebLogic应用服务器和J2EE<img src='/icons/27198de.gif' />新手<img src='/icons/27198dou.gif' />还是那些想了解J2EE能带来什么好处<img src='/icons/27198de.gif' />项目管理(project management)者和系统分析员<img src='/icons/27198dou.gif' />相信本文<img src='/icons/27198yi.gif' />定很有参考价值<img src='/icons/27198dou2.gif' /> <br/><br/>宏观印象: 分布式结构和J2EE <br/><br/>过去<img src='/icons/27198dou.gif' /> 2层化应用 -- 通常被称为client/server应用 -- 是大家谈论<img src='/icons/27198de.gif' />最多<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' />图1刻画了典型<img src='/icons/27198de.gif' /> 2层化结构<img src='/icons/27198dou2.gif' />在很多情况下<img src='/icons/27198dou.gif' />服务器提供<img src='/icons/27198de.gif' />唯<img src='/icons/27198yi.gif' />服务就是数据库服务<img src='/icons/27198dou2.gif' />在这种解决方案中<img src='/icons/27198dou.gif' />客户端<img src='/icons/27198chengxu.gif' />负责数据访问、实现业务逻辑、用合适<img src='/icons/27198de.gif' />样式显示结果、弹出预设<img src='/icons/27198de.gif' />用户界面、接受用户输入等<img src='/icons/27198dou2.gif' />client/server结构通常在第<img src='/icons/27198yi.gif' />次部署<img src='/icons/27198de.gif' />时候比较容易<img src='/icons/27198dou.gif' />但难于升级或改进<img src='/icons/27198dou.gif' />而且经常基于某种专有<img src='/icons/27198de.gif' />协议—通常是某种数据库协议<img src='/icons/27198dou2.gif' />它使得重用业务逻辑和界面逻辑非常困难<img src='/icons/27198dou2.gif' />更重要<img src='/icons/27198de.gif' />是<img src='/icons/27198dou.gif' />在Web时代<img src='/icons/27198dou.gif' /> 2层化应用通常不能体现出很好<img src='/icons/27198de.gif' />伸缩性<img src='/icons/27198dou.gif' />因而很难适应Internet<img src='/icons/27198de.gif' />要求<img src='/icons/27198dou2.gif' /> <br/><br/>图1.  2层化应用结构 <br/><br/>Sun设计J2EE<img src='/icons/27198de.gif' />部分起因就是想解决 2层化结构<img src='/icons/27198de.gif' />缺陷<img src='/icons/27198dou2.gif' />于是<img src='/icons/27198dou.gif' />J2EE定义了<img src='/icons/27198yi.gif' />套标准来简化N层企业级应用<img src='/icons/27198de.gif' />开发<img src='/icons/27198dou2.gif' />它定义了<img src='/icons/27198yi.gif' />套标准化<img src='/icons/27198de.gif' />组件<img src='/icons/27198dou.gif' />并为这些组件提供了完整<img src='/icons/27198de.gif' />服务<img src='/icons/27198dou2.gif' />J2EE还自动为应用<img src='/icons/27198chengxu.gif' />处理了很多实现细节<img src='/icons/27198dou.gif' />如安全、多线程等<img src='/icons/27198dou2.gif' /> <br/><br/>用J2EE开发N层应用包括将 2层化结构中<img src='/icons/27198de.gif' />区别层面切分成许多层<img src='/icons/27198dou2.gif' /><img src='/icons/27198yi.gif' />个N层化应用A能够为以下<img src='/icons/27198de.gif' />每种服务提供<img src='/icons/27198yi.gif' />个分开<img src='/icons/27198de.gif' />层: <br/><br/>显示:在<img src='/icons/27198yi.gif' />个典型<img src='/icons/27198de.gif' />Web应用中<img src='/icons/27198dou.gif' />客户端机器上运行<img src='/icons/27198de.gif' />浏览器负责实现用户界面<img src='/icons/27198dou2.gif' /> <br/>动态生成显示: 尽管浏览器可以完成某些动态内容显示<img src='/icons/27198dou.gif' />但为了兼容区别<img src='/icons/27198de.gif' />浏览器<img src='/icons/27198dou.gif' />这些动态生成工作应该放在Web服务器端进行<img src='/icons/27198dou.gif' />使用JSP、Servlets<img src='/icons/27198dou.gif' />或者XML(可扩展标记语言)和(可扩展样式表语言)<img src='/icons/27198dou2.gif' /> <br/>业务逻辑:业务逻辑适合用Session EJBs(后面将介绍)来实现<img src='/icons/27198dou2.gif' /> <br/>数据访问:数据访问适合用Entity EJBs(后面将介绍)和JDBC来实现<img src='/icons/27198dou2.gif' /> <br/><br/>后台系统集成: 同后台系统<img src='/icons/27198de.gif' />集成可能需要用到许多区别<img src='/icons/27198de.gif' />技术<img src='/icons/27198dou.gif' />至于何种最佳需要根据后台系统<img src='/icons/27198de.gif' />特征而定<img src='/icons/27198dou2.gif' /> <br/>您可能开始诧异:为什么有这么多<img src='/icons/27198de.gif' />层？事实上<img src='/icons/27198dou.gif' />多层方式可以使企业级应用具有很强<img src='/icons/27198de.gif' />伸缩性<img src='/icons/27198dou.gif' />它允许每层专注于特定<img src='/icons/27198de.gif' />角色<img src='/icons/27198dou2.gif' />例如<img src='/icons/27198dou.gif' />让Web服务器负责提供页面<img src='/icons/27198dou.gif' />应用服务器处理应用逻辑<img src='/icons/27198dou.gif' />而数据库服务器提供数据库服务<img src='/icons/27198dou2.gif' /> <br/><br/>由于J2EE建立在Java2平台标准版(J2SE)<img src='/icons/27198de.gif' />基础上<img src='/icons/27198dou.gif' />所以具备了J2SE<img src='/icons/27198de.gif' />所有优点和功能<img src='/icons/27198dou2.gif' />包括“编写<img src='/icons/27198yi.gif' />次<img src='/icons/27198dou.gif' />到处可用”<img src='/icons/27198de.gif' />可移植性、通过 JDBC访问数据库、同原有企业资源进行交互<img src='/icons/27198de.gif' />CORBA技术<img src='/icons/27198dou.gif' />以及<img src='/icons/27198yi.gif' />个经过验证<img src='/icons/27198de.gif' />安全模型<img src='/icons/27198dou2.gif' />在这些基础上<img src='/icons/27198dou.gif' />J2EE又增加了对EJB(企业级Java组件)、Java servlets、Java服务器页面(JSPs)和XML技术<img src='/icons/27198de.gif' />支持<img src='/icons/27198dou2.gif' /> <br/><br/>分布式结构和WebLogic应用服务器 <br/>J2EE提供了<img src='/icons/27198yi.gif' />个框架--<img src='/icons/27198yi.gif' />套标准API--用于开发分布式结构<img src='/icons/27198de.gif' />应用<img src='/icons/27198dou.gif' />这个框架<img src='/icons/27198de.gif' />实际实现留给了第 3方厂商<img src='/icons/27198dou2.gif' />部分厂商只是专注于整个J2EE架构中<img src='/icons/27198de.gif' /><img src='/icons/27198de.gif' />特定组件<img src='/icons/27198dou.gif' />例如Apache<img src='/icons/27198de.gif' />Tomcat提供了对JSP和servlets<img src='/icons/27198de.gif' />支持<img src='/icons/27198dou.gif' />BEA系统公司则通过其WebLogic应用服务器产品为整个 J2EE规范标准提供了<img src='/icons/27198yi.gif' />个较为完整<img src='/icons/27198de.gif' />实现<img src='/icons/27198dou2.gif' /> <br/><br/>WebLogic服务器已使建立和部署伸缩性较好<img src='/icons/27198de.gif' />分布式应用<img src='/icons/27198de.gif' />过程大为简化<img src='/icons/27198dou2.gif' />WebLogic和J2EE代你处理了大量常规<img src='/icons/27198de.gif' />编程任务<img src='/icons/27198dou.gif' />包括提供事务服务、安全领域、可靠<img src='/icons/27198de.gif' />消息、名字和目录服务、数据库访问和连接池、线程池、负载平衡和容错处理等<img src='/icons/27198dou2.gif' /> <br/><br/>通过以<img src='/icons/27198yi.gif' />种标准、易用<img src='/icons/27198de.gif' />方式提供这些公共服务<img src='/icons/27198dou.gif' />象WebLogic服务器这样<img src='/icons/27198de.gif' />产品造就了具有更好伸缩性和可维护性<img src='/icons/27198de.gif' />应用系统<img src='/icons/27198dou.gif' />使其为大量<img src='/icons/27198de.gif' />用户提供了增长<img src='/icons/27198de.gif' />可用性<img src='/icons/27198dou2.gif' /> <br/><br/>J2EE技术 <br/>在接下来<img src='/icons/27198de.gif' />部分里<img src='/icons/27198dou.gif' />我们将描述构成J2EE<img src='/icons/27198de.gif' />各种技术<img src='/icons/27198dou.gif' />并且了解WebLogic服务器是如何在<img src='/icons/27198yi.gif' />个分布式应用中对它们进行支持<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' />最常用<img src='/icons/27198de.gif' />J2EE技术应该是JDBC、JNDI、EJB、JSP和servlets<img src='/icons/27198dou.gif' />对这些我们将作更仔细<img src='/icons/27198de.gif' />考察<img src='/icons/27198dou2.gif' /> <br/><br/>图2表示了在<img src='/icons/27198yi.gif' />个分布式应用中<img src='/icons/27198dou.gif' />J2EE技术<img src='/icons/27198de.gif' />各个方面通常在何处发挥作用<img src='/icons/27198dou2.gif' /> <br/><br/>图2. <img src='/icons/27198yi.gif' />个N层应用结构<img src='/icons/27198de.gif' />例子 <br/><br/>Java Database Connectivity (JDBC) <br/>JDBC API以<img src='/icons/27198yi.gif' />种统<img src='/icons/27198yi.gif' /><img src='/icons/27198de.gif' />方式来对各种各样<img src='/icons/27198de.gif' />数据库进行存取<img src='/icons/27198dou2.gif' />和ODBC<img src='/icons/27198yi.gif' />样<img src='/icons/27198dou.gif' />JDBC为开发人员隐藏了区别数据库<img src='/icons/27198de.gif' />区别特性<img src='/icons/27198dou2.gif' />另外<img src='/icons/27198dou.gif' />由于JDBC建立在Java<img src='/icons/27198de.gif' />基础上,因此还提供了数据库存取<img src='/icons/27198de.gif' />平台独立性<img src='/icons/27198dou2.gif' /> <br/><br/>JDBC定义了4种区别<img src='/icons/27198de.gif' />驱动<img src='/icons/27198chengxu.gif' /><img src='/icons/27198dou.gif' />现分述如下: <br/><br/>类型 1: JDBC-ODBC Bridge <br/>在JDBC出现<img src='/icons/27198de.gif' />初期<img src='/icons/27198dou.gif' />JDBC-ODBC桥显然是非常有实用意义<img src='/icons/27198de.gif' /><img src='/icons/27198dou.gif' />通过JDBC-ODBC桥<img src='/icons/27198dou.gif' />开发人员可以使用JDBC来存取ODBC数据源<img src='/icons/27198dou2.gif' />不足<img src='/icons/27198de.gif' />是<img src='/icons/27198dou.gif' />他需要在客户端安装ODBC驱动<img src='/icons/27198chengxu.gif' /><img src='/icons/27198dou.gif' />换句话说<img src='/icons/27198dou.gif' />必须安装Microsoft Windows<img src='/icons/27198de.gif' />某个版本<img src='/icons/27198dou2.gif' />使用这<img src='/icons/27198yi.gif' />类型你需要牺牲JDBC<img src='/icons/27198de.gif' />平台独立性<img src='/icons/27198dou2.gif' />另外<img src='/icons/27198dou.gif' />ODBC驱动<img src='/icons/27198chengxu.gif' />还需要具有客户端<img src='/icons/27198de.gif' />控制权限<img src='/icons/27198dou2.gif' /> <br/><br/>类型 2: JDBC-native driver bridge <br/>JDBC本地驱动<img src='/icons/27198chengxu.gif' />桥提供了<img src='/icons/27198yi.gif' />种JDBC接口<img src='/icons/27198dou.gif' />它建立在本地数据库驱动<img src='/icons/27198chengxu.gif' /><img src='/icons/27198de.gif' />顶层<img src='/icons/27198dou.gif' />而不需要使用ODBC<img src='/icons/27198dou2.gif' /> JDBC驱动<img src='/icons/27198chengxu.gif' />将对数据库<img src='/icons/27198de.gif' />API从标准<img src='/icons/27198de.gif' />JDBC<img src='/icons/27198diaoyong.gif' />转换为本地<img src='/icons/27198diaoyong.gif' /><img src='/icons/27198dou2.gif' />使用此类型需要牺牲JDBC<img src='/icons/27198de.gif' />平台独立性<img src='/icons/27198dou.gif' />还要求在客户端安装<img src='/icons/27198yi.gif' />些本地代码<img src='/icons/27198dou2.gif' /> <br/><br/>类型 3: JDBC-network bridge <br/>JDBC网络桥驱动<img src='/icons/27198chengxu.gif' />不再需要客户端数据库驱动<img src='/icons/27198chengxu.gif' /><img src='/icons/27198dou2.gif' />它使用网络上<img src='/icons/27198de.gif' />中间服务器来存取数据库<img src='/icons/27198dou2.gif' />这种应用使得以下技术<img src='/icons/27198de.gif' />实现有了可能<img src='/icons/27198dou.gif' />这些技术包括负载均衡、连接缓冲池和数据缓存Cache等<img src='/icons/27198dou2.gif' />由于第3种类型往往只需要相对更少<img src='/icons/27198de.gif' />下载时间<img src='/icons/27198dou.gif' />具有平台独立性<img src='/icons/27198dou.gif' />而且不需要在客户端安装并取得控制权<img src='/icons/27198dou.gif' />所以很适合于 Internet上<img src='/icons/27198de.gif' />应用<img src='/icons/27198dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/><br/>类型 4: Pure Java driver <br/>第4种类型通过使用<img src='/icons/27198yi.gif' />个纯Java数据库驱动<img src='/icons/27198chengxu.gif' />来执行数据库<img src='/icons/27198de.gif' />直接访问<img src='/icons/27198dou2.gif' />此类型实际上在客户端实现了2层结构<img src='/icons/27198dou2.gif' />要在N-层结构中应用<img src='/icons/27198dou.gif' /><img src='/icons/27198yi.gif' />个更好<img src='/icons/27198de.gif' />做法是编写<img src='/icons/27198yi.gif' />个EJB<img src='/icons/27198dou.gif' />让它包含存取代码并提供<img src='/icons/27198yi.gif' />个对客户端具有数据库独立性<img src='/icons/27198de.gif' />服务<img src='/icons/27198dou2.gif' /> <br/>WebLogic服务器为<img src='/icons/27198yi.gif' />些通常<img src='/icons/27198de.gif' />数据库提供了JDBC驱动<img src='/icons/27198chengxu.gif' /><img src='/icons/27198dou.gif' />包括Oracle, Sybase, Microsoft SQL Server以及Informix<img src='/icons/27198dou2.gif' />它也带有<img src='/icons/27198yi.gif' />种JDBC驱动<img src='/icons/27198chengxu.gif' />用于Cloudscape<img src='/icons/27198dou.gif' />这是<img src='/icons/27198yi.gif' />种纯Java<img src='/icons/27198de.gif' />DBMS<img src='/icons/27198dou.gif' />WebLogic服务器中带有该数据库<img src='/icons/27198de.gif' />评估版本<img src='/icons/27198dou2.gif' /> <br/><br/>以下让我们看<img src='/icons/27198yi.gif' />个例子<img src='/icons/27198dou2.gif' /> <br/><br/>JDBC例子 <br/>在这个例子中我们假定你已经在Cloudscape中建立了<img src='/icons/27198yi.gif' />个PhoneBook数据库<img src='/icons/27198dou.gif' />并且包含<img src='/icons/27198yi.gif' />个表<img src='/icons/27198dou.gif' />名为 CONTACT_TABLE <img src='/icons/27198dou.gif' />它带有2个字段:NAME 和 PHONE<img src='/icons/27198dou2.gif' /> 开始<img src='/icons/27198de.gif' />时候先装载Cloudscape JDBC driver<img src='/icons/27198dou.gif' />并请求 driver manager得到<img src='/icons/27198yi.gif' />个对PhoneBook Cloudscape数据库<img src='/icons/27198de.gif' />连接<img src='/icons/27198dou2.gif' />通过这<img src='/icons/27198yi.gif' />连接<img src='/icons/27198dou.gif' />我们可以构造<img src='/icons/27198yi.gif' />个 Statement 对象并用它来执行<img src='/icons/27198yi.gif' />个简单<img src='/icons/27198de.gif' />SQL查询<img src='/icons/27198dou2.gif' />最后<img src='/icons/27198dou.gif' />用循环来遍历结果集<img src='/icons/27198de.gif' />所有数据<img src='/icons/27198dou.gif' />并用标准输出将NAME和PHONE字段<img src='/icons/27198de.gif' />内容进行输出<img src='/icons/27198dou2.gif' /> <br/><br/>import java.sql.*; <br/><br/>public <img src='/icons/27198class.gif' /> JDBCExample <br/>{ <br/>public <img src='/icons/27198static.gif' /> void <img src='/icons/27198main.gif' />( String args<img src='/icons/27198zhk2.gif' /> ) <br/>{ <br/>try <br/>  { <br/>  Class.forName(&quot;COM.cloudscape.core.JDBCDriver&quot;); <br/>  Connection conn = DriverManager.getConnection(&quot;jdbc:cloudscape:PhoneBook&quot;); <br/>  Statement stmt = conn.createStatement<img src='/icons/27198kh.gif' />; <br/>  String sql = &quot;SELECT name, phone FROM CONTACT_TABLE ORDER BY name&quot;; <br/>  ResultSet resultSet = stmt.executeQuery( sql ); <br/><br/>  String name; <br/>  String phone; <br/>  while ( resultSet.next<img src='/icons/27198kh.gif' /> ) <br/>   { <br/>   name = resultSet.getString(1).trim<img src='/icons/27198kh.gif' />; <br/>   phone = resultSet.getString(2).trim<img src='/icons/27198kh.gif' />; <br/>   <img src='/icons/27198System.gif' />.out.pr<img src='/icons/27198int.gif' />ln( name + &quot;, &quot; + phone ); <br/>   } <br/>  } <br/>catch ( Exception e ) <br/>  { <br/>  // Handle exception here <br/>  e.pr<img src='/icons/27198int.gif' />StackTrace<img src='/icons/27198kh.gif' />; <br/>  } <br/>} <br/>} <br/><br/>OK<img src='/icons/27198dou2.gif' />接着我们来看<img src='/icons/27198yi.gif' />看JDBC是如何在企业应用中<img src='/icons/27198de.gif' />进行使用<img src='/icons/27198dou2.gif' /> <br/><br/>JDBC在企业级应用中<img src='/icons/27198de.gif' />应用 <br/>以上例子其实是很基本<img src='/icons/27198de.gif' /><img src='/icons/27198dou.gif' />可能有些微不足道<img src='/icons/27198dou2.gif' />它假定了<img src='/icons/27198yi.gif' />个2层结构<img src='/icons/27198dou2.gif' />在<img src='/icons/27198yi.gif' />个多层<img src='/icons/27198de.gif' />企业级应用中<img src='/icons/27198dou.gif' />更大<img src='/icons/27198de.gif' />可能是在客户端和<img src='/icons/27198yi.gif' />个EJB进行通信<img src='/icons/27198dou.gif' />该EJB将建立数据库连接<img src='/icons/27198dou2.gif' />为了实现和改进可伸缩性和系统性能<img src='/icons/27198dou.gif' /> WebLogic服务器提供了对连接缓冲池connection pool<img src='/icons/27198de.gif' />支持<img src='/icons/27198dou2.gif' /> <br/><br/>Connection pool减少了建立和释放数据库连接<img src='/icons/27198de.gif' />消耗<img src='/icons/27198dou2.gif' />在系统启动以后即可建立这样<img src='/icons/27198de.gif' />缓冲池<img src='/icons/27198dou.gif' />此后如故再有对数据库<img src='/icons/27198de.gif' />请求<img src='/icons/27198dou.gif' />WebLogic服务器可以很简单地从缓冲池中取出数据<img src='/icons/27198dou2.gif' />数据缓冲池可以在WebLogic服务器<img src='/icons/27198de.gif' /> weblogic.properties 文件中进行定义<img src='/icons/27198dou2.gif' />(可参考 weblogic.properties 文件中<img src='/icons/27198de.gif' />例子<img src='/icons/27198dou.gif' />WebLogic服务器<img src='/icons/27198de.gif' />文档中还有更详细<img src='/icons/27198de.gif' />参考信息) <br/><br/>在企业级应用<img src='/icons/27198de.gif' />另<img src='/icons/27198yi.gif' />个常见<img src='/icons/27198de.gif' />数据库特性是事务处理<img src='/icons/27198dou2.gif' />事务是<img src='/icons/27198yi.gif' />组申明statement<img src='/icons/27198dou.gif' />它们必须做为同<img src='/icons/27198yi.gif' />个statement来处理以保证数据完整性<img src='/icons/27198dou2.gif' />缺省情况下JDBC使用 auto-commit 事务模式<img src='/icons/27198dou2.gif' />这可以通过使用Connection类<img src='/icons/27198de.gif' /> <img src='/icons/27198set.gif' />AutoCommit<img src='/icons/27198kh.gif' /> 思路方法来实现<img src='/icons/27198dou2.gif' /> <br/><br/>现在我们已经对JDBC有了<img src='/icons/27198yi.gif' />些认识<img src='/icons/27198dou.gif' />下面该转向JNDI了<img src='/icons/27198dou2.gif' /> <br/><br/>Java Naming and Directory Interface (JNDI) <br/>JNDI API被用于执行名字和目录服务<img src='/icons/27198dou2.gif' />它提供了<img src='/icons/27198yi.gif' />致<img src='/icons/27198de.gif' />模型来存取和操作企业级<img src='/icons/27198de.gif' />资源如DNS和LDAP<img src='/icons/27198dou.gif' />本地文件系统<img src='/icons/27198dou.gif' />后者在应用服务器中<img src='/icons/27198de.gif' />对象<img src='/icons/27198dou2.gif' /> <br/><br/>在JNDI中<img src='/icons/27198dou.gif' />在目录结构中<img src='/icons/27198de.gif' />每<img src='/icons/27198yi.gif' />个结点称为context<img src='/icons/27198dou2.gif' />每<img src='/icons/27198yi.gif' />个JNDI名字都是相对于context<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' />这里没有绝对名字<img src='/icons/27198de.gif' />概念存在<img src='/icons/27198dou2.gif' />对<img src='/icons/27198yi.gif' />个应用来说<img src='/icons/27198dou.gif' />它可以通过使用 InitialContext 类来得到其第<img src='/icons/27198yi.gif' />个context: <br/><br/>Context ctx = <img src='/icons/27198new.gif' /> InitialContext<img src='/icons/27198kh.gif' />; <br/><br/>应用可以通过这个<img src='/icons/27198chushi.gif' />化<img src='/icons/27198de.gif' />context经有这个目录树来定位它所需要<img src='/icons/27198de.gif' />资源或对象<img src='/icons/27198dou2.gif' />例如<img src='/icons/27198dou.gif' />假设你在Weblogic服务器中展开了<img src='/icons/27198yi.gif' />个EJB并将 home接口绑定到名字 myApp.myEJB <img src='/icons/27198dou.gif' />那么该EJB<img src='/icons/27198de.gif' />某个客户在取得<img src='/icons/27198yi.gif' />个<img src='/icons/27198chushi.gif' />化context以后<img src='/icons/27198dou.gif' />可以通过以下语句定位home接口: <br/><br/>MyEJBHome home = ctx.lookup( &quot;myApp.myEJB&quot; ); <br/><br/>在这个例子中<img src='/icons/27198dou.gif' /><img src='/icons/27198yi.gif' />旦你有了对被请求对象<img src='/icons/27198de.gif' />参考<img src='/icons/27198dou.gif' />EJB<img src='/icons/27198de.gif' />home接口就可以在它上面<img src='/icons/27198diaoyong.gif' />思路方法<img src='/icons/27198dou2.gif' />我们将在下面<img src='/icons/27198de.gif' />&quot;Enterprise Java Beans&quot;章节中做更多<img src='/icons/27198de.gif' />介绍<img src='/icons/27198dou2.gif' /> <br/><br/>以上有关JNDI<img src='/icons/27198de.gif' />讨论只是冰山的<img src='/icons/27198yi.gif' />角而已<img src='/icons/27198dou2.gif' />如果要更进<img src='/icons/27198yi.gif' />步地在context中查找对象<img src='/icons/27198dou.gif' />JNDI也提供了<img src='/icons/27198yi.gif' />些思路方法来进行以下操作:　 <br/><br/>将<img src='/icons/27198yi.gif' />个对象插入或绑定到context<img src='/icons/27198dou2.gif' />这在你展开<img src='/icons/27198yi.gif' />个EJB<img src='/icons/27198de.gif' />时候是很有效<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' /> <br/>从context中移去对象<img src='/icons/27198dou2.gif' /> <br/>列出context中<img src='/icons/27198de.gif' />所有对象<img src='/icons/27198dou2.gif' /> <br/>创建或删除子<img src='/icons/27198yi.gif' />级<img src='/icons/27198de.gif' />context<img src='/icons/27198dou2.gif' /> <br/>接下来<img src='/icons/27198dou.gif' />我们要开始关注EJB了<img src='/icons/27198dou2.gif' /> <br/><br/>Enterprise Java Beans (EJB) <br/>J2EE技术的所以赢得某体广泛重视<img src='/icons/27198de.gif' />原因的<img src='/icons/27198yi.gif' />就是EJB<img src='/icons/27198dou2.gif' />它们提供了<img src='/icons/27198yi.gif' />个框架来开发和实施分布式商务逻辑<img src='/icons/27198dou.gif' />由此很显著地简化了具有可伸缩性和高度复杂<img src='/icons/27198de.gif' />企业级应用<img src='/icons/27198de.gif' />开发<img src='/icons/27198dou2.gif' />EJB规范标准定义了EJB组件在何时如何和它们<img src='/icons/27198de.gif' />容器进行交互作用<img src='/icons/27198dou2.gif' />容器负责提供公用<img src='/icons/27198de.gif' />服务<img src='/icons/27198dou.gif' />例如目录服务、事务管理、安全性、资源缓冲池以及容错性<img src='/icons/27198dou2.gif' /> <br/><br/>EJB规范标准定义了3中基本<img src='/icons/27198de.gif' />bean类型: <br/><br/>Stateless session beans: 提供某种单<img src='/icons/27198yi.gif' /><img src='/icons/27198de.gif' />服务<img src='/icons/27198dou.gif' />不维持任何状态<img src='/icons/27198dou.gif' />在服务器故障发生时无法继续存在<img src='/icons/27198dou.gif' />生命期相对较短<img src='/icons/27198dou2.gif' />例如<img src='/icons/27198dou.gif' /><img src='/icons/27198yi.gif' />个stateless session bean可能被用于执行温度转换计算<img src='/icons/27198dou2.gif' /> <br/>Stateful session bean: T提供了和客户端<img src='/icons/27198de.gif' />会话交互<img src='/icons/27198dou.gif' />可以存储状态从而代表<img src='/icons/27198yi.gif' />个客户<img src='/icons/27198dou2.gif' />典型例子是购物车<img src='/icons/27198dou2.gif' />Stateful session bean在服务器故障时无法继续生存<img src='/icons/27198dou.gif' />生命气相对较短<img src='/icons/27198dou2.gif' />每<img src='/icons/27198yi.gif' />个例子只用于<img src='/icons/27198yi.gif' />个单个<img src='/icons/27198de.gif' />线程<img src='/icons/27198dou2.gif' /> <br/><br/>Entity beans: 提供了<img src='/icons/27198yi.gif' />致性数据<img src='/icons/27198de.gif' />表示-- 通常存放在数据库中 -- 在服务器故障发生后能继续存在<img src='/icons/27198dou2.gif' />多用户情况下可以使用EJB来表示相同<img src='/icons/27198de.gif' />数据<img src='/icons/27198dou2.gif' />entity EJB<img src='/icons/27198de.gif' /><img src='/icons/27198yi.gif' />个典型例子是客户<img src='/icons/27198de.gif' />帐号信息<img src='/icons/27198dou2.gif' /> <br/>尽管有以上<img src='/icons/27198de.gif' />区别<img src='/icons/27198dou.gif' />所有<img src='/icons/27198de.gif' />EJB还是有许多<img src='/icons/27198de.gif' />共同的处<img src='/icons/27198dou2.gif' />它们都处理home <img src='/icons/27198int.gif' />erface<img src='/icons/27198dou2.gif' />它定义了<img src='/icons/27198yi.gif' />个客户端是如何创建和消亡EJB<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' />可以在bean中对定义了客户端思路方法<img src='/icons/27198de.gif' />远程接口进行<img src='/icons/27198diaoyong.gif' />；bean类则执行了主要<img src='/icons/27198de.gif' />商务逻辑<img src='/icons/27198dou2.gif' /> <br/><br/>描述EJB<img src='/icons/27198de.gif' />开发已经超出了本文<img src='/icons/27198de.gif' />范围<img src='/icons/27198dou2.gif' />但是<img src='/icons/27198dou.gif' />如果<img src='/icons/27198yi.gif' />个EJB已经被开发了或者从第 3方进行了购买<img src='/icons/27198dou.gif' />它就必须在应用服务器中进行发布<img src='/icons/27198dou2.gif' />WebLogic Server 5.1带有<img src='/icons/27198yi.gif' />个EJB Deployer Tool来协助处理EJB<img src='/icons/27198de.gif' />发布<img src='/icons/27198dou2.gif' />当你使用EJB Deployer Tool<img src='/icons/27198de.gif' />时候<img src='/icons/27198dou.gif' />你要定义客户端所用<img src='/icons/27198de.gif' />JNDI名字来定位EJB<img src='/icons/27198dou2.gif' />Deployer Tool将生成wrapper类来处理和容器<img src='/icons/27198de.gif' />通信以及在<img src='/icons/27198yi.gif' />个jar文件中把被请求<img src='/icons/27198de.gif' />Java类绑定在<img src='/icons/27198yi.gif' />起<img src='/icons/27198dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/><br/><img src='/icons/27198yi.gif' />旦EJB被发布<img src='/icons/27198dou.gif' />客户端就可以使用它<img src='/icons/27198de.gif' />JNDI名字来定位EJB<img src='/icons/27198dou2.gif' />首先<img src='/icons/27198dou.gif' />它必须得到<img src='/icons/27198yi.gif' />个到home接口<img src='/icons/27198de.gif' />reference<img src='/icons/27198dou2.gif' />然后<img src='/icons/27198dou.gif' />客户端可以使用该接口<img src='/icons/27198dou.gif' /><img src='/icons/27198diaoyong.gif' /><img src='/icons/27198yi.gif' />个 create<img src='/icons/27198kh.gif' /> 思路方法来得到服务器上运行<img src='/icons/27198de.gif' />某个bean例子<img src='/icons/27198de.gif' />句柄；最后<img src='/icons/27198dou.gif' />客户端可以使用该句柄在bean中<img src='/icons/27198diaoyong.gif' />思路方法<img src='/icons/27198dou2.gif' /> <br/><br/>了解 EJB后<img src='/icons/27198dou.gif' />让我们再来看JSP<img src='/icons/27198dou2.gif' /> <br/><br/>JavaServer Pages (JSPs) <br/>我们中间可能已经有许多人已经熟悉Microsoft<img src='/icons/27198de.gif' />Active Server Pages (ASP)技术了<img src='/icons/27198dou2.gif' />JSP和ASP相对应<img src='/icons/27198de.gif' /><img src='/icons/27198dou.gif' />但更具有平台对立性<img src='/icons/27198dou2.gif' />他们被设计用以帮助Web内容开发人员创建动态网页<img src='/icons/27198dou.gif' />并且只需要相对较少<img src='/icons/27198de.gif' />代码<img src='/icons/27198dou2.gif' />即使Web设计师不懂得如何编程也可以使用JSP<img src='/icons/27198dou.gif' /><img src='/icons/27198yinwei.gif' />JSP应用是很方便<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' /> JSP页面由HTML代码和嵌入其中<img src='/icons/27198de.gif' />Java代码所组成<img src='/icons/27198dou2.gif' />服务器在页面被客户端所请求以后对这些Java代码进行处理<img src='/icons/27198dou.gif' />然后将生成<img src='/icons/27198de.gif' />HTML页面返回给客户端<img src='/icons/27198de.gif' />浏览器<img src='/icons/27198dou2.gif' /> <br/>下面我们来看<img src='/icons/27198yi.gif' />个JSP<img src='/icons/27198de.gif' />简单例子<img src='/icons/27198dou2.gif' />它只显示了服务器<img src='/icons/27198de.gif' />当前日期和时间<img src='/icons/27198dou2.gif' />虽然<img src='/icons/27198dou.gif' />对语法<img src='/icons/27198de.gif' />具体解释已经超出了本文<img src='/icons/27198de.gif' />范围<img src='/icons/27198dou.gif' />但我们还是可以很直观地看到<img src='/icons/27198dou.gif' /> Java代码被放在 &lt;% 和 %&gt; 符号<img src='/icons/27198de.gif' />中间<img src='/icons/27198dou.gif' />而Java<img src='/icons/27198de.gif' />表达式则放在 &lt;%= 和 %&gt; 符号的间<img src='/icons/27198dou2.gif' /> <br/><br/>&lt;html&gt; <br/>&lt;head&gt; <br/>&lt;title&gt;Sample JSP Page&lt;/title&gt; <br/>&lt;/head&gt; <br/>&lt;body&gt; <br/>&lt;h1&gt;Date JSP sample&lt;/h1&gt; <br/><br/>&lt;h2&gt; <br/>&lt;% response.<img src='/icons/27198set.gif' />Header(&quot;Refresh&quot;, 5); %&gt; <br/>The current date is &lt;%= <img src='/icons/27198new.gif' /> Date<img src='/icons/27198kh.gif' /> %&gt;. <br/>&lt;/h2&gt; <br/><br/>&lt;/body&gt; <br/>&lt;/html&gt; <br/><br/>您可能有时候听说过JHTML<img src='/icons/27198dou2.gif' />这是JSP以前<img src='/icons/27198de.gif' /><img src='/icons/27198yi.gif' />种较老<img src='/icons/27198de.gif' />标准<img src='/icons/27198dou2.gif' />WebLogic服务器既可支持JSP<img src='/icons/27198dou.gif' />又可支持JHTML<img src='/icons/27198dou2.gif' />请注意<img src='/icons/27198dou.gif' />在缺省状况下<img src='/icons/27198dou.gif' /> JSP在WebLogic服务器中并没有处于有效状态<img src='/icons/27198dou2.gif' />要使的有效<img src='/icons/27198dou.gif' />你可以编辑weblogic.properties文件<img src='/icons/27198dou2.gif' />如果Web服务器还没有处于有效状态<img src='/icons/27198dou.gif' />则要先使的有效<img src='/icons/27198dou2.gif' />Servlet<img src='/icons/27198de.gif' />情况和JSP是<img src='/icons/27198yi.gif' />样<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' /> <br/><br/>下面是: Java servlets <br/><br/>Java servlets <br/>servlet提供<img src='/icons/27198de.gif' />功能大多和JSP类似<img src='/icons/27198dou.gif' />不过实现<img src='/icons/27198de.gif' />方式区别<img src='/icons/27198dou2.gif' />JSP通常是大多数HTML代码中嵌入少量<img src='/icons/27198de.gif' />Java代码<img src='/icons/27198dou.gif' />而servlets全部由Java写成并且生成HTML<img src='/icons/27198dou2.gif' /> <br/><br/>servlet是<img src='/icons/27198yi.gif' />种小型<img src='/icons/27198de.gif' />Java<img src='/icons/27198chengxu.gif' /><img src='/icons/27198dou.gif' />它扩展了Web服务器<img src='/icons/27198de.gif' />功能<img src='/icons/27198dou2.gif' />作为<img src='/icons/27198yi.gif' />种服务器端<img src='/icons/27198de.gif' />应用<img src='/icons/27198dou.gif' />当被请求时开始执行<img src='/icons/27198dou.gif' />这和CGI Perl脚本很相似<img src='/icons/27198dou2.gif' />Servlets和CGI脚本<img src='/icons/27198de.gif' /><img src='/icons/27198yi.gif' />个很大<img src='/icons/27198de.gif' />区别是:每<img src='/icons/27198yi.gif' />个CGI在开始<img src='/icons/27198de.gif' />时候都要求开始<img src='/icons/27198yi.gif' />个新<img src='/icons/27198de.gif' />进程 -- 而servlets是在servlet引擎中以分离<img src='/icons/27198de.gif' />线程来运行<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' />因此servlets在可伸缩性上提供了很好<img src='/icons/27198de.gif' />改进<img src='/icons/27198dou2.gif' /> <br/>在开发servlets<img src='/icons/27198de.gif' />时候<img src='/icons/27198dou.gif' />您常常需要扩展javax.servlet.http.HttpServlet 类<img src='/icons/27198dou.gif' />并且override<img src='/icons/27198yi.gif' />些它<img src='/icons/27198de.gif' />思路方法<img src='/icons/27198dou.gif' />其中包括: <br/><br/>service<img src='/icons/27198kh.gif' />: 作为dispatcher来实现命令-定义思路方法 <br/>doGet<img src='/icons/27198kh.gif' />: 处理客户端<img src='/icons/27198de.gif' />HTTP GET请求<img src='/icons/27198dou2.gif' /> <br/>doPost<img src='/icons/27198kh.gif' />: 进行HTTP POST操作 <br/>其它<img src='/icons/27198de.gif' />思路方法还包括处理区别类型<img src='/icons/27198de.gif' />HTTP请求 -- 可以参考HttpServlet API文档<img src='/icons/27198dou2.gif' /> <br/><br/>以上描述<img src='/icons/27198de.gif' />是标准J2EE Servlet API<img src='/icons/27198de.gif' />各种思路方法<img src='/icons/27198dou2.gif' />WebLogic服务器提供了<img src='/icons/27198yi.gif' />个该API完整<img src='/icons/27198de.gif' />实现途径<img src='/icons/27198dou2.gif' /><img src='/icons/27198yi.gif' />旦你开发了<img src='/icons/27198yi.gif' />个servlet<img src='/icons/27198dou.gif' />你就可以在 weblogic.properties 中加以注册并由此可以在WebLogic服务器中对它进行配置<img src='/icons/27198dou2.gif' /> <br/><br/>通过Java servlets,我们已经到达了J2EE主要技术<img src='/icons/27198de.gif' />末尾了<img src='/icons/27198dou2.gif' />但J2EE所提供<img src='/icons/27198de.gif' />并不止于这些<img src='/icons/27198dou2.gif' />下面<img src='/icons/27198de.gif' />段落中我们将简要地看<img src='/icons/27198yi.gif' />下现存<img src='/icons/27198de.gif' /><img src='/icons/27198yi.gif' />些技术<img src='/icons/27198dou.gif' />包括RMI, Java IDL和CORBA, JTA, 以及XML<img src='/icons/27198dou.gif' />等等<img src='/icons/27198dou2.gif' /> <br/><br/>Remote Method Invocation (RMI) <br/>正如其名字所表示<img src='/icons/27198de.gif' />那样<img src='/icons/27198dou.gif' />RMI协议是在远程对象上<img src='/icons/27198diaoyong.gif' /><img src='/icons/27198yi.gif' />些思路方法<img src='/icons/27198dou2.gif' />它使用了连续序列方式在客户端和服务器端传递数据<img src='/icons/27198dou2.gif' />RMI是<img src='/icons/27198yi.gif' />种被EJB使用<img src='/icons/27198de.gif' />更下层<img src='/icons/27198de.gif' />协议<img src='/icons/27198dou2.gif' /> <br/><br/>Java IDL/CORBA <br/>在Java IDL<img src='/icons/27198de.gif' />支持下<img src='/icons/27198dou.gif' />开发人员可以将Java和CORBA集成在<img src='/icons/27198yi.gif' />起<img src='/icons/27198dou2.gif' /> 他们可以创建Java对象并使的可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB<img src='/icons/27198yi.gif' />起展开<img src='/icons/27198de.gif' />CORBA对象<img src='/icons/27198de.gif' />客户<img src='/icons/27198dou2.gif' />后<img src='/icons/27198yi.gif' />种思路方法提供了另外<img src='/icons/27198yi.gif' />种途径<img src='/icons/27198dou.gif' />通过它Java可以被用于将你<img src='/icons/27198de.gif' />新<img src='/icons/27198de.gif' />应用和legacy系统相集成<img src='/icons/27198dou2.gif' /> <br/><br/>Java Transaction Architecture (JTA)/Java Transaction Service (JTS) <br/>JTA定义了<img src='/icons/27198yi.gif' />种标准<img src='/icons/27198de.gif' />API<img src='/icons/27198dou.gif' />应用系统由此可以存取各种事务监控<img src='/icons/27198dou2.gif' /> <br/><br/>JTS是CORBA OTS事务监控<img src='/icons/27198de.gif' />基本<img src='/icons/27198de.gif' />实现<img src='/icons/27198dou2.gif' />JTS规定了事务管理器<img src='/icons/27198de.gif' />实现方式<img src='/icons/27198dou2.gif' />该事务管理器是在高层支持Java Transaction API (JTA)规范标准<img src='/icons/27198dou.gif' />并且在较底层实现OMG OTS spec<img src='/icons/27198if.gif' />ication<img src='/icons/27198de.gif' />Java映像<img src='/icons/27198dou2.gif' />JTS事务管理器为应用服务器、资源管理器、独立<img src='/icons/27198de.gif' />应用以及通信资源管理器提供了事务服务<img src='/icons/27198dou2.gif' /> <br/><br/>JavaMail and JavaBeans Activation Framework <br/>JavaMail是用于存取邮件服务器<img src='/icons/27198de.gif' />API<img src='/icons/27198dou.gif' />它提供了<img src='/icons/27198yi.gif' />套邮件服务器<img src='/icons/27198de.gif' />抽象类<img src='/icons/27198dou2.gif' />不仅支持SMTP服务器<img src='/icons/27198dou.gif' />也支持IMAP服务器<img src='/icons/27198dou2.gif' /> <br/><br/>JavaMail利用JavaBeans Activation Framework (JAF)来处理MIME-编码<img src='/icons/27198de.gif' />邮件附件<img src='/icons/27198dou2.gif' />MIME<img src='/icons/27198de.gif' />字节流可以被转换成Java对象<img src='/icons/27198dou.gif' />或者转换自Java对象<img src='/icons/27198dou2.gif' />由此大多数应用都可以不需要直接使用JAF<img src='/icons/27198dou2.gif' /> <br/><br/>Java Messaging Service (JMS) <br/>JMS是用于和面向消息<img src='/icons/27198de.gif' />中间件相互通信<img src='/icons/27198de.gif' />应用<img src='/icons/27198chengxu.gif' />接口(API)<img src='/icons/27198dou2.gif' />它既支持点对点<img src='/icons/27198de.gif' />域<img src='/icons/27198dou.gif' />有支持发布/订阅(publish/subscribe)类型<img src='/icons/27198de.gif' />域<img src='/icons/27198dou.gif' />并且提供对下列类型<img src='/icons/27198de.gif' />支持:经认可<img src='/icons/27198de.gif' />消息传递,事务型消息<img src='/icons/27198de.gif' />传递<img src='/icons/27198dou.gif' /><img src='/icons/27198yi.gif' />致性消息和具有持久性<img src='/icons/27198de.gif' />订阅者支持<img src='/icons/27198dou2.gif' />JMS还提供了另<img src='/icons/27198yi.gif' />种方式来对您<img src='/icons/27198de.gif' />应用和 legacy backend系统相集成<img src='/icons/27198dou2.gif' /> <br/><br/>Extensible Markup Language (XML) <br/>XML是<img src='/icons/27198yi.gif' />种可以用来定义其它标记语言<img src='/icons/27198de.gif' />语言<img src='/icons/27198dou2.gif' />它被用来在区别<img src='/icons/27198de.gif' />商务过程中共享数据<img src='/icons/27198dou2.gif' />XML<img src='/icons/27198de.gif' />发展和Java是相互独立<img src='/icons/27198de.gif' /><img src='/icons/27198dou.gif' />但是<img src='/icons/27198dou.gif' />它和Java具有<img src='/icons/27198de.gif' />相同目标正是平台独立性<img src='/icons/27198dou2.gif' />通过将Java和XML<img src='/icons/27198de.gif' />组合<img src='/icons/27198dou.gif' />您可以得到<img src='/icons/27198yi.gif' />个完美<img src='/icons/27198de.gif' />具有平台独立性<img src='/icons/27198de.gif' />解决方案<img src='/icons/27198dou2.gif' />目前正有许多区别<img src='/icons/27198de.gif' />公司在为Java和XML<img src='/icons/27198de.gif' />组合而努力<img src='/icons/27198dou2.gif' />如果要了解更多<img src='/icons/27198de.gif' />这方面<img src='/icons/27198de.gif' />信息<img src='/icons/27198dou.gif' />可以访问Sun<img src='/icons/27198de.gif' />Java-XML页面<img src='/icons/27198dou.gif' />或者IBM developerWorks<img src='/icons/27198de.gif' />XML Zone<img src='/icons/27198dou2.gif' /> <br/><br/>整理总结 <br/>在本文中<img src='/icons/27198dou.gif' />我们介绍了建立在J2EE上<img src='/icons/27198de.gif' />分布式应用结构<img src='/icons/27198dou.gif' />并且描述了WebLogic服务器对J2EE<img src='/icons/27198de.gif' />各种支持<img src='/icons/27198dou2.gif' /> 然而<img src='/icons/27198dou.gif' />我们所揭示<img src='/icons/27198de.gif' />仅仅是冰山的<img src='/icons/27198yi.gif' />角而已<img src='/icons/27198dou.gif' />要以<img src='/icons/27198yi.gif' />篇数千字<img src='/icons/27198de.gif' />文章来展示J2EE潜在<img src='/icons/27198de.gif' />对您<img src='/icons/27198de.gif' />企业级应用<img src='/icons/27198de.gif' />影响可是很不公平<img src='/icons/27198de.gif' /><img src='/icons/27198dou2.gif' /> <br/><br/>我们已经关注了在您开始用J2EE进行工作时最有可能遇到<img src='/icons/27198de.gif' />各类技术:JDBC, JNDI, EJB, JSP和servlet<img src='/icons/27198dou2.gif' />我们也为您提供了<img src='/icons/27198yi.gif' />些尚未常见<img src='/icons/27198de.gif' />J2EE技术<img src='/icons/27198de.gif' />背景知识<img src='/icons/27198dou2.gif' />不管您是<img src='/icons/27198yi.gif' />名开发人员<img src='/icons/27198dou.gif' />商务应用分析师<img src='/icons/27198dou.gif' />或者项目经理(project manager)<img src='/icons/27198dou.gif' />都应该对 J2EE和WebLogic服务器所能提供给我们<img src='/icons/27198dou.gif' />给我们<img src='/icons/27198de.gif' />企业以及我们<img src='/icons/27198de.gif' />企业级应用所带来<img src='/icons/27198de.gif' />意义有<img src='/icons/27198yi.gif' />个更好<img src='/icons/27198de.gif' />认识<img src='/icons/27198dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/><br/><br/>  <a href="/mypdf/6742.pdf" title="查看 j2ee开发:用J2EE开发N层应用-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6742.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:开发J2EE应用的要领-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6711.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          <img src='/icons/13901dou.gif' />作为开发mission-critical<img src='/icons/13901de.gif' />企业级应用<img src='/icons/13901de.gif' /><img src='/icons/13901yi.gif' />整套规范标准<img src='/icons/13901de.gif' />整合平台<img src='/icons/13901dou2.gif' />其规范标准的多、内容的广<img src='/icons/13901dou.gif' />从而给开发J2EE应用带来了很多“麻烦”<img src='/icons/13901dou2.gif' />比如<img src='/icons/13901dou.gif' />为实现内容<img src='/icons/13901de.gif' />RDBMS存储<img src='/icons/13901dou.gif' />我们可能<img src='/icons/13901de.gif' />思路方法有JDBC、Entity Beans、JDO、O/R Mapping工具(TopLink、Hibernate)、XML-DBMS、JAXB等思路方法(其中<img src='/icons/13901yi.gif' />些思路方法不是J2EE规范标准所包含<img src='/icons/13901de.gif' />)<img src='/icons/13901dou2.gif' />因此<img src='/icons/13901dou.gif' />为实现 J2EE各层(至少有表示层、控制层、商业逻辑层等3层)以及层和层的间<img src='/icons/13901de.gif' />耦合<img src='/icons/13901dou.gif' />J2EE系统架构师需要考虑<img src='/icons/13901de.gif' />问题会很多<img src='/icons/13901dou2.gif' />加上<img src='/icons/13901dou.gif' />J2EE本身<img src='/icons/13901de.gif' />快速发展<img src='/icons/13901dou.gif' />给架构、开发具有工业强度<img src='/icons/13901de.gif' />J2EE应用带来<img src='/icons/13901yi.gif' />些难题<img src='/icons/13901dou2.gif' /><br/>同时<img src='/icons/13901dou.gif' />软件Software开发技术从来就没有“银弹”<img src='/icons/13901dou.gif' />所以J2EE技术也不是万能<img src='/icons/13901de.gif' /><img src='/icons/13901dou2.gif' />但是<img src='/icons/13901dou.gif' />如果我们在结合具体商业需求<img src='/icons/13901de.gif' />基础上<img src='/icons/13901dou.gif' />合理<img src='/icons/13901de.gif' />应用好J2EE技术<img src='/icons/13901dou.gif' />其结果可想而知<img src='/icons/13901dou2.gif' />本文试探从自己以往<img src='/icons/13901de.gif' />项目经验来探讨开发J2EE应用应该遵循<img src='/icons/13901de.gif' />几点准测入手<img src='/icons/13901dou.gif' />以起到抛砖引玉<img src='/icons/13901de.gif' />作用<img src='/icons/13901dou2.gif' />如果能达到这<img src='/icons/13901yi.gif' />点要求<img src='/icons/13901dou.gif' />则万分激动<img src='/icons/13901dou2.gif' /><br/>本文结合JBoss 3.2.1下<img src='/icons/13901de.gif' />J2EE应用开发为例展开论述<img src='/icons/13901dou2.gif' /><br/><br/>1<img src='/icons/13901dou.gif' />结合商业需求选择合理<img src='/icons/13901de.gif' />架构<br/><br/>如果脱离商业需求<img src='/icons/13901dou.gif' />而单独<img src='/icons/13901de.gif' />讨论技术本身<img src='/icons/13901de.gif' />优势是不够<img src='/icons/13901de.gif' /><img src='/icons/13901dou2.gif' />各项技术都有产生<img src='/icons/13901de.gif' />特定背景<img src='/icons/13901dou.gif' />其中很多都是来自工业需求而触动<img src='/icons/13901de.gif' /><img src='/icons/13901dou2.gif' /><img src='/icons/13901yi.gif' />般而言<img src='/icons/13901dou.gif' />企业信息系统(EIS)都要求自己稳定、安全、可靠、高效、便于维护<img src='/icons/13901dou2.gif' />同时<img src='/icons/13901dou.gif' />各个企业信息系统都有自己独特<img src='/icons/13901de.gif' />要求<img src='/icons/13901dou.gif' />可能有些时候需要考虑和原有遗留系统<img src='/icons/13901de.gif' />集成<img src='/icons/13901dou.gif' />所以了解各个企业信息系统具体<img src='/icons/13901de.gif' />商业需求对于整个系统<img src='/icons/13901de.gif' />架构显得很关键<img src='/icons/13901dou2.gif' /><br/>比如<img src='/icons/13901dou.gif' />如果待开发<img src='/icons/13901de.gif' />J2EE应用系统中使用到<img src='/icons/13901de.gif' />数据大部分来自于外在数据源；而这些数据可能是通过JDBC直接从外在数据源导入到待开发<img src='/icons/13901de.gif' />J2EE系统<img src='/icons/13901de.gif' />Database中<img src='/icons/13901dou2.gif' />对于这种情形<img src='/icons/13901dou.gif' />如果在开发过程中<img src='/icons/13901dou.gif' />仅仅使用JDBC来操作数据库<img src='/icons/13901dou.gif' />对于小强度(并发访问用户少、数据流量少)<img src='/icons/13901de.gif' />情形<img src='/icons/13901dou.gif' />显然是比较合适<img src='/icons/13901de.gif' />；但如果<img src='/icons/13901dou.gif' />并发访问用户较多、数据流量大<img src='/icons/13901dou.gif' />对Database层使用较为频繁<img src='/icons/13901de.gif' />情形<img src='/icons/13901dou.gif' />则显得有些力不从心<img src='/icons/13901dou2.gif' />因此<img src='/icons/13901dou.gif' />对于这种需求<img src='/icons/13901dou.gif' />我们可以考虑采用Entity Beans with Caches<img src='/icons/13901dou2.gif' />打个比方<img src='/icons/13901dou.gif' />在JBoss 3.2.1中对于Entity Beans<img src='/icons/13901de.gif' />Cache策略有多种<img src='/icons/13901dou.gif' />这时可以考虑使用<img src='/icons/13901dou.gif' /><img src='/icons/13901dou.gif' />即“Standard CMP 2.x EntityBean”<img src='/icons/13901dou.gif' />方式并采用“D”类型<img src='/icons/13901de.gif' />commit-option来保证Entity Beans<img src='/icons/13901de.gif' />内容和数据源<img src='/icons/13901de.gif' />同步<img src='/icons/13901dou.gif' />并使得系统<img src='/icons/13901de.gif' />性能得到大大改善(同直接使用JDBC相比)<img src='/icons/13901dou2.gif' />其中<img src='/icons/13901dou.gif' />可以将<img src='/icons/13901yi.gif' />些Entity Beans设置为read-only<img src='/icons/13901dou.gif' />以改善性能<img src='/icons/13901dou2.gif' /><br/>当然<img src='/icons/13901dou.gif' />在这里也可以采用其他<img src='/icons/13901yi.gif' />些O/R Mapping技术<img src='/icons/13901dou.gif' />比如TopLink<img src='/icons/13901dou2.gif' /><br/>再比如<img src='/icons/13901dou.gif' />考虑这样<img src='/icons/13901yi.gif' />种情形:如果待开发<img src='/icons/13901de.gif' />企业信息系统使用到<img src='/icons/13901de.gif' />数据都是由系统本身生成和操作<img src='/icons/13901de.gif' /><img src='/icons/13901dou.gif' />则建议采用:CMP Entity Beans技术<img src='/icons/13901dou2.gif' />Entity Beans给大家<img src='/icons/13901de.gif' />印象很坏<img src='/icons/13901dou.gif' />这可能和EJB 1.1给大家留下<img src='/icons/13901de.gif' />坏映象有关吧<img src='/icons/13901dou2.gif' />但是<img src='/icons/13901dou.gif' />EJB 2.0(或者说2.1)得到了很大<img src='/icons/13901de.gif' />改善<img src='/icons/13901dou.gif' />Local Interfaces、CMR、Read-Only、Session Fa?ade模式给Entity Beans注入了活力<img src='/icons/13901dou2.gif' />当然<img src='/icons/13901dou.gif' />并发用户多、数据流量很大时才会体现出使用Entity Beans<img src='/icons/13901de.gif' />优势<img src='/icons/13901dou2.gif' />其中<img src='/icons/13901dou.gif' />有<img src='/icons/13901yi.gif' />点很关键:要注重Entity Beans技术<img src='/icons/13901de.gif' />性能调优<img src='/icons/13901dou.gif' />各个应用服务器都有自己<img src='/icons/13901de.gif' /><img src='/icons/13901yi.gif' />套性能调优方案<img src='/icons/13901dou2.gif' />对于JBoss 3.2.1<img src='/icons/13901dou.gif' />配置文件standardjboss.xml提供了Entity Beans技术调优<img src='/icons/13901de.gif' />入口<img src='/icons/13901dou2.gif' />比如<img src='/icons/13901dou.gif' />Bean Lock策略<img src='/icons/13901de.gif' />合理使用对于Entity Beans<img src='/icons/13901de.gif' />调优就显得很重要<img src='/icons/13901dou2.gif' />这样使得<img src='/icons/13901dou.gif' />我们可以更加关注于系统<img src='/icons/13901de.gif' />商业逻辑<img src='/icons/13901dou.gif' />而不只是底层<img src='/icons/13901de.gif' />Database(EJB调优处于EJB Container中<img src='/icons/13901dou.gif' />因此我们处在J2EE性能<img src='/icons/13901de.gif' />高端<img src='/icons/13901dou.gif' />而不是底端<img src='/icons/13901dou.gif' />即Database层<img src='/icons/13901dou2.gif' />同时<img src='/icons/13901dou.gif' />Database层<img src='/icons/13901de.gif' />调优使得J2EE系统<img src='/icons/13901de.gif' />数据库移植性大打折扣<img src='/icons/13901dou2.gif' />)<img src='/icons/13901dou2.gif' /><br/>简而言的<img src='/icons/13901dou.gif' />要结合各个系统<img src='/icons/13901de.gif' />特定需求和状况给出具体<img src='/icons/13901de.gif' />技术架构方案<img src='/icons/13901dou.gif' />而不能孤单<img src='/icons/13901de.gif' />论述技术本身<img src='/icons/13901de.gif' />好坏<img src='/icons/13901dou2.gif' /><br/><br/>2<img src='/icons/13901dou.gif' />Framework<img src='/icons/13901de.gif' />合理选用<br/><br/>设计模式在J2EE应用系统中扮演着重要<img src='/icons/13901de.gif' />角色<img src='/icons/13901dou2.gif' />因此<img src='/icons/13901dou.gif' />有<img src='/icons/13901yi.gif' />个问题摆在大家面前<img src='/icons/13901dou.gif' />是自己来实现具体<img src='/icons/13901de.gif' />设计模式<img src='/icons/13901dou.gif' />还是借助于Third-party Framework<img src='/icons/13901dou2.gif' />如果贵公司不大<img src='/icons/13901dou.gif' />或者说公司不想在J2EE基础应用Framework投入很多精力<img src='/icons/13901dou.gif' />选用现有<img src='/icons/13901de.gif' />较为成熟<img src='/icons/13901de.gif' />、稳定、和现有J2EE Spec<img src='/icons/13901if.gif' />ication兼容<img src='/icons/13901de.gif' />技术框架会比较明智<img src='/icons/13901dou2.gif' /><br/><img src='/icons/13901yi.gif' />般而言<img src='/icons/13901dou.gif' />Framework本身<img src='/icons/13901dou.gif' />或者说J2EE平台本身都是实现并优化了具体<img src='/icons/13901de.gif' />设计模式、规则<img src='/icons/13901dou.gif' />比如业务代理、Service Locator(包括Web Tier和EJB Tier各自<img src='/icons/13901de.gif' />服务定位器<img src='/icons/13901dou.gif' />起到统<img src='/icons/13901yi.gif' />管理有限资源、Cache相关资源<img src='/icons/13901de.gif' />作用<img src='/icons/13901dou.gif' />便于系统移植)、Front Controller、DAO等等<img src='/icons/13901dou2.gif' />现有<img src='/icons/13901de.gif' />J2EE Framework比较丰富<img src='/icons/13901dou2.gif' />比如:<br/>Struts: 对于实现了Model 2类型<img src='/icons/13901de.gif' />Framework<img src='/icons/13901dou.gif' />对于现在以及将来(随着JSF规范标准、技术<img src='/icons/13901de.gif' />成熟)<img src='/icons/13901dou.gif' />选用她是<img src='/icons/13901yi.gif' />种明智的举<img src='/icons/13901dou2.gif' />目前<img src='/icons/13901dou.gif' />Struts已经发展到1.1版本<img src='/icons/13901dou2.gif' />其内在<img src='/icons/13901de.gif' />MVC主线、对后端数据操作方式没有限定、集合了Apache Jakarta项目组<img src='/icons/13901de.gif' />优秀相关项目<img src='/icons/13901de.gif' />精华<img src='/icons/13901dou.gif' />可谓是开发J2EE应用<img src='/icons/13901de.gif' />佳品<img src='/icons/13901dou2.gif' />同时<img src='/icons/13901dou.gif' />对于具有.NET Web Forms功能<img src='/icons/13901de.gif' />下<img src='/icons/13901yi.gif' />代J2EE平台技术JSF而言<img src='/icons/13901dou.gif' />Struts本身可考虑到和JSF<img src='/icons/13901de.gif' />兼容和集成性<img src='/icons/13901dou2.gif' />比如<img src='/icons/13901dou.gif' />通过JSP呈现表示层、Servlet呈现控制层、EJB呈现数据存储层<img src='/icons/13901dou2.gif' />各层的间<img src='/icons/13901dou.gif' />可以通过值对象、HTTP相关对象来通讯<img src='/icons/13901dou.gif' />实现J2EE相关技术<img src='/icons/13901de.gif' />完美应用<img src='/icons/13901dou2.gif' /><br/>Log4j: 我想对于习惯采用“<img src='/icons/13901System.gif' />.out.pr<img src='/icons/13901int.gif' />ln(“”);”<img src='/icons/13901de.gif' />读者而言<img src='/icons/13901dou.gif' />Log4j是大家<img src='/icons/13901de.gif' />福音<img src='/icons/13901dou2.gif' />尽管Java 2 Standard Edition也具备java.util.logging包来保证日志<img src='/icons/13901de.gif' />输出<img src='/icons/13901dou.gif' />但Log4j<img src='/icons/13901de.gif' />简单、高效、灵活已经成了很多项目<img src='/icons/13901de.gif' />选择<img src='/icons/13901dou2.gif' />日志<img src='/icons/13901dou.gif' />在某种程度上可以考验系统<img src='/icons/13901de.gif' />稳定性、正确性<img src='/icons/13901dou.gif' />所以采用可配置<img src='/icons/13901de.gif' />Log4j(目前<img src='/icons/13901dou.gif' />Log4j已经考虑到了和java.util.logging包<img src='/icons/13901de.gif' />兼容性)是不会错<img src='/icons/13901de.gif' /><img src='/icons/13901dou2.gif' />比如<img src='/icons/13901dou.gif' />JBoss 3.2.1本身就是借助于Log4j来管理日志<img src='/icons/13901de.gif' /><img src='/icons/13901dou2.gif' /><br/>realMethods: 可能有些读者还不知道这<img src='/icons/13901yi.gif' />款杀手锏<img src='/icons/13901dou2.gif' />那好<img src='/icons/13901dou.gif' />这里就简要作<img src='/icons/13901yi.gif' />介绍<img src='/icons/13901dou2.gif' />realMethods是<img src='/icons/13901yi.gif' />开发J2EE应用<img src='/icons/13901de.gif' />Framework<img src='/icons/13901dou.gif' />她区别于Struts (主要在于实现Model 2<img src='/icons/13901dou.gif' />J2EE应用前端)；realMethods对于J2EE应用<img src='/icons/13901de.gif' />各个层面都有详尽、高效<img src='/icons/13901de.gif' />支持<img src='/icons/13901dou2.gif' />同时<img src='/icons/13901dou.gif' />realMethods以前还是商用软件Software<img src='/icons/13901dou.gif' />现在已经成为了Open Source<img src='/icons/13901de.gif' />产品<img src='/icons/13901dou.gif' />因此现在可以参看其全部源代码<img src='/icons/13901dou2.gif' /><br/>BC4J: Oracle公司推出<img src='/icons/13901de.gif' />用于Java<img src='/icons/13901de.gif' />商业组件<img src='/icons/13901dou2.gif' />其内容和外在<img src='/icons/13901de.gif' />特点和优势<img src='/icons/13901dou.gif' />不言而寓<img src='/icons/13901dou2.gif' /><br/>当然<img src='/icons/13901dou.gif' />类似<img src='/icons/13901de.gif' />Framework很多很多<img src='/icons/13901dou2.gif' />作为开发J2EE应用<img src='/icons/13901de.gif' />团队(Team)而言<img src='/icons/13901dou.gif' />我们需要对各种Framework加以筛选<img src='/icons/13901dou.gif' />选择适合项目需求、团队(Team)、公司发展方向<img src='/icons/13901de.gif' />框架<img src='/icons/13901dou2.gif' /><br/><img src='/icons/13901yi.gif' />般情况下<img src='/icons/13901dou.gif' />待开发<img src='/icons/13901de.gif' />目标产品不宜采用过多<img src='/icons/13901de.gif' />Framework<img src='/icons/13901dou2.gif' />其<img src='/icons/13901yi.gif' /><img src='/icons/13901dou.gif' />J2EE各个技术发展很快<img src='/icons/13901dou.gif' />过多<img src='/icons/13901de.gif' />Framework使得系统<img src='/icons/13901de.gif' />后续升级、维护不利；其 2<img src='/icons/13901dou.gif' />可以借鉴其中<img src='/icons/13901de.gif' />好<img src='/icons/13901de.gif' /><img src='/icons/13901yi.gif' />面<img src='/icons/13901dou.gif' />比如研究realMethods实现<img src='/icons/13901de.gif' />相应<img src='/icons/13901de.gif' />设计模式<img src='/icons/13901dou.gif' />并改造她以适合我们<img src='/icons/13901de.gif' />项目需求；其 3<img src='/icons/13901dou.gif' />Framework本身会有变动<img src='/icons/13901dou.gif' />如果选用过多<img src='/icons/13901dou.gif' />会给开发团队(Team)加重负担<img src='/icons/13901dou.gif' />从而不利于项目管理(project management)<img src='/icons/13901dou2.gif' /> 
		
          
              
          <br/>
        <br/>
          <br/>有选择<img src='/icons/13901de.gif' />使用现有<img src='/icons/13901de.gif' />成熟Framework能提升大家<img src='/icons/13901de.gif' />开发效率、开发水平<img src='/icons/13901dou2.gif' /><br/><br/>3<img src='/icons/13901dou.gif' />开发模式<img src='/icons/13901de.gif' />选择<br/><br/>开发J2EE应用要求目标开发人员能够掌握其中<img src='/icons/13901de.gif' />各种技术<img src='/icons/13901dou2.gif' />但是<img src='/icons/13901dou.gif' />现实情况不是这样<img src='/icons/13901dou2.gif' />作为<img src='/icons/13901yi.gif' />个团队(Team)<img src='/icons/13901dou.gif' />每个人都有自己区别<img src='/icons/13901de.gif' />技能优势、兴趣以及悟性<img src='/icons/13901dou2.gif' />同时<img src='/icons/13901dou.gif' /> J2EE本身需要体现社会分工<img src='/icons/13901dou2.gif' /><img src='/icons/13901yi.gif' />般情况下<img src='/icons/13901dou.gif' />我们<img src='/icons/13901de.gif' />开发团队(Team)不会有Spec<img src='/icons/13901if.gif' />ication所要求<img src='/icons/13901de.gif' />各个开发角色<img src='/icons/13901dou2.gif' />现实往往只有3种(也可能是两种):美工、JSP<img src='/icons/13901chengxu.gif' />员、EJB<img src='/icons/13901chengxu.gif' />员<img src='/icons/13901dou2.gif' />面对这种分工<img src='/icons/13901dou.gif' />团队(Team)更要注重沟通、交流<img src='/icons/13901dou.gif' />注重代码<img src='/icons/13901de.gif' /><img src='/icons/13901yi.gif' />致性<img src='/icons/13901dou2.gif' /><br/><img src='/icons/13901yi.gif' />般情况下<img src='/icons/13901dou.gif' />团队(Team)要尽量采用版本控制工具管理代码、尽量做到每天都有<img src='/icons/13901yi.gif' />个完整<img src='/icons/13901de.gif' />运行版本<img src='/icons/13901dou2.gif' />经过<img src='/icons/13901yi.gif' />段时间<img src='/icons/13901dou.gif' />团队(Team)都会适应这种开发模式<img src='/icons/13901dou2.gif' />其中<img src='/icons/13901dou.gif' />版本控制工具<img src='/icons/13901yi.gif' />定要使用<img src='/icons/13901dou.gif' />便于代码<img src='/icons/13901de.gif' />管理、控制和备份<img src='/icons/13901dou2.gif' />这其中会牵扯到很多层面<img src='/icons/13901dou2.gif' />比如<img src='/icons/13901dou.gif' />开发工具<img src='/icons/13901de.gif' />选择要考虑到版本控制工具<img src='/icons/13901de.gif' />使用、建模工具<img src='/icons/13901de.gif' />合理使用有助于团队(Team)有效<img src='/icons/13901de.gif' />沟通和交流<img src='/icons/13901dou2.gif' /><br/>基于现有<img src='/icons/13901de.gif' />开发模式<img src='/icons/13901dou.gif' />个人认为这样3套方案不错<img src='/icons/13901dou2.gif' />第<img src='/icons/13901yi.gif' /><img src='/icons/13901dou.gif' />采用Together作为建模工具、采用JBuilder作为IDE工具、采用VSS(或者CVS)作为版本控制工具、采用 JBoss作为开发J2EE应用开发阶段<img src='/icons/13901de.gif' />服务器<img src='/icons/13901dou2.gif' />第 2<img src='/icons/13901dou.gif' />采用WebSphere Studio整套工具<img src='/icons/13901dou2.gif' />第 3<img src='/icons/13901dou.gif' />采用Eclipse(或者JCreator)、Ant、XDoclets作为开发工具<img src='/icons/13901dou2.gif' /><br/>当然<img src='/icons/13901dou.gif' />手工完成J2EE应用<img src='/icons/13901de.gif' />编写、编译、打包、部署、测试更能使开发者理解各个开发阶段<img src='/icons/13901de.gif' />具体细节<img src='/icons/13901dou2.gif' />但本人认为<img src='/icons/13901dou.gif' />只要开发者有这种关注具体细节<img src='/icons/13901de.gif' />态度<img src='/icons/13901dou.gif' />选用功能强大<img src='/icons/13901de.gif' />建模、开发工具是明智<img src='/icons/13901de.gif' /><img src='/icons/13901dou2.gif' />开发工具不能提高开发人员<img src='/icons/13901de.gif' />开发技能<img src='/icons/13901dou.gif' />但是她能够引导开发人员正确<img src='/icons/13901de.gif' />开发方向<img src='/icons/13901dou2.gif' />比如,JBuidler 9 Enterprise提供<img src='/icons/13901de.gif' />EJB精灵具有<img src='/icons/13901de.gif' />“Struts + EJB + Session Fa?ade + Value Object”等功能呈现了业界广泛应用<img src='/icons/13901de.gif' />J2EE构架方式<img src='/icons/13901dou2.gif' /><br/><br/>4<img src='/icons/13901dou.gif' />注重各个阶段<img src='/icons/13901de.gif' />测试工作<br/><br/>测试工作往往是很多项目经理(project manager)忽视<img src='/icons/13901dou.gif' />不愿意去花费时间、费用<img src='/icons/13901de.gif' />内容<img src='/icons/13901dou.gif' /><img src='/icons/13901yinwei.gif' />那样会增加项目<img src='/icons/13901de.gif' />成本<img src='/icons/13901dou2.gif' />但是<img src='/icons/13901dou.gif' />他们忽视了<img src='/icons/13901dou.gif' />项目<img src='/icons/13901de.gif' />完成质量往往对项目<img src='/icons/13901de.gif' />成本有很大<img src='/icons/13901de.gif' />关系<img src='/icons/13901dou2.gif' />比如<img src='/icons/13901dou.gif' />如果软件Software质量很差<img src='/icons/13901dou.gif' />并没有经历测试阶段<img src='/icons/13901dou.gif' />其后期部署、运行所带来<img src='/icons/13901de.gif' />费用会远远超过前期<img src='/icons/13901de.gif' />费用<img src='/icons/13901dou2.gif' /><br/>测试是分阶段<img src='/icons/13901de.gif' /><img src='/icons/13901dou2.gif' />单元测试<img src='/icons/13901dou.gif' />比如借助于JUnit<img src='/icons/13901dou.gif' />来保证功能正确等内容<img src='/icons/13901dou2.gif' />集成测试<img src='/icons/13901dou.gif' />来保证系统没有内存泄漏等内容<img src='/icons/13901dou2.gif' />其中<img src='/icons/13901dou.gif' />Optimizeite Suite Enterprise对于完成Profiler、Code Coverage、Thread Debugger等内容很有帮助<img src='/icons/13901dou2.gif' />我记得<img src='/icons/13901dou.gif' />我写<img src='/icons/13901de.gif' /><img src='/icons/13901yi.gif' />个Swing桌面应用存在内容泄漏<img src='/icons/13901dou.gif' />但是想了很多办法都没有解决问题<img src='/icons/13901dou2.gif' />后来<img src='/icons/13901dou.gif' />采用Profiler获得了答案<img src='/icons/13901dou2.gif' />因此<img src='/icons/13901dou.gif' />现在开发应用<img src='/icons/13901dou.gif' />我们很多时候都采用Optimizeite Suite Enterprise作为测试工具<img src='/icons/13901dou2.gif' />尤其是<img src='/icons/13901dou.gif' />在做集成测试过程中<img src='/icons/13901dou.gif' />检查系统<img src='/icons/13901de.gif' />内存泄漏、性能很有帮助<img src='/icons/13901dou2.gif' /><br/>测试是分类型<img src='/icons/13901de.gif' /><img src='/icons/13901dou2.gif' />压力测试、性能测试<img src='/icons/13901dou2.gif' />就目前对支持J2EE应用<img src='/icons/13901de.gif' />测试而言<img src='/icons/13901dou.gif' />并没有很好<img src='/icons/13901de.gif' />测试工具<img src='/icons/13901dou2.gif' />但是<img src='/icons/13901dou.gif' /><img src='/icons/13901yi.gif' />般情况下<img src='/icons/13901dou.gif' />借助于Rational Robot也能够取得不错<img src='/icons/13901de.gif' />效果<img src='/icons/13901dou2.gif' /><br/><br/>当然<img src='/icons/13901dou.gif' />成功开发J2EE应用<img src='/icons/13901de.gif' />原因有很多<img src='/icons/13901dou2.gif' />比如<img src='/icons/13901dou.gif' />Entity Beans<img src='/icons/13901de.gif' />成功应用很大程度上和底层Database<img src='/icons/13901de.gif' />设计有关系(如果表结构设计设计<img src='/icons/13901de.gif' />不合理<img src='/icons/13901dou.gif' />将导致Entity Beans性能<img src='/icons/13901de.gif' />急剧下降)；如何最大化挖掘、提升团队(Team)各个成员<img src='/icons/13901de.gif' />J2EE技能<img src='/icons/13901dou2.gif' />等等这些<img src='/icons/13901dou.gif' />设计面很广<img src='/icons/13901dou2.gif' /><br/><br/>谢谢<img src='/icons/13901dou.gif' />希望此文给你带来了快乐、帮助<br/><br/>作者:罗时飞<br/>(版权个人所有<img src='/icons/13901dou.gif' />引用指明出处<img src='/icons/13901dou.gif' />不要用于商业目<img src='/icons/13901de.gif' />)<br/><br/><br/><br/>  <a href="/mypdf/6711.pdf" title="查看 j2ee开发:开发J2EE应用的要领-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6711.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:J2EE开发过程中的异常处理-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6710.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          a里有3种异常类型:<br/><br/>1.       检查型异常,这样<img src='/icons/65061de.gif' />异常继承于Excetpion,就是在编译期间需要检查,如果该异常被throw,那么在该异常所在<img src='/icons/65061de.gif' />method后必须显示<img src='/icons/65061de.gif' />throws,<img src='/icons/65061diaoyong.gif' />该method<img src='/icons/65061de.gif' />地方也必须捕获该异常,否则编译器会抛出异常.ejb里<img src='/icons/65061de.gif' />RemoteException是<img src='/icons/65061yi.gif' />个这样<img src='/icons/65061de.gif' />异常.<br/><br/>2.       运行时异常,就是在运行期间系统出现<img src='/icons/65061de.gif' />异常,该类异常继承于RuntimeException,该类异常在编译时系统不进行检查,如NullPo<img src='/icons/65061int.gif' />erExcetpion,NumberFormatException.<br/><br/>3.       系统<img src='/icons/65061cuowu.gif' />,<img src='/icons/65061yi.gif' />般是JVM出现异常时抛出<img src='/icons/65061de.gif' />异常,如OutofMemoryError,这样<img src='/icons/65061de.gif' />异常在J2EE开发中是不用关心<img src='/icons/65061de.gif' />.<br/><br/>在J2EE开发中,检查型异常被滥用以至于过<img src='/icons/65061yi.gif' />段时间<img src='/icons/65061chengxu.gif' />员自己都看不懂抛出这样<img src='/icons/65061de.gif' />异常,.里面封装<img src='/icons/65061de.gif' />这些<img src='/icons/65061cuowu.gif' />信息是干什么用<img src='/icons/65061de.gif' />,更可怕<img src='/icons/65061de.gif' />是有好多有用<img src='/icons/65061de.gif' />信息找不到了.比如SQLException和RemoteException这样<img src='/icons/65061de.gif' />异常我们没必要再进行封装,这样<img src='/icons/65061de.gif' />异常只对我们调试<img src='/icons/65061chengxu.gif' />有用,而对客户来说它就是<img src='/icons/65061yi.gif' />个”系统<img src='/icons/65061cuowu.gif' />”而已.异常处理有<img src='/icons/65061yi.gif' />个简单<img src='/icons/65061de.gif' />原则,你什么时候需要封装自己<img src='/icons/65061de.gif' />检查型异常?就是你很清楚自己抛出这个异常<img src='/icons/65061de.gif' />用途时,比如用户输入用户名和密码要登录,但用户名和密码不匹配,你就要定义<img src='/icons/65061yi.gif' />个检查型异常,客户端通过捕获该异常,然后把相应<img src='/icons/65061de.gif' /><img src='/icons/65061cuowu.gif' />信息反馈给客户.而其它<img src='/icons/65061de.gif' />自己未预期<img src='/icons/65061de.gif' /><img src='/icons/65061cuowu.gif' />或者异常比如SQLException,只需封装到EJBException中,ejb container会把它<img src='/icons/65061de.gif' />信息追加到RemoteException里,这样客户端捕获RemoteException后把它写到系统日志里,就很容易进行调试.<br/><br/>有关<img src='/icons/65061cuowu.gif' />代码,<img src='/icons/65061yi.gif' />般反馈给客户<img src='/icons/65061de.gif' /><img src='/icons/65061cuowu.gif' />代码有两种类型:<br/><br/>1.       应用<img src='/icons/65061chengxu.gif' />级<img src='/icons/65061cuowu.gif' />,这些<img src='/icons/65061cuowu.gif' />是由客户自身<img src='/icons/65061de.gif' />原因引起<img src='/icons/65061de.gif' />,比如输入信息有误,没有操作该功能<img src='/icons/65061de.gif' />权限.对于这样情况,系统应给用户<img src='/icons/65061yi.gif' />个明确<img src='/icons/65061de.gif' />提示.<br/><br/>2.       系统级异常,比如”未连接到服务器”,”服务器忙”,”未连接到数据库”,”系统<img src='/icons/65061cuowu.gif' />”,这样<img src='/icons/65061de.gif' /><img src='/icons/65061cuowu.gif' />给客户带来<img src='/icons/65061de.gif' />后果是不能进行操作,那么下面<img src='/icons/65061de.gif' />戏该由系统管理员和系统开发者去演了.<br/><br/>个人觉得检查型异常对应于应用<img src='/icons/65061chengxu.gif' />级<img src='/icons/65061cuowu.gif' />,运行时异常对应于系统级异常. <br/>  <a href="/mypdf/6710.pdf" title="查看 j2ee开发:J2EE开发过程中的异常处理-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6710.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee项目开发:J2EE项目中开发团队的组建-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6705.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          这种应用模型允许区别<img src='/icons/86168de.gif' />开发人员同时进行开发<img src='/icons/86168de.gif' />各个元素<img src='/icons/86168dou2.gif' />这里阐述<img src='/icons/86168yi.gif' />下对区别层次<img src='/icons/86168de.gif' />设计人员<img src='/icons/86168dou.gif' />开发人员<img src='/icons/86168de.gif' />技术要求<img src='/icons/86168dou2.gif' />对以下几个分类进行描述<img src='/icons/86168dou2.gif' /> <br/>　　设计师组建团队(Team) <br/>　　表现逻辑层<img src='/icons/86168de.gif' />团队(Team)角色 <br/>　　业务逻辑层等团队(Team)角色 <br/>　　数据库访问层<img src='/icons/86168de.gif' />团队(Team)角色 <br/><br/>　　团队(Team)<img src='/icons/86168de.gif' />组成可以根据人员<img src='/icons/86168de.gif' />数量和系统<img src='/icons/86168de.gif' />范围大小<img src='/icons/86168dou2.gif' />例如<img src='/icons/86168dou.gif' />不<img src='/icons/86168yi.gif' />定所有<img src='/icons/86168de.gif' />角色都要分配<img src='/icons/86168dou.gif' />有些人可以担当不能<img src='/icons/86168de.gif' />角色<img src='/icons/86168dou2.gif' /> <br/><br/>设计师 <br/>在基于组件<img src='/icons/86168de.gif' />应用系统开发中<img src='/icons/86168dou.gif' /><img src='/icons/86168yi.gif' />个或几个人必须对这个系统<img src='/icons/86168de.gif' />整体需求有全面<img src='/icons/86168de.gif' />了解<img src='/icons/86168dou.gif' />比如系统<img src='/icons/86168de.gif' />控制流程<img src='/icons/86168dou.gif' />和其他<img src='/icons/86168de.gif' />接口等等<img src='/icons/86168dou2.gif' />有些公司称这个角色为总工程师<img src='/icons/86168dou.gif' />不管如何叫<img src='/icons/86168dou.gif' />这个角色非常重要<img src='/icons/86168dou.gif' />他承担协调区别开发小组的间<img src='/icons/86168de.gif' />工作<img src='/icons/86168dou.gif' />帮助他们考虑系统这个“大图”<img src='/icons/86168dou2.gif' /> <br/><br/>表现逻辑层<img src='/icons/86168de.gif' />团队(Team)角色 <br/>在表现层<img src='/icons/86168dou.gif' />用户界面是动态生成<img src='/icons/86168de.gif' /><img src='/icons/86168dou2.gif' />需要如下开发人员: <br/>　　Java servlet 开发人员 <br/>　　JSP 开发人员 <br/>　　HTML 设计人员 <br/>　　美工人员 <br/>　　客户端<img src='/icons/86168de.gif' />javascript 开发人员 <br/>　　Servlet 开发人员建立表现层<img src='/icons/86168de.gif' />逻辑<img src='/icons/86168dou.gif' />而其他人员建立表现<img src='/icons/86168de.gif' />形式<img src='/icons/86168dou2.gif' /> <br/><br/>Java Servlet 开发人员 <br/>Servlet处理页和页的间<img src='/icons/86168de.gif' />浏览<img src='/icons/86168dou.gif' />会话管理<img src='/icons/86168dou.gif' />简单<img src='/icons/86168de.gif' />输入验证<img src='/icons/86168dou2.gif' />Servlet也将业务逻辑<img src='/icons/86168de.gif' />元素连接起来<img src='/icons/86168dou2.gif' /> <br/>Servlet开发人员必须理解<img src='/icons/86168yi.gif' />些相关事宜<img src='/icons/86168dou.gif' />HTTP请求<img src='/icons/86168dou.gif' />安全<img src='/icons/86168dou.gif' />多语言<img src='/icons/86168dou.gif' />和<img src='/icons/86168yi.gif' />些页面元素如session, cookie<img src='/icons/86168dou.gif' />超时等等<img src='/icons/86168dou2.gif' />J2EE<img src='/icons/86168de.gif' />应用里面<img src='/icons/86168dou.gif' />servlet必须用Java来写<img src='/icons/86168dou.gif' />Servlet可能会<img src='/icons/86168diaoyong.gif' />JSP, EJB, JDBC等等<img src='/icons/86168dou2.gif' />因此<img src='/icons/86168dou.gif' />servlet开发人员要和应用系统<img src='/icons/86168de.gif' />其他人员紧密合作<img src='/icons/86168dou2.gif' /> <br/><br/>JSP 开发人员 <br/>JSP开发人员和servlet开发人员密切合作来定义系统<img src='/icons/86168de.gif' />表现层页面<img src='/icons/86168dou2.gif' />即使在复杂<img src='/icons/86168de.gif' />开发项目里<img src='/icons/86168dou.gif' />JSP和servlet<img src='/icons/86168de.gif' />开发人员也可能是<img src='/icons/86168yi.gif' />个人<img src='/icons/86168dou2.gif' /> <br/><br/><br/>　　然而<img src='/icons/86168dou.gif' />如果<img src='/icons/86168yi.gif' />个系统中大部分Java在servlet而不是在JSP里<img src='/icons/86168dou.gif' />JSP人员就不必对Java非常熟悉<img src='/icons/86168dou2.gif' /> <br/><br/>HTML 设计人员 <br/>HTML 设计人员对HTML页面进行优化<img src='/icons/86168dou2.gif' />例如<img src='/icons/86168dou.gif' />他可能要完成以下任务: <br/><br/>　　保证在区别<img src='/icons/86168de.gif' />浏览器中所有<img src='/icons/86168de.gif' />页面都能正常显示 <br/>　　保证低速<img src='/icons/86168de.gif' />调制解调器访问也不受影响 <br/>　　对JSP设计人员<img src='/icons/86168de.gif' />页面进行进<img src='/icons/86168yi.gif' />步<img src='/icons/86168de.gif' />优化 <br/><br/>美工人员 <br/>美工人员创建图片等等<img src='/icons/86168dou2.gif' />这些图片要能小体积<img src='/icons/86168dou.gif' />快速下载<img src='/icons/86168dou2.gif' />美工和HTML页面人员紧密合作<img src='/icons/86168dou2.gif' /> <br/><br/>客户端<img src='/icons/86168de.gif' />javascript 开发人员 <br/>使用客户端<img src='/icons/86168de.gif' />javascript有很多原因<img src='/icons/86168dou2.gif' />比如<img src='/icons/86168dou.gif' />可以处理简单<img src='/icons/86168de.gif' />输入验证<img src='/icons/86168dou.gif' />不必提交给服务器<img src='/icons/86168dou.gif' />还可以让用户界面更生动<img src='/icons/86168dou2.gif' />这个角色和servlet, JSP人员紧密合作<img src='/icons/86168dou2.gif' /> <br/><br/>业务逻辑层<img src='/icons/86168de.gif' />团队(Team)角色 <br/>业务逻辑层包含业务规则和业务实体<img src='/icons/86168dou2.gif' />需要以下人员: <br/>Session bean 开发人员 <br/>　　Entity bean 开发人员 <br/><br/>Session Bean 开发人员 <br/>Session beans包含业务处理和业务规则<img src='/icons/86168de.gif' />逻辑<img src='/icons/86168dou2.gif' />比如<img src='/icons/86168dou.gif' /><img src='/icons/86168yi.gif' />个session bean 可能设计成计算<img src='/icons/86168yi.gif' />个支票<img src='/icons/86168de.gif' />税率<img src='/icons/86168dou2.gif' />如果<img src='/icons/86168yi.gif' />个系统面临处理经常变化<img src='/icons/86168de.gif' />复杂逻辑<img src='/icons/86168dou.gif' />而又大量使用session bean<img src='/icons/86168dou.gif' />结果是<img src='/icons/86168dou.gif' />session bean就需要不断<img src='/icons/86168de.gif' />更新<img src='/icons/86168dou2.gif' /> <br/><br/>　　Session bean <img src='/icons/86168de.gif' />开发人员<img src='/icons/86168yi.gif' />般是<img src='/icons/86168yi.gif' />个领域<img src='/icons/86168de.gif' />专家<img src='/icons/86168dou.gif' />理解复杂<img src='/icons/86168de.gif' /><img src='/icons/86168dou.gif' />专门领域<img src='/icons/86168de.gif' />逻辑<img src='/icons/86168dou.gif' />还有数据验证<img src='/icons/86168de.gif' />规则<img src='/icons/86168dou2.gif' />这个人员和servlet和entity bean开发人员紧密合作<img src='/icons/86168dou2.gif' /> <br/><br/>　　Session bean可能需要<img src='/icons/86168diaoyong.gif' />JDBC接口<img src='/icons/86168dou.gif' />和其他<img src='/icons/86168de.gif' />EJB<img src='/icons/86168dou2.gif' />无状态<img src='/icons/86168de.gif' />session bean系统运行<img src='/icons/86168de.gif' />会更好<img src='/icons/86168yi.gif' />些<img src='/icons/86168dou2.gif' /><img src='/icons/86168yinwei.gif' /><img src='/icons/86168dou.gif' />如果计算费率是<img src='/icons/86168yi.gif' />个有状态<img src='/icons/86168de.gif' />session bean<img src='/icons/86168dou.gif' />系统就必须访问<img src='/icons/86168yi.gif' />个保存bean<img src='/icons/86168de.gif' />状态信息<img src='/icons/86168de.gif' />服务器<img src='/icons/86168dou2.gif' />如果那个服务器恰巧出现问题<img src='/icons/86168dou.gif' />整个流程就会受阻<img src='/icons/86168dou2.gif' /> <br/><br/>Entity Bean 开发人员 <br/>Entity bean代表永久<img src='/icons/86168de.gif' />对象<img src='/icons/86168dou.gif' />如<img src='/icons/86168yi.gif' />个数据库中<img src='/icons/86168de.gif' /><img src='/icons/86168yi.gif' />条记录<img src='/icons/86168dou2.gif' />Entity bean开发人员<img src='/icons/86168de.gif' />任务是设计<img src='/icons/86168yi.gif' />个面向对象<img src='/icons/86168de.gif' />所有业务数据<img src='/icons/86168de.gif' />组织图<img src='/icons/86168dou2.gif' />建立面向对象<img src='/icons/86168de.gif' />试图意味着要将数据库中<img src='/icons/86168de.gif' />表(关系型<img src='/icons/86168de.gif' />)映射成entity bean<img src='/icons/86168dou2.gif' />例如<img src='/icons/86168dou.gif' />开发人员需要将客户表<img src='/icons/86168dou.gif' />发票表<img src='/icons/86168dou.gif' />和订单表转换成相应<img src='/icons/86168de.gif' />客户<img src='/icons/86168dou.gif' />发票<img src='/icons/86168dou.gif' />和订单对象<img src='/icons/86168dou2.gif' /> <br/><br/><br/>　　<img src='/icons/86168yi.gif' />个entity bean 开发人员和session bean, Servlet开发人员密切合作<img src='/icons/86168dou.gif' />保证应用系统提供快速<img src='/icons/86168de.gif' /><img src='/icons/86168dou.gif' />灵活<img src='/icons/86168de.gif' /><img src='/icons/86168dou.gif' />可扩展<img src='/icons/86168de.gif' />对业务数据<img src='/icons/86168de.gif' />访问<img src='/icons/86168dou2.gif' /> <br/><br/>　　Entity bean 可能会大量<img src='/icons/86168de.gif' /><img src='/icons/86168diaoyong.gif' />JDBC接口<img src='/icons/86168dou2.gif' />而entity bean 的间<img src='/icons/86168de.gif' /><img src='/icons/86168diaoyong.gif' />会很少<img src='/icons/86168dou2.gif' /> <br/><br/>数据库访问层<img src='/icons/86168de.gif' />团队(Team)角色 <br/>在数据库访问层<img src='/icons/86168dou.gif' />开发人员需要建立关系型数据库<img src='/icons/86168de.gif' />ER图<img src='/icons/86168dou.gif' />数据字典等等相关文档<img src='/icons/86168dou2.gif' />所有对数据库<img src='/icons/86168de.gif' />修改<img src='/icons/86168dou.gif' />访问等等权限操作都要经过数据库访问层开发人员<img src='/icons/86168dou2.gif' />这个角色在大部分项目中担当DBA<img src='/icons/86168de.gif' />角色<img src='/icons/86168dou2.gif' /> <br/><br/>　　团队(Team)组建的后<img src='/icons/86168dou.gif' />就可以开始设计用户界面<img src='/icons/86168dou2.gif' /> <br/><br/>设计用户界面 <br/>建议从前到后开始设计应用系统<img src='/icons/86168dou2.gif' />就是说<img src='/icons/86168dou.gif' />先设计用户界面<img src='/icons/86168dou.gif' />再设计EJB<img src='/icons/86168dou.gif' />这样效率最高<img src='/icons/86168dou2.gif' />  <a href="/mypdf/6705.pdf" title="查看 j2ee项目开发:J2EE项目中开发团队的组建-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6705.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:基于J2EE的开发的一些经验-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6691.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          p; 1.CMP<img src='/icons/80852de.gif' />findByPrimaryKey有时将返回NULL:<br/>给findByPrimaryKey送了<img src='/icons/80852yi.gif' />个数据库中不存在<img src='/icons/80852de.gif' />键值,就抛出了异常<br/>如果参数是数据库中存在<img src='/icons/80852de.gif' /><img src='/icons/80852yi.gif' />个关键字,则是返回对应<img src='/icons/80852de.gif' />primarykey<br/>2.对于BMP<img src='/icons/80852dou.gif' />必须远程<img src='/icons/80852de.gif' /><img src='/icons/80852diaoyong.gif' /><img src='/icons/80852yi.gif' />个create思路方法<img src='/icons/80852dou.gif' />否则只能被使用<img src='/icons/80852yi.gif' />次<img src='/icons/80852dou.gif' />就会出现JDBC<img src='/icons/80852de.gif' />问题<img src='/icons/80852dou2.gif' />这个create<img src='/icons/80852kh.gif' />如果不是用返回对象<img src='/icons/80852de.gif' />话可以任意写<img src='/icons/80852yi.gif' />个返回primayKey值即可<br/>3.response.<img src='/icons/80852set.gif' />ContentType(\"text/xml;char<img src='/icons/80852set.gif' />=UTF-8\");<br/>Pr<img src='/icons/80852int.gif' />Writer out = response.getWriter<img src='/icons/80852kh.gif' />;<br/>但需要指定编码时<img src='/icons/80852dou.gif' />这两条语句必须是这个顺序<img src='/icons/80852dou.gif' />否则就会出错<img src='/icons/80852dou2.gif' /><br/><img src='/icons/80852yinwei.gif' />response.getWriter<img src='/icons/80852kh.gif' /><img src='/icons/80852de.gif' />默认编码是ISO-5988-1<img src='/icons/80852dou.gif' />它是不能被转码成GB2312,UTF-8.<br/>而且这种编码时不支持中文<img src='/icons/80852de.gif' /><img src='/icons/80852dou2.gif' />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.对于jsp页面<img src='/icons/80852dou.gif' />通常是不需要在web.xml文件中配置<img src='/icons/80852dou.gif' />就可以根据链接<img src='/icons/80852dou.gif' />就可以访问<img src='/icons/80852dou2.gif' />只有对于于特定<img src='/icons/80852de.gif' />访问就需要<br/>配置到web.xml文件中<img src='/icons/80852dou.gif' />以控制页面<img src='/icons/80852de.gif' />走向<img src='/icons/80852dou2.gif' /><br/>5.对于<img src='/icons/80852cuowu.gif' />处理页面<img src='/icons/80852dou.gif' />只要在web.xml文件中设置如下:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;error-page&gt;<br/>&nbsp;&nbsp;&lt;error-code&gt;404&lt;/error-code&gt;<br/>&nbsp;&nbsp;&lt;location&gt;/error.jsp&lt;/location&gt;<br/>&nbsp;&lt;/error-page&gt;<br/>即当页面访问出错时<img src='/icons/80852dou.gif' />就会显示该页面<img src='/icons/80852dou2.gif' />对于请求所出<img src='/icons/80852de.gif' /><img src='/icons/80852cuowu.gif' />是没有办法<img src='/icons/80852de.gif' />！<br/>6.对于jsp和servlet<img src='/icons/80852de.gif' />显示和处理<img src='/icons/80852dou.gif' />经常可能出现乱码<img src='/icons/80852dou2.gif' /><br/>&nbsp;通常<br/>&nbsp;&nbsp; 对于jsp<img src='/icons/80852dou.gif' />有&lt;%@ page contentType=\"text/html;char<img src='/icons/80852set.gif' />=gb2312\"%&gt;<br/>&nbsp;&nbsp; 对于servlet,有Response.<img src='/icons/80852set.gif' />ContentType(\"text/html;char<img src='/icons/80852set.gif' />=gb2312\");<br/>&nbsp;&nbsp; <img src='/icons/80852yi.gif' />般对于显示<img src='/icons/80852dou.gif' />中文上面是保险<img src='/icons/80852de.gif' />办法<img src='/icons/80852dou.gif' />其他<img src='/icons/80852de.gif' /><img src='/icons/80852yi.gif' />些编码会经常出乱码<br/>7.有时还需要对request<img src='/icons/80852de.gif' />内容进行编码<img src='/icons/80852dou2.gif' />如<br/>&nbsp;&nbsp; request.<img src='/icons/80852set.gif' />CharacterEncoding(\"GBK\");<br/>8.在servlet中从服务器<img src='/icons/80852de.gif' />数据库中读出文件(上传可以用fileupload组件smartupload组件)<img src='/icons/80852de.gif' />办法.例:<br/>&nbsp;String sql=\"SELECT FileSize,FileStore FROM ResourseStore where MagazineNumber=@#\"+MIDValue+\"@#\";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; stmt=con.prepareStatement(sql);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rs=stmt.executeQuery<img src='/icons/80852kh.gif' />;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/80852if.gif' />(rs.next<img src='/icons/80852kh.gif' />){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/80852int.gif' /> len=rs.getInt(\"FileSize\");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream&nbsp; in = rs.getBinaryStream(\"FileStore\");//对于ResultSet而言<img src='/icons/80852dou.gif' />获取值得顺序同select中返回值<img src='/icons/80852de.gif' />顺序<img src='/icons/80852dou.gif' />否则数据库会出异常<img src='/icons/80852dou2.gif' /><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/80852byte.gif' /> b<img src='/icons/80852zhk2.gif' />=<img src='/icons/80852new.gif' /> <img src='/icons/80852byte.gif' />[len];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while(true)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/80852int.gif' /> readlen=in.read(b);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/80852if.gif' />(readlen<img src='/icons/80852dd.gif' />-1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img src='/icons/80852break.gif' />;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.<img src='/icons/80852set.gif' />ContentType(\"application/x-msdownload\");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletOutputStream op = response.getOutputStream<img src='/icons/80852kh.gif' />;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; op.write(b,0,b.length);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; op.flush<img src='/icons/80852kh.gif' />;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; op.close<img src='/icons/80852kh.gif' />;<br/><br/>如果数据库支持clob或clob时(sql service不支持读取,也不支持URL)<img src='/icons/80852dou.gif' />可以采用别<img src='/icons/80852de.gif' />办法解决问题<img src='/icons/80852dou2.gif' />如:读取 2进制(如上)<img src='/icons/80852dou.gif' />读入<img src='/icons/80852zifu.gif' />串<img src='/icons/80852dou.gif' />然后通过类型转换即可！<br/><br/>  <a href="/mypdf/6691.pdf" title="查看 j2ee开发:基于J2EE的开发的一些经验-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6691.html</guid>
		</item>
		<item>
			<title><![CDATA[j2eeejb:使用EJB3.O简化EJB开发(二)-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6681.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          lign=left>简化开发者<img src='/icons/60894de.gif' />观点 <br/><br/>如果你使用现有版本<img src='/icons/60894de.gif' />EJB你会懂得开发<img src='/icons/60894yi.gif' />个如HelloWorld<img src='/icons/60894de.gif' />简单<img src='/icons/60894de.gif' />EJB<img src='/icons/60894chengxu.gif' />是多么困难<img src='/icons/60894dou2.gif' />你至少需要两个接口<img src='/icons/60894dou.gif' /><img src='/icons/60894yi.gif' />个bean类和<img src='/icons/60894yi.gif' />个部署描述文件<img src='/icons/60894dou2.gif' />大多数<img src='/icons/60894de.gif' />开发者希望知道为什么我需要所有这些<img src='/icons/60894dou2.gif' />IDEs(开发环境工具)象, 和简化了开发者<img src='/icons/60894de.gif' />做这些普通<img src='/icons/60894de.gif' />工作开发周期<img src='/icons/60894dou.gif' />可是在EJB在你部署到所选择<img src='/icons/60894de.gif' />容器中的前<img src='/icons/60894dou.gif' />编译类和打包部署文件依然是开发人员<img src='/icons/60894de.gif' />工作<img src='/icons/60894dou2.gif' /> <br/><br/>EJB3.0试图从以下方面简化复杂性: <br/><br/>· 不必定义接口和部署<img src='/icons/60894de.gif' />描述文件<img src='/icons/60894dou.gif' />这些可以由容器使用metadata annotations生成<img src='/icons/60894dou2.gif' /> <br/><br/>· 使用常用<img src='/icons/60894de.gif' />Java类作为EJB<img src='/icons/60894de.gif' />类和常用<img src='/icons/60894de.gif' />EJB业务接口<img src='/icons/60894dou2.gif' /> <br/><br/>元数据描述(Metadata Annotations) <br/><br/>EJB3.0非常倚重Metadata Annotations<img src='/icons/60894dou2.gif' />Metadata Annotations已经成为标准并且将是<img src='/icons/60894de.gif' /><img src='/icons/60894yi.gif' />部分<img src='/icons/60894dou2.gif' />Annotations是<img src='/icons/60894yi.gif' />种对象变成<img src='/icons/60894de.gif' />属性<img src='/icons/60894dou.gif' />非常类似和XDoclet<img src='/icons/60894dou2.gif' />可是不像XDoclet那样需要预先编译<img src='/icons/60894dou.gif' />Annotations由Java编译器在需要编译<img src='/icons/60894de.gif' />时候编译<img src='/icons/60894dou2.gif' />(依赖于@Retention<img src='/icons/60894de.gif' />开始时间)<img src='/icons/60894dou2.gif' />在开发人员<img src='/icons/60894de.gif' />观点<img src='/icons/60894dou.gif' />Annotations就如同<img src='/icons/60894yi.gif' />个公有<img src='/icons/60894de.gif' />并可以作为类<img src='/icons/60894dou.gif' />域<img src='/icons/60894dou.gif' />思路方法<img src='/icons/60894dou.gif' />参数<img src='/icons/60894dou.gif' />本地变量<img src='/icons/60894dou.gif' />构造<img src='/icons/60894dou.gif' />枚举和包<img src='/icons/60894yi.gif' />样使用<img src='/icons/60894de.gif' />修改量<img src='/icons/60894dou2.gif' />你可以在你<img src='/icons/60894de.gif' />Java代码中附带特殊<img src='/icons/60894de.gif' />属性使用Annotations来生成代码<img src='/icons/60894dou.gif' />自动编写文档代码<img src='/icons/60894dou.gif' />或者提供如在运行期间增强业务层安全或特殊业务逻辑<img src='/icons/60894de.gif' />特殊服务<img src='/icons/60894dou2.gif' />J2EE1.5(5.0)<img src='/icons/60894de.gif' />目标是简化开发人员使用Annotations因此而可能产生<img src='/icons/60894yi.gif' />套<img src='/icons/60894de.gif' />Annotations模板<img src='/icons/60894dou2.gif' />Annotations使用@来标记<img src='/icons/60894dou.gif' />如下: <br/><br/> @Author(\"Debu Panda\") <br/><br/> @Bean <br/><br/> public <img src='/icons/60894class.gif' /> MySessionBean <br/><br/>EJB3.0为了简化开发因此使用Metadata Annotations来产生许多如接口<img src='/icons/60894yi.gif' />样<img src='/icons/60894de.gif' />人为原因和使用Annotations来替代部署描述文件<img src='/icons/60894dou2.gif' /> <br/><br/>使用 POJOs 和 POJIs <br/><br/>在规范标准条件中<img src='/icons/60894dou.gif' />JavaBeans和接口经常分别<img src='/icons/60894de.gif' />涉及到简单Java对象(POJOs)和简单Java接口(POJIs)<img src='/icons/60894dou2.gif' />这些不必要<img src='/icons/60894de.gif' />如Home接口<img src='/icons/60894de.gif' />人为原因已经被去掉<img src='/icons/60894dou2.gif' /> <br/><br/>开发人员必须在javax.ejb包中实现<img src='/icons/60894yi.gif' />个EJB接口(会话bean<img src='/icons/60894dou.gif' />实体bean或消息驱动bean)或者选择在bean<img src='/icons/60894de.gif' />实现类中使用Annotation<img src='/icons/60894dou2.gif' />你可以使用无状态<img src='/icons/60894dou.gif' />状态<img src='/icons/60894dou.gif' />消息驱动或者实体去注释<img src='/icons/60894yi.gif' />个bean类<img src='/icons/60894dou2.gif' />例如<img src='/icons/60894dou.gif' />如果你定义<img src='/icons/60894yi.gif' />个无状态EJB作为HelloWorld,你可以如下定义EJB: <br/><br/>@Remote <br/><br/> @Stateless public <img src='/icons/60894class.gif' /> HelloWorldBean { <br/><br/>public String sayHello(String s) <br/><br/> { <img src='/icons/60894System.gif' />.out.pr<img src='/icons/60894int.gif' />ln(\"Hello: \"+s; } <br/><br/> } <br/><br/>EJB<img src='/icons/60894de.gif' />接口无论远程<img src='/icons/60894de.gif' />还是本地<img src='/icons/60894de.gif' />都不必再实现EJBObject和EJBLocalObject<img src='/icons/60894dou2.gif' />你要么为EJB提供业务接口并且实现bean类中<img src='/icons/60894de.gif' />接口<img src='/icons/60894dou.gif' />要么需要在部署<img src='/icons/60894de.gif' />时候生成这些接口<img src='/icons/60894dou2.gif' />虽然会话bean和消息驱动bean<img src='/icons/60894de.gif' />接口是必须<img src='/icons/60894de.gif' /><img src='/icons/60894dou.gif' />但是实体bean<img src='/icons/60894de.gif' />接口是可选<img src='/icons/60894de.gif' /><img src='/icons/60894dou2.gif' />如果你没有为你<img src='/icons/60894de.gif' />会话bean实现<img src='/icons/60894yi.gif' />个接口<img src='/icons/60894dou.gif' />那么它会自动为你生成<img src='/icons/60894yi.gif' />个<img src='/icons/60894dou2.gif' />所生成<img src='/icons/60894de.gif' />接口是本地<img src='/icons/60894de.gif' />还是远程<img src='/icons/60894de.gif' />取决于你在bean类中<img src='/icons/60894de.gif' />Annotations<img src='/icons/60894dou2.gif' />如果你仔细看看上面<img src='/icons/60894de.gif' />代码范例<img src='/icons/60894dou.gif' />@Remote很明显是用来为你<img src='/icons/60894de.gif' />HelloWorld生成<img src='/icons/60894yi.gif' />个远程接口<img src='/icons/60894dou2.gif' />如果需要<img src='/icons/60894dou.gif' />你可以在你<img src='/icons/60894de.gif' />EJB中同时生成远程和本地接口<img src='/icons/60894dou2.gif' /> <br/><br/>在上面<img src='/icons/60894de.gif' />例子中<img src='/icons/60894dou.gif' />很明显开发人员不必再做那些如定义接口和实现回滚思路方法等这些普通<img src='/icons/60894de.gif' />工作<img src='/icons/60894dou2.gif' /> <br/><br/>生成接口<img src='/icons/60894de.gif' />名字来源于bean实现类<img src='/icons/60894de.gif' />名字<img src='/icons/60894dou2.gif' />生成接口对开发人员来说非常有用<img src='/icons/60894dou2.gif' />但是我并没有看到任何如Oracle <img src='/icons/60894de.gif' />JDeveloper<img src='/icons/60894de.gif' />这些IDE立即实现这种生成接口功能<img src='/icons/60894dou2.gif' /> <br/><br/>规范标准中没有明确EJB查找时客户端<img src='/icons/60894de.gif' />需求是什么<img src='/icons/60894dou.gif' />也没有明确我们如何保持这些EJB需要<img src='/icons/60894diaoyong.gif' /><img src='/icons/60894de.gif' />接口<img src='/icons/60894dou2.gif' />基于以下几个情况下<img src='/icons/60894de.gif' />原因我将不推荐使用生成接口: <br/><br/>· 生成接口<img src='/icons/60894de.gif' />名字来源于bean<img src='/icons/60894de.gif' />名字 <br/><br/>· 如果你不愿意在EJB中暴露出<img src='/icons/60894yi.gif' />些思路方法而生成接口将默认暴露出所有<img src='/icons/60894de.gif' />思路方法<img src='/icons/60894dou2.gif' /> <br/><br/>· 你需要在客户端使用接口来<img src='/icons/60894diaoyong.gif' />EJB. <br/><br/>去掉回滚思路方法<img src='/icons/60894de.gif' />需求<img src='/icons/60894dou2.gif' /> <br/><br/>EJB2.1和更早版本需要实现很多即使对于每个EJB你不需要<img src='/icons/60894de.gif' /><img src='/icons/60894yi.gif' />些生命周期<img src='/icons/60894de.gif' />思路方法<img src='/icons/60894dou.gif' />如ejbPassivate, ejbActivate, ejbLoad, ejbStore等等<img src='/icons/60894dou2.gif' />例如,在无状态会话bean中不需要ejbPassivate但是你还是得实现它<img src='/icons/60894de.gif' />思路方法<img src='/icons/60894dou2.gif' />现在EJB3.0中类似<img src='/icons/60894de.gif' />常用Java类实现这些生命周期<img src='/icons/60894de.gif' />思路方法都变成为可选择<img src='/icons/60894de.gif' /><img src='/icons/60894dou2.gif' />如果你在EJB中实现任何回滚容器都会<img src='/icons/60894diaoyong.gif' />这些思路方法<img src='/icons/60894dou2.gif' /> <br/><br/>唯<img src='/icons/60894yi.gif' /><img src='/icons/60894de.gif' />异常是在你可以使用Remove<img src='/icons/60894de.gif' />annotations时<img src='/icons/60894yi.gif' />个状态会话bean<img src='/icons/60894de.gif' />业务思路方法<img src='/icons/60894de.gif' />ejbRemove思路方法是状态会话bean<img src='/icons/60894dou2.gif' />如果你使用这个annotations它将在完成annotations思路方法后(无论正常或非正常)提示容器移除状态会话bean例子<img src='/icons/60894dou2.gif' />例如<img src='/icons/60894dou.gif' />你可以指定以下<img src='/icons/60894de.gif' />方式去在checkOut思路方法执行后移除<img src='/icons/60894yi.gif' />个状态会话bean例子<img src='/icons/60894dou2.gif' /> <br/><br/>@Stateful public <img src='/icons/60894class.gif' /> Cart { <br/><br/>... <br/><br/>... <br/><br/>@Remove public void checkOut<img src='/icons/60894kh.gif' /> { <br/><br/>... <br/><br/>} <br/><br/>} <br/><br/>Annotations和部署描述<img src='/icons/60894de.gif' />比较  
		
          
              
          <br/>
        <br/>
          <br/><br/>在前面我们讨论到EJB中不再需要部署描述而由annotations代替<img src='/icons/60894dou2.gif' />每个部署描述<img src='/icons/60894de.gif' />属性都将被选择<img src='/icons/60894yi.gif' />个默认值<img src='/icons/60894dou.gif' />而开发人员在直到他们想改变这些属性<img src='/icons/60894de.gif' />默认值的前不必为这些属性指定值<img src='/icons/60894dou2.gif' />这些也能用来为bean<img src='/icons/60894de.gif' />类自身指定使用<img src='/icons/60894de.gif' />annotations<img src='/icons/60894dou2.gif' />EJB3.0规范标准为开发人员使用bean类型<img src='/icons/60894dou.gif' />接口类型<img src='/icons/60894dou.gif' />资源引用<img src='/icons/60894dou.gif' />事务属性<img src='/icons/60894dou.gif' />安全等等定义了<img src='/icons/60894yi.gif' />组metadata annotations<img src='/icons/60894dou2.gif' />例如<img src='/icons/60894dou.gif' />如果我们可以如下为<img src='/icons/60894yi.gif' />个特殊<img src='/icons/60894de.gif' />EJB定义使用资源引用: <br/><br/>@Resource(name=\"jdbc/OracleDS\", resourceType=\"javax.sql.DataSource\") <br/><br/>J2EE<img src='/icons/60894de.gif' />提供商如Oracle, BEA, IBM将增加属性annotations在他们指定<img src='/icons/60894de.gif' />部署描述中<img src='/icons/60894dou.gif' />开发人员将可以使用这些annotations去避免使用部署描述<img src='/icons/60894dou2.gif' />这看起来对开发人员十分具有吸引力<img src='/icons/60894dou.gif' />特别对XML描述是已经感到厌恶<img src='/icons/60894de.gif' />开发人员<img src='/icons/60894dou.gif' />他们早就恨透并想脱离老<img src='/icons/60894de.gif' />那种描述方式<img src='/icons/60894dou.gif' />但依然有<img src='/icons/60894yi.gif' />些问题使得我们在正式使用annotations时需要谨慎对待<img src='/icons/60894dou2.gif' /> <br/><br/><UL type=disc><LI>它违背了我们轻便应用<img src='/icons/60894chengxu.gif' /><img src='/icons/60894de.gif' />目标<img src='/icons/60894dou.gif' /><img src='/icons/60894yinwei.gif' />如果<img src='/icons/60894yi.gif' />个EJB如果使用<img src='/icons/60894yi.gif' />个提供商指定<img src='/icons/60894de.gif' />部署描述<img src='/icons/60894dou.gif' />在重新编译或打包EJB<img src='/icons/60894de.gif' />时候它必须多次改变<img src='/icons/60894dou2.gif' /> <br/><LI>部署描述对EJB模板提供了全局观点使得组装和部署<img src='/icons/60894de.gif' />时候不必考虑单独<img src='/icons/60894de.gif' />EJB<img src='/icons/60894dou.gif' />他们将每个部署需求拧在<img src='/icons/60894yi.gif' />起<img src='/icons/60894dou.gif' />并且在部署完成的前描述是无效或者不可自动生成<img src='/icons/60894de.gif' /><img src='/icons/60894dou2.gif' />这对部署员来说是个可怕<img src='/icons/60894de.gif' />事情<img src='/icons/60894dou2.gif' /> <br/><LI>部署描述在EJB模板中被相关工具用来定义EJBs<img src='/icons/60894dou.gif' />当你试图整合<img src='/icons/60894yi.gif' />个和另<img src='/icons/60894yi.gif' />个容器<img src='/icons/60894de.gif' />时候非常有用<img src='/icons/60894dou2.gif' />EJB3.0规格同样主张在部署描述中使用重载annotations<img src='/icons/60894de.gif' />方式<img src='/icons/60894dou2.gif' />可是在规范标准里并没有提到重载annotations<img src='/icons/60894de.gif' />细节<img src='/icons/60894dou2.gif' /> <br/></LI></UL>无疑摆脱部署描述将使得新<img src='/icons/60894de.gif' />开发者开发更加容易<img src='/icons/60894dou.gif' />但是如果使用不当这也将造成管理上<img src='/icons/60894de.gif' />可怕问题<img src='/icons/60894dou2.gif' /> <br/><br/><br/><br/>  <a href="/mypdf/6681.pdf" title="查看 j2eeejb:使用EJB3.O简化EJB开发(二)-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6681.html</guid>
		</item>
		<item>
			<title><![CDATA[j2eeejb:使用EJB3.O简化EJB开发(一)-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6680.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          lign=left>使用EJB3.O简化EJB开发&nbsp;&nbsp;&nbsp; 原著:Debu Panda<br/><br/><br/><br/>我们引入EJB来构造分布式<img src='/icons/85924de.gif' />组件<img src='/icons/85924dou2.gif' />它诞生的时是为了解决所有CORBA<img src='/icons/85924de.gif' />问题和复杂性<img src='/icons/85924dou2.gif' />经历过几次重要<img src='/icons/85924de.gif' />版本更新和增加许多特性的后<img src='/icons/85924dou.gif' />EJB已经成为了J2EE<img src='/icons/85924de.gif' />核心<img src='/icons/85924dou2.gif' />在早期<img src='/icons/85924dou.gif' />很多开发人员沉迷于EJB甚至在没有任何意义<img src='/icons/85924de.gif' />情况下在他们<img src='/icons/85924de.gif' />工程中使用EJB<img src='/icons/85924dou2.gif' />而当他们发现所使用<img src='/icons/85924de.gif' />工程并没有质<img src='/icons/85924de.gif' />变化后<img src='/icons/85924dou.gif' />谴责EJB成了<img src='/icons/85924yi.gif' />种趋势<img src='/icons/85924dou2.gif' /> <br/><br/>开发EJB从来没有变得简单甚至在早期<img src='/icons/85924de.gif' />EJB版本规范标准中变得更加复杂<img src='/icons/85924dou2.gif' />EJB由于其<img src='/icons/85924de.gif' />复杂性和重量级特性而被比作<img src='/icons/85924yi.gif' />只大象<img src='/icons/85924dou2.gif' />学多开发人员感觉EJB象<img src='/icons/85924yi.gif' />个油炸圈饼上多余<img src='/icons/85924de.gif' /><img src='/icons/85924yi.gif' />层甜糖浆<img src='/icons/85924dou2.gif' />在现在low carb和Atkins diet大行其道<img src='/icons/85924de.gif' />今天<img src='/icons/85924dou.gif' />EJB专家委员会也没有选择余地<img src='/icons/85924de.gif' />发布了体现low carb<img src='/icons/85924de.gif' />EJB规范标准来简化EJB<img src='/icons/85924de.gif' />开发<img src='/icons/85924dou2.gif' />EJB3.0专家委员会在2004Javaone大会上发布了称的为EJB3.0第<img src='/icons/85924yi.gif' />个公开规范标准<img src='/icons/85924de.gif' />轻量级模型<img src='/icons/85924de.gif' />范例图<img src='/icons/85924dou2.gif' /> <br/><br/>第<img src='/icons/85924yi.gif' />眼看到EJB<img src='/icons/85924de.gif' />新模型感觉很不错<img src='/icons/85924dou2.gif' />在这篇文章中我们将讨论EJB3.0如何使用<img src='/icons/85924yi.gif' />个更小而精致<img src='/icons/85924de.gif' />装配来吸引开发者<img src='/icons/85924de.gif' /><img src='/icons/85924dou2.gif' />在接下来<img src='/icons/85924de.gif' />文章中我们将来讨论EJB3.0是怎样简化持久性模型<img src='/icons/85924de.gif' /><img src='/icons/85924dou2.gif' /> <br/><br/>整理缺陷 <br/><br/>在我们开始对EJB3.0带来<img src='/icons/85924de.gif' />新特性进行讨论的前<img src='/icons/85924dou.gif' />让我们先分析<img src='/icons/85924yi.gif' />下现在EJB模型<img src='/icons/85924de.gif' />复杂繁琐<img src='/icons/85924dou2.gif' /> <br/><br/><UL type=disc><LI>现在<img src='/icons/85924de.gif' />EJB模型需要建立许多组件接口和实现许多不必要<img src='/icons/85924de.gif' />回滚思路方法<img src='/icons/85924dou2.gif' /> <br/><LI>组件接口需要实现EJBObject或者EJBLocalObject<img src='/icons/85924dou.gif' />并且处理许多不必要<img src='/icons/85924de.gif' />异常<img src='/icons/85924dou2.gif' /> <br/><LI>EJB<img src='/icons/85924de.gif' />部署描述复杂而容易出错<img src='/icons/85924dou2.gif' /> <br/><LI>基于EJB模型<img src='/icons/85924de.gif' />容器持久化管理<img src='/icons/85924de.gif' />开发和管理过于复杂<img src='/icons/85924dou2.gif' />许多基础<img src='/icons/85924de.gif' />特征未考虑到<img src='/icons/85924dou.gif' />比如使用数据库序列和EJBQL定义<img src='/icons/85924yi.gif' />个主键<img src='/icons/85924de.gif' />标准思路方法就非常有限<img src='/icons/85924dou2.gif' /> <br/><LI>EJB组件不像是面向对象<img src='/icons/85924de.gif' /><img src='/icons/85924dou.gif' />比如在使用继承和多态时就有太多限制<img src='/icons/85924dou2.gif' /> <br/><LI><img src='/icons/85924yi.gif' />个主要<img src='/icons/85924de.gif' />EJB<img src='/icons/85924de.gif' />缺点是你不能脱离EJB容器测试<img src='/icons/85924yi.gif' />个EJB模型且不能在容器内调试<img src='/icons/85924yi.gif' />个EJB<img src='/icons/85924dou.gif' />这对开发者无疑是<img src='/icons/85924yi.gif' />个可怕<img src='/icons/85924de.gif' />事情<img src='/icons/85924dou2.gif' /> <br/></LI></UL>如果你使用EJB你需要熟悉<img src='/icons/85924diaoyong.gif' />和查找EJB<img src='/icons/85924de.gif' />复杂过程<img src='/icons/85924dou2.gif' />显然<img src='/icons/85924dou.gif' />你仅仅要在<img src='/icons/85924chengxu.gif' />中使用EJB但你却必须知道JNDI详细<img src='/icons/85924de.gif' />细节<img src='/icons/85924dou2.gif' />  <a href="/mypdf/6680.pdf" title="查看 j2eeejb:使用EJB3.O简化EJB开发(一)-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6680.html</guid>
		</item>
		<item>
			<title><![CDATA[j2eeejb:使用EJB3.O简化EJB开发(三)-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6678.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          LE id=HB_Mail_Container height=\"100%\" cellSpacing=0 cellPadding=0 width=\"100%\" border=0 unselectable=\"on\">  简化持久化容器管理 <br/><br/>CMP实体bean将成为EJB3.0使得开发人员强制使用<img src='/icons/62843de.gif' /><img src='/icons/62843yi.gif' />个主要<img src='/icons/62843de.gif' />检查方式<img src='/icons/62843dou2.gif' />持久化框架象如, 开源<img src='/icons/62843de.gif' />已经成为不像实体bean本质上<img src='/icons/62843de.gif' />复杂和重量级<img src='/icons/62843de.gif' />开发J2EE持久化框架应用<img src='/icons/62843de.gif' />被大家喜爱<img src='/icons/62843de.gif' />方式<img src='/icons/62843dou2.gif' /> EJB3.0采纳了如TopLink和Hibernate轻量级<img src='/icons/62843de.gif' />持久化模式来简化容器持久化管理<img src='/icons/62843dou.gif' />这些听起来更让开发人员们欣喜<img src='/icons/62843dou2.gif' />让我们简单<img src='/icons/62843de.gif' />浏览<img src='/icons/62843yi.gif' />下实体bean<img src='/icons/62843de.gif' />计划<img src='/icons/62843dou.gif' />我们将在另外<img src='/icons/62843de.gif' />文章中讨论持久化改进<img src='/icons/62843de.gif' />细节<img src='/icons/62843dou2.gif' /> <br/><br/>实体bean作为POJOs已经改头换面<img src='/icons/62843dou.gif' />实体bean将不在需要组件接口<img src='/icons/62843dou2.gif' />实体bean现在看起来是支持继承和多态<img src='/icons/62843de.gif' />纯粹<img src='/icons/62843de.gif' />对象<img src='/icons/62843dou2.gif' /> <br/><br/>下面<img src='/icons/62843de.gif' />是有关实体bean源代码 <br/><br/>@Entity public <img src='/icons/62843class.gif' /> Employee{ <br/><br/> private Long empNo; <br/><br/> private String empName; <br/><br/> private Address address; <br/><br/> private Hashmap projects = <img src='/icons/62843new.gif' /> Hashmap<img src='/icons/62843kh.gif' />; <br/><br/> private Double salary; <br/><br/> @Id(generate=SEQUENCE) public Long getEmpNo<img src='/icons/62843kh.gif' /> { <br/><br/> <img src='/icons/62843return.gif' /> empNo; <br/><br/> } <br/><br/> protected void <img src='/icons/62843set.gif' />EmpNo(Long empNo) { <br/><br/> this.empNo = empNo; <br/><br/> } <br/><br/> public String getEmpName<img src='/icons/62843kh.gif' /> { <br/><br/> <img src='/icons/62843return.gif' /> EmpName; <br/><br/> } <br/><br/> public void <img src='/icons/62843set.gif' />EmpName(String EmpName){ <br/><br/> this.EmpName = EmpName; <br/><br/> } <br/><br/> @Dependent public Address getAddress<img src='/icons/62843kh.gif' /> { <br/><br/> <img src='/icons/62843return.gif' /> address; <br/><br/> } <br/><br/> public void <img src='/icons/62843set.gif' />Address(Address address) { <br/><br/> this.address = address; <br/><br/> } <br/><br/> public Set getProjects<img src='/icons/62843kh.gif' /> { <br/><br/> <img src='/icons/62843return.gif' /> projects; <br/><br/> } <br/><br/> public void <img src='/icons/62843set.gif' />Projects(Set projects) { <br/><br/> this.projects = projects; <br/><br/> } <br/><br/> public Double getSalary<img src='/icons/62843kh.gif' /> { <br/><br/> <img src='/icons/62843return.gif' /> salary; <br/><br/> } <br/><br/> public void <img src='/icons/62843set.gif' />Salary(Double salary) { <br/><br/> this.salary = salary; <br/><br/> } <br/><br/> .... <br/><br/> } <br/><br/>如果你仔细看这些代码<img src='/icons/62843dou.gif' />你可以发现在现在<img src='/icons/62843de.gif' />实体bean中bean类是<img src='/icons/62843yi.gif' />个具体<img src='/icons/62843de.gif' />类而不再是<img src='/icons/62843yi.gif' />个抽象类<img src='/icons/62843dou2.gif' /> <br/><br/>EJB QL和实体bean<img src='/icons/62843de.gif' />SQL查询做了多项改进<img src='/icons/62843dou2.gif' />类似于Hibernate<img src='/icons/62843de.gif' />新<img src='/icons/62843de.gif' />实体管理API和简化版<img src='/icons/62843de.gif' />TopLink<img src='/icons/62843de.gif' />会话API被建议用来处理实体bean<img src='/icons/62843de.gif' />操作<img src='/icons/62843dou.gif' />也就是实体bean<img src='/icons/62843de.gif' />创建<img src='/icons/62843dou.gif' />释放<img src='/icons/62843dou.gif' />查找<img src='/icons/62843dou2.gif' /> <br/><br/>我们将在深入<img src='/icons/62843de.gif' />文章中进<img src='/icons/62843yi.gif' />步对建议CMP实体bean<img src='/icons/62843de.gif' />细节做更多<img src='/icons/62843de.gif' />验证<img src='/icons/62843dou2.gif' /> <br/><br/>简化EJB客户端 <br/><br/>即使应用中EJB是序列化<img src='/icons/62843de.gif' /><img src='/icons/62843dou.gif' />使用EJB也就是寻找和<img src='/icons/62843diaoyong.gif' />也是非常复杂<img src='/icons/62843de.gif' /><img src='/icons/62843dou2.gif' />J2EE 1.4 和 EJB 3.0规范标准致力于简化EJB客户端<img src='/icons/62843dou2.gif' /> <br/><br/>如果目前你希望使用EJB你必须在部署描述中定义EJB引用或者EJB本地引用<img src='/icons/62843dou.gif' />寻找到EJB然后<img src='/icons/62843diaoyong.gif' /><img src='/icons/62843dou2.gif' />如果我们希望<img src='/icons/62843diaoyong.gif' />HelloWorld <img src='/icons/62843de.gif' />EJB<img src='/icons/62843dou.gif' />你可以按照下面<img src='/icons/62843de.gif' />简单思路方法<img src='/icons/62843diaoyong.gif' />EJB使用已存在<img src='/icons/62843de.gif' />实现<img src='/icons/62843dou2.gif' /> <br/><br/>如下在部署描述中找到EJB指示<img src='/icons/62843de.gif' />定义 <br/><br/>&lt;ejb-ref&gt; <br/><br/> &lt;ejb-ref-name&gt;HelloWorldEJB&lt;/ejb-ref-name&gt; <br/><br/> &lt;ejb-ref-type&gt;Session&lt;/ejb-ref-type&gt; <br/><br/> &lt;home&gt;hello.HelloWorldHome&lt;/home&gt; <br/><br/> &lt;remote&gt; hello.HelloWorld&lt;/remote&gt; <br/><br/> &lt;/ejb-ref&gt; <br/><br/>然后按照如下思路方法寻找EJB.你需要明确处理EJB查找和建立<img src='/icons/62843yi.gif' />个bean例子时<img src='/icons/62843de.gif' />异常<img src='/icons/62843dou2.gif' /> <br/><br/>try <br/><br/> { <br/><br/> Context context = <img src='/icons/62843new.gif' /> InitialContext<img src='/icons/62843kh.gif' />; <br/><br/> HelloWorldHome helloHome = <br/><br/>  (HelloWorld)PortableRemoteObject.narrow(context.lookup <br/><br/> (\"java:comp/env/ejb/HelloWorldEJB\"), HelloWorldHome.<img src='/icons/62843class.gif' />); <br/><br/> HelloWorld hello = helloHome.create<img src='/icons/62843kh.gif' />; <br/><br/>  .... <br/><br/> } <br/><br/> catch(RemoteException e) <br/> 
		
          
              
          <br/>
        <br/>
          <br/> { <br/><br/>  <img src='/icons/62843System.gif' />.err.pr<img src='/icons/62843int.gif' />ln(\"<img src='/icons/62843System.gif' />/communication error: \" + e.getMessage<img src='/icons/62843kh.gif' />); <br/><br/> } <br/><br/> catch(NamingException e) <br/><br/> { <br/><br/>  <img src='/icons/62843System.gif' />.err.pr<img src='/icons/62843int.gif' />ln(\"Communication error: \" + e.getMessage<img src='/icons/62843kh.gif' />); <br/><br/> } <br/><br/> catch(CreateException e) <br/><br/> { <br/><br/>  <img src='/icons/62843System.gif' />.err.pr<img src='/icons/62843int.gif' />ln(\"Error creating EJB instance: \" + e.getMessage<img src='/icons/62843kh.gif' />); <br/><br/> } <br/><br/>如<img src='/icons/62843yi.gif' />个环境变量<img src='/icons/62843de.gif' />变化<img src='/icons/62843yi.gif' />样<img src='/icons/62843dou.gif' />EJB3.0建议使用安放injection<img src='/icons/62843de.gif' />思路方法查找和<img src='/icons/62843diaoyong.gif' />EJB. <br/><br/>下面我们使用安放injection<img src='/icons/62843de.gif' />思路方法在另<img src='/icons/62843yi.gif' />个EJB查找HelloWorldEJB<img src='/icons/62843dou2.gif' /> <br/><br/>@Inject private void <img src='/icons/62843set.gif' />SessionContext(SessionContext ctx) <br/><br/> { <br/><br/> this.ctx = ctx <br/><br/> } <br/><br/> ... <br/><br/> myHello = (HelloWorld)ctx.lookup(\"java:comp/env/ejb/HelloWorldEJB\"); <br/><br/>如果你仔细查看上面<img src='/icons/62843de.gif' />代码<img src='/icons/62843dou.gif' />它依赖<img src='/icons/62843de.gif' />injection使用@Inject<img src='/icons/62843set.gif' />来<img src='/icons/62843de.gif' />指定对SessionContext思路方法<img src='/icons/62843de.gif' />annotations<img src='/icons/62843dou2.gif' />injection 思路方法将可以在业务思路方法被EJB<img src='/icons/62843diaoyong.gif' />前被容器<img src='/icons/62843diaoyong.gif' />来设定EJBContext<img src='/icons/62843dou2.gif' /> <br/><br/>另<img src='/icons/62843yi.gif' />个injected <img src='/icons/62843de.gif' />HelloWorld会话bean<img src='/icons/62843de.gif' />直接<img src='/icons/62843de.gif' />范例可以简化为使用 <br/><br/>@EJB public HelloWorld myHello<img src='/icons/62843dou.gif' />这将使得myHello被HelloWorld bean<img src='/icons/62843de.gif' />例子injected <img src='/icons/62843dou2.gif' /> <br/><br/>你可以使用依赖<img src='/icons/62843de.gif' />injection来查询任何类型<img src='/icons/62843de.gif' />环境和资源参考如DataSource, JMS, Mail, Web Service等等<img src='/icons/62843dou2.gif' /> <br/><br/>容器外部测试可行性 <br/><br/><img src='/icons/62843yi.gif' />个现在EJB开发者所关注<img src='/icons/62843de.gif' />不仅仅是EJB开发<img src='/icons/62843de.gif' />复杂<img src='/icons/62843dou.gif' />也包括了测试<img src='/icons/62843de.gif' />可怕的处<img src='/icons/62843dou2.gif' />开发和测试EJB必须需要<img src='/icons/62843yi.gif' />个EJB容器并且开发人员必须熟悉最终部署平台才可以执行测试<img src='/icons/62843dou2.gif' />这对于许多只在<img src='/icons/62843yi.gif' />个主要平台开发<img src='/icons/62843de.gif' />企业开发人员来说不是主要问题<img src='/icons/62843dou.gif' />但是对于支持多个开发商平台并且要在维护<img src='/icons/62843de.gif' />多个环境中测试EJB<img src='/icons/62843de.gif' />ISV们来说是个大问题<img src='/icons/62843dou2.gif' />EJB3.0规范标准承诺将提供在容器外测试<img src='/icons/62843de.gif' />功能<img src='/icons/62843dou.gif' />但是这点在这次<img src='/icons/62843de.gif' />规范标准中遗漏掉了<img src='/icons/62843dou2.gif' /> <br/><br/>结论 <br/><br/>虽然还有很多有关打包<img src='/icons/62843dou.gif' />装配和重要<img src='/icons/62843de.gif' />API细节没有在这个规范标准中提及<img src='/icons/62843dou.gif' />但是诸多<img src='/icons/62843de.gif' />建议使得EJB3.0规范标准让企业级Java开发人员看起来是恨有前途<img src='/icons/62843de.gif' /><img src='/icons/62843dou2.gif' />通过这些无疑是从开发人员到服务供应商都将帮助减少开发<img src='/icons/62843de.gif' />复杂性<img src='/icons/62843dou2.gif' />下面就要看服务提供商们如何实现<img src='/icons/62843dou.gif' />并使得EJB3.0成为企业级应用<img src='/icons/62843yi.gif' />个引人瞩目<img src='/icons/62843de.gif' />选择<img src='/icons/62843dou2.gif' /> <br/><br/>Author Bio 作者自述 <br/><br/>Debu Panda是Oracle应用服务开发小组<img src='/icons/62843de.gif' />主要管理者<img src='/icons/62843dou.gif' />他<img src='/icons/62843de.gif' />在EJB容器和事务管理上取得过很多成就<img src='/icons/62843dou2.gif' />他已经有13年<img src='/icons/62843de.gif' />IT产业<img src='/icons/62843de.gif' />经验并在多家杂志和技术出版社刊登过很多著作<img src='/icons/62843dou2.gif' /> <br/><br/> <br/><br/>翻译问题: <br/><br/>由于部分英文名词未敢枉自翻译<img src='/icons/62843dou.gif' />所以留英文原词在文中 <br/><br/>Cleaning up the Dirty Laundry 整理缺陷 <br/><br/>low carb <br/><br/>Atkins diet <br/><br/>metadata annotations  元数据描述 <br/><br/>Simpl<img src='/icons/62843if.gif' />ying Client View for EJBs 简化EJB客户端 <br/><br/>dependency injection  依赖型injection <br/><br/><img src='/icons/62843set.gif' />ter injection   安放injection <br/><br/>ISV Independent software vendor 独立软件Software供应商 <br/> <br/> <br/>  <a href="/mypdf/6678.pdf" title="查看 j2eeejb:使用EJB3.O简化EJB开发(三)-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6678.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee项目开发:J2EE项目中开发团队的组建-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6671.html</link>
			<description>
				<![CDATA[

			
            这种应用模型允许不同的开发人员同时进行开发的各个元素。这里阐述一下对不同层次的设计人员，开发人员的技术要求。对以下几个分类进行描述。<BR>　　设计师组建团队<BR>　　表现逻辑层的团队角色<BR>　　业务逻辑层等团队角色<BR>　　数据库访问层的团队角色<BR><BR>　　团队的组成可以根据人员的数量和系统的范围大小。例如，不一定所有的角色都要分配，有些人可以担当不能的角色。<BR><BR>设计师<BR>在基于组件的应用系统开发中，一个或几个人必须对这个系统的整体需求有全面的了解，比如系统的控制流程，和其他的接口等等。有些公司称这个角色为总工程师，不管怎么叫，这个角色非常重要，他承担协调不同开发小组之间的工作，帮助他们考虑系统这个“大图”。<BR><BR>表现逻辑层的团队角色<BR>在表现层，用户界面是动态生成的。需要如下开发人员：<BR>　　Javaservlet开发人员<BR>　　JSP开发人员<BR>　　HTML设计人员<BR>　　美工人员<BR>　　客户端的javascript开发人员<BR>　　Servlet开发人员建立表现层的逻辑，而其他人员建立表现的形式。<BR><BR>JavaServlet开发人员<BR>Servlet处理页和页之间的浏览，会话管理，简单的输入验证。Servlet也将业务逻辑的元素连接起来。<BR>Servlet开发人员必须理解一些相关事宜，HTTP请求，安全，多语言，和一些页面元素如session,cookie，超时等等。J2EE的应用里面，servlet必须用Java来写，Servlet可能会调用JSP,EJB,JDBC等等。因此，servlet开发人员要与应用系统的其他人员紧密合作。<BR><BR>JSP开发人员<BR>JSP开发人员与servlet开发人员密切合作来定义系统的表现层页面。即使在复杂的开发项目里，JSP和servlet的开发人员也可能是一个人。<BR><BR><BR>　　然而，如果一个系统中大部分Java在servlet而不是在JSP里，JSP人员就不必对Java非常熟悉。<BR><BR>HTML设计人员<BR>HTML设计人员对HTML页面进行优化。例如，他可能要完成以下任务：<BR><BR>　　保证在不同的浏览器中所有的页面都能正常显示<BR>　　保证低速的调制解调器访问也不受影响<BR>　　对JSP设计人员的页面进行进一步的优化<BR><BR>美工人员<BR>美工人员创建图片等等。这些图片要能小体积，快速下载。美工与HTML页面人员紧密合作。<BR><BR>客户端的javascript开发人员<BR>使用客户端的javascript有很多原因。比如，可以处理简单的输入验证，不必提交给服务器，还可以让用户界面更生动。这个角色和servlet,JSP人员紧密合作。<BR><BR>业务逻辑层的团队角色<BR>业务逻辑层包含业务规则和业务实体。需要以下人员：<BR>Sessionbean开发人员<BR>　　Entitybean开发人员<BR><BR>SessionBean开发人员<BR>Sessionbeans包含业务处理和业务规则的逻辑。比如，一个sessionbean可能设计成计算一个支票的税率。如果一个系统面临处理经常变化的复杂逻辑，而又大量使用sessionbean，结果是，sessionbean就需要不断的更新。<BR><BR>　　Sessionbean的开发人员一般是一个领域的专家，理解复杂的，专门领域的逻辑，还有数据验证的规则。这个人员与servlet和entitybean开发人员紧密合作。<BR><BR>　　Sessionbean可能需要调用JDBC接口，和其他的EJB。无状态的sessionbean系统运行的会更好一些。因为，如果计算费率是一个有状态的sessionbean，系统就必须访问一个保存bean的状态信息的服务器。如果那个服务器恰巧出现问题，整个流程就会受阻。<BR><BR>EntityBean开发人员<BR>Entitybean代表永久的对象，如一个数据库中的一条记录。Entitybean开发人员的任务是设计一个面向对象的所有业务数据的组织图。建立面向对象的试图意味着要将数据库中的表（关系型的）映射成entitybean。例如，开发人员需要将客户表，发票表，和订单表转换成相应的客户，发票，和订单对象。<BR><BR><BR>　　一个entitybean开发人员与sessionbean,Servlet开发人员密切合作，保证应用系统提供快速的，灵活的，可扩展的对业务数据的访问。<BR><BR>　　Entitybean可能会大量的调用JDBC接口。而entitybean之间的调用会很少。<BR><BR>数据库访问层的团队角色<BR>在数据库访问层，开发人员需要建立关系型数据库的ER图，数据字典等等相关文档。所有对数据库的修改，访问等等权限操作都要经过数据库访问层开发人员。这个角色在大部分项目中担当DBA的角色。<BR><BR>　　团队组建之后，就可以开始设计用户界面。<BR><BR>设计用户界面<BR>建议从前到后开始设计应用系统。就是说，先设计用户界面，再设计EJB，这样效率最高。             <a href="/mypdf/6671.pdf" title="查看 j2ee项目开发:J2EE项目中开发团队的组建-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2008-09-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6671.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:开发J2EE应用的要领-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6669.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          <img src='/icons/91231dou.gif' />作为开发mission-critical<img src='/icons/91231de.gif' />企业级应用<img src='/icons/91231de.gif' /><img src='/icons/91231yi.gif' />整套规范标准<img src='/icons/91231de.gif' />整合平台<img src='/icons/91231dou2.gif' />其规范标准的多、内容的广<img src='/icons/91231dou.gif' />从而给开发J2EE应用带来了很多“麻烦”<img src='/icons/91231dou2.gif' />比如<img src='/icons/91231dou.gif' />为实现内容<img src='/icons/91231de.gif' />RDBMS存储<img src='/icons/91231dou.gif' />我们可能<img src='/icons/91231de.gif' />思路方法有JDBC、Entity Beans、JDO、O/R Mapping工具(TopLink、Hibernate)、XML-DBMS、JAXB等思路方法(其中<img src='/icons/91231yi.gif' />些思路方法不是J2EE规范标准所包含<img src='/icons/91231de.gif' />)<img src='/icons/91231dou2.gif' />因此<img src='/icons/91231dou.gif' />为实现J2EE各层(至少有表示层、控制层、商业逻辑层等3层)以及层和层的间<img src='/icons/91231de.gif' />耦合<img src='/icons/91231dou.gif' />J2EE系统架构师需要考虑<img src='/icons/91231de.gif' />问题会很多<img src='/icons/91231dou2.gif' />加上<img src='/icons/91231dou.gif' />J2EE本身<img src='/icons/91231de.gif' />快速发展<img src='/icons/91231dou.gif' />给架构、开发具有工业强度<img src='/icons/91231de.gif' />J2EE应用带来<img src='/icons/91231yi.gif' />些难题<img src='/icons/91231dou2.gif' /><br/>同时<img src='/icons/91231dou.gif' />软件Software开发技术从来就没有“银弹”<img src='/icons/91231dou.gif' />所以J2EE技术也不是万能<img src='/icons/91231de.gif' /><img src='/icons/91231dou2.gif' />但是<img src='/icons/91231dou.gif' />如果我们在结合具体商业需求<img src='/icons/91231de.gif' />基础上<img src='/icons/91231dou.gif' />合理<img src='/icons/91231de.gif' />应用好J2EE技术<img src='/icons/91231dou.gif' />其结果可想而知<img src='/icons/91231dou2.gif' />本文试探从自己以往<img src='/icons/91231de.gif' />项目经验来探讨开发J2EE应用应该遵循<img src='/icons/91231de.gif' />几点准测入手<img src='/icons/91231dou.gif' />以起到抛砖引玉<img src='/icons/91231de.gif' />作用<img src='/icons/91231dou2.gif' />如果能达到这<img src='/icons/91231yi.gif' />点要求<img src='/icons/91231dou.gif' />则万分激动<img src='/icons/91231dou2.gif' /><br/>本文结合JBoss 3.2.1下<img src='/icons/91231de.gif' />J2EE应用开发为例展开论述<img src='/icons/91231dou2.gif' /> 1<img src='/icons/91231dou.gif' />结合商业需求选择合理<img src='/icons/91231de.gif' />架构<br/><br/>如果脱离商业需求<img src='/icons/91231dou.gif' />而单独<img src='/icons/91231de.gif' />讨论技术本身<img src='/icons/91231de.gif' />优势是不够<img src='/icons/91231de.gif' /><img src='/icons/91231dou2.gif' />各项技术都有产生<img src='/icons/91231de.gif' />特定背景<img src='/icons/91231dou.gif' />其中很多都是来自工业需求而触动<img src='/icons/91231de.gif' /><img src='/icons/91231dou2.gif' /><img src='/icons/91231yi.gif' />般而言<img src='/icons/91231dou.gif' />企业信息系统(EIS)都要求自己稳定、安全、可靠、高效、便于维护<img src='/icons/91231dou2.gif' />同时<img src='/icons/91231dou.gif' />各个企业信息系统都有自己独特<img src='/icons/91231de.gif' />要求<img src='/icons/91231dou.gif' />可能有些时候需要考虑和原有遗留系统<img src='/icons/91231de.gif' />集成<img src='/icons/91231dou.gif' />所以了解各个企业信息系统具体<img src='/icons/91231de.gif' />商业需求对于整个系统<img src='/icons/91231de.gif' />架构显得很关键<img src='/icons/91231dou2.gif' /><br/>比如<img src='/icons/91231dou.gif' />如果待开发<img src='/icons/91231de.gif' />J2EE应用系统中使用到<img src='/icons/91231de.gif' />数据大部分来自于外在数据源；而这些数据可能是通过JDBC直接从外在数据源导入到待开发<img src='/icons/91231de.gif' />J2EE系统<img src='/icons/91231de.gif' />Database中<img src='/icons/91231dou2.gif' />对于这种情形<img src='/icons/91231dou.gif' />如果在开发过程中<img src='/icons/91231dou.gif' />仅仅使用JDBC来操作数据库<img src='/icons/91231dou.gif' />对于小强度(并发访问用户少、数据流量少)<img src='/icons/91231de.gif' />情形<img src='/icons/91231dou.gif' />显然是比较合适<img src='/icons/91231de.gif' />；但如果<img src='/icons/91231dou.gif' />并发访问用户较多、数据流量大<img src='/icons/91231dou.gif' />对Database层使用较为频繁<img src='/icons/91231de.gif' />情形<img src='/icons/91231dou.gif' />则显得有些力不从心<img src='/icons/91231dou2.gif' />因此<img src='/icons/91231dou.gif' />对于这种需求<img src='/icons/91231dou.gif' />我们可以考虑采用Entity Beans with Caches<img src='/icons/91231dou2.gif' />打个比方<img src='/icons/91231dou.gif' />在JBoss 3.2.1中对于Entity Beans<img src='/icons/91231de.gif' />Cache策略有多种<img src='/icons/91231dou.gif' />这时可以考虑使用<img src='/icons/91231dou.gif' /><img src='/icons/91231dou.gif' />即“Standard CMP 2.x EntityBean”<img src='/icons/91231dou.gif' />方式并采用“D”类型<img src='/icons/91231de.gif' />commit-option来保证Entity Beans<img src='/icons/91231de.gif' />内容和数据源<img src='/icons/91231de.gif' />同步<img src='/icons/91231dou.gif' />并使得系统<img src='/icons/91231de.gif' />性能得到大大改善(同直接使用JDBC相比)<img src='/icons/91231dou2.gif' />其中<img src='/icons/91231dou.gif' />可以将<img src='/icons/91231yi.gif' />些Entity Beans设置为read-only<img src='/icons/91231dou.gif' />以改善性能<img src='/icons/91231dou2.gif' /><br/>当然<img src='/icons/91231dou.gif' />在这里也可以采用其他<img src='/icons/91231yi.gif' />些O/R Mapping技术<img src='/icons/91231dou.gif' />比如TopLink<img src='/icons/91231dou2.gif' /><br/>再比如<img src='/icons/91231dou.gif' />考虑这样<img src='/icons/91231yi.gif' />种情形:如果待开发<img src='/icons/91231de.gif' />企业信息系统使用到<img src='/icons/91231de.gif' />数据都是由系统本身生成和操作<img src='/icons/91231de.gif' /><img src='/icons/91231dou.gif' />则建议采用:CMP Entity Beans技术<img src='/icons/91231dou2.gif' />Entity Beans给大家<img src='/icons/91231de.gif' />印象很坏<img src='/icons/91231dou.gif' />这可能和EJB 1.1给大家留下<img src='/icons/91231de.gif' />坏映象有关吧<img src='/icons/91231dou2.gif' />但是<img src='/icons/91231dou.gif' />EJB 2.0(或者说2.1)得到了很大<img src='/icons/91231de.gif' />改善<img src='/icons/91231dou.gif' />Local Interfaces、CMR、Read-Only、Session Fa&ccedil;ade模式给Entity Beans注入了活力<img src='/icons/91231dou2.gif' />当然<img src='/icons/91231dou.gif' />并发用户多、数据流量很大时才会体现出使用Entity Beans<img src='/icons/91231de.gif' />优势<img src='/icons/91231dou2.gif' />其中<img src='/icons/91231dou.gif' />有<img src='/icons/91231yi.gif' />点很关键:要注重Entity Beans技术<img src='/icons/91231de.gif' />性能调优<img src='/icons/91231dou.gif' />各个应用服务器都有自己<img src='/icons/91231de.gif' /><img src='/icons/91231yi.gif' />套性能调优方案<img src='/icons/91231dou2.gif' />对于JBoss 3.2.1<img src='/icons/91231dou.gif' />配置文件standardjboss.xml提供了Entity Beans技术调优<img src='/icons/91231de.gif' />入口<img src='/icons/91231dou2.gif' />比如<img src='/icons/91231dou.gif' />Bean Lock策略<img src='/icons/91231de.gif' />合理使用对于Entity Beans<img src='/icons/91231de.gif' />调优就显得很重要<img src='/icons/91231dou2.gif' />这样使得<img src='/icons/91231dou.gif' />我们可以更加关注于系统<img src='/icons/91231de.gif' />商业逻辑<img src='/icons/91231dou.gif' />而不只是底层<img src='/icons/91231de.gif' />Database(EJB调优处于EJB Container中<img src='/icons/91231dou.gif' />因此我们处在J2EE性能<img src='/icons/91231de.gif' />高端<img src='/icons/91231dou.gif' />而不是底端<img src='/icons/91231dou.gif' />即Database层<img src='/icons/91231dou2.gif' />同时<img src='/icons/91231dou.gif' />Database层<img src='/icons/91231de.gif' />调优使得J2EE系统<img src='/icons/91231de.gif' />数据库移植性大打折扣<img src='/icons/91231dou2.gif' />)<img src='/icons/91231dou2.gif' /><br/>简而言的<img src='/icons/91231dou.gif' />要结合各个系统<img src='/icons/91231de.gif' />特定需求和状况给出具体<img src='/icons/91231de.gif' />技术架构方案<img src='/icons/91231dou.gif' />而不能孤单<img src='/icons/91231de.gif' />论述技术本身<img src='/icons/91231de.gif' />好坏<img src='/icons/91231dou2.gif' /><br/><br/>2<img src='/icons/91231dou.gif' />Framework<img src='/icons/91231de.gif' />合理选用<br/><br/>设计模式在J2EE应用系统中扮演着重要<img src='/icons/91231de.gif' />角色<img src='/icons/91231dou2.gif' />因此<img src='/icons/91231dou.gif' />有<img src='/icons/91231yi.gif' />个问题摆在大家面前<img src='/icons/91231dou.gif' />是自己来实现具体<img src='/icons/91231de.gif' />设计模式<img src='/icons/91231dou.gif' />还是借助于Third-party Framework<img src='/icons/91231dou2.gif' />如果贵公司不大<img src='/icons/91231dou.gif' />或者说公司不想在J2EE基础应用Framework投入很多精力<img src='/icons/91231dou.gif' />选用现有<img src='/icons/91231de.gif' />较为成熟<img src='/icons/91231de.gif' />、稳定、和现有J2EE Spec<img src='/icons/91231if.gif' />ication兼容<img src='/icons/91231de.gif' />技术框架会比较明智<img src='/icons/91231dou2.gif' /><br/><img src='/icons/91231yi.gif' />般而言<img src='/icons/91231dou.gif' />Framework本身<img src='/icons/91231dou.gif' />或者说J2EE平台本身都是实现并优化了具体<img src='/icons/91231de.gif' />设计模式、规则<img src='/icons/91231dou.gif' />比如业务代理、Service Locator(包括Web Tier和EJB Tier各自<img src='/icons/91231de.gif' />服务定位器<img src='/icons/91231dou.gif' />起到统<img src='/icons/91231yi.gif' />管理有限资源、Cache相关资源<img src='/icons/91231de.gif' />作用<img src='/icons/91231dou.gif' />便于系统移植)、Front Controller、DAO等等<img src='/icons/91231dou2.gif' />现有<img src='/icons/91231de.gif' />J2EE Framework比较丰富<img src='/icons/91231dou2.gif' />比如:<br/>Struts: 对于实现了Model 2类型<img src='/icons/91231de.gif' />Framework<img src='/icons/91231dou.gif' />对于现在以及将来(随着JSF规范标准、技术<img src='/icons/91231de.gif' />成熟)<img src='/icons/91231dou.gif' />选用她是<img src='/icons/91231yi.gif' />种明智的举<img src='/icons/91231dou2.gif' />目前<img src='/icons/91231dou.gif' />Struts已经发展到1.1版本<img src='/icons/91231dou2.gif' />其内在<img src='/icons/91231de.gif' />MVC主线、对后端数据操作方式没有限定、集合了Apache Jakarta项目组<img src='/icons/91231de.gif' />优秀相关项目<img src='/icons/91231de.gif' />精华<img src='/icons/91231dou.gif' />可谓是开发J2EE应用<img src='/icons/91231de.gif' />佳品<img src='/icons/91231dou2.gif' />同时<img src='/icons/91231dou.gif' />对于具有.NET Web Forms功能<img src='/icons/91231de.gif' />下<img src='/icons/91231yi.gif' />代J2EE平台技术JSF而言<img src='/icons/91231dou.gif' />Struts本身可考虑到和JSF<img src='/icons/91231de.gif' />兼容和集成性<img src='/icons/91231dou2.gif' />比如<img src='/icons/91231dou.gif' />通过JSP呈现表示层、Servlet呈现控制层、EJB呈现数据存储层<img src='/icons/91231dou2.gif' />各层的间<img src='/icons/91231dou.gif' />可以通过值对象、HTTP相关对象来通讯<img src='/icons/91231dou.gif' />实现J2EE相关技术<img src='/icons/91231de.gif' />完美应用<img src='/icons/91231dou2.gif' /><br/>Log4j: 我想对于习惯采用“<img src='/icons/91231System.gif' />.out.pr<img src='/icons/91231int.gif' />ln(“”);”<img src='/icons/91231de.gif' />读者而言<img src='/icons/91231dou.gif' />Log4j是大家<img src='/icons/91231de.gif' />福音<img src='/icons/91231dou2.gif' />尽管Java 2 Standard Edition也具备java.util.logging包来保证日志<img src='/icons/91231de.gif' />输出<img src='/icons/91231dou.gif' />但Log4j<img src='/icons/91231de.gif' />简单、高效、灵活已经成了很多项目<img src='/icons/91231de.gif' />选择<img src='/icons/91231dou2.gif' />日志<img src='/icons/91231dou.gif' />在某种程度上可以考验系统<img src='/icons/91231de.gif' />稳定性、正确性<img src='/icons/91231dou.gif' />所以采用可配置<img src='/icons/91231de.gif' />Log4j(目前<img src='/icons/91231dou.gif' />Log4j已经考虑到了和java.util.logging包<img src='/icons/91231de.gif' />兼容性)是不会错<img src='/icons/91231de.gif' /><img src='/icons/91231dou2.gif' />比如<img src='/icons/91231dou.gif' />JBoss 3.2.1本身就是借助于Log4j来管理日志<img src='/icons/91231de.gif' /><img src='/icons/91231dou2.gif' /><br/>realMethods: 可能有些读者还不知道这<img src='/icons/91231yi.gif' />款杀手锏<img src='/icons/91231dou2.gif' />那好<img src='/icons/91231dou.gif' />这里就简要作<img src='/icons/91231yi.gif' />介绍<img src='/icons/91231dou2.gif' /><br/>realMethods是<img src='/icons/91231yi.gif' />开发J2EE应用<img src='/icons/91231de.gif' />Framework<img src='/icons/91231dou.gif' />她区别于Struts(主要在于实现Model 2<img src='/icons/91231dou.gif' />J2EE应用前端)；realMethods对于J2EE应用<img src='/icons/91231de.gif' />各个层面都有详尽、高效<img src='/icons/91231de.gif' />支持<img src='/icons/91231dou2.gif' />同时<img src='/icons/91231dou.gif' />realMethods以前还是商用软件Software<img src='/icons/91231dou.gif' />现在已经成为了Open Source<img src='/icons/91231de.gif' />产品<img src='/icons/91231dou.gif' />因此现在可以参看其全部源代码<img src='/icons/91231dou2.gif' /><br/>BC4J: Oracle公司推出<img src='/icons/91231de.gif' />用于Java<img src='/icons/91231de.gif' />商业组件<img src='/icons/91231dou2.gif' />其内容和外在<img src='/icons/91231de.gif' />特点和优势<img src='/icons/91231dou.gif' />不言而寓<img src='/icons/91231dou2.gif' /><br/>当然<img src='/icons/91231dou.gif' />类似<img src='/icons/91231de.gif' />Framework很多很多<img src='/icons/91231dou2.gif' />作为开发J2EE应用<img src='/icons/91231de.gif' />团队(Team)而言<img src='/icons/91231dou.gif' />我们需要对各种Framework加以筛选<img src='/icons/91231dou.gif' />选择适合项目需求、团队(Team)、公司发展方向<img src='/icons/91231de.gif' />框架<img src='/icons/91231dou2.gif' /><br/><img src='/icons/91231yi.gif' />般情况下<img src='/icons/91231dou.gif' />待开发<img src='/icons/91231de.gif' />目标产品不宜采用过多<img src='/icons/91231de.gif' />Framework<img src='/icons/91231dou2.gif' />其<img src='/icons/91231yi.gif' /><img src='/icons/91231dou.gif' />J2EE各个技术发展很快<img src='/icons/91231dou.gif' />过多<img src='/icons/91231de.gif' />Framework使得系统<img src='/icons/91231de.gif' />后续升级、维护不利；其 2<img src='/icons/91231dou.gif' />可以借鉴其中<img src='/icons/91231de.gif' />好<img src='/icons/91231de.gif' /><img src='/icons/91231yi.gif' />面<img src='/icons/91231dou.gif' />比如研究realMethods实现<img src='/icons/91231de.gif' />相应<img src='/icons/91231de.gif' />设计模式<img src='/icons/91231dou.gif' />并改造她以适合我们<img src='/icons/91231de.gif' />项目需求；其 3<img src='/icons/91231dou.gif' />Framework本身会有变动<img src='/icons/91231dou.gif' />如果选用过多<img src='/icons/91231dou.gif' />会给开发团队(Team)加重负担<img src='/icons/91231dou.gif' />从而不利于项目管理(project management)<img src='/icons/91231dou2.gif' /> 
		
          
              
          <br/>
        <br/>
          <br/>有选择<img src='/icons/91231de.gif' />使用现有<img src='/icons/91231de.gif' />成熟Framework能提升大家<img src='/icons/91231de.gif' />开发效率、开发水平<img src='/icons/91231dou2.gif' /><br/><br/>3<img src='/icons/91231dou.gif' />开发模式<img src='/icons/91231de.gif' />选择<br/><br/>开发J2EE应用要求目标开发人员能够掌握其中<img src='/icons/91231de.gif' />各种技术<img src='/icons/91231dou2.gif' />但是<img src='/icons/91231dou.gif' />现实情况不是这样<img src='/icons/91231dou2.gif' />作为<img src='/icons/91231yi.gif' />个团队(Team)<img src='/icons/91231dou.gif' />每个人都有自己区别<img src='/icons/91231de.gif' />技能优势、兴趣以及悟性<img src='/icons/91231dou2.gif' />同时<img src='/icons/91231dou.gif' />J2EE本身需要体现社会分工<img src='/icons/91231dou2.gif' /><img src='/icons/91231yi.gif' />般情况下<img src='/icons/91231dou.gif' />我们<img src='/icons/91231de.gif' />开发团队(Team)不会有Spec<img src='/icons/91231if.gif' />ication所要求<img src='/icons/91231de.gif' />各个开发角色<img src='/icons/91231dou2.gif' />现实往往只有3种(也可能是两种):美工、JSP<img src='/icons/91231chengxu.gif' />员、EJB<img src='/icons/91231chengxu.gif' />员<img src='/icons/91231dou2.gif' />面对这种分工<img src='/icons/91231dou.gif' />团队(Team)更要注重沟通、交流<img src='/icons/91231dou.gif' />注重代码<img src='/icons/91231de.gif' /><img src='/icons/91231yi.gif' />致性<img src='/icons/91231dou2.gif' /><br/><img src='/icons/91231yi.gif' />般情况下<img src='/icons/91231dou.gif' />团队(Team)要尽量采用版本控制工具管理代码、尽量做到每天都有<img src='/icons/91231yi.gif' />个完整<img src='/icons/91231de.gif' />运行版本<img src='/icons/91231dou2.gif' />经过<img src='/icons/91231yi.gif' />段时间<img src='/icons/91231dou.gif' />团队(Team)都会适应这种开发模式<img src='/icons/91231dou2.gif' />其中<img src='/icons/91231dou.gif' />版本控制工具<img src='/icons/91231yi.gif' />定要使用<img src='/icons/91231dou.gif' />便于代码<img src='/icons/91231de.gif' />管理、控制和备份<img src='/icons/91231dou2.gif' />这其中会牵扯到很多层面<img src='/icons/91231dou2.gif' />比如<img src='/icons/91231dou.gif' />开发工具<img src='/icons/91231de.gif' />选择要考虑到版本控制工具<img src='/icons/91231de.gif' />使用、建模工具<img src='/icons/91231de.gif' />合理使用有助于团队(Team)有效<img src='/icons/91231de.gif' />沟通和交流<img src='/icons/91231dou2.gif' /><br/>基于现有<img src='/icons/91231de.gif' />开发模式<img src='/icons/91231dou.gif' />个人认为这样3套方案不错<img src='/icons/91231dou2.gif' />第<img src='/icons/91231yi.gif' /><img src='/icons/91231dou.gif' />采用Together作为建模工具、采用JBuilder作为IDE工具、采用VSS(或者CVS)作为版本控制工具、采用JBoss作为开发J2EE应用开发阶段<img src='/icons/91231de.gif' />服务器<img src='/icons/91231dou2.gif' />第 2<img src='/icons/91231dou.gif' />采用WebSphere Studio整套工具<img src='/icons/91231dou2.gif' />第 3<img src='/icons/91231dou.gif' />采用Eclipse(或者JCreator)、Ant、XDoclets作为开发工具<img src='/icons/91231dou2.gif' /><br/>当然<img src='/icons/91231dou.gif' />手工完成J2EE应用<img src='/icons/91231de.gif' />编写、编译、打包、部署、测试更能使开发者理解各个开发阶段<img src='/icons/91231de.gif' />具体细节<img src='/icons/91231dou2.gif' />但本人认为<img src='/icons/91231dou.gif' />只要开发者有这种关注具体细节<img src='/icons/91231de.gif' />态度<img src='/icons/91231dou.gif' />选用功能强大<img src='/icons/91231de.gif' />建模、开发工具是明智<img src='/icons/91231de.gif' /><img src='/icons/91231dou2.gif' />开发工具不能提高开发人员<img src='/icons/91231de.gif' />开发技能<img src='/icons/91231dou.gif' />但是她能够引导开发人员正确<img src='/icons/91231de.gif' />开发方向<img src='/icons/91231dou2.gif' />比如,JBuidler 9 Enterprise提供<img src='/icons/91231de.gif' />EJB精灵具有<img src='/icons/91231de.gif' />“Struts + EJB + Session Fa&ccedil;ade + Value Object”等功能呈现了业界广泛应用<img src='/icons/91231de.gif' />J2EE构架方式<img src='/icons/91231dou2.gif' /><br/><br/>4<img src='/icons/91231dou.gif' />注重各个阶段<img src='/icons/91231de.gif' />测试工作<br/><br/>测试工作往往是很多项目经理(project manager)忽视<img src='/icons/91231dou.gif' />不愿意去花费时间、费用<img src='/icons/91231de.gif' />内容<img src='/icons/91231dou.gif' /><img src='/icons/91231yinwei.gif' />那样会增加项目<img src='/icons/91231de.gif' />成本<img src='/icons/91231dou2.gif' />但是<img src='/icons/91231dou.gif' />他们忽视了<img src='/icons/91231dou.gif' />项目<img src='/icons/91231de.gif' />完成质量往往对项目<img src='/icons/91231de.gif' />成本有很大<img src='/icons/91231de.gif' />关系<img src='/icons/91231dou2.gif' />比如<img src='/icons/91231dou.gif' />如果软件Software质量很差<img src='/icons/91231dou.gif' />并没有经历测试阶段<img src='/icons/91231dou.gif' />其后期部署、运行所带来<img src='/icons/91231de.gif' />费用会远远超过前期<img src='/icons/91231de.gif' />费用<img src='/icons/91231dou2.gif' /><br/>测试是分阶段<img src='/icons/91231de.gif' /><img src='/icons/91231dou2.gif' />单元测试<img src='/icons/91231dou.gif' />比如借助于JUnit<img src='/icons/91231dou.gif' />来保证功能正确等内容<img src='/icons/91231dou2.gif' />集成测试<img src='/icons/91231dou.gif' />来保证系统没有内存泄漏等内容<img src='/icons/91231dou2.gif' />其中<img src='/icons/91231dou.gif' />Optimizeite Suite Enterprise对于完成Profiler、Code Coverage、Thread Debugger等内容很有帮助<img src='/icons/91231dou2.gif' />我记得<img src='/icons/91231dou.gif' />我写<img src='/icons/91231de.gif' /><img src='/icons/91231yi.gif' />个Swing桌面应用存在内容泄漏<img src='/icons/91231dou.gif' />但是想了很多办法都没有解决问题<img src='/icons/91231dou2.gif' />后来<img src='/icons/91231dou.gif' />采用Profiler获得了答案<img src='/icons/91231dou2.gif' />因此<img src='/icons/91231dou.gif' />现在开发应用<img src='/icons/91231dou.gif' />我们很多时候都采用Optimizeite Suite Enterprise作为测试工具<img src='/icons/91231dou2.gif' />尤其是<img src='/icons/91231dou.gif' />在做集成测试过程中<img src='/icons/91231dou.gif' />检查系统<img src='/icons/91231de.gif' />内存泄漏、性能很有帮助<img src='/icons/91231dou2.gif' /><br/>测试是分类型<img src='/icons/91231de.gif' /><img src='/icons/91231dou2.gif' />压力测试、性能测试<img src='/icons/91231dou2.gif' />就目前对支持J2EE应用<img src='/icons/91231de.gif' />测试而言<img src='/icons/91231dou.gif' />并没有很好<img src='/icons/91231de.gif' />测试工具<img src='/icons/91231dou2.gif' />但是<img src='/icons/91231dou.gif' /><img src='/icons/91231yi.gif' />般情况下<img src='/icons/91231dou.gif' />借助于Rational Robot也能够取得不错<img src='/icons/91231de.gif' />效果<img src='/icons/91231dou2.gif' /><br/><br/>当然<img src='/icons/91231dou.gif' />成功开发J2EE应用<img src='/icons/91231de.gif' />原因有很多<img src='/icons/91231dou2.gif' />比如<img src='/icons/91231dou.gif' />Entity Beans<img src='/icons/91231de.gif' />成功应用很大程度上和底层Database<img src='/icons/91231de.gif' />设计有关系(如果表结构设计设计<img src='/icons/91231de.gif' />不合理<img src='/icons/91231dou.gif' />将导致Entity Beans性能<img src='/icons/91231de.gif' />急剧下降)；如何最大化挖掘、提升团队(Team)各个成员<img src='/icons/91231de.gif' />J2EE技能<img src='/icons/91231dou2.gif' />等等这些<img src='/icons/91231dou.gif' />设计面很广<img src='/icons/91231dou2.gif' /><br/><br/>谢谢<img src='/icons/91231dou.gif' />希望此文给你带来了快乐、帮助<img src='/icons/91231dou2.gif' /><br/><br/><br/>  <a href="/mypdf/6669.pdf" title="查看 j2ee开发:开发J2EE应用的要领-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6669.html</guid>
		</item>
		<item>
			<title><![CDATA[购物网站架设实战:实战J2EE—开发购物网站（二）-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6666.html</link>
			<description>
				<![CDATA[

			
            LE style=\"WORD-BREAK: break-all\" cellSpacing=0 cellPadding=0 width=700 align=center border=0><TBODY><TR bgColor=#f9f9f9><TD id=fontzoom style=\"LINE-HEIGHT: 200%\"><P align=center>第三步，安装配置jBuilder 7<BR><BR>这里我安装的是weblogic版<BR>安装jBuilder不要把它装到带有空格的目录里如Prograih Files,或是中文目录中，不然编译时会出错的。安装很简单，不必多言，这里着重讲一下配置</P><P>小技巧一：大家觉得jBuilder运行时也许很慢，因为jbuilder默认使用32MB内存，如果你的内存够大的话，可以加大一点，具体办法如下，<BR><BR>在jBuilder安装目录BIN下找到jbuilder.config文件，编辑它，改变Vmparams 后的参数，我的配置为 <BR>vmparam -Xms64M<BR>vmparam -Xmx64M<BR>启动jBuilder，在Help下的About Jbuilder下可以看到Java heap已经增加了，运行也快了许多，起码以后可以编译较大的文件。</P><P>小技巧二：运行jBuilder时，发现编写代码很不方便，所选的代码与实际所见的总是差一个，这是因为字体的原因，解决方法如下，在Tools的Editor Options下的Display里，将Editor font里的Font Family改为新宋体即可。</P><P align=center></P><P>配置weblogic服务<BR><BR>用jBuilder可以整合weblogic，这样可以把在jBuilder下开发的EJB或打包成WAR的网站直接发布到weblogic！<BR><BR>首先在tools下选择Configure Servers<BR><BR>在下面的user Home下，你可以看到“webLogic Application Server 6.X-7.0”项，点击它，在右边会出现Server Settings ，将Enable server打上勾，在下面的General下选择home directory和Working directory:本人的为\"D:/bea/wlserver6.1\"</P><P align=center></P><P>然后点Custom项<BR>选择JDK installation directory:本人的为“D:/bea/jdk131”<BR>BEA home directory:本人的安装目录为“D:/bea”，接着输入密码和设定的Domain name和Server name这些都是你安装weblogic时设定的，如果目录选择正确，在下面的version下会自动出现你的weblogci的版本号。点击OK即完成！</P><P align=center></P><P align=left>下面，我们做一个试验，看看weblogic是不是和jbuilder整合了！<BR>首先，我们新建一个工程，选Application,在name里填写你的工程名,接着按完成即可。</P><P align=center></P><P align=left><BR>在新建工程项目时顺便看一看Server是不是用的Weblogic</P><P align=center></P><P>然后再选新建，在出现的Object Gallery下选Web,因为我们是要发布WEB应用，所以选取Web Application，为它命个名，这将是网站包的名字，指定它的工作目录后选择Generate war,点OK即可</P><P align=center></P><P>接下来，我们要新建一个JSP文件，一样点新建，在WEB下选择JAVAServer Page,按它的默认点下一步即可，它会自动创建一个JAVABEAN。</P><P>首先，我们要把自动生成的这个BEAN编译为class，选中它，点右键，在出现的菜单选Rebuild编译</P><P></P><P>然后编译你的Web Application，它会自动生成WAR包,点这个包发布即可</P><P></P><P>发布网站</P><P align=center></P><P>接下来打开浏览器输入 http://127.0.0.1:7001/tds/index.jsp 即可看到该页面。</P><P></P><P>PS:WAR为整个web appliction压缩包，讲简单明白点就是我们所做的整个网站都可以打成一个包，然后用weblogic来发布，当然weblogic也支持用目录发式来发布的！</P></TD></TR></TBODY></TABLE><BR>             <a href="/mypdf/6666.pdf" title="查看 购物网站架设实战:实战J2EE—开发购物网站（二）-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2008-09-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6666.html</guid>
		</item>
		<item>
			<title><![CDATA[购物网站架设实战:实战J2EE—开发购物网站（一）-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6665.html</link>
			<description>
				<![CDATA[

			
            言</P><P>本文通过实战全程编写一个购物网站来讲解如何使用J2EE来建立企业级的网络应用！本文针对的是像我这样的绝对初学者，如果您是高手就莫要见笑了！</P><P>一：搭建开发平台</P><P>本文从实战出发，所以关于一些概念性的问题就不多讲了，这些东东可以从google上搜到，首先准备下面的家伙吧：</P><P>1.oracle<BR>2.weblogic<BR>3.jbuilder</P><P>其它：struts-console-2.2（用作struts视图开发）PowerBulider（方便数据库操作）Dreamweaver(美化前台页面)<BR>以上就是我在公司里开发的所用的东东了！开发平台为win2000。</P><P>以下以我家里的配置为例详细介绍搭建J2EE的开发平台。（家里的软件都是从网上当的）</P><P>家用机配置：P4赛扬1.7G,256MB 20GHDD 操作系统：windows2000 SP3<BR>数据库：oracle 8i<BR>J2EE应用平台:weblogic 6.1 sp2<BR>EJB,JSP,jAVABEAN开发：jbuilder 7 weblogic版</P><P>第一步，安装配置oracle数据库</P><P>安装oracle最新版的9i什么事都没有，但如果你在P4的机器上装8i可能就会出现问题，点了安装之后没有反应。（P4赛扬也存在这个问题）没法，我的oracle就是从网上当的8i（比9i苗条多了），如果您是P4的机器又要装8i的话，那么先按如下方法做（这是我从网上搜到的方法）</P><P>（1）创建一临时目录，并将Oracle8i的安装源程序拷贝到此目录。 <BR>找到目录 <BR>stage\\Components\\oracle.swd.jre\\1.1.7.30\\1\\DataFiles\\Expanded\\jre\\win32\\bin下的 symcjit.dll 的文件，并改名为 symcjit.old。注意OEM目录下还有一个symcjit.dll文件要改名。<BR>（2）搜索到oraparam.ini文件，打开它，改变行RE_MEMORY_OPTIONS=-mx48m的参数为 JRE_MEMORY_OPTIONS=-nojit -ms16m -mx32m <BR>（3）其它的参数保持不变。 <BR>（4）执行本地硬盘install\\win32\\setup.exe目录下的Setup.exe文件。此时调用的是修改过的参数文件oraparam.ini。 <BR>（5）安装时选择自定义模式，并且不创建数据库。 <BR>（7）Oracle8i安装完成后，安装目录中的下列每一个文件都有需要作相应修改。(如果不修改点任何应用都没有反应)</P><P>assistants\\dbca\\dbassist.cl <BR>assistants\\dbma\\dbmig.cl <BR>assistants\\ifa\\ifa.cl <BR>bin\\elogin.cl <BR>bin\\owm.cl <BR>ldap\\oidamdin\\oidadmin.cl <BR>network\\tools\\netasst.cl <BR>network\\tools\\netca.cl <BR>owm\\install\\instelogin.cl <BR>owm\\install\\instowm.cl </P><P>用编辑工具依次打开上述文件，增加参数 -nojit，以dbassist.cl文件为例示意如下： </P><P>Command=(\"C:\\Program Files\\Oracle\\jre\\1.1.7\\BIN\\JREW\" -nojit -classpath ....) </P><P>用相同的方法修改所列出的每一个.cl 文件内容。<BR>修改完后运行database administrator下的Database Configuration Assistant就可以创建数据库了，这可是一个漫长的过程，在创建数据库时要创建全局标识，搞个好记的就行，以后好配置数据库连接。创建完后，默认的DBA用户名为system,密码为manager。<BR>在以后，我会陆续讲一些关于oracle的初学经验，帮助大家快速入门！ </P><P>第二步，安装配置weblogic 6.1SP2,并连接oracle</P><P>win平台的weblogic基本上都可以直接安装，但要注意不要把它装到带有空格的目录里如Program Files,或是中文目录中，默认为c:\\bea，按默认点下一步，就可以完成安装，这个基本没有意外！（最简单的安装操作）,最后要记住你设的管理密码!<BR>我把管理员名和服务名改了。</P><P></P><P>为了调试方便，不将weblogic设为自动服务启动</P><P></P><P>设定您的管理密码，进入控制台，启动服务都需要</P><P></P><P>为了方便，我将目录安到了D盘，并将domain改为maxuan,server改为max,接下来我们将配置JDBC连接oracle数据库</P><P>首先打开D:\\bea\\wlserver6.1\\config\\maxuan(maxuan为我改后的名字，默认的为mydomain)，用文本编辑器如：记事本或editplus打开startWebLogic.cmd，找到“set PATH=”这一行，加入“.\\bin\\oci817_8”，如本人的为“set PATH=.\\bin;.\\bin\\oci817_8;%PATH%”</P><P>为了使启动weblogic不需要每次都输入密码，在“set WLS_PW=”输入安装时所设定的密码即可。</P><P>双击startWebLogic.cmd或在程序中直接运行Start Default Server启动weblogic服务（注意不要将这个窗口关了哟）<BR>启动weblogic</P><P></P><P>然后在程序中运行Start Default Console，进入控制台操作,在出现的对话框中输入管理用户名system，密码为你设的密码即可进入！</P><P></P><P>点开左边的Services，你可以看到JDBC</P><P></P><P>点开它,点击在下面的Connection Pools，右边会出现配置项目，点击Configure a new JDBC Connection Pool出现配置项，在Configuration下的General标签下配置</P><P>name:这里我填写的是“mytest”；<BR>URL填写为“jdbc：weblogic：oracle”；<BR>Driver Classname:填写为“weblogic.jdbc.oci.Driver”；<BR>Properties(key=value)：填写为：<BR>user=system<BR>password=manager<BR>server=oradb<BR>这里的oradb即是所安装的oracle所创建的数据库的全局标识。user和password我用的是默认的DBA，你可以用自己创建的用户名和密码。点击Apply按钮完成。</P><P></P><P>点击Targets下的Servers标签，把Available下的Tgets-Server移到Chosen下，然后点Apply按钮。</P><P></P><P>接着配置下面的Data Sources，在右边用“Configure a new JDBC Data Source”创建新的Data Sources，这里的Name和Pool Name均填上面的设定“mytest”，JNDI Name填写“oradb”,同上面一样，点击Targets下的Servers标签，把Available下的Targets-Server移到Chosen下，然后点Apply按钮。</P><P></P><P>这时点开Start Default Server窗口应当看到已经启动jDriver/Oracle了！<BR>PS：用weblogic已经有段时间了，而且也参加过weblogic J2ee 的培训，以后将会把相关经验放到论坛上！<BR>重启服务吧！</P>             <a href="/mypdf/6665.pdf" title="查看 购物网站架设实战:实战J2EE—开发购物网站（一）-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2008-09-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6665.html</guid>
		</item>
		<item>
			<title><![CDATA[购物网站架设实战:实战J2EE—开发购物网站（三）-j2ee]]></title>
			<link>http://CrazyCoder.cn/Java/Article6663.html</link>
			<description>
				<![CDATA[

			
            p; <TABLE style=\"WORD-BREAK: break-all\" cellSpacing=0 cellPadding=0 width=700 align=center border=0><TBODY><TR bgColor=#f9f9f9><TD id=fontzoom style=\"LINE-HEIGHT: 200%\"><P></P><P>二：创建数据库<BR><BR>小试牛刀oracle 8i(顺便我们练练手)(为了方便，我就将oracle 8i简写8i了)<BR>8i和9i确实有些不一样，不过在界面上区别不大，还是以我的oracle 8i为例为大家讲解一下吧！既然是实战，首先我们为自己新建一个开发用户，并创建一个表！！<BR>在oracle里创建新用户和表的方法比较多，只要你有管理员的权限（废话！），首先用最简单的，在8i的程序组中启动DBA Studio程序项,在出现的数据库链接信息中输入管理用户名和口令即可，当然，在oracle中，你可以用用户名斜杠口令的方法登陆，连接身份选SYSDBA。</P><P align=center></P><P>(1-1)创建用户：<BR>在登陆后，点安全，在第一项，你就会看到用户，用右键你可以创建新用户，或者给用户授于角色，不同的角色拥有不同的权限！oracle8i预定义的角色，我在下面会讲。看看下边我抓的图吧，在一般信息后面的角色，你就可以赋予connect,resource权限。</P><P align=center></P><P align=center></P><P>(1-2)创建数据库：<BR>咱们先断开system的数据库连接，可以在文件中选择，也可以用右键。然后用我们创建的用户来登陆，并且在方案中找到表，然后就可以直接创建，由于是图形可视化，而且又是全中文的，我就不缀述了！！大家可以多试试！</P><P align=center></P><P>(2)用SQLPLUS工具创建用户和数据库：<BR>在oracle中可以使用sqlplus这个工具来书写SQL语句，对于SQL高手来说，这是发挥才能的好地方！！<BR>咱们来试试吧，首先一样要先登陆，为了创建新用户，咱们仍以system来登陆。在主机字符串中填入数据标识(oradb)</P><P align=center></P><P>下用我用一张截图说明所有的操作，这里做一下说明：<BR>在登陆进去后，出现“SQL&gt;”我们就可以在它后面书写SQL语句，grant connect,resouce to maxuan identified by max,这一句是创建用户maxuan,口令为max,并赋予connect,resource权限，在出现授权成功后，我们用conn maxuan/max这句来以maxuan连接数据库，这时的角色已经不是DBA了！接下来的是些基本的SQL建表语句，不用多说了，在sqlplus中，每条语句结束用分号标识，在完成后，我们可以用quit或exit命令断开</P><P></P><P>ps:这里我说几个8i的预定义角色！</P><P>1.CONNECT角色: 授于最终用户的典型最基本的权利<BR>ALTER SESSION --修改会话<BR>CREATE CLUSTER --建立聚簇<BR>CREATE DATABASE LINK --建立数据库链接<BR>CREATE SEQUENCE --建立序列<BR>CREATE SESSION --建立会话<BR>CREATE SYNONYM --建立同义词<BR>CREATE VIEW --建立视图</P><P>2.RESOURCE角色: 是授予开发人员的<BR>CREATE CLUSTER --建立聚簇<BR>CREATE PROCEDURE --建立过程<BR>CREATE SEQUENCE --建立序列<BR>CREATE TABLE --建表<BR>CREATE TRIGGER --建立触发器<BR>CREATE TYPE --建立类型</P><P>3.DBA角色：拥有系统所有系统级权限</P><P>4.IMP_FULL_DATABASE角色、EXP_FULL_DATABASE角色：<BR>BACKUP ANY TABLE --备份任何表<BR>EXECUTE ANY PROCEDURE --执行任何操作<BR>SELECT ANY TABLE --查询任何表</P><P>5.DELETE_CATALOG_ROLE角色：<BR>授予用户这个角色，用户就可以从表sys.aud$中删除记录，<BR>sys.aud$表中记录着审计后的记录，使用这个角色可以简化审计踪迹管理。</P><P>6.SELECT_CATALOG_ROLE角色、EXECUTE_CATALOG_ROLE角色：<BR>SELECT_CATALOG_ROLE角色具有从数据字典查询的权利，<BR>EXECUTE_CATALOG_ROLE角色具有从数据字典中执行部分过程和函数的权利。</P></TD></TR></TBODY></TABLE>             <a href="/mypdf/6663.pdf" title="查看 购物网站架设实战:实战J2EE—开发购物网站（三）-j2ee 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2008-09-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6663.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:J2EE开发原则学习]]></title>
			<link>http://CrazyCoder.cn/Java/Article6646.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          J2EE<img src='/icons/27527dou.gif' />作为开发mission-critical<img src='/icons/27527de.gif' />企业级应用<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />整套规范标准<img src='/icons/27527de.gif' />整合平台<img src='/icons/27527dou.gif' />规范标准多、内容广<img src='/icons/27527dou.gif' />从而给开发J2EE应用带来了很多“麻烦”<img src='/icons/27527dou2.gif' />比如<img src='/icons/27527dou.gif' />为实现内容<img src='/icons/27527de.gif' />RDBMS存储<img src='/icons/27527dou.gif' />我们可能<img src='/icons/27527de.gif' />思路方法有JDBC、Entity Beans、JDO、O/R Mapping工具(TopLink、Hibernate)、XML-DBMS、JAXB等思路方法(其中<img src='/icons/27527yi.gif' />些思路方法不是J2EE规范标准所包含<img src='/icons/27527de.gif' />)<img src='/icons/27527dou2.gif' />因此<img src='/icons/27527dou.gif' />为实现J2EE各层(至少有表示层、控制层、商业逻辑层等3层)以及层和层的间<img src='/icons/27527de.gif' />耦合<img src='/icons/27527dou.gif' />J2EE系统架构师需要考虑<img src='/icons/27527de.gif' />问题会很多<img src='/icons/27527dou2.gif' />加上<img src='/icons/27527dou.gif' />J2EE本身<img src='/icons/27527de.gif' />快速发展<img src='/icons/27527dou.gif' />给架构、开发具有工业强度<img src='/icons/27527de.gif' />J2EE应用带来<img src='/icons/27527yi.gif' />些难题<img src='/icons/27527dou2.gif' /> <br/>　　同时<img src='/icons/27527dou.gif' />软件Software开发技术从来就没有“银弹”<img src='/icons/27527dou.gif' />所以J2EE技术也不是万能<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />但是<img src='/icons/27527dou.gif' />如果我们在结合具体商业需求<img src='/icons/27527de.gif' />基础上<img src='/icons/27527dou.gif' />合理<img src='/icons/27527de.gif' />应用好J2EE技术<img src='/icons/27527dou.gif' />其结果可想而知<img src='/icons/27527dou2.gif' />本文试图从本人以往<img src='/icons/27527de.gif' />项目经验入手<img src='/icons/27527dou.gif' />来探讨开发J2EE应用时应该遵循<img src='/icons/27527de.gif' />几点准则<img src='/icons/27527dou.gif' />希望起到抛砖引玉<img src='/icons/27527de.gif' />作用<img src='/icons/27527dou2.gif' />本文结合JBoss 3.2.1下<img src='/icons/27527de.gif' />J2EE应用开发为例展开论述<img src='/icons/27527dou2.gif' /> <br/>　　1.结合商业需求选择合理<img src='/icons/27527de.gif' />架构 <br/>　　如果脱离商业需求<img src='/icons/27527dou.gif' />而单独<img src='/icons/27527de.gif' />讨论技术本身<img src='/icons/27527de.gif' />优势是不够<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />各项技术都有产生<img src='/icons/27527de.gif' />特定背景<img src='/icons/27527dou.gif' />其中很多都是来自工业需求而触动<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' /><img src='/icons/27527yi.gif' />般而言<img src='/icons/27527dou.gif' />企业信息系统(EIS)都要求自己稳定、安全、可靠、高效、便于维护<img src='/icons/27527dou2.gif' />同时<img src='/icons/27527dou.gif' />各个企业信息系统都有自己独特<img src='/icons/27527de.gif' />要求<img src='/icons/27527dou.gif' />可能有些时候需要考虑和原有遗留系统<img src='/icons/27527de.gif' />集成<img src='/icons/27527dou.gif' />所以了解各个企业信息系统具体<img src='/icons/27527de.gif' />商业需求对于整个系统<img src='/icons/27527de.gif' />架构显得很关键<img src='/icons/27527dou2.gif' /> <br/>　　比如<img src='/icons/27527dou.gif' />如果待开发<img src='/icons/27527de.gif' />J2EE应用系统中使用到<img src='/icons/27527de.gif' />数据大部分来自于外在数据源；而这些数据可能是通过JDBC直接从外在数据源导入到待开发<img src='/icons/27527de.gif' />J2EE系统<img src='/icons/27527de.gif' />Database中<img src='/icons/27527dou2.gif' />对于这种情形<img src='/icons/27527dou.gif' />如果在开发过程中<img src='/icons/27527dou.gif' />仅仅使用JDBC来操作数据库<img src='/icons/27527dou.gif' />对于小强度(并发访问用户少、数据流量少)<img src='/icons/27527de.gif' />情形<img src='/icons/27527dou.gif' />显然是比较合适<img src='/icons/27527de.gif' />；但如果<img src='/icons/27527dou.gif' />并发访问用户较多、数据流量大<img src='/icons/27527dou.gif' />对Database层使用较为频繁<img src='/icons/27527de.gif' />情形<img src='/icons/27527dou.gif' />则显得有些力不从心<img src='/icons/27527dou2.gif' />因此<img src='/icons/27527dou.gif' />对于这种需求<img src='/icons/27527dou.gif' />我们可以考虑采用Entity Beans with Caches<img src='/icons/27527dou2.gif' />打个比方<img src='/icons/27527dou.gif' />在JBoss 3.2.1中对于Entity Beans<img src='/icons/27527de.gif' />Cache策略有多种<img src='/icons/27527dou.gif' />这时可以考虑使用<img src='/icons/27527dou.gif' /><img src='/icons/27527dou.gif' />即“Standard CMP 2.x EntityBean”<img src='/icons/27527dou.gif' />方式并采用“D”类型<img src='/icons/27527de.gif' />commit-option来保证Entity Beans<img src='/icons/27527de.gif' />内容和数据源<img src='/icons/27527de.gif' />同步<img src='/icons/27527dou.gif' />并使得系统<img src='/icons/27527de.gif' />性能得到大大改善(同直接使用JDBC相比)<img src='/icons/27527dou2.gif' />其中<img src='/icons/27527dou.gif' />可以将<img src='/icons/27527yi.gif' />些Entity Beans设置为read-only<img src='/icons/27527dou.gif' />以改善性能<img src='/icons/27527dou2.gif' />当然<img src='/icons/27527dou.gif' />在这里也可以采用其他<img src='/icons/27527yi.gif' />些O/R Mapping技术<img src='/icons/27527dou.gif' />比如TopLink<img src='/icons/27527dou2.gif' /> <br/>　　再比如<img src='/icons/27527dou.gif' />考虑这样<img src='/icons/27527yi.gif' />种情形:如果待开发<img src='/icons/27527de.gif' />企业信息系统使用到<img src='/icons/27527de.gif' />数据都是由系统本身生成和操作<img src='/icons/27527de.gif' /><img src='/icons/27527dou.gif' />则建议采用:CMP Entity Beans技术<img src='/icons/27527dou2.gif' />Entity Beans给大家<img src='/icons/27527de.gif' />印象很坏<img src='/icons/27527dou.gif' />这可能和EJB 1.1给大家留下<img src='/icons/27527de.gif' />坏映象有关吧<img src='/icons/27527dou2.gif' />但是<img src='/icons/27527dou.gif' />EJB 2.0(或者说2.1)得到了很大<img src='/icons/27527de.gif' />改善<img src='/icons/27527dou.gif' />Local Interfaces、CMR、Read-Only、Session Fa?ade模式给Entity Beans注入了活力<img src='/icons/27527dou2.gif' />当然<img src='/icons/27527dou.gif' />并发用户多、数据流量很大时才会体现出使用Entity Beans<img src='/icons/27527de.gif' />优势<img src='/icons/27527dou2.gif' />其中<img src='/icons/27527dou.gif' />有<img src='/icons/27527yi.gif' />点很关键:要注重Entity Beans技术<img src='/icons/27527de.gif' />性能调优<img src='/icons/27527dou.gif' />各个应用服务器都有自己<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />套性能调优方案<img src='/icons/27527dou2.gif' />对于JBoss 3.2.1<img src='/icons/27527dou.gif' />配置文件standardjboss.xml提供了Entity Beans技术调优<img src='/icons/27527de.gif' />入口<img src='/icons/27527dou2.gif' />比如<img src='/icons/27527dou.gif' />Bean Lock策略<img src='/icons/27527de.gif' />合理使用对于Entity Beans<img src='/icons/27527de.gif' />调优就显得很重要<img src='/icons/27527dou2.gif' />这样使得<img src='/icons/27527dou.gif' />我们可以更加关注于系统<img src='/icons/27527de.gif' />商业逻辑<img src='/icons/27527dou.gif' />而不只是底层<img src='/icons/27527de.gif' />Database(EJB调优处于EJB Container中<img src='/icons/27527dou.gif' />因此我们处在J2EE性能<img src='/icons/27527de.gif' />高端<img src='/icons/27527dou.gif' />而不是底端<img src='/icons/27527dou.gif' />即Database层<img src='/icons/27527dou2.gif' />同时<img src='/icons/27527dou.gif' />Database层<img src='/icons/27527de.gif' />调优使得J2EE系统<img src='/icons/27527de.gif' />数据库移植性大打折扣<img src='/icons/27527dou2.gif' />)<img src='/icons/27527dou2.gif' /> <br/>　　简而言的<img src='/icons/27527dou.gif' />要结合各个系统<img src='/icons/27527de.gif' />特定需求和状况给出具体<img src='/icons/27527de.gif' />技术架构方案<img src='/icons/27527dou.gif' />而不能孤单<img src='/icons/27527de.gif' />论述技术本身<img src='/icons/27527de.gif' />好坏<img src='/icons/27527dou2.gif' /> <br/>　　2.Framework<img src='/icons/27527de.gif' />合理选用 <br/>　　设计模式在J2EE应用系统中扮演着重要<img src='/icons/27527de.gif' />角色<img src='/icons/27527dou2.gif' />因此<img src='/icons/27527dou.gif' />有<img src='/icons/27527yi.gif' />个问题摆在大家面前<img src='/icons/27527dou.gif' />是自己来实现具体<img src='/icons/27527de.gif' />设计模式<img src='/icons/27527dou.gif' />还是借助于Third-party Framework<img src='/icons/27527dou2.gif' />如果贵公司不大<img src='/icons/27527dou.gif' />或者说公司不想在J2EE基础应用Framework投入很多精力<img src='/icons/27527dou.gif' />选用现有<img src='/icons/27527de.gif' />较为成熟<img src='/icons/27527de.gif' />、稳定、和现有J2EE Spec<img src='/icons/27527if.gif' />ication兼容<img src='/icons/27527de.gif' />技术框架会比较明智<img src='/icons/27527dou2.gif' /> [Page]<br/>　　<img src='/icons/27527yi.gif' />般而言<img src='/icons/27527dou.gif' />Framework本身<img src='/icons/27527dou.gif' />或者说J2EE平台本身都是实现并优化了具体<img src='/icons/27527de.gif' />设计模式、规则<img src='/icons/27527dou.gif' />比如业务代理、Service Locator(包括Web Tier和EJB Tier各自<img src='/icons/27527de.gif' />服务定位器<img src='/icons/27527dou.gif' />起到统<img src='/icons/27527yi.gif' />管理有限资源、Cache相关资源<img src='/icons/27527de.gif' />作用<img src='/icons/27527dou.gif' />便于系统移植)、Front Controller、DAO等等<img src='/icons/27527dou2.gif' />现有<img src='/icons/27527de.gif' />J2EE Framework比较丰富<img src='/icons/27527dou2.gif' />比如: <br/>　　Struts: 对于实现了Model 2类型<img src='/icons/27527de.gif' />Framework<img src='/icons/27527dou.gif' />对于现在以及将来(随着JSF规范标准、技术<img src='/icons/27527de.gif' />成熟)<img src='/icons/27527dou.gif' />选用她是<img src='/icons/27527yi.gif' />种明智的举<img src='/icons/27527dou2.gif' />目前<img src='/icons/27527dou.gif' />Struts已经发展到1.1版本<img src='/icons/27527dou2.gif' />其内在<img src='/icons/27527de.gif' />MVC主线、对后端数据操作方式没有限定、集合了Apache Jakarta项目组<img src='/icons/27527de.gif' />优秀相关项目<img src='/icons/27527de.gif' />精华<img src='/icons/27527dou.gif' />可谓是开发J2EE应用<img src='/icons/27527de.gif' />佳品<img src='/icons/27527dou2.gif' />同时<img src='/icons/27527dou.gif' />对于具有.NET Web Forms功能<img src='/icons/27527de.gif' />下<img src='/icons/27527yi.gif' />代J2EE平台技术JSF而言<img src='/icons/27527dou.gif' />Struts本身可考虑到和JSF<img src='/icons/27527de.gif' />兼容和集成性<img src='/icons/27527dou2.gif' />比如<img src='/icons/27527dou.gif' />通过JSP呈现表示层、Servlet呈现控制层、EJB呈现数据存储层<img src='/icons/27527dou2.gif' />各层的间<img src='/icons/27527dou.gif' />可以通过值对象、HTTP相关对象来通讯<img src='/icons/27527dou.gif' />实现J2EE相关技术<img src='/icons/27527de.gif' />完美应用<img src='/icons/27527dou2.gif' /> <br/>　　Log4j: 我想对于习惯采用“<img src='/icons/27527System.gif' />.out.pr<img src='/icons/27527int.gif' />ln(“”);”<img src='/icons/27527de.gif' />读者而言<img src='/icons/27527dou.gif' />Log4j是大家<img src='/icons/27527de.gif' />福音<img src='/icons/27527dou2.gif' />尽管Java 2 Standard Edition也具备java.util.logging包来保证日志<img src='/icons/27527de.gif' />输出<img src='/icons/27527dou.gif' />但Log4j<img src='/icons/27527de.gif' />简单、高效、灵活已经成了很多项目<img src='/icons/27527de.gif' />选择<img src='/icons/27527dou2.gif' />日志<img src='/icons/27527dou.gif' />在某种程度上可以考验系统<img src='/icons/27527de.gif' />稳定性、正确性<img src='/icons/27527dou.gif' />所以采用可配置<img src='/icons/27527de.gif' />Log4j(目前<img src='/icons/27527dou.gif' />Log4j已经考虑到了和java.util.logging包<img src='/icons/27527de.gif' />兼容性)是不会错<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />比如<img src='/icons/27527dou.gif' />JBoss 3.2.1本身就是借助于Log4j来管理日志<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' /> <br/>　　realMethods: 可能有些读者还不知道这<img src='/icons/27527yi.gif' />款杀手锏<img src='/icons/27527dou2.gif' />那好<img src='/icons/27527dou.gif' />这里就简要作<img src='/icons/27527yi.gif' />介绍<img src='/icons/27527dou2.gif' />realMethods是<img src='/icons/27527yi.gif' />开发J2EE应用<img src='/icons/27527de.gif' />Framework<img src='/icons/27527dou.gif' />她区别于Struts(主要在于实现Model 2<img src='/icons/27527dou.gif' />J2EE应用前端)；realMethods对于J2EE应用<img src='/icons/27527de.gif' />各个层面都有详尽、高效<img src='/icons/27527de.gif' />支持<img src='/icons/27527dou2.gif' />同时<img src='/icons/27527dou.gif' />realMethods以前还是商用软件Software<img src='/icons/27527dou.gif' />现在已经成为了Open Source<img src='/icons/27527de.gif' />产品<img src='/icons/27527dou.gif' />因此现在可以参看其全部源代码<img src='/icons/27527dou2.gif' /> <br/>　　BC4J: Oracle公司推出<img src='/icons/27527de.gif' />用于Java<img src='/icons/27527de.gif' />商业组件<img src='/icons/27527dou2.gif' />其内容和外在<img src='/icons/27527de.gif' />特点和优势<img src='/icons/27527dou.gif' />不言而喻<img src='/icons/27527dou2.gif' /> <br/>　　当然<img src='/icons/27527dou.gif' />类似<img src='/icons/27527de.gif' />Framework很多很多<img src='/icons/27527dou2.gif' />作为开发J2EE应用<img src='/icons/27527de.gif' />团队(Team)而言<img src='/icons/27527dou.gif' />我们需要对各种Framework加以筛选<img src='/icons/27527dou.gif' />选择适合项目需求、团队(Team)、公司发展方向<img src='/icons/27527de.gif' />框架<img src='/icons/27527dou2.gif' /> <br/>　　<img src='/icons/27527yi.gif' />般情况下<img src='/icons/27527dou.gif' />待开发<img src='/icons/27527de.gif' />目标产品不宜采用过多<img src='/icons/27527de.gif' />Framework<img src='/icons/27527dou2.gif' />其<img src='/icons/27527yi.gif' /><img src='/icons/27527dou.gif' />J2EE各个技术发展很快<img src='/icons/27527dou.gif' />过多<img src='/icons/27527de.gif' />Framework使得系统<img src='/icons/27527de.gif' />后续升级、维护不利；其 2<img src='/icons/27527dou.gif' />可以借鉴其中<img src='/icons/27527de.gif' />好<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />面<img src='/icons/27527dou.gif' />比如研究realMethods实现<img src='/icons/27527de.gif' />相应<img src='/icons/27527de.gif' />设计模式<img src='/icons/27527dou.gif' />并改造她以适合我们<img src='/icons/27527de.gif' />项目需求；其 3<img src='/icons/27527dou.gif' />Framework本身会有变动<img src='/icons/27527dou.gif' />如果选用过多<img src='/icons/27527dou.gif' />会给开发团队(Team)加重负担<img src='/icons/27527dou.gif' />从而不利于项目管理(project management)<img src='/icons/27527dou2.gif' />有选择<img src='/icons/27527de.gif' />使用现有<img src='/icons/27527de.gif' />成熟Framework能提升大家<img src='/icons/27527de.gif' />开发效率、开发水平<img src='/icons/27527dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/>　　3<img src='/icons/27527dou.gif' />开发模式<img src='/icons/27527de.gif' />选择 <br/>　　开发J2EE应用要求目标开发人员能够掌握其中<img src='/icons/27527de.gif' />各种技术<img src='/icons/27527dou2.gif' />但是<img src='/icons/27527dou.gif' />现实情况不是这样<img src='/icons/27527dou2.gif' />作为<img src='/icons/27527yi.gif' />个团队(Team)<img src='/icons/27527dou.gif' />每个人都有自己区别<img src='/icons/27527de.gif' />技能优势、兴趣以及悟性<img src='/icons/27527dou2.gif' />同时<img src='/icons/27527dou.gif' />J2EE本身需要体现社会分工<img src='/icons/27527dou2.gif' /><img src='/icons/27527yi.gif' />般情况下<img src='/icons/27527dou.gif' />我们<img src='/icons/27527de.gif' />开发团队(Team)不会有Spec<img src='/icons/27527if.gif' />ication所要求<img src='/icons/27527de.gif' />各个开发角色<img src='/icons/27527dou2.gif' />现实往往只有3种(也可能是两种):美工、JSP<img src='/icons/27527chengxu.gif' />员、EJB<img src='/icons/27527chengxu.gif' />员<img src='/icons/27527dou2.gif' />面对这种分工<img src='/icons/27527dou.gif' />团队(Team)更要注重沟通、交流<img src='/icons/27527dou.gif' />注重代码<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />致性<img src='/icons/27527dou2.gif' /> <br/>　　<img src='/icons/27527yi.gif' />般情况下<img src='/icons/27527dou.gif' />团队(Team)要尽量采用版本控制工具管理代码、尽量做到每天都有<img src='/icons/27527yi.gif' />个完整<img src='/icons/27527de.gif' />运行版本<img src='/icons/27527dou2.gif' />经过<img src='/icons/27527yi.gif' />段时间<img src='/icons/27527dou.gif' />团队(Team)都会适应这种开发模式<img src='/icons/27527dou2.gif' />其中<img src='/icons/27527dou.gif' />版本控制工具<img src='/icons/27527yi.gif' />定要使用<img src='/icons/27527dou.gif' />便于代码<img src='/icons/27527de.gif' />管理、控制和备份<img src='/icons/27527dou2.gif' />这其中会牵扯到很多层面<img src='/icons/27527dou2.gif' />比如<img src='/icons/27527dou.gif' />开发工具<img src='/icons/27527de.gif' />选择要考虑到版本控制工具<img src='/icons/27527de.gif' />使用、建模工具<img src='/icons/27527de.gif' />合理使用有助于团队(Team)有效<img src='/icons/27527de.gif' />沟通和交流<img src='/icons/27527dou2.gif' /> [Page]<br/>　　基于现有<img src='/icons/27527de.gif' />开发模式<img src='/icons/27527dou.gif' />个人认为这样3套方案不错<img src='/icons/27527dou2.gif' />第<img src='/icons/27527yi.gif' /><img src='/icons/27527dou.gif' />采用Together作为建模工具、采用JBuilder作为IDE工具、采用VSS(或者CVS)作为版本控制工具、采用JBoss作为开发J2EE应用开发阶段<img src='/icons/27527de.gif' />服务器<img src='/icons/27527dou2.gif' />第 2<img src='/icons/27527dou.gif' />采用WebSphere Studio整套工具<img src='/icons/27527dou2.gif' />第 3<img src='/icons/27527dou.gif' />采用Eclipse(或者JCreator)、Ant、XDoclets作为开发工具<img src='/icons/27527dou2.gif' /> <br/>　　当然<img src='/icons/27527dou.gif' />手工完成J2EE应用<img src='/icons/27527de.gif' />编写、编译、打包、部署、测试更能使开发者理解各个开发阶段<img src='/icons/27527de.gif' />具体细节<img src='/icons/27527dou2.gif' />但本人认为<img src='/icons/27527dou.gif' />只要开发者有这种关注具体细节<img src='/icons/27527de.gif' />态度<img src='/icons/27527dou.gif' />选用功能强大<img src='/icons/27527de.gif' />建模、开发工具是明智<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />开发工具不能提高开发人员<img src='/icons/27527de.gif' />开发技能<img src='/icons/27527dou.gif' />但是她能够引导开发人员正确<img src='/icons/27527de.gif' />开发方向<img src='/icons/27527dou2.gif' />比如,JBuidler 9 Enterprise提供<img src='/icons/27527de.gif' />EJB精灵具有<img src='/icons/27527de.gif' />“Struts + EJB + Session Fa?ade + Value Object”等功能呈现了业界广泛应用<img src='/icons/27527de.gif' />J2EE构架方式<img src='/icons/27527dou2.gif' /> <br/>　　4<img src='/icons/27527dou.gif' />注重各个阶段<img src='/icons/27527de.gif' />测试工作 <br/>　　测试工作往往是很多项目经理(project manager)忽视<img src='/icons/27527dou.gif' />不愿意去花费时间、费用<img src='/icons/27527de.gif' />内容<img src='/icons/27527dou.gif' /><img src='/icons/27527yinwei.gif' />那样会增加项目<img src='/icons/27527de.gif' />成本<img src='/icons/27527dou2.gif' />但是<img src='/icons/27527dou.gif' />他们忽视了<img src='/icons/27527dou.gif' />项目<img src='/icons/27527de.gif' />完成质量往往对项目<img src='/icons/27527de.gif' />成本有很大<img src='/icons/27527de.gif' />关系<img src='/icons/27527dou2.gif' />比如<img src='/icons/27527dou.gif' />如果软件Software质量很差<img src='/icons/27527dou.gif' />并没有经历测试阶段<img src='/icons/27527dou.gif' />其后期部署、运行所带来<img src='/icons/27527de.gif' />费用会远远超过前期<img src='/icons/27527de.gif' />费用<img src='/icons/27527dou2.gif' /> <br/>　　测试是分阶段<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />单元测试<img src='/icons/27527dou.gif' />比如借助于JUnit<img src='/icons/27527dou.gif' />来保证功能正确等内容<img src='/icons/27527dou2.gif' />集成测试<img src='/icons/27527dou.gif' />来保证系统没有内存泄漏等内容<img src='/icons/27527dou2.gif' />其中<img src='/icons/27527dou.gif' />Optimizeite Suite Enterprise对于完成Profiler、Code Coverage、Thread Debugger等内容很有帮助<img src='/icons/27527dou2.gif' />我记得<img src='/icons/27527dou.gif' />我写<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />个Swing桌面应用存在内容泄漏<img src='/icons/27527dou.gif' />但是想了很多办法都没有解决问题<img src='/icons/27527dou2.gif' />后来<img src='/icons/27527dou.gif' />采用Profiler获得了答案<img src='/icons/27527dou2.gif' />因此<img src='/icons/27527dou.gif' />现在开发应用<img src='/icons/27527dou.gif' />我们很多时候都采用Optimizeite Suite Enterprise作为测试工具<img src='/icons/27527dou2.gif' />尤其是<img src='/icons/27527dou.gif' />在做集成测试过程中<img src='/icons/27527dou.gif' />检查系统<img src='/icons/27527de.gif' />内存泄漏、性能很有帮助<img src='/icons/27527dou2.gif' /> <br/>　　测试是分类型<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />压力测试、性能测试<img src='/icons/27527dou2.gif' />就目前对支持J2EE应用<img src='/icons/27527de.gif' />测试而言<img src='/icons/27527dou.gif' />并没有很好<img src='/icons/27527de.gif' />测试工具<img src='/icons/27527dou2.gif' />但是<img src='/icons/27527dou.gif' /><img src='/icons/27527yi.gif' />般情况下<img src='/icons/27527dou.gif' />借助于Rational Robot也能够取得不错<img src='/icons/27527de.gif' />效果<img src='/icons/27527dou2.gif' /> <br/>　　当然<img src='/icons/27527dou.gif' />成功开发J2EE应用<img src='/icons/27527de.gif' />原因有很多<img src='/icons/27527dou2.gif' />比如<img src='/icons/27527dou.gif' />Entity Beans<img src='/icons/27527de.gif' />成功应用很大程度上和底层Database<img src='/icons/27527de.gif' />设计有关系(如果表结构设计设计<img src='/icons/27527de.gif' />不合理<img src='/icons/27527dou.gif' />将导致Entity Beans性能<img src='/icons/27527de.gif' />急剧下降)；如何最大化挖掘、提升团队(Team)各个成员<img src='/icons/27527de.gif' />J2EE技能<img src='/icons/27527dou2.gif' />等等这些<img src='/icons/27527dou.gif' />设计面很广<img src='/icons/27527dou2.gif' /> (赛迪培训子网) <br/>J2EE 探索者:用 5个容易<img src='/icons/27527de.gif' />步骤实现 JSP 自定义标记 <br/>JSP 自定义标记为在动态 Web 页中将表示和业务逻辑分离提供了<img src='/icons/27527yi.gif' />种标准化<img src='/icons/27527de.gif' />机制<img src='/icons/27527dou.gif' />使页面设计者可以将注意力放到表示上<img src='/icons/27527dou.gif' />而应用<img src='/icons/27527chengxu.gif' />开发人员编写后端<img src='/icons/27527de.gif' />代码<img src='/icons/27527dou2.gif' />在 J2EE 探索者 <img src='/icons/27527de.gif' />这篇文章中<img src='/icons/27527dou.gif' />具有企业观念<img src='/icons/27527de.gif' />开发者 Kyle Gabhart 介绍了 JSP 自定义标记<img src='/icons/27527de.gif' />基本知识<img src='/icons/27527dou.gif' />并引导您完成将它们加入到 JSP 页面<img src='/icons/27527de.gif' /> 5步过程<img src='/icons/27527dou2.gif' /> <br/>您可能听说现在有上百种区别<img src='/icons/27527de.gif' />方式<img src='/icons/27527dou.gif' />但是在开发 Web 应用<img src='/icons/27527chengxu.gif' />时将表示逻辑和业务逻辑分离是很重要<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />近年来<img src='/icons/27527dou.gif' />Java 平台已经发展为在体系结构层次上加入了这种分离<img src='/icons/27527dou2.gif' />例如<img src='/icons/27527dou.gif' />在 JSP 体系结构中加入 JavaBean 组件使开发人员使用 JSP 标记获得和设置经过特别编码<img src='/icons/27527de.gif' /> Java 组件上<img src='/icons/27527de.gif' />属性<img src='/icons/27527dou2.gif' />这些组件或者 JavaBean 再代表表示层执行后端业务处理<img src='/icons/27527dou2.gif' /> <br/>JSP 自定义标记是 JSP/JavaBean 体系结构<img src='/icons/27527de.gif' />产物<img src='/icons/27527dou2.gif' />像 JavaBean 技术<img src='/icons/27527yi.gif' />样<img src='/icons/27527dou.gif' />自定义标记有助于将表示逻辑和业务逻辑分离<img src='/icons/27527dou2.gif' />并且自定义标记成了 Web 设计者<img src='/icons/27527de.gif' /> HTML、XML 和 Javascript 世界和软件Software工程师<img src='/icons/27527de.gif' /> Java 代码、SQL <img src='/icons/27527diaoyong.gif' />和算法世界的间<img src='/icons/27527de.gif' />桥梁<img src='/icons/27527dou2.gif' /> [Page]<br/>在本月<img src='/icons/27527de.gif' /> J2EE 探索者 中<img src='/icons/27527dou.gif' />您将学到在 JSP 页中使用 JSP 自定义标记<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />些基本知识<img src='/icons/27527dou2.gif' />我们首先介绍 JSP 标记<img src='/icons/27527dou.gif' />然后直接进入创建标记、将它结合到 JSP 容器并在 JSP 页面中使用它<img src='/icons/27527de.gif' />过程<img src='/icons/27527dou2.gif' />在本文<img src='/icons/27527de.gif' />最后<img src='/icons/27527dou.gif' />我们将简要讨论 Java 标准标记库(Java Standard Tag Library, JSTL)<img src='/icons/27527dou.gif' />这是<img src='/icons/27527yi.gif' />组可以在您<img src='/icons/27527de.gif' /> Java 开发项目中使用<img src='/icons/27527de.gif' />、标准化<img src='/icons/27527de.gif' /> JSP 自定义标记<img src='/icons/27527dou2.gif' /> <br/>JSP 自定义标记 <br/>JSP 自定义标记 是用户定义<img src='/icons/27527de.gif' />标记<img src='/icons/27527dou.gif' />它遵循 JSP JavaBean 标记(即 useBean、getProperty 和 <img src='/icons/27527set.gif' />Property)所使用<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />种特殊<img src='/icons/27527de.gif' /> XML 语法<img src='/icons/27527dou2.gif' />当 servlet 容器处理自定义标记时<img src='/icons/27527dou.gif' />会<img src='/icons/27527diaoyong.gif' /><img src='/icons/27527yi.gif' />个或者多个 Java 类文件处理它<img src='/icons/27527dou.gif' />和用 Java 类文件处理 JSP 页面<img src='/icons/27527de.gif' /> JavaBean <img src='/icons/27527diaoyong.gif' /><img src='/icons/27527de.gif' />方式基本<img src='/icons/27527yi.gif' />样<img src='/icons/27527dou2.gif' />处理标记以后<img src='/icons/27527dou.gif' />容器将取其名字和属性、以及标记正文中可能有<img src='/icons/27527de.gif' />任何内容<img src='/icons/27527dou.gif' />并将它传递给<img src='/icons/27527yi.gif' />个或者多个类文件进行处理<img src='/icons/27527dou2.gif' /> <br/>Java 开发人员编写标记处理<img src='/icons/27527chengxu.gif' />类以处理标记并处理所有需要<img src='/icons/27527de.gif' /> Java 代码和数据操作<img src='/icons/27527dou2.gif' />对于 Web 设计者来说<img src='/icons/27527dou.gif' />自定义标记和标准 HTML 标记除了都可以利用后端动态数据外<img src='/icons/27527dou.gif' />它们看上去和使用起来没什么区别<img src='/icons/27527dou2.gif' />正确编写自定义标记可以让 Web 设计者创建、查询和操作数据而无需编写<img src='/icons/27527yi.gif' />行 Java 代码<img src='/icons/27527dou2.gif' />正确使用自定义标记使 Java 开发人员不必再在编码过程中考虑表示层<img src='/icons/27527dou2.gif' />这样应用<img src='/icons/27527chengxu.gif' />开发小组<img src='/icons/27527de.gif' />每<img src='/icons/27527yi.gif' />位成员都可以关注于他或者她最擅长<img src='/icons/27527de.gif' />事物<img src='/icons/27527dou2.gif' /> <br/>实现 JSP 自定义标记 <br/>JSP 体系结构需要以下组件以实现自定义标记: <br/>在每<img src='/icons/27527yi.gif' />页中有<img src='/icons/27527yi.gif' />个 JSP 声明 <br/>Web 应用<img src='/icons/27527chengxu.gif' />描述符(web.xml)中<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />个项 <br/><img src='/icons/27527yi.gif' />个包含特殊 XML 文件和为处理自定义标记而<img src='/icons/27527diaoyong.gif' /><img src='/icons/27527de.gif' /> Java 类<img src='/icons/27527de.gif' /> JAR 文件 <br/>在下面几节<img src='/icons/27527dou.gif' />您将<img src='/icons/27527yi.gif' />步<img src='/icons/27527yi.gif' />步地学习如何满足这些要求并将自定义标记加入到 JSP 页面中<img src='/icons/27527dou2.gif' />要想成功实现 JSP 自定义标记<img src='/icons/27527dou.gif' />您需要采取下面 5个步骤: <br/>编写标记处理<img src='/icons/27527chengxu.gif' />类<img src='/icons/27527dou2.gif' /> <br/>创建标记库描述符(TLD)<img src='/icons/27527dou2.gif' /> <br/>使 TLD 文件和处理<img src='/icons/27527chengxu.gif' />类可访问<img src='/icons/27527dou2.gif' /> <br/>引用标记库<img src='/icons/27527dou2.gif' /> <br/>在 JSP 页面中使用标记<img src='/icons/27527dou2.gif' /> <br/>这些内容是相当基本<img src='/icons/27527de.gif' /><img src='/icons/27527dou.gif' />也不用花很长时间<img src='/icons/27527dou2.gif' />就让我们开始吧<img src='/icons/27527dou2.gif' /> <br/>第 1 步. 编写标记处理<img src='/icons/27527chengxu.gif' />类  
		
          
              
          <br/>
        <br/>
          <br/>在下面<img src='/icons/27527de.gif' />例子中<img src='/icons/27527dou.gif' />我们将使用<img src='/icons/27527yi.gif' />个非常简单<img src='/icons/27527de.gif' />显示当前时间和日期<img src='/icons/27527de.gif' />自定义标记例子<img src='/icons/27527dou2.gif' />下面就是 DateTag: <br/>&lt;abc:displayDate /&gt; <br/>我们要做<img src='/icons/27527de.gif' />第<img src='/icons/27527yi.gif' />件事是编写标记处理<img src='/icons/27527chengxu.gif' />类<img src='/icons/27527dou2.gif' />在执行引用自定义标记<img src='/icons/27527de.gif' /> JSP 页面时<img src='/icons/27527dou.gif' />JSP 容器判断每<img src='/icons/27527yi.gif' />个自定义标记<img src='/icons/27527dou2.gif' />当容器遇到<img src='/icons/27527yi.gif' />个标记时<img src='/icons/27527dou.gif' />它<img src='/icons/27527diaoyong.gif' />和这个自定义标记相关联<img src='/icons/27527de.gif' />标记处理<img src='/icons/27527chengxu.gif' /><img src='/icons/27527dou.gif' />我们将在后面更多地讨论这个过程<img src='/icons/27527dou2.gif' />然后<img src='/icons/27527dou.gif' />每<img src='/icons/27527yi.gif' />个标记处理<img src='/icons/27527chengxu.gif' />实现 JSP API 中<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />个特殊接口<img src='/icons/27527dou2.gif' />标记有两种类型:可以处理标记内容(或者正文)<img src='/icons/27527de.gif' />标记和不能处理标记内容<img src='/icons/27527de.gif' />标记: <br/>&lt;abc:tagWithNoBody attribute=\"value\"/&gt; <br/>&lt;abc:tagWithBody attribute=\"value\"&gt; <br/>This is some body content that the tag handler can operate upon. <br/>&lt;/abc:tagWithBody&gt; <br/>在 DateTag 例子中不需要加入正文内容<img src='/icons/27527dou.gif' /><img src='/icons/27527yinwei.gif' />它只显示当前日期<img src='/icons/27527dou2.gif' />因此<img src='/icons/27527dou.gif' />我们<img src='/icons/27527de.gif' />处理<img src='/icons/27527chengxu.gif' />类将实现 Tag 接口(<img src='/icons/27527yi.gif' />般是通过扩展 TagSupport 类)<img src='/icons/27527dou2.gif' />如果我们要创建<img src='/icons/27527yi.gif' />个可以处理正文<img src='/icons/27527de.gif' />标记<img src='/icons/27527dou.gif' />那么我们就需要实现 BodyTag 接口(<img src='/icons/27527yi.gif' />般是通过扩展 BodyTagSupport 类)<img src='/icons/27527dou2.gif' />清单 1 显示了 DateTag <img src='/icons/27527de.gif' />处理<img src='/icons/27527chengxu.gif' />类: [Page]<br/>清单 1. 标记处理<img src='/icons/27527chengxu.gif' />类 <br/>package myTags; <br/>import javax.servlet.jsp.tagext.*; <br/>import javax.servlet.jsp.*; <br/>import javax.servlet.http.*; <br/>import java.text.*; <br/>import java.util.*; <br/>public DateTag extends TagSupport { <br/>public <img src='/icons/27527int.gif' /> doStartTag<img src='/icons/27527kh.gif' /> throws javax.servlet.jsp.JspException { <br/>HttpServletRequest req; <br/>Locale locale; <br/>HttpJspPage g; <br/>DateFormat df; <br/>String date; <br/>JSPWriter out; <br/><br/>req = ( HttpServletRequest )pageContext.getRequest<img src='/icons/27527kh.gif' />; <br/>locale = req.getLocale<img src='/icons/27527kh.gif' />; <br/>df = SimpleDateFormat.getDateInstance( <br/>SimpleDateFormat.FULL,locale ); <br/>date = df.format( <img src='/icons/27527new.gif' /> java.util.Date<img src='/icons/27527kh.gif' /> ); <br/>try { <br/>out = pageContext.getOut<img src='/icons/27527kh.gif' />; <br/>out.pr<img src='/icons/27527int.gif' />( date ); <br/>} catch( IOException ioe ) { <br/>throw <img src='/icons/27527new.gif' /> JspException( \"I/O Error : \" + ioe.getMessage<img src='/icons/27527kh.gif' /> ); <br/>}//end try/catch <br/><img src='/icons/27527return.gif' /> Tag.SKIP_BODY; <br/>}//end doStartTag<img src='/icons/27527kh.gif' /> <br/>}//end DateTag <br/>有关这段代码<img src='/icons/27527de.gif' />介绍说明 <br/>有关 DateTag 处理<img src='/icons/27527chengxu.gif' />类有几件事值得<img src='/icons/27527yi.gif' />说<img src='/icons/27527dou2.gif' />首先看<img src='/icons/27527yi.gif' />下思路方法声明<img src='/icons/27527dou2.gif' />如果我们直接实现 Tag 接口<img src='/icons/27527dou.gif' />那么就需要完成几个思路方法声明<img src='/icons/27527dou2.gif' /><img src='/icons/27527yinwei.gif' /> TagSupport 类是简单<img src='/icons/27527de.gif' />、具体类<img src='/icons/27527dou.gif' />它完全实现了在 Tag 接口中声明<img src='/icons/27527de.gif' />思路方法<img src='/icons/27527dou.gif' />我们可以只实现那些在自定义标记中要使用<img src='/icons/27527de.gif' />思路方法<img src='/icons/27527dou2.gif' />在这个简单<img src='/icons/27527de.gif' />例子中<img src='/icons/27527dou.gif' />我们只实现了 doStartTag<img src='/icons/27527kh.gif' /> 思路方法<img src='/icons/27527dou.gif' />它是在遇到开始标记时<img src='/icons/27527diaoyong.gif' /><img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' /> <br/>您还可能注意到 doStartTag<img src='/icons/27527kh.gif' /> 思路方法返回 SKIP_BODY<img src='/icons/27527dou2.gif' />当然其原因是我们<img src='/icons/27527de.gif' />简单日期标记没有正文<img src='/icons/27527dou2.gif' />您要注意<img src='/icons/27527de.gif' />最后<img src='/icons/27527yi.gif' />件重要<img src='/icons/27527de.gif' />事情是使用了 pageContext 对象访问输出缓存Cache以直接向输出流发送内容<img src='/icons/27527dou2.gif' />您可能还记得在本系列以前<img src='/icons/27527de.gif' />文章说过<img src='/icons/27527dou.gif' />pageContext 对象是<img src='/icons/27527yi.gif' />个隐式对象<img src='/icons/27527dou.gif' />它提供对和当前页面有关<img src='/icons/27527de.gif' />属性<img src='/icons/27527de.gif' />访问<img src='/icons/27527dou2.gif' /> <br/>编写了源代码文件后<img src='/icons/27527dou.gif' />我们像编译所有其他 Java 类<img src='/icons/27527yi.gif' />样编译这个类(确保在类路径中加入 Servlet/JSP JAR 文件)<img src='/icons/27527dou.gif' />然后将编译<img src='/icons/27527de.gif' />类文件放到 Web 应用<img src='/icons/27527chengxu.gif' /><img src='/icons/27527de.gif' />类目录(WEB-INF/<img src='/icons/27527class.gif' />es)中<img src='/icons/27527dou2.gif' />如果我们开发<img src='/icons/27527de.gif' />是几个标记或者定义有标记变量<img src='/icons/27527de.gif' />标记<img src='/icons/27527dou.gif' />那么我们就会有多个标记处理<img src='/icons/27527chengxu.gif' />类<img src='/icons/27527dou2.gif' />在这种情况下我们可能选择将处理<img src='/icons/27527chengxu.gif' />类打包在<img src='/icons/27527yi.gif' />个 JAR 文件中而不是使它们成为类目录中<img src='/icons/27527de.gif' />分散<img src='/icons/27527de.gif' />文件<img src='/icons/27527dou2.gif' /> <br/>第 2 步. 创建 TLD <br/>下<img src='/icons/27527yi.gif' />步是定义包含自定义标记和处理它<img src='/icons/27527de.gif' /> Java 类(或多个类)的间<img src='/icons/27527de.gif' />映射<img src='/icons/27527de.gif' />库<img src='/icons/27527dou2.gif' />这个库是在<img src='/icons/27527yi.gif' />个名为标记库描述符(TLD)<img src='/icons/27527de.gif' /> XML 文档中定义<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />我们将从 DateTag 例子 DateTagLib.tld 中<img src='/icons/27527diaoyong.gif' />这个 TLD<img src='/icons/27527dou2.gif' />注意“.tld”是这种文件<img src='/icons/27527de.gif' />标准扩展名<img src='/icons/27527dou2.gif' /> <br/>清单 2. DateTagLib.tld 文件 <br/>&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?&gt; <br/>&lt;taglib&gt; <br/>&lt;tlibversion&gt;1.0&lt;/tlibversion&gt; <br/>&lt;info&gt;A simple tag library&lt;/info&gt; <br/>&lt;tag&gt; <br/>&lt;name&gt;displayDate&lt;/name&gt; <br/>&lt;tag<img src='/icons/27527class.gif' />&gt;myTags.DateTag&lt;/tag<img src='/icons/27527class.gif' />&gt; <br/>&lt;bodycontent&gt;empty&lt;/bodycontent&gt; <br/>&lt;info&gt;Display Date&lt;/info&gt; <br/>&lt;/tag&gt; <br/>&lt;/taglib&gt; <br/>DateTagLib.tld 是<img src='/icons/27527yi.gif' />个出色<img src='/icons/27527de.gif' />、最小<img src='/icons/27527de.gif' />标记库描述符文件<img src='/icons/27527dou2.gif' />所有关键信息都包含在 Tag 标记中<img src='/icons/27527dou.gif' />在这里映射了标记名和处理<img src='/icons/27527chengxu.gif' />类<img src='/icons/27527dou.gif' />我们声明了标记对于正文内容<img src='/icons/27527de.gif' />敏感性<img src='/icons/27527dou2.gif' />对于更复杂<img src='/icons/27527de.gif' />情况<img src='/icons/27527dou.gif' />我们可以使用其他<img src='/icons/27527de.gif' /> XML 标记以提供有关库和标记<img src='/icons/27527de.gif' />更多信息<img src='/icons/27527dou2.gif' />在<img src='/icons/27527yi.gif' />个库中定义多个标记也很常见<img src='/icons/27527dou2.gif' /> [Page]<br/>第 3 步. 使 TLD 和处理<img src='/icons/27527chengxu.gif' />类可访问 <br/>第 3 步是使这个类或者这些类和 TLD 可以被 Web 应用<img src='/icons/27527chengxu.gif' />访问<img src='/icons/27527dou2.gif' />有两种思路方法:可以将类和 TLD 打包到<img src='/icons/27527yi.gif' />个 JAR 文件中<img src='/icons/27527dou.gif' />再将这个 JAR 文件储存在 Web 应用<img src='/icons/27527chengxu.gif' /><img src='/icons/27527de.gif' /> lib 目录中<img src='/icons/27527dou.gif' />也可以将类文件分散地放到 <img src='/icons/27527class.gif' />es 子目录中并将 TLD 文件放到 Web 应用<img src='/icons/27527chengxu.gif' /><img src='/icons/27527de.gif' /> WEB-INF 目录下面<img src='/icons/27527de.gif' />某<img src='/icons/27527yi.gif' />位置<img src='/icons/27527dou2.gif' /> <br/>在这个例子中<img src='/icons/27527dou.gif' />我们将使用第 2种思路方法<img src='/icons/27527dou.gif' />将 TLD 文件和类分散地放到 Web 应用<img src='/icons/27527chengxu.gif' />目录结构中<img src='/icons/27527dou2.gif' />您可以回忆起在第 1 步中我们已经将标记处理<img src='/icons/27527chengxu.gif' />类放到了 <img src='/icons/27527class.gif' />es 目录中<img src='/icons/27527dou.gif' />所以我们实际上只需储存 TLD 文件<img src='/icons/27527dou2.gif' />TLD 文件被储存在 WEB-INF 目录或者子目录中<img src='/icons/27527dou.gif' />如果是部署 Java 文件<img src='/icons/27527dou.gif' />则储存在 JAR <img src='/icons/27527de.gif' /> META-INF/ 目录或者子目录<img src='/icons/27527dou2.gif' />在这里<img src='/icons/27527dou.gif' />我们没有使用 JAR 文件<img src='/icons/27527dou.gif' />所以我们只将 TLD 储存到 Web 应用<img src='/icons/27527chengxu.gif' /><img src='/icons/27527de.gif' /> WEB-INF/lib 目录中<img src='/icons/27527dou2.gif' /> <br/>第 4 步. 引用这个库 <br/>这时<img src='/icons/27527dou.gif' />我们已经编译了标记处理<img src='/icons/27527chengxu.gif' />类、创建了 TLD 文件以定义处理<img src='/icons/27527chengxu.gif' />类和标记的间<img src='/icons/27527de.gif' />映射、并保证类和标记在应用<img src='/icons/27527chengxu.gif' />中都是可访问<img src='/icons/27527de.gif' /><img src='/icons/27527dou2.gif' />下<img src='/icons/27527yi.gif' />步是建立 JSP 页面和标记库的间<img src='/icons/27527de.gif' />引用<img src='/icons/27527dou2.gif' />有两种思路方法声明 JSP 页面和其库的间<img src='/icons/27527de.gif' />引用<img src='/icons/27527dou2.gif' />可以通过 Web 应用<img src='/icons/27527chengxu.gif' />描述符(web.xml)声明<img src='/icons/27527yi.gif' />个静态引用<img src='/icons/27527dou.gif' />也可以直接在页面中声明<img src='/icons/27527yi.gif' />个动态引用<img src='/icons/27527dou2.gif' />我们将试用这两种思路方法<img src='/icons/27527dou2.gif' /> <br/>为了进行静态引用<img src='/icons/27527dou.gif' />首先必须将下面<img src='/icons/27527de.gif' />项加入到 web.xml 文件中: <br/>&lt;?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?&gt; <br/>&lt;Web-app&gt; <br/>&lt;!-- Define Servlets, Servlet Mappings, etc. --&gt; <br/>&lt;taglib&gt; <br/>&lt;taglib-uri&gt;myTags&lt;/taglib-uri&gt; <br/>&lt;taglib-location&gt;/WEB-INF/lib/DateTagLib.tld&lt;/taglib-location&gt;  
		
          
              
          <br/>
        <br/>
          <br/>&lt;/taglib&gt; <br/>&lt;/Web-app&gt; <br/>然后<img src='/icons/27527dou.gif' />将 JSP 声明加入到所有需要使用自定义标记库<img src='/icons/27527de.gif' />页面中: <br/>&lt;%@ taglib uri=\"myTags\" prefix=\"abc\" %&gt; <br/>注意指定<img src='/icons/27527de.gif' /> uri 属性和在 web.xml 文件中指定<img src='/icons/27527de.gif' /> taglib-uri 值相匹配<img src='/icons/27527dou2.gif' /> <br/>为了进行动态引用<img src='/icons/27527dou.gif' />只需在所有需要使用这个库<img src='/icons/27527de.gif' />页面中加入<img src='/icons/27527yi.gif' />个 JSP 声明即可: <br/>&lt;%@ taglib uri=\"/WEB-INF/lib/DateTagLib.tld\" prefix=\"abc\" %&gt; <br/>静态引用和动态引用<img src='/icons/27527de.gif' />比较 <br/>在进行标记库<img src='/icons/27527de.gif' />静态引用时<img src='/icons/27527dou.gif' />JSP 声明必须查询 web.xml 文件以执行库查询<img src='/icons/27527dou2.gif' />这意味着如果移动或者重命名了库<img src='/icons/27527dou.gif' />或者希望在 web.xml 文件中加入更多<img src='/icons/27527de.gif' />库<img src='/icons/27527dou.gif' />就必须停止服务器、更新 web.xml 文件、然后重新启动服务器<img src='/icons/27527dou2.gif' />动态思路方法让 JSP 页直接指向 TLD 位置<img src='/icons/27527dou.gif' />因而是在解释 JSP 页面时进行处理<img src='/icons/27527dou2.gif' /> <br/>静态思路方法提供了页面和库<img src='/icons/27527de.gif' />实际名和位置的间<img src='/icons/27527yi.gif' />定程度<img src='/icons/27527de.gif' />非直接性<img src='/icons/27527dou.gif' />这可以为您提供<img src='/icons/27527yi.gif' />些改变这些属性而不修改页面<img src='/icons/27527de.gif' />灵活性<img src='/icons/27527dou2.gif' />另<img src='/icons/27527yi.gif' />方面<img src='/icons/27527dou.gif' />动态思路方法提供了更大<img src='/icons/27527de.gif' />灵活性<img src='/icons/27527dou.gif' />让您可以在运行时增加和移动标记声明<img src='/icons/27527dou2.gif' />如果您对动态思路方法感兴趣<img src='/icons/27527dou.gif' />但是又担心做了<img src='/icons/27527yi.gif' />些改变后、有可能要更新多个页面<img src='/icons/27527de.gif' />维护负担<img src='/icons/27527dou.gif' />那么您可以始终将 JSP 声明放到<img src='/icons/27527yi.gif' />个单独<img src='/icons/27527de.gif' /> JSP 文件中<img src='/icons/27527dou.gif' />并在每<img src='/icons/27527yi.gif' />个要访问 Web 应用<img src='/icons/27527chengxu.gif' /><img src='/icons/27527de.gif' />自定义库<img src='/icons/27527de.gif' />页面中加入这<img src='/icons/27527yi.gif' />页<img src='/icons/27527dou2.gif' />这使您具有在运行时只需要更新信息<img src='/icons/27527yi.gif' />次就可以增加库<img src='/icons/27527de.gif' />灵活性<img src='/icons/27527dou2.gif' /> <br/>第 5 步. 在 JSP 页面中使用标记 <br/>完成了所有这些准备工作后<img src='/icons/27527dou.gif' />我们就可以在 JSP 页面中使用这些自定义标记了<img src='/icons/27527dou2.gif' />清单 3 显示了包含 DateTag <img src='/icons/27527de.gif' /> JSP 页面<img src='/icons/27527de.gif' />浏览器输出: [Page]<br/>清单 3. 带有自定义标记<img src='/icons/27527de.gif' /> JSP 页 <br/>&lt;%@ taglib uri=\"/WEB-INF/lib/DateTagLib.tld\" prefix=\"abc\" %&gt; <br/>&lt;HTML&gt; <br/>&lt;HEAD&gt; <br/>&lt;TITLE&gt;Date tag example&lt;/TITLE&gt; <br/>&lt;/HEAD&gt; <br/><br/>&lt;BODY&gt; <br/>&lt;H1&gt;Date tag Example&lt;/H1&gt; <br/>&lt;p&gt;Hi today is &lt;b&gt;&lt;abc:displayDate /&gt;&lt;/b&gt; &lt;/p&gt; <br/>&lt;/BODY&gt; <br/>&lt;/HTML&gt; <br/>重新启动 Web 服务器并测试自己<img src='/icons/27527de.gif' /> JSP 页面 ！结果看起来类似于图 1 所示<img src='/icons/27527dou2.gif' /> <br/>图 1. DateTag <img src='/icons/27527de.gif' />浏览器输出 <br/>用 JSTL 节省时间 <br/>您所需要<img src='/icons/27527de.gif' />自定义标记功能中也许有多达百分的 8十已经由 J2EE 团体创建并标准化了<img src='/icons/27527dou2.gif' />使用现有<img src='/icons/27527de.gif' />标记库而不是从头创建所有东西会使您节省大量时间和精力<img src='/icons/27527dou2.gif' />尽管在公共域有数十种库<img src='/icons/27527dou.gif' />不过业界汇集了<img src='/icons/27527yi.gif' />个特定<img src='/icons/27527de.gif' />自定义库<img src='/icons/27527dou2.gif' />Java 标准标记库(JSTL)是由 Java Community Process 设计<img src='/icons/27527de.gif' /><img src='/icons/27527dou.gif' />其参考实现是由 Apache Group 通过 Jakarta Taglibs 项目所开发和维护<img src='/icons/27527de.gif' />(参阅参考资料)<img src='/icons/27527dou2.gif' /> <br/>JSTL 定义了针对常见 Web 应用<img src='/icons/27527chengxu.gif' />处理需求<img src='/icons/27527dou.gif' />如变量支持、流程控制、URL 管理、XML 操作、国际化、数据库访问等等<img src='/icons/27527de.gif' />标记<img src='/icons/27527dou2.gif' />除了<img src='/icons/27527yi.gif' />组丰富<img src='/icons/27527de.gif' />标记外<img src='/icons/27527dou.gif' />JSTL 还定义了自己<img src='/icons/27527de.gif' />表达式语言(EL)<img src='/icons/27527dou2.gif' />EL 使我们可以容易地访问应用<img src='/icons/27527chengxu.gif' />数据并更容易在不使用脚本或者请求时表达式<img src='/icons/27527de.gif' />条件下操作这些数据<img src='/icons/27527dou2.gif' /> <br/>除了节省您从头开发所有标记<img src='/icons/27527de.gif' />时间和精力<img src='/icons/27527dou.gif' />JSTL 还具有标准化和业界承认<img src='/icons/27527de.gif' />所有好处<img src='/icons/27527dou2.gif' />这些好处包括厂商支持、大量介绍文字、以及有很大<img src='/icons/27527de.gif' />机会找到具有 JSTL 经验<img src='/icons/27527de.gif' />雇员或者承包商<img src='/icons/27527dou2.gif' /> <br/>结束语 <br/>在 J2EE Web 开发中越来越多地需要将业务和表示逻辑分离<img src='/icons/27527dou.gif' />JSP 自定义标记提供了替代简单<img src='/icons/27527de.gif' />老 JavaBean 和 Java 脚本<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />个有吸引力<img src='/icons/27527de.gif' />思路方法<img src='/icons/27527dou2.gif' />更好<img src='/icons/27527de.gif' />是在 JSTL 中已存在<img src='/icons/27527yi.gif' />组已定义<img src='/icons/27527de.gif' />标准<img src='/icons/27527de.gif' />自定义标记库<img src='/icons/27527dou2.gif' />在 J2EE 探索者 <img src='/icons/27527de.gif' />这篇文章中<img src='/icons/27527dou.gif' />您经历了从头创建<img src='/icons/27527yi.gif' />个自定义标记并在 JSP 页面中实现它<img src='/icons/27527de.gif' />过程<img src='/icons/27527dou2.gif' />我还简单介绍了 JSTL 并阐述了使用它而不是从头创建所有<img src='/icons/27527de.gif' />自定义标记<img src='/icons/27527de.gif' />好处<img src='/icons/27527dou2.gif' /> <br/>下个月<img src='/icons/27527dou.gif' />我们将继续探索 J2EE 技术<img src='/icons/27527dou.gif' />对 Web 应用<img src='/icons/27527chengxu.gif' />安全体系结构进行分析<img src='/icons/27527dou2.gif' />祝这段时间里探索快乐！ <br/><br/>[J2EE]项目艰辛笔记 <br/>这3天让Eclipse-Tocmat-Struts <img src='/icons/27527de.gif' />配置问题搞<img src='/icons/27527de.gif' /><img src='/icons/27527yi.gif' />直头大<img src='/icons/27527dou.gif' />今天下班前终于将其搞定 :-) <br/>我<img src='/icons/27527de.gif' />做法是将Struts 配置到标准<img src='/icons/27527de.gif' />J2EE工程里<img src='/icons/27527dou.gif' />具体为:将*.jar 放到WEB-INF\\lib 下<img src='/icons/27527dou.gif' />编写 <br/>WEB-INF 下<img src='/icons/27527de.gif' />struts-config.xml文件<img src='/icons/27527dou.gif' />将tld放到WEB-INF 下<img src='/icons/27527dou.gif' />配置web.xml 文件； <br/>在发布<img src='/icons/27527de.gif' />时候<img src='/icons/27527dou.gif' />将J2EE工程发布为标准<img src='/icons/27527de.gif' /> war 文件<img src='/icons/27527dou.gif' />直接放到 $TOMCAT\\webapps\\ 下运行 <br/><br/><br/>1.struts-config.xml 文件<img src='/icons/27527de.gif' />配置 <br/>STRUTS 配置中最重要<img src='/icons/27527de.gif' />应该是struts-config.xml文件<img src='/icons/27527de.gif' />配置了<img src='/icons/27527dou.gif' /> <br/>struts-config.xml 文件<img src='/icons/27527de.gif' />作用是映射form bean &amp;&amp; action bean ,其中最重要<img src='/icons/27527de.gif' />是 <br/>&lt;action-mappings&gt; &lt;/action-mappings&gt; <img src='/icons/27527de.gif' />映射<img src='/icons/27527dou.gif' />它定义了JSP&lt;-&gt;FORM BEAN&lt;-&gt;ACTION BEAN <br/>的间<img src='/icons/27527de.gif' />对应和forward 转发(在ACTION BEAN 里用到)；值得注意<img src='/icons/27527de.gif' />是:JSP 中text/password <br/>等文本标签必须在其对应<img src='/icons/27527de.gif' />FORM BEAN 中有getter/<img src='/icons/27527set.gif' />ter 思路方法<img src='/icons/27527dou.gif' />否则将提示出错 <br/>(花了2天才搞定！) <br/><br/>2.工程在TOMCAT 下<img src='/icons/27527de.gif' />发布 [Page]<br/>标准<img src='/icons/27527de.gif' />J2EE可以在ECLIPSE 中方便<img src='/icons/27527de.gif' />进行开发<img src='/icons/27527dou.gif' />这中间<img src='/icons/27527dou.gif' />BEAN 和 SERVLET<img src='/icons/27527de.gif' />单元测试也可以在 <br/>ECLIPSE 中进行<img src='/icons/27527dou.gif' />当<img src='/icons/27527yi.gif' />切似乎没什么问题时<img src='/icons/27527dou.gif' />你可以将其发布；值得注意<img src='/icons/27527de.gif' />是<img src='/icons/27527dou.gif' />你应该让 ECLISPE <br/>先为你编译<img src='/icons/27527dou.gif' />即将src 编译为.<img src='/icons/27527class.gif' /> 放到 WEB-INF\\<img src='/icons/27527class.gif' /> 中<img src='/icons/27527dou.gif' />(花了1上午也没搞定<img src='/icons/27527dou.gif' />幸好ZHENGQ <br/>帮忙)<img src='/icons/27527dou.gif' />编译的后<img src='/icons/27527dou.gif' />就可用Lomboz 做发布了<img src='/icons/27527dou.gif' />这个东西会帮你将工程发布为.war 文件 <br/><br/>3.依然存在<img src='/icons/27527de.gif' />问题 <br/>1)整个过程非常麻烦<img src='/icons/27527dou.gif' />尤其是调试.jsp<img src='/icons/27527de.gif' />时候<img src='/icons/27527dou.gif' />期待<img src='/icons/27527yi.gif' />种比较优雅高效<img src='/icons/27527de.gif' />方式 <br/>2)使用lomboz发布时<img src='/icons/27527dou.gif' />应该可以指定目录<img src='/icons/27527dou.gif' />但现在还不知道 <br/>3)eclipse <img src='/icons/27527de.gif' />调试也比较繁<img src='/icons/27527dou.gif' />期待<img src='/icons/27527yi.gif' />种简洁<img src='/icons/27527de.gif' />方式<br/>  <a href="/mypdf/6646.pdf" title="查看 j2ee开发:J2EE开发原则学习 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6646.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee项目开发:使用Rational工具简化J2EE项目开发]]></title>
			<link>http://CrazyCoder.cn/Java/Article6642.html</link>
			<description>
				<![CDATA[

		
          
              
          <br/>
        <br/>
          图1显示了在ASDI项目<img src='/icons/70972de.gif' />第1阶段(RUP<img src='/icons/70972de.gif' /><img src='/icons/70972chushi.gif' />和细化阶段)中<img src='/icons/70972de.gif' />用例<img src='/icons/70972de.gif' />演化<img src='/icons/70972dou2.gif' />我们在<img src='/icons/70972chushi.gif' />阶段创建了业务用例<img src='/icons/70972dou.gif' />然后在细化阶段<img src='/icons/70972de.gif' />初期将业务用例转换成体现了“目前<img src='/icons/70972de.gif' />”系统<img src='/icons/70972de.gif' />用例<img src='/icons/70972dou2.gif' />现在我们是在细化阶段<img src='/icons/70972de.gif' />最激烈<img src='/icons/70972de.gif' />时刻<img src='/icons/70972dou.gif' />我们正准备细化我们<img src='/icons/70972de.gif' />用例<img src='/icons/70972dou.gif' />为系统完成向详细需求<img src='/icons/70972de.gif' />转换<img src='/icons/70972dou2.gif' />这个演进是自然形成<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />直到断定了是否我们开始定义<img src='/icons/70972de.gif' />用例是正确<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />我们才可以为用例进行更为详细<img src='/icons/70972de.gif' />信息添加<img src='/icons/70972dou2.gif' /><img src='/icons/70972yi.gif' />旦详细<img src='/icons/70972de.gif' />系统需求被完成<img src='/icons/70972dou.gif' />我们将它作为<img src='/icons/70972yi.gif' />个正式<img src='/icons/70972de.gif' />交付物被ASDI审查通过<img src='/icons/70972dou2.gif' /> <br/> <br/>图1:第1阶段用例<img src='/icons/70972de.gif' />演进 <br/> <br/><br/>标准化用例文档 <br/>在我们和ASDI对用例进行非正式<img src='/icons/70972de.gif' />检查<img src='/icons/70972de.gif' />会议中我们对用例进行了注释<img src='/icons/70972dou2.gif' />用例图和包也被我们<img src='/icons/70972de.gif' />高级团队(Team)成员定期<img src='/icons/70972de.gif' />检查了<img src='/icons/70972dou.gif' /><img src='/icons/70972yi.gif' />个“健全<img src='/icons/70972de.gif' />”检查将带来以下<img src='/icons/70972de.gif' />结果: <br/>将不稳定<img src='/icons/70972de.gif' />或者遗漏<img src='/icons/70972de.gif' />方面反馈给组长 <br/>有用<img src='/icons/70972de.gif' />分析建议、模式和功能分解方面<img src='/icons/70972de.gif' />考虑 <br/><img src='/icons/70972yi.gif' />致<img src='/icons/70972de.gif' />系统视图 <br/>工程团队(Team)对详细需求<img src='/icons/70972de.gif' />交流 <br/>我们现在<img src='/icons/70972de.gif' />重点是记录我们已经了解到<img src='/icons/70972de.gif' />东西<img src='/icons/70972dou2.gif' />我们和ASDI在用例文档<img src='/icons/70972de.gif' />形式上达成了<img src='/icons/70972yi.gif' />致<img src='/icons/70972dou.gif' />并且我们非常高兴他们愿意接受在Rose模型中对每<img src='/icons/70972yi.gif' />个用例直接添加文档<img src='/icons/70972de.gif' />方式<img src='/icons/70972dou2.gif' />这对于我们来说<img src='/icons/70972dou.gif' />事情变得更加简单了<img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />这意味着更低<img src='/icons/70972de.gif' />对文档美观<img src='/icons/70972de.gif' />期望<img src='/icons/70972dou2.gif' /> <br/>在多个团队(Team)成员共同工作<img src='/icons/70972de.gif' />情况下<img src='/icons/70972dou.gif' />我们发现我们需要标准化和每个用例相关联<img src='/icons/70972de.gif' />文档<img src='/icons/70972dou2.gif' />因此<img src='/icons/70972dou.gif' />我们起草<img src='/icons/70972yi.gif' />份用例<img src='/icons/70972de.gif' />文档模板<img src='/icons/70972dou.gif' />并应用于Rose模型<img src='/icons/70972de.gif' />每个用例中<img src='/icons/70972dou2.gif' />在图2中显示<img src='/icons/70972de.gif' />内容是被粘贴到每个用例作为模板<img src='/icons/70972de.gif' />文档窗口<img src='/icons/70972dou2.gif' />注意我们在这个模板中使用术语“variation”作为对RUP可选流概念<img src='/icons/70972de.gif' />速记标记<img src='/icons/70972dou2.gif' /> <br/> <br/>图2:用例文档模板 <br/><br/>在项目<img src='/icons/70972de.gif' />后来<img src='/icons/70972dou.gif' />我们意识到在模型(*.mdl和*.cat)文件中有大量ASCII形式<img src='/icons/70972de.gif' />文档<img src='/icons/70972dou.gif' />使模型<img src='/icons/70972de.gif' />加载慢了下来<img src='/icons/70972dou2.gif' />感谢我们<img src='/icons/70972de.gif' />快速<img src='/icons/70972de.gif' />电脑<img src='/icons/70972dou.gif' />这个副作用还可以被容忍<img src='/icons/70972dou.gif' />但是在后来<img src='/icons/70972de.gif' />项目中我们使用了更加正式<img src='/icons/70972de.gif' />思路方法来维护用例<img src='/icons/70972de.gif' />内容<img src='/icons/70972dou.gif' />通过<img src='/icons/70972yi.gif' />个自定义接口<img src='/icons/70972de.gif' />方式<img src='/icons/70972dou2.gif' />(就像在文章\"FineTuningRo<img src='/icons/70972set.gif' />oComplementYourProcess\"所讨论<img src='/icons/70972de.gif' />那样)另<img src='/icons/70972yi.gif' />个可选<img src='/icons/70972de.gif' />思路方法是使用Rose附带单独<img src='/icons/70972de.gif' />MicrosoftWord文档到用例<img src='/icons/70972de.gif' />特性(通过右键点击用例并从上下文菜单中选择New&gt;File)<img src='/icons/70972dou2.gif' /> <br/>用例<img src='/icons/70972de.gif' />可跟踪性 <br/>ASDI原来<img src='/icons/70972de.gif' />期望是SOW将最终成为<img src='/icons/70972yi.gif' />个大<img src='/icons/70972de.gif' />文字形式<img src='/icons/70972de.gif' />文档<img src='/icons/70972dou2.gif' />我们通过和他们<img src='/icons/70972de.gif' />不断<img src='/icons/70972de.gif' />讨论<img src='/icons/70972dou.gif' />最终他们意识到这种思路方法<img src='/icons/70972de.gif' />缺点<img src='/icons/70972dou.gif' />并作出了让步<img src='/icons/70972de.gif' />姿态<img src='/icons/70972dou2.gif' />他们现在明白了使用用例<img src='/icons/70972de.gif' />好处并很快<img src='/icons/70972de.gif' />掌握了相关<img src='/icons/70972de.gif' />概念<img src='/icons/70972dou.gif' />并理解了使用用例将给他们<img src='/icons/70972yi.gif' />种不需要对模型进行预排<img src='/icons/70972de.gif' />非常强大并适当<img src='/icons/70972de.gif' />反馈<img src='/icons/70972de.gif' />方式<img src='/icons/70972dou2.gif' />无论如何<img src='/icons/70972dou.gif' /><img src='/icons/70972yi.gif' />个好<img src='/icons/70972de.gif' />时间和精力<img src='/icons/70972de.gif' />分配已经进入了SOW<img src='/icons/70972dou.gif' />可以理解ASDI希望我们能够确保不会遗漏任何在SOW中被捕获<img src='/icons/70972de.gif' />东西<img src='/icons/70972dou2.gif' /> <br/>为了提供这个保证<img src='/icons/70972dou.gif' />我们使用了Rational<img src='/icons/70972de.gif' />工具来建立在SOW需求和我们<img src='/icons/70972de.gif' />相当稳定<img src='/icons/70972de.gif' />用例的间<img src='/icons/70972de.gif' />可跟踪性<img src='/icons/70972dou2.gif' />首先我们通过RequisitePro将Rose模型和被管理<img src='/icons/70972de.gif' />需求文档关联起来<img src='/icons/70972dou.gif' />通过选择Tools&gt;RationalRequisitePro&gt;AssociateModeltoProject并选择SOW<img src='/icons/70972dou2.gif' />然后我们相应<img src='/icons/70972de.gif' />映射每<img src='/icons/70972yi.gif' />个用例到主SOW需求<img src='/icons/70972dou.gif' />通过右键点击用例并在上下文菜单中选择RequirementProperties&gt;New<img src='/icons/70972dou2.gif' />如图3所示<img src='/icons/70972dou.gif' />我们展示了<img src='/icons/70972yi.gif' />个SOW需求列表<img src='/icons/70972dou.gif' />并从中选择适当<img src='/icons/70972de.gif' />需求<img src='/icons/70972dou2.gif' /> [Page]<br/> <br/>图3:关联需求和用例 <br/> <br/><br/>我们已经在模型中建立起了这些关联<img src='/icons/70972dou.gif' />我们可以跟踪需求到用例<img src='/icons/70972dou.gif' />相反也可以<img src='/icons/70972dou2.gif' />双向<img src='/icons/70972de.gif' />可跟踪性是十分重要<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />因此我们既可以发现遗漏<img src='/icons/70972de.gif' />需求也可以发现新添加<img src='/icons/70972de.gif' />需求<img src='/icons/70972dou2.gif' />遗漏某<img src='/icons/70972yi.gif' />需求是不可接受<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />跟踪需求到用例可以使我们很容易<img src='/icons/70972de.gif' />发现我们<img src='/icons/70972de.gif' />任何遗漏<img src='/icons/70972dou2.gif' />添加需求而没有清晰<img src='/icons/70972de.gif' />调整将导致项目范围<img src='/icons/70972de.gif' />蔓延并对项目<img src='/icons/70972de.gif' />时间计划和预算有着负面<img src='/icons/70972de.gif' />影响<img src='/icons/70972dou2.gif' />为了防止这<img src='/icons/70972yi.gif' />切<img src='/icons/70972dou.gif' />我们应该跟踪所有<img src='/icons/70972de.gif' />用例到每<img src='/icons/70972yi.gif' />个存在<img src='/icons/70972de.gif' />SOW需求或者变更请求<img src='/icons/70972dou2.gif' /> <br/>不像跟踪需求到用例<img src='/icons/70972dou.gif' />反方向<img src='/icons/70972de.gif' />跟踪经常被忽略<img src='/icons/70972dou.gif' />但是我们可以很容易<img src='/icons/70972de.gif' />在Rose中完成这<img src='/icons/70972yi.gif' />点<img src='/icons/70972dou2.gif' />为了浏览和<img src='/icons/70972yi.gif' />个用例相关联<img src='/icons/70972de.gif' />SOW需求<img src='/icons/70972dou.gif' />我们简单<img src='/icons/70972de.gif' />在Rose模型中右键点击用例<img src='/icons/70972dou.gif' />并选择从上下文菜单中选择ViewRequisiteProAssociation<img src='/icons/70972dou2.gif' />这会弹出<img src='/icons/70972yi.gif' />个窗口指示哪<img src='/icons/70972yi.gif' />个SOW需求是被选择<img src='/icons/70972de.gif' />用例跟踪<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />如图4所示<img src='/icons/70972dou2.gif' />如果用例没有被映射到<img src='/icons/70972yi.gif' />个SOW需求<img src='/icons/70972dou.gif' />底部<img src='/icons/70972de.gif' />两个域将显示“NONE”<img src='/icons/70972dou2.gif' />我们也可以通过RationalSoDA产生更加复杂<img src='/icons/70972de.gif' />跟踪报告<img src='/icons/70972dou2.gif' /> <br/> <br/>图4:被Rose报告<img src='/icons/70972de.gif' />对于<img src='/icons/70972yi.gif' />个用例<img src='/icons/70972de.gif' />SOW需求 <br/> <br/><br/>注意在这个思路方法中使用<img src='/icons/70972yi.gif' />个捷径是重要<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />通过我们使用<img src='/icons/70972de.gif' />思路方法<img src='/icons/70972dou.gif' />我们可以仅仅可以每次关联<img src='/icons/70972yi.gif' />个用例到<img src='/icons/70972yi.gif' />个需求<img src='/icons/70972dou.gif' />反的亦然；然而<img src='/icons/70972dou.gif' /><img src='/icons/70972yi.gif' />个用例实际上是可以跟踪回到几个需求<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />同样<img src='/icons/70972yi.gif' />个需求可能分布到多个用例中<img src='/icons/70972dou2.gif' />我们不必苦恼映射多对多<img src='/icons/70972de.gif' />关系<img src='/icons/70972dou2.gif' />我们直接将用例关联到SOW中<img src='/icons/70972de.gif' />需求<img src='/icons/70972dou.gif' />但是更好<img src='/icons/70972de.gif' />思路方法是引入<img src='/icons/70972yi.gif' />个被RequisitePro管理<img src='/icons/70972de.gif' />用例规格文档<img src='/icons/70972dou.gif' />它包含很多用例需求<img src='/icons/70972de.gif' />文字描述并可以实现多对多<img src='/icons/70972de.gif' />映射<img src='/icons/70972dou2.gif' />(详细<img src='/icons/70972de.gif' />描述可以在Rational白皮书\"UseCaseManagementwithRationalRoseandRationalRequisitePro\"中被找到<img src='/icons/70972dou2.gif' />)我们现在觉得用例规格文档是我们不应该跳过<img src='/icons/70972de.gif' />重要步骤<img src='/icons/70972dou2.gif' /> <br/>用例文档<img src='/icons/70972de.gif' />检查周期 <br/>我们和ASDI都明白文档频繁<img src='/icons/70972de.gif' />检查周期会导致无止境<img src='/icons/70972de.gif' />循环下去<img src='/icons/70972dou2.gif' />结束任何文档都是困难<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />每<img src='/icons/70972yi.gif' />次阅读文档时检查人员经常会产生<img src='/icons/70972yi.gif' />些新<img src='/icons/70972de.gif' />想法<img src='/icons/70972dou2.gif' />在迭代<img src='/icons/70972de.gif' />思路方法中<img src='/icons/70972dou.gif' />相同<img src='/icons/70972de.gif' />“何时结束<img src='/icons/70972de.gif' />”<img src='/icons/70972de.gif' />挑战也会出现在软件Software<img src='/icons/70972de.gif' />文档和其他任务中<img src='/icons/70972dou2.gif' />为了满足ASDI对有关结束<img src='/icons/70972de.gif' />关心<img src='/icons/70972dou.gif' />我们描述了我们对用例文档<img src='/icons/70972de.gif' />检查周期将是什么样<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />我们努力<img src='/icons/70972de.gif' />借用了RUP中所描述<img src='/icons/70972de.gif' />概念(见图5)<img src='/icons/70972dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/> <br/>图5:文档检查周期图 <br/> <br/><br/>就像你所看到<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />我们<img src='/icons/70972de.gif' />每<img src='/icons/70972yi.gif' />个文档都经过了<img src='/icons/70972yi.gif' />系列<img src='/icons/70972de.gif' />迭代<img src='/icons/70972dou2.gif' />对于我们来说找到<img src='/icons/70972yi.gif' />个工具来支持它是重要<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />我们在RationalSoDA中发现这样<img src='/icons/70972yi.gif' />个工具<img src='/icons/70972dou.gif' />它允许我们生成Rose模型以外<img src='/icons/70972de.gif' />文档<img src='/icons/70972dou2.gif' />虽然对文档直接做修改是诱人<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />但是这将带来文档和模型区别步<img src='/icons/70972de.gif' />风险<img src='/icons/70972dou2.gif' />如果你将在<img src='/icons/70972yi.gif' />个或其他<img src='/icons/70972de.gif' />文档中投入精力<img src='/icons/70972dou.gif' />更好<img src='/icons/70972de.gif' />思路方法是在模型中投入精力<img src='/icons/70972dou2.gif' />除了你开发<img src='/icons/70972de.gif' />软件Software用户手册以外<img src='/icons/70972dou.gif' />模型几乎是可以在软件Software被交付后还可以继续被引用和维护<img src='/icons/70972de.gif' />产物<img src='/icons/70972dou2.gif' /> [Page]<br/>通过使用SoDA<img src='/icons/70972dou.gif' />产生报告是简单<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />为客户<img src='/icons/70972de.gif' />检查生成用例文档<img src='/icons/70972dou.gif' />我们从Rose<img src='/icons/70972de.gif' />报告菜单中选择SoDAReport<img src='/icons/70972dou.gif' />这将出现<img src='/icons/70972yi.gif' />个报告模板<img src='/icons/70972de.gif' />列表<img src='/icons/70972dou.gif' />如图6所示<img src='/icons/70972dou2.gif' />从中我们选择aRUPuse-<img src='/icons/70972case.gif' />modelsurvey模板<img src='/icons/70972dou2.gif' /> <br/> <br/>图6:SoDA报告选择 <br/> <br/><br/>每<img src='/icons/70972yi.gif' />个模板提供了<img src='/icons/70972yi.gif' />个缺省<img src='/icons/70972de.gif' />报告(作为MicrosoftWord文档)伴随<img src='/icons/70972yi.gif' />个空<img src='/icons/70972de.gif' />部分和相应<img src='/icons/70972de.gif' />内容表格(TOC)<img src='/icons/70972dou2.gif' />图7显示了我们选择报告<img src='/icons/70972de.gif' />TOC<img src='/icons/70972dou2.gif' />我们通过和ASDI检查TOC开始<img src='/icons/70972dou.gif' />并且我们查看了我们<img src='/icons/70972de.gif' />用例以决定是否需要在报告中根据我们<img src='/icons/70972de.gif' />需要进行合适<img src='/icons/70972de.gif' />裁剪<img src='/icons/70972dou2.gif' /> <br/> <br/>图7:SoDAuse-<img src='/icons/70972case.gif' />survey报告(TOC) <br/> <br/><br/>你可能想知道在写任何实际<img src='/icons/70972de.gif' />内容的前<img src='/icons/70972dou.gif' />为什么我们担心和ASDI<img src='/icons/70972yi.gif' />起检查TOC<img src='/icons/70972dou2.gif' />我们发现这是<img src='/icons/70972yi.gif' />个重要<img src='/icons/70972de.gif' />步骤<img src='/icons/70972dou2.gif' />有时ASDI给我们<img src='/icons/70972yi.gif' />个DID(数据项描述)<img src='/icons/70972dou.gif' />它对正式<img src='/icons/70972de.gif' />交付物提供<img src='/icons/70972yi.gif' />个TOC<img src='/icons/70972dou.gif' />但是我们发现在开始充实内容的前根据TOC从ASDI(或者内部<img src='/icons/70972de.gif' />团队(Team)检查人员)得到信息是有用<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />有时我们在每<img src='/icons/70972yi.gif' />个部分填写显示我们将如何细化<img src='/icons/70972de.gif' />标题<img src='/icons/70972dou.gif' />但是在首次<img src='/icons/70972de.gif' />TOC检查时几乎没有任何<img src='/icons/70972de.gif' />段落内容<img src='/icons/70972dou2.gif' /> <br/>后续<img src='/icons/70972de.gif' />文章部分将讨论RationalSoDA和模板定制<img src='/icons/70972de.gif' />更加详细<img src='/icons/70972de.gif' />信息<img src='/icons/70972dou2.gif' /> <br/>细化:不只是用例 <br/>为了使生活更加有难度<img src='/icons/70972dou.gif' />ASDI期望我们在继续随后<img src='/icons/70972de.gif' />任务的前创建用例文档<img src='/icons/70972dou2.gif' />我们必须提醒他们用例文档直到软件Software被交付才会被“完成”<img src='/icons/70972dou.gif' />除非他们不想让我们在需求变化或者新需求出现时更新用例<img src='/icons/70972dou2.gif' />我们说服了他们<img src='/icons/70972dou.gif' />他们不会对完成<img src='/icons/70972de.gif' />里程碑甚至是自信<img src='/icons/70972de.gif' />里程碑感兴趣<img src='/icons/70972dou2.gif' />然而<img src='/icons/70972dou.gif' />他们希望放<img src='/icons/70972yi.gif' />个检查标记到下<img src='/icons/70972yi.gif' />个要做<img src='/icons/70972de.gif' />“详细<img src='/icons/70972de.gif' />用例文档”项<img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />它是十分成熟<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />我们同意这个观点<img src='/icons/70972dou2.gif' /> <br/>真正<img src='/icons/70972de.gif' />挑战是说服ASDI所有需要<img src='/icons/70972de.gif' />活动应该是并行<img src='/icons/70972de.gif' />发生<img src='/icons/70972dou.gif' />而不是所有<img src='/icons/70972de.gif' />里程碑都是按照顺序被交付<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />我们把它作为在项目早期<img src='/icons/70972de.gif' /><img src='/icons/70972yi.gif' />个常规<img src='/icons/70972de.gif' />关注点<img src='/icons/70972dou.gif' />它仍然没有被完全<img src='/icons/70972de.gif' />解决<img src='/icons/70972dou2.gif' />为了让他符合用例分析<img src='/icons/70972de.gif' /><img src='/icons/70972yi.gif' />些活动<img src='/icons/70972dou.gif' />我们提出了这两个观点: <br/>屏幕<img src='/icons/70972de.gif' />模拟将简化需求<img src='/icons/70972de.gif' />检查<img src='/icons/70972dou.gif' />并可以比用例讲述<img src='/icons/70972yi.gif' />个广泛<img src='/icons/70972de.gif' />经过<img src='/icons/70972dou2.gif' /> <br/>没有<img src='/icons/70972yi.gif' />些前瞻性<img src='/icons/70972de.gif' />原型<img src='/icons/70972dou.gif' />工具获得、安装和培训不应该发生<img src='/icons/70972dou2.gif' /> <br/>我们非常高兴ASDI同意模拟和原型作为分析阶段<img src='/icons/70972de.gif' />有用<img src='/icons/70972de.gif' />部分<img src='/icons/70972dou2.gif' />这使我们可以在用例分析被完成前进入到架构<img src='/icons/70972de.gif' />和工具<img src='/icons/70972de.gif' />选择问题中<img src='/icons/70972dou2.gif' /> <br/>选择工具和技术 <br/>工具和技术选择从来就不是微不足道<img src='/icons/70972de.gif' />任务<img src='/icons/70972dou.gif' />虽然它常常被忽略<img src='/icons/70972dou2.gif' />团队(Team)经常根据启动成本、“小工具原因”、好奇心或者对工具和技术<img src='/icons/70972de.gif' />忠心来作出选择<img src='/icons/70972dou.gif' />相反<img src='/icons/70972dou.gif' />他们应该考虑生产成本、可靠性、可得到<img src='/icons/70972de.gif' />培训、团队(Team)技能和特性标准<img src='/icons/70972dou2.gif' />在评估过程中添加<img src='/icons/70972yi.gif' />些正式手续可以确保工具<img src='/icons/70972de.gif' />选择使基于项目需要<img src='/icons/70972de.gif' />而不是个人主观<img src='/icons/70972de.gif' />意见<img src='/icons/70972dou2.gif' /> [Page]<br/>正式<img src='/icons/70972de.gif' />工具评估 <br/><img src='/icons/70972yi.gif' />个在RUP中很少关注<img src='/icons/70972de.gif' />地方是团队(Team)挑选现货(off-the-shelf)—也称作商业现货供应(COTS)—工具<img src='/icons/70972de.gif' />过程<img src='/icons/70972dou2.gif' />可以了解这个过程领域知识<img src='/icons/70972de.gif' /><img src='/icons/70972yi.gif' />个地方是卡内基－梅隆软件Software工程学院(SEI)<img src='/icons/70972dou.gif' />那里有COTS-Based<img src='/icons/70972System.gif' />sInitiative关注于COTS产品<img src='/icons/70972de.gif' />选择和采纳<img src='/icons/70972de.gif' />策略<img src='/icons/70972dou2.gif' />特别有趣<img src='/icons/70972de.gif' />是SEI<img src='/icons/70972de.gif' />productfeaturechecklist；虽然它更关注于选择软件Software系统<img src='/icons/70972de.gif' />组件和框架<img src='/icons/70972dou.gif' />但是其中<img src='/icons/70972de.gif' />很多策略也可以被用于选择软件Software开发工具、Web服务、数据库等等<img src='/icons/70972dou2.gif' /> <br/>工具选择标准 <br/>ASDI向我们展示了这些他们觉得将影响我们<img src='/icons/70972de.gif' />工具选择<img src='/icons/70972de.gif' />标准: <br/>他们最终承担系统<img src='/icons/70972de.gif' />核心开发和维护团队(Team)包含3到5个人<img src='/icons/70972dou2.gif' /> <br/>系统能够被4到7个内部用户和1到5个来自于20到30个公司<img src='/icons/70972de.gif' />外部用户访问(虽然系统<img src='/icons/70972de.gif' />将来版本将支持数千人在线用户)<img src='/icons/70972dou2.gif' /> <br/>跨平台技术是重要<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />ASDI期望在数年中这个系统仍然是可用<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' /> <br/>对所有技术<img src='/icons/70972de.gif' />培训必须是容易得到<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' /> <br/>他们强烈首选基于Java<img src='/icons/70972de.gif' />解决方案<img src='/icons/70972dou2.gif' /> <br/>他们首选OODB(面向对象<img src='/icons/70972de.gif' />数据库)作为数据<img src='/icons/70972de.gif' />存储<img src='/icons/70972dou2.gif' /> <br/>系统<img src='/icons/70972de.gif' />早期版本将运行在Linux系统上<img src='/icons/70972dou.gif' />虽然的后将运行在Solaris系统的上<img src='/icons/70972dou2.gif' /> <br/>开发人员需要能够在Windows2000<img src='/icons/70972de.gif' />机器上有效<img src='/icons/70972de.gif' />使用软件Software<img src='/icons/70972dou2.gif' /> <br/>性能不会是重要<img src='/icons/70972de.gif' />挑战<img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />在同<img src='/icons/70972yi.gif' />时刻仅有少数<img src='/icons/70972de.gif' />用户和系统进行交互<img src='/icons/70972dou2.gif' /> <br/>应用服务器<img src='/icons/70972de.gif' />选择 <br/>我们拥有J2EE应用服务器<img src='/icons/70972de.gif' />经验<img src='/icons/70972dou.gif' />因此我们非常幸运ASDI选择基于Java方案<img src='/icons/70972dou2.gif' />不过在我们还是快速<img src='/icons/70972de.gif' />评估了象Perl/CGI和PHP这样<img src='/icons/70972de.gif' />入门级<img src='/icons/70972de.gif' />Web方案的后<img src='/icons/70972de.gif' />计算技术(主要是Microsoft.NET/DNA)<img src='/icons/70972dou2.gif' /> <br/>我们<img src='/icons/70972yi.gif' />致发现OrionApplicationServer是友好<img src='/icons/70972de.gif' />并是最成本有效<img src='/icons/70972de.gif' />开发环境<img src='/icons/70972dou2.gif' />在那里Orion唯<img src='/icons/70972yi.gif' />评分低<img src='/icons/70972de.gif' />方面是供应商<img src='/icons/70972de.gif' />稳定性和支持<img src='/icons/70972dou2.gif' />提供Orion产品<img src='/icons/70972de.gif' />公司是非常小<img src='/icons/70972de.gif' />并且不具备象BEA<img src='/icons/70972de.gif' />WebLogic或者IBM<img src='/icons/70972de.gif' />WebSphere<img src='/icons/70972de.gif' />能力和信誉<img src='/icons/70972dou2.gif' />然而在和ASDI<img src='/icons/70972de.gif' />检查人员讨论后<img src='/icons/70972dou.gif' />我们互相同意Orion<img src='/icons/70972de.gif' />J2EE标准遵从<img src='/icons/70972de.gif' />好处足以抵消这些风险<img src='/icons/70972dou2.gif' />如果第 2阶段开发需要<img src='/icons/70972dou.gif' />仔细<img src='/icons/70972de.gif' />开发将可以确保我们拥有轻便<img src='/icons/70972de.gif' />可以移植到其他应用服务器方案<img src='/icons/70972de.gif' />代码<img src='/icons/70972dou2.gif' />因此我们选择了Orion—这意味这启动成本为零<img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />Orion是免费<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/>Web服务器选择 <br/>Orion带有高速<img src='/icons/70972de.gif' />内建<img src='/icons/70972de.gif' />Web服务器<img src='/icons/70972dou.gif' />因此当Orion被选定后Web服务器<img src='/icons/70972de.gif' />选择过程也就有了结论<img src='/icons/70972dou2.gif' />它主要<img src='/icons/70972de.gif' />竞争对手是Apache<img src='/icons/70972dou2.gif' />然而<img src='/icons/70972dou.gif' />在Orion网站WebSite上显示Orion已经在某些测试方面达到并超过了Apache<img src='/icons/70972dou2.gif' /> [Page]<br/>数据库选择 <br/>使用哪<img src='/icons/70972yi.gif' />个数据库<img src='/icons/70972de.gif' />选择不是显而易见<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />数据库通常不会执行高负载<img src='/icons/70972dou.gif' />但是它需要有丰富<img src='/icons/70972de.gif' />特性支持<img src='/icons/70972dou2.gif' />比如<img src='/icons/70972dou.gif' />复杂<img src='/icons/70972de.gif' />数据关系要求有完全<img src='/icons/70972de.gif' />引用完整性限制<img src='/icons/70972dou2.gif' />同时<img src='/icons/70972dou.gif' />系统必须可以24小时不间断运行<img src='/icons/70972dou.gif' />因此我们希望它具有热备功能、复制、其他<img src='/icons/70972de.gif' />可用性和容错特性<img src='/icons/70972dou2.gif' />我们是否会用到所有<img src='/icons/70972de.gif' />特性将在以后被决定<img src='/icons/70972dou2.gif' /> <br/>我们觉得PostgreSQL仅仅是<img src='/icons/70972yi.gif' />个有资格<img src='/icons/70972de.gif' />开放源码<img src='/icons/70972de.gif' />候选者<img src='/icons/70972dou2.gif' />它有很好<img src='/icons/70972de.gif' />ANSISQL支持和引用完整性<img src='/icons/70972dou.gif' />并且只要并发用户<img src='/icons/70972de.gif' />增长不太大它可以保持良好<img src='/icons/70972de.gif' />性能<img src='/icons/70972dou2.gif' />然而<img src='/icons/70972dou.gif' />数据存储需要更多<img src='/icons/70972de.gif' />来自于<img src='/icons/70972yi.gif' />个供应商<img src='/icons/70972de.gif' />committed支持<img src='/icons/70972dou2.gif' />此外<img src='/icons/70972dou.gif' />我们觉得PostgreSQL在线支持(比如用户社区讨论)对我们来说是不够<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />MySQL实际上是更加流行<img src='/icons/70972de.gif' />开放源码<img src='/icons/70972de.gif' />数据库<img src='/icons/70972dou.gif' />但是它缺少太多<img src='/icons/70972de.gif' />特性(比如<img src='/icons/70972dou.gif' />外键支持)<img src='/icons/70972dou2.gif' /> <br/>然后我们转到主流<img src='/icons/70972de.gif' />数据库:DB2<img src='/icons/70972dou.gif' />Oracle<img src='/icons/70972dou.gif' />andMicrosoftSQL<img src='/icons/70972dou2.gif' />我们在Oracle上有着丰富<img src='/icons/70972de.gif' />经验<img src='/icons/70972dou.gif' />但是新<img src='/icons/70972de.gif' />处理器单元价格模式对于我们<img src='/icons/70972de.gif' />这个应用来说是过于昂贵了<img src='/icons/70972dou2.gif' />Oracle<img src='/icons/70972de.gif' />每MHz每CPU<img src='/icons/70972de.gif' />基本负荷<img src='/icons/70972dou.gif' />意味着ASDI将为系统忍受高<img src='/icons/70972de.gif' />生产环境成本<img src='/icons/70972dou.gif' />除非他们愿意将Oracle安装在<img src='/icons/70972yi.gif' />台P-133<img src='/icons/70972de.gif' />机器上<img src='/icons/70972dou2.gif' />MicrosoftSQL被淘汰了<img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />它是基于私有平台<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />如果创建<img src='/icons/70972yi.gif' />个基于DNA<img src='/icons/70972de.gif' />方案<img src='/icons/70972dou.gif' />MicrosoftSQL自然是首选<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />但是对于J2EE来说很少被选择<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' /> <br/>最后<img src='/icons/70972dou.gif' />我们选择了DB2<img src='/icons/70972dou.gif' />我们<img src='/icons/70972de.gif' />调查表明DB2对SQL有着非常优秀<img src='/icons/70972de.gif' />支持、强大<img src='/icons/70972de.gif' />容错特性、公道<img src='/icons/70972de.gif' />价格模式和正在增长<img src='/icons/70972de.gif' />和被培训<img src='/icons/70972de.gif' />在线用户集合<img src='/icons/70972dou2.gif' />IBM<img src='/icons/70972de.gif' />JDBC驱动是高性能<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />而且他们<img src='/icons/70972de.gif' />个人版可以被免费<img src='/icons/70972de.gif' />用于开发团队(Team)中<img src='/icons/70972dou2.gif' />不幸<img src='/icons/70972de.gif' />是<img src='/icons/70972dou.gif' />我们缺乏DB2<img src='/icons/70972de.gif' />技能<img src='/icons/70972dou.gif' />这就意味着<img src='/icons/70972yi.gif' />些培训在原型活动期间被需要<img src='/icons/70972dou2.gif' /> <br/>你也许正想知道对于ASDI首选<img src='/icons/70972de.gif' />OODB<img src='/icons/70972de.gif' />选择发生了什么<img src='/icons/70972dou2.gif' />在通过原型和探索产品后<img src='/icons/70972dou.gif' />我们很快个到了结论<img src='/icons/70972dou.gif' />使用OODB得到<img src='/icons/70972de.gif' />好处不足以抵消它带来<img src='/icons/70972de.gif' />风险<img src='/icons/70972dou2.gif' /> <br/>集成开发环境(IDE)选择 <br/>在这<img src='/icons/70972yi.gif' />点上<img src='/icons/70972dou.gif' />我们不想使用任何高端<img src='/icons/70972de.gif' />IDE产品<img src='/icons/70972dou.gif' />有几个原因: <br/>我们并不明确第1阶段概念<img src='/icons/70972de.gif' />证明需要使用EnterpriseJavaBeans<img src='/icons/70972dou2.gif' /> <br/>IDE<img src='/icons/70972de.gif' />投入是昂贵<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' /> <br/>团队(Team)<img src='/icons/70972de.gif' />成员已经有了他们自己<img src='/icons/70972de.gif' />选择<img src='/icons/70972dou2.gif' /> <br/><img src='/icons/70972yinwei.gif' />第1阶段<img src='/icons/70972de.gif' />时间是很紧<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />使用如IBM<img src='/icons/70972de.gif' />VisualAge所带来<img src='/icons/70972de.gif' />学习曲线是我们无法承受<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' /> <br/>相反<img src='/icons/70972dou.gif' />我们混合使用了以下工具: <br/>JCreator—免费<img src='/icons/70972de.gif' />基于Java<img src='/icons/70972de.gif' />IDE <br/>CodeGuide—低成本<img src='/icons/70972de.gif' />IDE <br/>log4j—简化服务器端调试<img src='/icons/70972de.gif' />日志工具 [Page]<br/>Jikes—快速严格<img src='/icons/70972de.gif' />Java编译器 <br/>很自然<img src='/icons/70972dou.gif' />这些工具可通过使用Rational工具来弥补在测试、调优和代码覆盖上<img src='/icons/70972de.gif' />缺乏<img src='/icons/70972dou2.gif' /> <br/>整理总结 <br/>在这个阶段我们看到了用例<img src='/icons/70972de.gif' />演进(通过可跟踪性和文档化)并且通过ASDI参和<img src='/icons/70972de.gif' />用例<img src='/icons/70972de.gif' />检查<img src='/icons/70972dou.gif' />我们快速<img src='/icons/70972de.gif' />发现我们是自由主题方式<img src='/icons/70972de.gif' />专家<img src='/icons/70972dou2.gif' />这通常是软件Software开发项目中<img src='/icons/70972de.gif' />最大挑战的<img src='/icons/70972yi.gif' /><img src='/icons/70972dou.gif' />因此早期<img src='/icons/70972de.gif' />并有效地建立这种关系才是真正<img src='/icons/70972de.gif' />胜利<img src='/icons/70972dou2.gif' />我们和ASDI<img src='/icons/70972de.gif' />关心通常是很好<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' />他们很快<img src='/icons/70972de.gif' />理解并同意了基于RUP<img src='/icons/70972de.gif' />开发过程而没有花费我们太多<img src='/icons/70972de.gif' />精力<img src='/icons/70972dou2.gif' />这是令人惊讶<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />被他们给<img src='/icons/70972de.gif' />首选<img src='/icons/70972de.gif' />瀑布型<img src='/icons/70972de.gif' />开发最终取得了这个和约<img src='/icons/70972dou2.gif' />很多被RUP鼓励<img src='/icons/70972de.gif' />迭代和增量开发<img src='/icons/70972de.gif' />思路方法被良好<img src='/icons/70972de.gif' />进行了调整<img src='/icons/70972dou.gif' />并且ASDI也看到可好处<img src='/icons/70972dou2.gif' /> <br/>我们幸运<img src='/icons/70972de.gif' />是工具<img src='/icons/70972de.gif' />选择相当<img src='/icons/70972de.gif' />简单<img src='/icons/70972dou.gif' />并在项目<img src='/icons/70972de.gif' />早期被完成<img src='/icons/70972dou2.gif' />Rational<img src='/icons/70972de.gif' /><img src='/icons/70972yi.gif' />些工具被用来节省我们<img src='/icons/70972de.gif' />时间<img src='/icons/70972dou2.gif' />在的前<img src='/icons/70972de.gif' />项目中我们使用Excel来管理需求<img src='/icons/70972dou.gif' />但是我们发现RationalRequisitePro是<img src='/icons/70972yi.gif' />流<img src='/icons/70972de.gif' />并是完整<img src='/icons/70972de.gif' />方案<img src='/icons/70972dou2.gif' />此外<img src='/icons/70972dou.gif' />RationalSoDA报告可以大大<img src='/icons/70972de.gif' />降低我们<img src='/icons/70972de.gif' />文档生成<img src='/icons/70972de.gif' />成本<img src='/icons/70972dou2.gif' /><img src='/icons/70972yinwei.gif' />这个项目是我们第<img src='/icons/70972yi.gif' />次使用SoDA<img src='/icons/70972dou.gif' />我们非常高兴ASDI对标准<img src='/icons/70972de.gif' />SoDA模板表示满意<img src='/icons/70972dou2.gif' /> <br/>计划未来 <br/>到现在为止<img src='/icons/70972dou.gif' />我们把焦点放到了需求相关<img src='/icons/70972de.gif' />产物上<img src='/icons/70972dou.gif' />并且花费了相对来说不多<img src='/icons/70972de.gif' />时间来评估技术并创建原型以支持工具<img src='/icons/70972de.gif' />选择<img src='/icons/70972dou2.gif' />现在对我们来说重要<img src='/icons/70972de.gif' />是通过创建更有挑战<img src='/icons/70972de.gif' />原型来揭示系统更加复杂<img src='/icons/70972de.gif' />领域<img src='/icons/70972dou.gif' />并开始在实际<img src='/icons/70972de.gif' />开发中使用工具<img src='/icons/70972dou2.gif' />我们是否会用到XML？如果会用到<img src='/icons/70972dou.gif' />我们应该使用什么样<img src='/icons/70972de.gif' />解释器？我们需要什么样<img src='/icons/70972de.gif' />安全机制？我们应该使用EnterpriseJavaBeans吗？象这些问题我们将很快有答案<img src='/icons/70972dou2.gif' /> <br/>换句话说<img src='/icons/70972dou.gif' />是时候从分析转移到架构和设计了—尽可能快而不是晚<img src='/icons/70972dou.gif' /><img src='/icons/70972yinwei.gif' />大多数<img src='/icons/70972de.gif' />技术风险将在接下来<img src='/icons/70972de.gif' />几周显现出来<img src='/icons/70972dou2.gif' />我们有<img src='/icons/70972yi.gif' />个很好<img src='/icons/70972de.gif' />功能基线包含<img src='/icons/70972yi.gif' />系列定义良好<img src='/icons/70972de.gif' />用例<img src='/icons/70972dou2.gif' />对于我们来说避免分析麻痹大意和维护前进<img src='/icons/70972de.gif' />动力是重要<img src='/icons/70972de.gif' /><img src='/icons/70972dou2.gif' /> <br/>主要风险 <br/>没有新<img src='/icons/70972de.gif' />风险被识别出来；实际上我们<img src='/icons/70972de.gif' />风险列表比以前更短了<img src='/icons/70972dou2.gif' /><img src='/icons/70972yinwei.gif' />ASDI同意对于这个项目OODB是不合适<img src='/icons/70972de.gif' /><img src='/icons/70972dou.gif' />我们因此不再有技术上<img src='/icons/70972de.gif' />风险要管理<img src='/icons/70972dou2.gif' />他们也放松了对我们<img src='/icons/70972de.gif' />交付产物<img src='/icons/70972de.gif' />正规形式和他们预想<img src='/icons/70972de.gif' />结构<img src='/icons/70972dou.gif' />并且他们毫无保留<img src='/icons/70972de.gif' />批准了我们<img src='/icons/70972de.gif' />基于RUP框架<img src='/icons/70972de.gif' />文档<img src='/icons/70972dou2.gif' /> <br/>在我们关心<img src='/icons/70972de.gif' />剩余时间和工作量<img src='/icons/70972de.gif' />问题上<img src='/icons/70972dou.gif' />当我们增加了对所需能够<img src='/icons/70972de.gif' />理解和对技术熟悉后<img src='/icons/70972dou.gif' />我们觉得预算更加符合项目情况了<img src='/icons/70972dou2.gif' />更进<img src='/icons/70972yi.gif' />步<img src='/icons/70972de.gif' />技术探索勿庸置疑<img src='/icons/70972de.gif' />将揭开新<img src='/icons/70972de.gif' />挑战<img src='/icons/70972dou2.gif' />  
		
          
              
          <br/>
        <br/>
          <br/>1  <a href="/mypdf/6642.pdf" title="查看 j2ee项目开发:使用Rational工具简化J2EE项目开发 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2009-02-12</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6642.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee设计模式:开发J2EE应用时开发模式的选择]]></title>
			<link>http://CrazyCoder.cn/Java/Article6615.html</link>
			<description>
				<![CDATA[

            <P>　　开发J2EE应用要求目标开发人员能够掌握其中的各种技术。但是，现实情况不是这样。作为一个团队，每个人都有自己不同的技能优势、兴趣以及悟性。同时，J2EE本身需要体现社会分工。一般情况下，我们的开发团队不会有Specification所要求的各个开发角色。现实往往只有3种（也可能是两种）：美工、JSP程序员、EJB程序员。面对这种分工，团队更要注重沟通、交流，注重代码的一致性。 <BR><BR>　　一般情况下，团队要尽量采用版本控制工具管理代码、尽量做到每天都有一个完整的运行版本。经过一段时间，团队都会适应这种开发模式。其中，版本控制工具一定要使用，便于代码的管理、控制和备份。这其中会牵扯到很多层面。比如，开发工具的选择要考虑到版本控制工具的使用、建模工具的合理使用有助于团队有效的沟通和交流。 <BR><BR>　　基于现有的开发模式，个人认为这样3套方案不错。第一，采用Together作为建模工具、采用JBuilder作为IDE工具、采用VSS(或者CVS)作为版本控制工具、采用JBoss作为开发J2EE应用开发阶段的服务器。第二，采用WebSphereStudio整套工具。第三，采用Eclipse(或者JCreator)、Ant、XDoclets作为开发工具。 <BR><BR>　　当然，手工完成J2EE应用的编写、编译、打包、部署、测试更能使开发者理解各个开发阶段的具体细节。但本人认为，只要开发者有这种关注具体细节的态度，选用功能强大的建模、开发工具是明智的。开发工具不能提高开发人员的开发技能，但是她能够引导开发人员正确的开发方向。比如,JBuidler9Enterprise提供的EJB精灵具有的“Struts+EJB+SessionFa?ade+ValueObject”等功能呈现了业界广泛应用的J2EE构架方式。 </P> <a href="/mypdf/6615.pdf" title="查看 j2ee设计模式:开发J2EE应用时开发模式的选择 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2008-09-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6615.html</guid>
		</item>
		<item>
			<title><![CDATA[j2ee开发:开发J2EE应用应注重测试工作]]></title>
			<link>http://CrazyCoder.cn/Java/Article6614.html</link>
			<description>
				<![CDATA[

            　　测试工作往往是很多项目经理忽视，不愿意去花费时间、费用的内容，因为那样会增加项目的成本。但是，他们忽视了，项目的完成质量往往对项目的成本有很大的关系。比如，如果软件质量很差，并没有经历测试阶段，其后期部署、运行所带来的费用会远远超过前期的费用。 <BR><BR>　　测试是分阶段的。单元测试，比如借助于JUnit，来保证功能正确等内容。集成测试，来保证系统没有内存泄漏等内容。其中，OptimizeiteSuiteEnterprise对于完成Profiler、CodeCoverage、ThreadDebugger等内容很有帮助。我记得，我写的一个Swing桌面应用存在内容泄漏，但是想了很多办法都没有解决问题。后来，采用Profiler获得了答案。因此，现在开发应用，我们很多时候都采用OptimizeiteSuiteEnterprise作为测试工具。尤其是，在做集成测试过程中，检查系统的内存泄漏、性能很有帮助。 <BR><BR>　　测试是分类型的。压力测试、性能测试。就目前对支持J2EE应用的测试而言，并没有很好的测试工具。但是，一般情况下，借助于RationalRobot也能够取得不错的效果。 <BR><BR>　　当然，成功开发J2EE应用的因素有很多。比如，EntityBeans的成功应用很大程度上与底层Database的设计有关系（如果表结构设计设计的不合理，将导致EntityBeans性能的急剧下降）；如何最大化挖掘、提升团队各个成员的J2EE技能。等等这些，设计面很广。  <a href="/mypdf/6614.pdf" title="查看 j2ee开发:开发J2EE应用应注重测试工作 的PDF电子文档">[查看PDF电子文档]</a>				]]>
			</description>
			<author></author>
			<category>Java教程</category>
			<pubDate>2008-09-10</pubDate>
			<guid>http://CrazyCoder.cn/Java/Article6614.html</guid>
		</item>
	</channel>
</rss>
