??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品一区二区欧美,特级西西444www大精品视频,亚洲久久在线http://www.aygfsteel.com/qq13367612/category/3975.html<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font class="subhead" size=3><b>一些技术文?& 一些生zL?lt;/b></font>zh-cnWed, 28 Feb 2007 09:14:51 GMTWed, 28 Feb 2007 09:14:51 GMT60面向切面(AOP)与面向对?OOP)http://www.aygfsteel.com/qq13367612/articles/18131.htmlSungSungFri, 04 Nov 2005 05:57:00 GMThttp://www.aygfsteel.com/qq13367612/articles/18131.htmlhttp://www.aygfsteel.com/qq13367612/comments/18131.htmlhttp://www.aygfsteel.com/qq13367612/articles/18131.html#Feedback0http://www.aygfsteel.com/qq13367612/comments/commentRss/18131.htmlhttp://www.aygfsteel.com/qq13367612/services/trackbacks/18131.html
作ؓ(f)一个用OOP多年的h来说Q当我听说AOP可以解决一些OOP一直都不能优雅地解决的问题Ӟ我觉得应该去探个I竟了。对两种技术的比较最能给我们实际应用提供见解。这里我设计了一个例?一个OOP应用Q其中某些方面适合使用AOP?

本文展示了一个简单的例子。一开始介l了问题域,然后分别l出OOP与AOP的解x案。后者用了JDK5.0QJUnitQ和AspectWerkz。最后说明如何编写代码。读完本文后Q我希望你能知道AOP到底是什么,解决什么样的问题?׃作者在后面AOP的例子中使用了Java5?的批?Annotation)Q徏议读者先有所了解)

问题域描q?

一个Y件公叔R佣一个程序员Q指定给他一个业务部门ƈ要求他随时向l理报告。当团队成员完成他们的目标时Q经理会(x)l他们相应的奖金。公司所需要的Ҏ(gu)必须能够增加一个新的雇员ƈl当前的员工增加奖金。ؓ(f)了方便,我们用CSV文g存储数据?



? 解决Ҏ(gu)模型


cManager(l理)l承自类EmployeeQ包含一个额外的属性,Managing Project。一个部门可能包含很多员工。多个部门构成了公司。暂不考虑公司q样的一个类Q因为它在问题域之外?

解决Ҏ(gu)设计

以下程图描qC解决Ҏ(gu)设计?



? 对象之间的交?增加一个新的员工,指派l他一个部门和l理)


Z单的考虑Q本文只x必需的细节。当然你也可以深入代码得C惌的其他信息?

[link]http://www.devx.com/assets/sourcecode/13172.zip[/link]

EmployeeServiceTestCaseQ一个JUnit试用例Q模拟一个最l用P创徏新员工记录,指派部门和经理。它获取所有可用的部门和经理数据ƈ昄在图形界面上?

Z实例化域对象BusinessUnit和ManagerQ获得的记录传递给工厂cR之后,通过lEmployeeService传递一个引用来创徏一个Employee对象?

q个服务cM用EmployeeFactory创徏对象Qƈ把这个对象传lEmployeeRepository 来进行持久化操作?

应用E序中需要面向哪?切面"

到目前ؓ(f)止,Ҏ(gu)型和设计的讨限于一个较抽象的层面。现在,我{向这个应用的其他斚w - q对理解AOP的h(hun)D关重要?

操作所需的资?BR>


















public static Set findAllBusinessUnits() 
throws RepositoryException { 
Set businessUnits = new HashSet(); 
try { 
FileReader businessUnitFile = null; 
BufferedReader bufferedBusinessUnitFile = null; 
try { 
businessUnitFile = new FileReader(FILE_NAME); 
bufferedBusinessUnitFile = 
new BufferedReader(businessUnitFile); 
String businessUnitRecord; 
while((businessUnitRecord =
bufferedBusinessUnitFile.readLine()) != null)
{ 
BusinessUnit businessUnit = BusinessUnitFactory.
createBusinessUnit(businessUnitRecord); 
businessUnits。add(businessUnit); 
} 
} finally 
{ 
if(bufferedBusinessUnitFile != null) 
{ 
bufferedBusinessUnitFile。close(); 
} 
if(businessUnitFile != null)
{ 
businessUnitFile。close(); 
} 
} 
} catch(IOException ioe) 
{ 
String message = 
"IOError. Unable to find Business Unit records"; 
logger.log(SEVEREQ?messageQ?ioe); 
throw new RepositoryException(messageQ?ioe); 
} 

logger。log(INFOQ?
"Manager Records returned:" 
+ businessUnits.size()); 
return businessUnits; 
}


上面的代码通过FileReader和BUfferedReader来读取CSV文g中的业务数据。应用程序重复地从资源文件中取得数据然后在操作完成后释放。我们会(x)发现:LE序的这两个"切面"提高代码的可读性ƈ辑ֈ一个更好的设计Q因为去掉这?多余"的东西,剩下的代码才是这个方法真正的_N?

q个Ҏ(gu)的作用是d业务单位数据。所以不应该也不需要去知道"如何获取和释放资源以?qing)这个过E中出现的异?q个"切面"。同样地Q用AOP处理异常也变得不同?后面详l介l?

持久?

传统的OOP使用仓库c?repository classes)来打理应用程序的持久层。即:

public class EmployeeRepository 
{ 

public static void createEmployee
(Employee employee) 
throws RepositoryException 
{ 
//使用print writer把数据放入csv文g 
} 

public static String 
findEmployeeRecordById(String id) 
throws RepositoryException 
{ 
//使用file reader来获得指定id的员工数?
} 

public static Employee 
findEmployeeById(String id) 
throws RepositoryException 
{ 
//使用该方法获取员工数据,
Employee对象由工厂类创徏 
} 

public static void 
updateEmployee(Employee employee) 
{ 
//更新员工数据 
} 
}


cEmployeeService 使用一个仓库类l应用中相关雇员提供服务Q在一个企业应用中Q从域模?domain model)中去掉持久层代码是一U设计上的改q。模型设计者和E序员就可以x各自的业务逻辑和持久层处理。后面你会(x)看到如何通过AOP来达到这L(fng)效果?

日志

删除用于调试的日志代码将?x)极大地改进代码的可L。考虑下面的代码片?

public Employee 
createEmployee(String nameQ?
String contactNumberQ?
BusinessUnit businessUnitQ?
Manager manager) 
throws EmployeeServiceException 
{ 
String id = createNewEmployeeId(); 
Employee employee = 
EmployeeFactory。createEmployee
(idQ?nameQ?contactNumberQ?
businessUnitQ?manager); 
try { 
EmployeeRepository.createEmployee(employee); 
} catch(RepositoryException re) 
{ 
String message = 
"Created employee successfully:" 
+ employee; 
logger。log(SEVEREQ?message); 
throw new EmployeeServiceException
(messageQ?re); 
} 
logger。log(INFOQ?
"Created employee successfully:"
+ employee); 
return employee; 
}


上面的代码里包含了一个致命错误和一个成功信息。输出日志这一"切面"同样可以Ud业务模型外独立实现?

异常处理

异常处理的例子我q里不再赘述Q但q节已经通过上面的代码讨Z潜在的问题。当你调用EmployeeRepository对象的createEmployeeҎ(gu)Ӟ你可能会(x)得到一个RepositoryException异常?

传统的解x法是Q在q个cM处理。另一U方法是Q当RepositoryException异常被抛出时createEmployee Ҏ(gu)q回nullQcatch块中的其他逻辑可以在类外处理这一错误?

错误处理在不同的情况中也?x)不同。但是,通过AOP可以区分开每种情况?BR>










?


?中描qCAOPҎ(gu)的设计以?qing)在一个更抽象的层ơ上c间的交互。你可以通过Ҏ(gu)?和图3来更好地理解AOP。程序的目的是通过BusinessUnit对象dCSV文g中的记录然后填入cBusinessUnitService中的map?

使用AOP来填充这个map有点cM后门(backdoor)Ҏ(gu) -- 控制被委zBusinessUnit 来读取存储介质中的记录?

AOP是定义一些切入点(pointcut)和处理方?advice)。一?切入?是源代码中一个执行点。前面的例子定义了一?切入?--cBusinessUnitService中的findBusinessUnitsҎ(gu)。一?处理Ҏ(gu)"֐思义是当执行到某个"切入?时的一块代码?

cBusinessUnitPersistentAspect包括adviceҎ(gu)findAllBusinessUnitsQ该Ҏ(gu)从存储介质中载入数据Q然后用工厂类创徏BusinessUnit对象。然后这个对象被加入mapQmap对象的引用通过BusinessUnitService对象获得?

"切入??处理Ҏ(gu)"l成了所谓的"切面(Aspect)"Zd存储介质中的数据QOOPҎ(gu)通过一个DAOcL做。而AOP中,你只要定义一?切入?和相应的"处理Ҏ(gu)"来读取数据。AOP框架?x)以advice的Ş式注入代码,既可以在执行期也可以在编译期?

总而言之,当类BusinessUnitService 中的findAllBusinessUnits Ҏ(gu)被调用时QAOP框架?x)?切入?处注入处理方法,通过BusinessUnit 对象预先d数据来填充map对象。这P持久层方面的代码可以移C务代码之外了?

新方法里?切面"

本节讨论如何用AOP为应用程序的各个"切面"建模

操作资源

cBusinessUnitPersistenceAspect 的持久方法用了一个buffered reader。你甚至可以定义"切面"?切面"Q但Z单,q里只关注类的查找方法?

@Aspect("perJVM") 
public class BufferedFileReaderAspect 
{ 

@Expression("execution
(* org.javatechnocrats.aop.withaop.
aspects.BusinessUnitPersistenceAspect.find*(..))") 
Pointcut businessUnitPersistenceAspect; 

// 其他"切入?定义 

@Expression("businessUnitPersistenceAspect || 
employeePersistenceAspect || 
managerPersistenceAspect") 
Pointcut allPersistencePointcuts; 

private Map<ClassQ?String> fileNames; 

public BufferedFileReaderAspect() 
{ 
System.out.println
("BufferedFileReaderAspect created"); 
fileNames = new HashMap<ClassQ?String>(); 
fillFileNames(); 
} 

@Before("allPersistencePointcuts") 
public void assignReader
(JoinPoint joinPoint) 
throws Throwable 
{ 
System。out。println
("assignReader advice called"); 
Object callee = 
joinPoint.getCallee(); 
IBufferedFileReaderConsumable
bufReaderConsumable =
(IBufferedFileReaderConsumable)callee; 
Class persistenceClass = 
callee.getClass(); 
String fileName = 
fileNames.get(persistenceClass); 
FileReader fileReader = 
new FileReader(fileName); 
BufferedReader bufferedReader =
new BufferedReader(fileReader); 
bufReaderConsumable.
setBufferedReader(bufferedReader); 
} 

@AfterFinally("allPersistencePointcuts") 
public void releaseReader
(JoinPoint joinPoint) throws Throwable 
{ 
//释放buffered reader{资?
} 
//其他Ҏ(gu) 
}


上面的代码试图ؓ(f)每一个方法创?切入?--所有以find开头的Ҏ(gu)。无Z时这些方法被调用QassignReaderҎ(gu)都会(x)被提前执行。这里它获取被调用的cd例然后设|新建的buffered reader?

同样圎ͼ在releaseReader Ҏ(gu)里,代码?x)预先关闭buffered reader集合。本节只解释@before和@

AfterFinally q两?切入??以J2SE 5?的标记定?。另外,你也可以在方面定义的xml文g中声明他们。你可以查看例程源代码中的aop。xml文g?

下蝲

持久?

前面提到QOOPҎ(gu)使用BusinessUnit来ؓ(f)应用的持久层填充Map。在下面的高亮代码中(@before一行,以及(qing)while循环代码)Q当BusinessUnitService中的Ҏ(gu)findAllBusinessUnits 被调用时"处理Ҏ(gu)"findAllBusinessUnits 也将被调用?BR>








@Aspect("perJVM") 
public class
BusinessUnitPersistenceAspect 
implements IBufferedFileReaderConsumable
{ 

private BufferedReader buffFileReader; 

@Before("execution
(Collection org.javatechnocrats.aop.withaop.
BusinessUnitService.findAllBusinessUnits())") 
public void findAllBusinessUnits
(JoinPoint joinPoint)
throws Throwable 
{ 
System.out.println
("findAllBusinessUnits advice called"); 
Map<StringQ?BusinessUnit> businessUnits = 
((BusinessUnitService)joinPoint.
getThis()).getBusinessUnits(); 
String businessUnitRecord; 
while((businessUnitRecord =
buffFileReader。readLine()) != null) 
{ 
BusinessUnit businessUnit = BusinessUnitFactory.
createBusinessUnit(businessUnitRecord); 
businessUnits.put
(businessUnit.getId()Q?businessUnit); 
} 
} 

public void setBufferedReader
(BufferedReader buffFileReader) 
{ 
System.out.println
("BusinessUnitPersistenceAspect.
setBufferedReader called"); 
this.buffFileReader = buffFileReader; 
} 

public BufferedReader getBufferedReader() 
{ 
System.out.println
("BusinessUnitPersistenceAspect.
getBufferedReader called"); 
return this.buffFileReader; 
} 
}


"处理Ҏ(gu)"从数据存储中d记录Q用工厂类创徏一个BusinessUnit实例。然后这个实例被加入到Map。该Map掌管E序的所有持久化"切面"?

日志

本文中的例子没有包含一个完整的日志AOP解决Ҏ(gu)。但是,它ؓ(f)java。lang。ObjectcȝtoStringҎ(gu)定义了一?切入?来获取类的调试信息。因此,域中的类不需要实现toStringҎ(gu)。通常可能你可能需要ؓ(f)每一个类都要实现q个Ҏ(gu)?

@Aspect("perJVM") 
public class LoggingAspect 
{ 

@Around("execution(
String org.javatechnocrats.aop.
withaop..*.toString())") 
public Object toStringAdvice
(JoinPoint joinPoint)
throws Throwable 
{ 
System.out.println
("toStringAdvice called"); 
String toString = 
(String)joinPoint.proceed(); 
Object target = joinPoint.getThis(); 
Field fields[] = 
target.getClass().getDeclaredFields(); 
List members = 
new ArrayList(fields.length + 1); 
members.add(toString); 
for(Field field : fields) 
{ 
field.setAccessible(true); 
Object member = field.get(target); 
members.add(field.getName() 
+ "=" + member); 
} 
return members。toString(); 
}


你也可以用这个样例代码完成错误处?切面"?

深入源代?

Z理解样例需求的OOP设计Q请参看源代码ƈ思考以下几个问? 下蝲

* 首先分析oldway包中EmployeeServiceTestCase cM的代?

*查看testEmployeeCredit Ҏ(gu)

*搞懂业务cEmployee和BusinessUnit

*学习(fn) serviceQrepository和factory概念。这些是业务驱动设计的主要概c?

*更深入地理解oldway包中的serviceQrepository和factoryc?

而AOP地理解则应该?

*分析newway包中EmployeeServiceTestCase c?

*查看serviceQrepository和factoryc,基本和前一U差不多。只是你要让"处理Ҏ(gu)"截获E序的执行流E?

*研究aspectcd?切入?的定?

要执行程序,你需要做的工?

* 下蝲AspectWerkz 2? http://aspectwerkz。codehaus。org/

*讄以下的环境变?

set JAVA_HOME=c:\Program Files\Java\jdk1.5.0
set ASPECTWERKZ_HOME=C:\aw_2_0_2
set PATH=%PATH%;%ASPECTWERKZ_HOME%\bin
set CLASSPATH=
C:\aw_2_0_2\lib\aspectwerkz-2.0.RC2.jar;
C:\aw_2_0_2\lib\aspectwerkz-jdk5-2.0.RC2.jar;
classes;
C:\ junit\3.8.1\resources\lib\junit.jar


*解压~源代码和其他文?

*~译Java文gQ但不要~译试用例否则你调试时?x)遇C个错误?

*q行ȝ调试。假设你把文件解压羃到c:\aopQ类文g解压到c:\aop\classesQ在c:\aop目录下执行以下命?

%ASPECTWERKZ_HOME%\bin\aspectwerkz 
-offline etc/aop。xml -cp classes classes


*AOP框架?x)修改类来注入必要的字节?

*~译试用例Q用JUnitq行它?

后记

当你完成了上面的q些工作Q你应该有以下的领?zhn)?

*E序中的交叉兌

*关于AOP中深入源代码

Z理解样例需求的OOP设计Q请参看源代码ƈ思考以下几个问?

下蝲

* 首先分析oldway包中EmployeeServiceTestCase cM的代?

*查看testEmployeeCredit Ҏ(gu)

*搞懂业务cEmployee和BusinessUnit

*学习(fn) serviceQrepository和factory概念。这些是业务驱动设计的主要概c?

*更深入地理解oldway包中的serviceQrepository和factoryc?

而AOP地理解则应该?

*分析newway包中EmployeeServiceTestCase c?

*查看serviceQrepository和factoryc,基本和前一U差不多。只是你要让advice截取E序的流E?

*研究aspectcd?fn)point cut的定?

要执行程序,你需要做的工?

* 下蝲AspectWerkz 2.0 http://aspectwerkz。codehaus。org/

*讄以下的环境变?

set JAVA_HOME=c:\Program Files\Java\jdk1.5.0
set ASPECTWERKZ_HOME=C:\aw_2_0_2
set PATH=%PATH%;
%ASPECTWERKZ_HOME%\bin
set CLASSPATH=
C:\aw_2_0_2\lib\aspectwerkz-2.0.RC2.jar;
C:\aw_2_0_2\lib\aspectwerkz-jdk5-2.0.RC2.jar; 
classes;
C:\ junit\3.8.1\resources\lib\junit.jar


*解压~源代码和其他文?

*~译Java文gQ但不要~译试用例否则你调试时?x)遇C个错误?

*q行ȝ调试。假设你把文件解压羃到c:\aop Q类文g解压到c:\aop\classesQ在c:\aop目录下执行以下命?

%ASPECTWERKZ_HOME%\bin\aspectwerkz
-offline etc/aop。xml -cp classes classes


*AOP框架?x)修改类来注入必要的字节?

*~译试用例Q用JUnitq行它?

后记

当你完成了上面的q些工作Q你应该有以下的领?zhn)?

*E序中的交叉兌

*关于AOP?切面"的含?

*如何用AOP来把E序业务层中的交叉关联分d来,使用"切入??处理Ҏ(gu)"

*OOP和AOP时在E序控制上的不?

从本文你应该也得CU看待实际开发的新视角。你应该有信心用AOP来改q项目中的设计,建模Q提高代码的重用性。至,你可以开始用AOP来处理日志,错误和持久化?

个h觉得QAOP的学?fn)曲U相对较陡,其在理解定?切入?的句法时。理想的情况是,使用OOP来设计业务模型,使用AOP把业务模型中的交叉关联移出,从而代码zƈ提高可读性?

AOP的一个缺Ҏ(gu)?x)调试变得困难Q因Z同于OOPQ程序流变的复杂了,交互是由~译期或执行期决定。我准备来做一些自动化工具来解册个问题?


Sung 2005-11-04 13:57 发表评论
]]>
当前行的J2EE WEB应用架构分析http://www.aygfsteel.com/qq13367612/articles/16905.htmlSungSungWed, 26 Oct 2005 09:52:00 GMThttp://www.aygfsteel.com/qq13367612/articles/16905.htmlhttp://www.aygfsteel.com/qq13367612/comments/16905.htmlhttp://www.aygfsteel.com/qq13367612/articles/16905.html#Feedback0http://www.aygfsteel.com/qq13367612/comments/commentRss/16905.htmlhttp://www.aygfsteel.com/qq13367612/services/trackbacks/16905.htmlJ2EE体系包括java server pages(JSP) ,java SERVLET, enterprise beanQW(xu)EB service{技术。这些技术的出现l电(sh)子商务时代的WEB应用E序的开发提供了一个非常有竞争力的选择。怎样把这些技术组合v来Ş成一个适应目需要的E_架构是项目开发过E中一个非帔R要的步骤。完成这个步骤可以Ş成一个主要里E碑基线?/BLOCKQUOTE>

1. 架构概述

J2EE体系包括java server pages(JSP) ,java SERVLET, enterprise beanQW(xu)EB service{技术。这些技术的出现l电(sh)子商务时代的WEB应用E序的开发提供了一个非常有竞争力的选择。怎样把这些技术组合v来Ş成一个适应目需要的E_架构是项目开发过E中一个非帔R要的步骤。完成这个步骤可以Ş成一个主要里E碑基线。Ş成这个基U有很多好处Q?/P>

  1. 各种因数初步定
    Z形成架构基线Q架构设计师要对q_Q体p)中的技术进行筛选,各种利弊的权衡。往往架构设计师在q个q程中要阅读大量的技术资料,听取目l成员的Q考虑领域专家的需求,考虑赞助商成本(包括开发成本和q行l护成本Q限额。一旦架构设计经q评审,q些因数初步地就有了在整个项目过E中的对目起多大作用的定位?
  2. 定向技术培?
    一旦架构师设计的架构得C批准形成了基U,目开发和q行所采用的技术基本确定下来了。众多的目l理都会(x)寚w备项目组成员的技术功底感到担心;他们需要培训部门提供培训,但就架构师面对的技术vz,目l理Ҏ(gu)提不出明确的技术培训需求。怎不能够对体pM所有技术都q行培训吧!有了架构里程基U,目l理能确定这个项目开发会(x)采用什么技术,q是提出培训需求应该是最_的。不q在实际目开发中Q技术培训可以在基线定之前与架构设计ƈ发进行?
  3. 角色分工
    有了一个好的架构蓝图,我们p准确划分工作。如|页设计QJSP 标签处理c设计,SERVLET 设计Qsession bean设计Q还有各U实现。这些Q务在架构蓝图上都可以清晰地标Z|,使得目l成员能很好地定位自qd。一个好的架构蓝囑֐时也能规范化dQ能很好地把d划分为几c,在同一cM的Q务的工作量和性质相同或相伹{这样工作量估计h有一个非常好的基?
  4. q行l护
    前面说过各个d在架构图上都有比较好的定位。Q何h能借助它很快地熟?zhn)整个目的运行情况,错误出现时能比较快速地定位错误炏V另外,有了清晰的架构图Q项目版本管理也有很好的版本?wi)躯qӀ?
  5. 扩展?
    架构犹如一颗参天大?wi)的w干Q只要躯q根pȝQ树(wi)q粗Q长一些旁支,加一些树(wi)叶轻而易举无疑。同P有一个稳定的l得赯验的架构,增加一两个业务lg是非常快速和Ҏ(gu)的?

大家都知道这些好处,一心想形成一个这L(fng)J2EE应用E序架构Q就像在windowsq_中的MFCQ。在q个路程中经历了两个大的阶段Q?/P>

1.1. 模型1

模型1其实不是一个什么稳定架构,甚至谈不上Ş成了架构。模?的基是JSP文g。它从HTTP的请求中提取参数Q调用相应的业务逻辑Q处理HTTP?x)话Q最后生成HTTP文档。一pdq样的JSP文g形成一个完整的模型1应用Q当然可能会(x)有其他辅助类或文件。早期的ASP ?PHP 技术就属于q个情况?/P>

ȝ看来Q这个模型的好处是简单,但是它把业务逻辑和表现؜在一块,对大应用来说Q这个缺Ҏ(gu)令h容忍不了的?/P>

1.2. 模型2
在经q一番实践,q广泛借鉴和ȝl验教训之后QJ2EE应用E序l于q来了MVCQ模?视图-控制Q模式。MVC模式q不是J2EE行业人士标新立异的,所以前面我谈到q发借鉴。MVC的核心就是做C层甚臛_层的松散耦合。这对基于组件的Q所覆盖的技术不断膨胀的J2EE体系来说真是音和救星?/P>

它在览器(本文对客户代理都U浏览器Q和JSP或SERVLET之间插入一个控制组件。这个控制组仉中了处理览器发q来的HTTPh的分发逻辑Q也是_(d)它会(x)Ҏ(gu)HTTPh的URL,输入参数Q和目前应用的内部状态,把请求分发给相应的WEB 层的JSP 或SERVLET。另外它也负责选择下一个视图(在J2EE中,JSP,SERVLET?x)生成回l浏览器的html从而Ş成视图)。集中的控制lg也有利于安全验证Q日志纪录,有时也封装请求数据给下面的WEB tier层。这一套逻辑的实现Ş成了一个像MFC的应用框Ӟ位置如图Q?/P>


1.3. 多层应用
下图为J2EE体系中典型的多层应用模型?/P>

  • Client tier客户?
    一般ؓ(f)览器或其他应用。客户层普遍地支持HTTP协议Q也U客户代理?
  • WEB tier WEB应用?
    在J2EE中,q一层由WEB 容器q行Q它包括JSP, SERVLET{WEB部g?
  • EJB tier 企业lg?
    企业lg层由EJB容器q行Q支持EJB, JMS, JTA {服务和技术?
  • EIS tier 企业信息pȝ?
    企业信息pȝ包含企业内传l信息系l如财务QCRM{,特点是有数据库系l的支持?


应用框架目前主要集中在WEB层,旨在规范q一层Y件的开发。其实企业组件层也可以实现这个模型,但目前主要以设计模式的Ş式存在。而且有些框架可以扩充Q有了企业组件层lg的参与,框架?x)显得更紧凑Q更自然Q效率会(x)更高?/P>

2. 候选方?/SPAN>

目前Q实现模?的框架也在不断的涌现Q下面列出比较有名的框架?/P>

2.1. Apache Struts
Struts是一个免费的开源的WEB层的应用框架Qapache软g基金致力于struts的开发。Strutsh高可配置的性,和有一个不断增长的Ҏ(gu)列表。一个前端控制组Ӟ一pd动作c,动作映射Q处理XML的实用工L(fng)Q服务器端java bean 的自动填充,支持验证的WEB 表单Q国际化支持Q生成HTMLQ实现表现逻辑和模版组成了struts的灵?/P>

2.1.1. Struts和MVC

模型2的目的和MVC的目的是一L(fng)Q所以模?基本可以和MVC{同h。下图体CStruts的运作机理:(x)


2.1.1.1. 控制

如图所C,它的主要部g是一个通用的控制组件。这个控制组件提供了处理所有发送到Struts 的HTTPh的入口点。它截取和分发这些请求到相应的动作类Q这些动作类都是Actioncȝ子类Q。另外控制组件也负责用相应的h参数填充 From bean,q传l动作类。动作类实现核心商业逻辑Q它可以通过讉Kjava bean 或调用EJB。最后动作类把控制权传给后箋的JSP 文gQ后者生成视图。所有这些控刉辑利用一个叫struts-config.xml文g来配|?/P>

2.1.1.2. 模型

模型以一个或几个java bean的Ş式存在。这些bean分ؓ(f)三种Q?/P>

  • Form beans(表单Beans)
    它保存了HTTP posth传来的数据,在Struts里,所有的Form beans都是 ActionFrom cȝ子类?
  • 业务逻辑beans
    专门用来处理业务逻辑?
  • pȝ状态beans
    它保存了跨越多个HTTP h的单个客L(fng)?x)话信息Q还有系l状态?

2.1.1.3. 视图

控制lgl传HTTPhl实C视图的JSP文g。JSP能访问beans q生成结果文档反馈到客户。Struts提供JSP 标签库:(x) HtmlQBeanQLogicQTemplate{来辑ֈq个目的Qƈ有利于分开表现逻辑和程序逻辑?/P>

2.1.2. Struts的细节分?/B>

2.1.2.1. 视图-控制-模型

用户发出一?.do的HTTPhQ控制组件接收到q个h后,查找针对q个h的动作映,再检查是否曾创徏q相应的动作对象Qaction实例Q,如果没有则调用actionmapping生成一个动作对象,控制lg?x)保存这个动作对象供以后使用。接着调用actionmapping的方法得到actionForm对象。之后把actionForm作ؓ(f)参数传给动作对象的performҎ(gu)Q这个方法结束之后会(x)q回l控制组件一?actionforward对象。控制组件接着从这个对象中获取下一个视囄路径和重定向属性。如果ؓ(f)重定向则调用HTTPSERVLETREPONSE的方法来昄下一个视图,否则相调用requestdispatcher, SERVLETcontext的方法箋传HTTPhC一个视图?/P>

当动作对象运行performҎ(gu)Ӟ可能出现错误信息。动作对象可以保存这些错误信息到一个error对象中,接着调用自n的saveerrorsҎ(gu)把这个错误保存到request对象的属性中。接着动作对象调用actionmapping对象的getInputҎ(gu)从动作映中获取input参数Q也是产生输入的视图,q以q个input为参数生成一个actionforward对象q回。这个input参数的JSP中一般有HTTP:errors定制标签dq些错误信息q显C在面上?/P>

下面是一个logon.JSP 的代码实例:(x)


<%@ page language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html:html locale="true">
<head>
<title><bean:message key="logon.title"/></title>
<html:base/>
</head>
<body bgcolor="white">

<html:errors/>   <!--  如果出现错误?x)显C在q里  -->

<html:form action="/logon" focus="username">
<table border="0" width="100%">

  <tr>
    <th align="right">
      <bean:message key="prompt.username"/>
    </th>
    <td align="left">
      <html:text property="username" size="16" maxlength="16"/>
    </td>
  </tr>

  <tr>
    <th align="right">
      <bean:message key="prompt.password"/>
    </th>
    <td align="left">
      <html:password property="password" size="16" maxlength="16"
                    redisplay="false"/>
    </td>
  </tr>

  <tr>
    <td align="right">
      <html:submit property="submit" value="Submit"/>
    </td>
    <td align="left">
      <html:reset/>
    </td>
  </tr>

</table>


2.1.2.2. 模型到视?/P>

模型到视图指视图在显CZ前装载系l数据到视图的过E。系l数据一般ؓ(f)模型内java bean的信息。示意图表现了由控制lgforwardq来的有html:form定制标签的JSP 的处理逻辑?/P>

html:form定制标签处理对象从application scopeQ通过查询SERVLETCONTEXT对象的属性来实现Q获取先前由控制lgactionSERVLET攑֜那里的动作映等对象Q由html:form 的action属性查得actionform名字、类型和范围{信息,在相应的范围内查找actionformQ如果有则利用它的信息填充html form表单[实际填充动作在嵌套的html:text{定制标{处理对象中]。否则在相应范围内创Z个actionform 对象?/P>

2.1.3. 优缺?/B>

优点Q?/P>

  • 一些开发商开始采用ƈ推广q个框架
  • 作ؓ(f)开源项目,有很多先q的实现思想
  • 对大型的应用支持的较?
  • 有集中的|页D定义

~点Q?/P>

  • 不是业届标准
  • 对开发工L(fng)支持不够
  • 复杂的taglibQ需要比较长的时间来掌握
  • html form ?actionform的搭配比较封闭,但这也是它的_֍所在?

修改把actionform属性的讄器和讉K器修Ҏ(gu)d或生成xml文档的方法,然后 html form和actionform之间用xml文档q行数据交换Q之松散耦合Q适应数据l构易变化的应用?/P>


2.2. JATO
JATO应用E序框架是iPlanet 应用E序框架的旧名。它是一个成熟的、强大的Q基于J2EE标准的面向于开发WEB应用E序的应用框架。结合了昄字段、应用程序事件、组件层ơ和以页面ؓ(f)中心的开发方法、以?qing)MVC和服务到工作者service-to-workers的设计模式等概念。JATO可适用于中、大、超大规模的WEB应用。但是它也不是一个企业层的应用框Ӟ也就是说它不?x)直接提供创建EJB, WEB services{企业层lg的方法,但用它可以构造出讉K企业层组件的客户应用?/P>

q个框架功能主要有三部分l成Q?/P>

  • iPlanet应用框架核心Q?
  • iPlanet应用框架lgQ?
  • iPlanet应用框架扩展?

应用框架核心定义了基本接口、对象协议、简单组Ӟ以及(qing)iPlanet应用框架E序的最核心。包括视囄单组件、模型简单组件、请求分发组件和可重用命令对象。iPlanet应用框架lg利用框架核心定义的基本接口、协议和lg向开发者提供高层的重用lgQ这些组件既有与特定视觉效果无关的水q组Ӟ同时也有适应特定实用环境、提高可用性而特意提供的垂直型组件。框架扩展实C用框架相容的Ҏ(gu)讉K非J2EE环境的方法。通常情况下,扩展被框架应用程序用来无~访问J2EE容器特定功能。JATOq_栈图很清楚地表达了这个情c?/P>

JATO最大的威力在:(x)对于快速开发用P你能利用框架lg和扩展提高生产率Q对于要求更大灵zL的用户Q你能实现框架核心提供的接口来保持应用的框架兼容性?/P>



此图表示实现一个JATO应用E序Q可以简单地实现控制lgmodule1ServletQ视囄件ListCustomersViewBean和模型组件CustomersModuleImplQ以?qing)一个给客户代理昄界面的ListCustomers.jsp文g。ƈ清楚地表明这些组件与JATO框架lg的承关pR?/P>


JATO标签库提供了VIEW对象与JSP文g的接口。库中标{֤理程序负责实现VIEW对象和JSP产生地客L(fng)文档的信息同步和交换。这个图清楚地表达了q种对应关系

2.2.1. MVC分析


前端控制lg接收用户发来的Q何请求,q个可在WEB.xml中指定请求分发组件负责视囄理和DQ和前端控制lg装在ApplicationSERVLETBase一起实现。应用程序开发者需要ؓ(f)每一个子pȝQh力资源,财务QCRM{)实现一个此cȝl承?/P>

h分发lg分发hl工作者,工作者实Ccommand接口。应用开发者可以实现这个接口。JATO提供了一个缺省实玎ͼ(x)DefaultRequestHandingCommandQ这个实C(x)把请求传l视囄件的特定事g?/P>

l合视图是指视图lg在显C给用户时的层次关系Q根视图是一个ViewBeancȝ对象字段是一个DisplayFieldcȝ对象Q容器视图是一个ContainerViewcȝ对象。视囄件类的层ơ关pd下图Q?/P>


2.2.2. 优缺点分?/B>

优点Q?/P>

  • q种框架的适应范围大,x供了底层接口Q也有立卛_用的lg
  • h与客L(fng)RAD开发工L(fng)似的开发概念如ؓ(f)中心Q等同于VB的FORMQ,事g处理{?
  • 对大型的应用支持较好

~点Q?/P>

  • 不是业届标准
  • 目前q没有开发工L(fng)支持Q然JATO已经为工h持做好了准备Q?
  • 没有定义|页DQ开发者在视图中自己指定具体的DURL

修改
把众多的VIEW/MODEL对应修改成xml文档传递数据,加上集中的网导航定?

2.3. JSF(JavaServer Faces)
JSF是一个包括SUN在内的专家组正在定义的开发WEB应用用户界面的框ӞJSF 技术包括:(x)

  • 一lAPIQ它实现UI了组Ӟ理lg的状态,处理事gQ输入校验,定义面DQ支持国际化和访问;
  • 一个JSP定制标签库实CJSP的接口?

JSF非常单,是一个定义良好的~程模型。利用这个技术,开发者通过在页面内l合可重用的UIlgQ在把这些组件和应用的数据源相连Q\由客户生的事g到服务器端的事g处理器进行编E。JSP处理了所有幕后的复杂工作Q得开发者把x重点攑֜应用代码上?/P>

2.3.1. STRUTS、JATO和JSF比较

它们之间有部分重叠,但重点不一栗?/P>

  • STRUTS和JATO都提供了一个MVC式的应用模型Q而JSF只在用户界面上提供编E接口。这意味着前两者涉?qing)的范围比后者广。JSF可以成ؓ(f)前两者在UI开发的部分?
  • JSF的规范的发布版将?2002q底发布Q实现可能要比这个时间晚些。另外将?x)有工具支持q个框架的应用开发?

2.4. WAF
WAF是WEB APPLICATION FRAMWORK的简Uͼ是SUN蓝皮书例子程序中提出的应用框架。它实现?MVC和其他良好的设计模式?/P>

2.4.1. l节分析


点击q里看大?/A>

2.4.2. 视图-控制-模型

如图所C,开发h员编写的两个xml配置文g定义了WAF的运作参数。Screendefinition.xml定义了一pd的屏q?screen)。Mapping.xml则定义了某个动作之后应该昄的屏q,但没有指定屏q到哪里拿数据?/P>

用户发出一个HTTPhQ?.screenQ,由TemplateSERVLET屏幕前端控制lg接收Q它提取h信息Q设|request对象CurrentScreen属性,再把h发到模版JSP。模版JSP收到h后,JSP中的Template标签察看q个当前屏幕Qƈ从屏q定义文ӞScreendefinition.xmlQ中获取q个屏幕的具体参敎ͼ再生成htmlq回l客戗?/P>

假设q回l客L(fng)html中包括了html表单Q用户在输入一定数据之后提交,发出一个HTTPhQ?.doQ。这个请求被MainSERVLET接收Q它提取h信息Q察看动作映文Ӟmapping.xmlQ,讄处理q个h的动作对?HTTPAction对象)Q交lrequestprosessor对象处理。Requestprosessor对象调用动作对象完成dQ如果需要进一步处理,requestprosessor对象?x)调用WEBclientcontroler对象的事件处理机制。MainSERVLET在处理完h之后Q从屏幕管理对象那里得C一个屏q,q把h传给q个屏幕的JSP文g?/P>

值得一提的是WEBclientcontroler事g处理机制最l把HTTPh的数据传CEJBAction对象那里处理。这样HTTPAction对象和EJBAction对象形成了两U处理机Ӟ前一U与request对象紧密相关Q把数据装h形成一个Event对象Q再传给了EJBAction对象Q后者与Request对象无关。这个方式可以Ş成一个sessionU别的数据处理机制。下图显CZq个Ҏ(gu)。HTTPAction1对象处理一个请求,q把数据攑ֈ一个状态SessionBean内,HTTPAction2也如此,当HTTPAction3接收到HTTPh之后Q把控制传给EJBAction, 后者获取状态SessionBean数据Q处理请求,成功后清控状态SessionBean的内宏V这个机刉帔R应多个输入面才能满一个业务的输入数据的情况(比如购物车)?/P>


2.4.3. 优缺点分?/B>

优点

  • 屏幕D定义明确
  • 为框架的扩展提供了一个空?

~点

  • 源码比较乱,E_性和可靠性没人验证?
  • 只是一个框架躯qԌ没有正式的model层,视图的概念不?
  • 没有模型到视囄定义

修改意见
只有一个框架躯qԌ正ؓ(f)实现自己的应用框架提供了灉|性。没有僵化的视图概念Q提供了在网输入到模型的扩充接口,比如插入XML数据交换?



Sung 2005-10-26 17:52 发表评论
]]>
MVC减少~程复杂?http://www.aygfsteel.com/qq13367612/articles/16890.htmlSungSungWed, 26 Oct 2005 08:14:00 GMThttp://www.aygfsteel.com/qq13367612/articles/16890.htmlhttp://www.aygfsteel.com/qq13367612/comments/16890.htmlhttp://www.aygfsteel.com/qq13367612/articles/16890.html#Feedback0http://www.aygfsteel.com/qq13367612/comments/commentRss/16890.htmlhttp://www.aygfsteel.com/qq13367612/services/trackbacks/16890.html
复杂?BR>  复杂性是应用开发过E中最令h头疼的一个问题。每当在一个应用中增加一个功能时Q它的复杂性通常呈几何的增ѝ这U复杂性往往DE序的开发无法再l箋下去。这也是现在Z么许多应用只有Beta版本而没有正式版的原因?BR>
  专家应用开发过E生的复杂性分Zc,即非本质的(accidentalQ和本质的(essentialQ。本质的复杂性是对于解决目标问题所必然产生的复杂性,非本质的复杂性是׃选择了不适当的开发工具和设计工具而生的复杂性。对于一个功能确定的E序来讲Q本质的复杂性是定的,而非本质的复杂性则是没有限制的。因此,一个应用的开发要惌利地取得成功,需要尽可能地减非本质的复杂性?BR>
OOD的特?BR>  面向对象的设计(OODQ将一个程序分解成Ҏ(gu)具体的对象而设计的一pd元素。这些具体对象的行ؓ(f)和数据以一U叫做“类QclassQ”的~程单元q行打包。应用程序创Z个或多个q些cȝ例示Q也UCؓ(f)“对象(objectQ”。类的行为是通过创徏对象之间的关pȝ合在一L(fng)?BR>
  OOD允许开发者用两种主要的方法来控制复杂性的增加。第一QOOD定义严格的出口语义,q允许开发者隐藏实现的l节Qƈ且明说明什么方法是其它的对象可以访问的。这个信息隐藏得可以对大部分的代码q行修改而不影响其它的对象?BR>
  W二QOOD对象之间的关系分ؓ(f)四类Qѝ包宏V用和协调。适当C用这些关pd以大大减应用开发过E中本质的和非本质的复杂性。如Q承是产生面向对象设计中可再用的主要因素。这个再使用性是通过代码׃n和多态性获得的。这U再使用可以大大减少应用的本质的复杂性。包容允怸个类的用户在使用包容器时忽略被包容的c(classQ。这个简化设计者能够大大减应用的非本质的复杂性?BR>
可视化接口在OOD斚w的不?BR>  许多E序都需要可视化接口Q这些接口由对话框、选单、工h{组成。这些可视化接口的增加会(x)引进OOD设计的不I使得一个好的面向对象的设计走向反面。可视化接口有三个属性可能会(x)l应用开发带来麻烦?BR>
  W一Q可视化接口提高了传l的面向操作的拓扑结构。用户生接口事Ӟ如开x键和列表框选择{,受到E序的一个模块的驱动q且用来寚w态的数据q行操作。在设计中将q面向操作的拓扑l构同一个面向对象的设计混合在一起将D对象之间的大量的杂合?BR>
  W二Q用h口通常对于同样的信息经怼(x)需要许多不同的昄。如Q一个客户选择列表框可以包含一个客L(fng)名字和电(sh)话号码以?qing)许多其它客L(fng)名字?BR>
  当用户选择某个特定的客户后Q他Q她的名字和?sh)话L(fng)?qing)其它全部相关的信息都?x)详细地显C出来?BR>
  除此之外Q一个简单的E序可能h不同的用h口。如一个银行̎L(fng)l有一个接口用于出U_来访问̎户^衡、存?gu)Ƒ֒取款Q而监督者的接口则包含另外的信息q加上̎L(fng)理的功能。这些不同的接口很容易导致类的扩展?BR>
  最后,可视化接口在整个设计阶段q会(x)q行较大的改变。这些改变包括完全重新安排用户与pȝ的交互操作等。可视化接口的这些改变即使在最好的设计中也?x)增加应用开发的复杂性?BR>
MVC弥补可视化接?OOD的不?BR>  模型Q界面/控制器(ModelQViewQControllerQMVCQ编E技术允怸个开发者将一个可视化接口q接C个面向对象的设计中,而同时还可以避免我们上面讨论的几个问题。MVC最初是为Smalltalk语言而设计的。MVC通过创徏下面三个层将面向对象的设计与可视化接口分开Q?BR>
  模型QModelQ:(x)模型包含完成d所需要的所有的行ؓ(f)和数据。模型一般由许多cȝ成ƈ且用面向对象的技术来创徏满五个设计目标的程序?BR>
  界面QViewQ:(x)一个界面就是一个程序的可视化元素,如对话框、选单、工h{。界面显CZ模型中提供的数据Q它q不控制数据或提供除昄外的其它行ؓ(f)。一个单一的程序或模型一般有两种界面行ؓ(f)?BR>
  控制器(ControllerQ:(x)控制器将模型映射到界面中。控制器处理用户的输入,每个界面有一个控制器。它是一个接收用戯入、创建或修改适当的模型对象ƈ且将修改在界面中体现出来的状态机。控制器在需要时q负责创建其它的界面和控制器?BR>
  控制器一直决定哪些界面和模型lg应该在某个给定的时刻是活动的Q它一直负责接收和处理用户的输入,来自用户输入的Q何变化都被从控制器送到模型?BR>
  界面从模型内的对象中昄数据。这些对象的改变可以通过也可以不通过用户的交互操作来完成。如Q在一个Web览器中负责接收面的对象收集和装配栈中的信息,必须有某U方式来让这些对象通知界面数据已经被改变了。在模型变化时有两种Ҏ(gu)来对界面q行更新?BR>
  在第一U方法中Q界面可以告诉模型它正在监视哪些对象。当q些对象中有M一个发生变化时Q一个信息就被发送给界面。界面接收这些信息ƈ且相应地q行更新。ؓ(f)了避免我们上面讨论的不Q模型必能够不用修改就支持许多U不同的界面昄?BR>
  W二个方法ƈ不直接将界面q接到模型中Q它的控制器负责在模型变化时更新界面。控制器通过Ҏ(gu)型对象或观察器方法进行监来模型中的变化。这个方法不用了解界面的模型知识Q因此界面就变成是可以跨应用使用的?BR>
使用MVC的优?BR>  MVC通过以下三种方式消除与用h口和面向对象的设计有关的l大部分困难Q?BR>
  W一Q控制器通过一个状态机跟踪和处理面向操作的用户事g。这允许控制器在必要时创建和破坏来自模型的对象,q且面向操作的拓扑l构与面向对象的设计隔离开来。这个隔L助于防止面向对象的设计走向反面?BR>
  W二QMVC用h口与面向对象的模型分开。这允许同样的模型不用修改就可用许多不同的界面昄方式。除此之外,如果模型更新由控制器完成Q那么界面就可以跨应用再使用?BR>
  最后,MVC允许应用的用h口进行大的变化而不影响模型。每个用h口的变化只需要对控制器进行修改,但是既然控制器包含很的实际行ؓ(f)Q它是很Ҏ(gu)修改的?BR>
  面向对象的设计h员在一个可视化接口dC个面向对象的设计中时必须非常心Q因为可视化接口的面向操作的拓扑l构可以大大增加设计的复杂性?BR>
  MVC设计允许一个开发者将一个好的面向对象的设计与用h口隔d来,允许在同L(fng)模型中容易地使用多个接口Qƈ且允许在实现阶段Ҏ(gu)口作大的修改而不需要对相应的模型进行修攏V?img src ="http://www.aygfsteel.com/qq13367612/aggbug/16890.html" width = "1" height = "1" />

Sung 2005-10-26 16:14 发表评论
]]>
在Ruby on Rails/Naked Objects_指引下的域驱动开发框?/title><link>http://www.aygfsteel.com/qq13367612/articles/16547.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Mon, 24 Oct 2005 03:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/qq13367612/articles/16547.html</guid><wfw:comment>http://www.aygfsteel.com/qq13367612/comments/16547.html</wfw:comment><comments>http://www.aygfsteel.com/qq13367612/articles/16547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/qq13367612/comments/commentRss/16547.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/qq13367612/services/trackbacks/16547.html</trackback:ping><description><![CDATA[Ruby on Rails已经受到来多的重视,更多文章开始关注,<A target=_blank>Rolling with Ruby on Rails</A>一文比较详l,也有国h做了译Q?A target=_blank>按这?/A>。这里我们不q多讨论ROR(Ruby on Rails)Q而是探讨如何以一个正的方式快速开发J2EE? <P><STRONG>现在的问?/STRONG></P> <P>  现在我们J2EE开发碰C什么问题呢Q?让我们想象一下用Spring和Hibernate开发一个J2EE WEB应用是什么样的:(x)我们需要增加一个新的域对象cd为PersonQ下面主要的开发步骤:(x)</P> <OL> <LI>创徏<CODE>Person</CODE>c? <LI>创徏<CODE>PersonDAO</CODE>c? <LI>创徏<CODE>Person数据?/CODE>. <LI>定义<CODE>PersonDAO?/CODE>Spring的application context XML文g. <LI>创徏<CODE>Person</CODE> page面和actionc? <LI>增加<CODE>Person面?/CODE>web框架(如struts)XML配置文g? <LI>创徏<CODE>personList</CODE>面来显C?CODE>Person实例</CODE>. <LI>创徏<CODE>personEdit</CODE>面来编?CODE>Person</CODE>实例. </LI></OL> <P>  你会(x)实感慨Q真是需要很多步骤啊?/P> <P><STRONG>如何解决Q?/STRONG></P> <P>  关键问题是我们开发时不能重复一些步骤,因此必须量减少步骤Q如果只减少步骤?</P> <OL> <LI>创徏<CODE>Person</CODE>c? </LI></OL> <P>  是否只需要第一个步骤就可以Q在W一步时Q我们花Ҏ(gu)多时间精力进行域建模Q确定域模型的属性行为等。其他步骤我们会(x)发现下面的规律:(x)</P> <UL> <LI>对于每个实体Q我们需要完成应用的基本功能Q如 create, retrieve, update, and delete (CRUD). <LI>我们需要每个实体持久化到数据库. <LI>我们需要数据库为每个实体创建数据表? <LI>我们需要安排实体之间的关系?</LI></UL> <P>  当然Q在复杂应用中,不会(x)只是q些功能Q但是如果我们将q些功能通过框架实现Q将大大提高我们的开发效率?/P> <P><STRONG>域驱动开?/STRONG></P> <P>  域驱动开?domain driven development framework )Q简UDDD是一U最新的OO设计概念Q它是由ROR?A target=_blank>Naked Object</A>l织提出的?/P> <P>  所谓naked Object是指一个复杂的域对象,q个Object是一个POJOQ但是不是一个傻?c)完全是属性的POJOQ而是装了业务逻辑的POJOQ注意这里是最大的区别Q一般业务逻辑我们是通过另外的ServicecL实现Q然后在Service中封装的transaction script(Martin Fowler却称血模型) Q?naked Object则是合ƈh的(有的cM回归传统?W合Martin Fowler审美观了Q,但是Q这U纯OO是和SOA()思想矛盾?Service-Oriented vs. Object-Oriented )Q可?A id=viewpost.ascx_TitleUrl target=_blank>Adventures in SOA</A>(puts the business logic in service-like methods instead of on the object, service method -> business method --> persistence method) )</P> <P>  个h感觉整个软g好像一直在??的游戏,不过也许最复杂的体pd是来自最单的抉择Q如股票/汇市{投资领域也如此?/P> <P>  naked Object提出现在J2EE开发和怽对象DDD开发下的图Q?/P> <P><IMG height=374 src="http://www.jdon.com/artichect/images/nakedarchitecture-diagram.gif" width=600></P> <P>  通过q张图我们可以看刎ͼ以前方式造成J2EE开发层ơ之间调用؜乱,修改和拓展非怸方便Q而在双的DDD开发方式下Q?STRONG>界面(边界)对象是域对象就是持久化的实体BO</STRONG>Q没有多余的Contorller或Action了。原来Domain层被服务层Service layer遮挡Q在叛_中,则Domain层直接暴露给前台了,所以Domain没有东西被遮盖,裔R了,UCؓ(f)Naked(裔R) Objects.</P> <P><STRONG>现在怎么办?</STRONG></P> <P>  ROR提倡的DDD方式引v了众多J2EE开发者的兴趣Q在各大Java媒体正在引vq泛的讨论,但是ROR不是Java的,那么有无ZJava的DDD开发框架呢Q?/P> <P>  目前有不DDD开发框架正在诞生中Q?A target=_blank>Jdon框架</A>正是在RORq种_指引下的一Ƒֿ速开源开发框ӞJdon框架1.2.2版本虽然不是一个完全意义上的Naked ObjectQ基于Service-Oriented 架构,但是已经初步具备上图双开发流E,具体可参?A target=_blank>Jdon Sample的开发流E?/A></P> <P>  使用Jdon框架开发J2EE应用pȝQ最重要的一个前提是Q设计好你的域对象,然后在将域对象复制到表现层,变成表现层的ActionForm/ModelFormQ将域对象直接在持久层用Hibernate/iBatis{持久化到数据库Q如果用EJB的实体Bean持久化技术,无需实现建立数据表;应用pȝ部vӞJ2EE容器直接根据实体徏立数据表Q也可节省前面步骤中两个步骤?/P> <P>  当然Q目前Jdon框架是采取分L法,遵@桥模式,抽象和行ؓ(f)分离Q每个域对象对应一个操作它的服务类或DAOc,服务cM要用来封装业务逻辑层,然后业务Service作ؓ(f)一个业务组件暴露给表现层的Controller/Actionc,而Controller/Action则无需代码Q只要通过如下配置卛_完成Q?/P> <P><FONT face=arial,sans-serif color=#000000 size=-1><model key="username" <B>class</B>=</FONT><FONT color=#00bb00>"com.jdon.framework.samples.jpetstore.domain.Account"</FONT><FONT color=black>><BR>  <actionForm name=</FONT><FONT color=#00bb00>"accountForm"</FONT><FONT color=black>/> </FONT><FONT color=#0000aa>//指定边界c?/FONT><FONT color=black><BR>  <handler><BR>    <service ref=</FONT><FONT color=#00bb00>"accountService"</FONT><FONT color=black>> </FONT><FONT color=#0000aa>//指定某个业务接口</FONT><FONT color=black><BR>      <getMethod name=</FONT><FONT color=#00bb00>"getAccount"</FONT><FONT color=black>/><BR>      <createMethod name=</FONT><FONT color=#00bb00>"insertAccount"</FONT><FONT color=black>/> </FONT><FONT color=#0000aa>//业务接口的新增方?/FONT><FONT color=black><BR>      <updateMethod name=</FONT><FONT color=#00bb00>"updateAccount"</FONT><FONT color=black>/> </FONT><FONT color=#0000aa>//业务接口的修Ҏ(gu)?/FONT><FONT color=black><BR>      <deleteMethod name=</FONT><FONT color=#00bb00>"deleteAccount"</FONT><FONT color=black>/><BR>    </service><BR>    </handler><BR></model></FONT></P> <P>  通过上述配置Q净化了上图中应用控制层(Application or Controller layer)和Domain Layer之间对应关系Q变得有条理而且明晰?/P> <P>  随着Naked Object 被越来越多h认识和应用成熟,Jdon框架也将转向支持另外一个纯OO派Naked ObjectQ?p它同时支持POJOz֒EJBz一栗?</P> <P>  在Jdon框架以后版本中,?x)很方便支持Naked ObjectQ只要将上面配置文g指向Service去除QCRUDҎ(gu)由Model自己实现Q如下:(x)</P> <P><FONT face=arial,sans-serif color=#000000 size=-1><model key="username" <B>class</B>=</FONT><FONT color=#00bb00>"com.jdon.framework.samples.jpetstore.domain.Account"</FONT><FONT color=black>><BR>  <actionForm name=</FONT><FONT color=#00bb00>"accountForm"</FONT><FONT color=black>/> </FONT><FONT color=#0000aa>//指定边界c?/FONT><FONT color=black><BR>  <handler><BR>   <!-- <service ref=</FONT><FONT color=#00bb00>"accountService"</FONT><FONT color=black>> </FONT><FONT color=#0000aa>//指定某个业务接口</FONT><FONT color=black> 无需业务层,去除--> <BR>      <getMethod name=</FONT><FONT color=#00bb00>"getAccount"</FONT><FONT color=black>/><BR>      <createMethod name=</FONT><FONT color=#00bb00>"insertAccount"</FONT><FONT color=black>/> </FONT><FONT color=#0000aa>//业务接口的新增方?/FONT><FONT color=black><BR>      <updateMethod name=</FONT><FONT color=#00bb00>"updateAccount"</FONT><FONT color=black>/> </FONT><FONT color=#0000aa>//业务接口的修Ҏ(gu)?/FONT><FONT color=black><BR>      <deleteMethod name=</FONT><FONT color=#00bb00>"deleteAccount"</FONT><FONT color=black>/><BR>   <!--  </service> --> <BR>  </handler><BR></model></FONT></P><img src ="http://www.aygfsteel.com/qq13367612/aggbug/16547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/qq13367612/" target="_blank">Sung</a> 2005-10-24 11:15 <a href="http://www.aygfsteel.com/qq13367612/articles/16547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java设计模式之综q篇http://www.aygfsteel.com/qq13367612/articles/16092.htmlSungSungThu, 20 Oct 2005 03:03:00 GMThttp://www.aygfsteel.com/qq13367612/articles/16092.htmlhttp://www.aygfsteel.com/qq13367612/comments/16092.htmlhttp://www.aygfsteel.com/qq13367612/articles/16092.html#Feedback0http://www.aygfsteel.com/qq13367612/comments/commentRss/16092.htmlhttp://www.aygfsteel.com/qq13367612/services/trackbacks/16092.html自从J2EE出现以来Q就大大化了在Java下的企业U开发。但是随着J2EE来普遍地被应用到各个领域中,开发者们渐渐意识到需要一U方法来标准化应用程序的开发过E,他们采用的方法是标准化应用程序的l构层。在l构层通常装了一些独立于业务逻辑的复杂技术,以便在业务逻辑和底层的架构之间建立起弱q接。在个专题中会(x)介绍一些设计模式,通过利用q些设计模式Q开发h员可以达到标准化和简化应用程序开发过E的目的?


应用E序l构和J2EE


J2EE是一个很成功的技术,它ؓ(f)一些基本的d提供了一致的标准Q例如数据库q接、分布式应用E序{。但是用J2EEq不能保证开发h员开发出成功的应用程序。有些h认ؓ(f)J2EE本n是一U框架技术,但是q种认识是不正确的,我们应该意识到J2EEq没有提供一个能够帮助开发h员开发出高质量应用程序的框架Q因此很多有l验的开发h员通过利用设计模式来I补这一~项?


设计模式


在开发h员的圈子中,大家通过怺交流在开发过E中所遇到的问题以?qing)解x法来丰富整个圈子的经验。而设计模式就是在q样的情况下产生的。一个设计模式必然是针对某个特定的问题的Q这个问题的解决Ҏ(gu)以及(qing)q样解决问题产生的后果。在解决利用J2EEq行E序开发中出现的问题的q程中,Z把设计模式分Zc,一U是通用开发模式,一U是Z解决特定的J2EE问题的模式。下面让我们来看一看每一U类型的开发模式都包含了哪些内宏V?

J2EE设计模式

J2EE设计模式在过dq中随着Java开发h员经验的不断成长而发展。这些设计模式是针对使用各种J2EE技术时可能出现的问题提出的Q它们能够帮助开发h员构造出应用E序框架的要求。例如,Front ControllerQ前端控Ӟ模式servlet代码的开发{化ؓ(f)在图形用L(fng)面下的开发。但是需要记住J2EE设计模型解决了那些在J2EE目中最可能出现的问题。如果你在J2EE遇到的问题很Ҏ(gu)Q很有可能没有相应的设计模型来解军_?

软g开发设计模?

软g开发设计模式又被分ZU,一U是通用的面向对象设计模式。例如工厂(F(tun)actoryQ模式是一U面向对象的设计模式Q它?yu)对象的创徏装hQ对象能够重用Q这样就可以减少E序占用的系l资源。而另一U是ZJava的设计模式,q些设计模式要么是和Java的语aҎ(gu)结合得很紧Q要么是面向对象技术在Java中的深化。不要以Y件设计模式相对独立于J2EEp为它们不重要Q通常它们比J2EE设计模式更重要。这是因为:(x)

1QJ2EE设计模式是近几年才出现的Qƈ且在不断变化Q而Y件开发设计模式经q了长时间的考验Q比前者更加成熟和完善Q?

2Q有些J2EE设计模式是徏立在某些软g开发设计模式之上的Q?

3QY件开发模式ؓ(f)J2EE设计模式提供了坚实的基础。它的应用将影响到整个结构的E_性和可扩充性?

在实际应用中Q设计模式ƈ不是一D具体的代码。设计模式通常是在设计说明书中描述。将设计模式应用到系l中的真正挑战在于如何在pȝ中应用模式中的思想。这些思想必须被应用到恰当的环境中?

Ҏ(gu)设计模式的所解决的问题,又可以分Z下几个类型:(x)

· 创徏cdQ创建类型的模式都是用于创徏cȝ实例。但是和通过new来创建实例不同,q些模式提供了更加灵zȝ方式Q是E序能够Ҏ(gu)特定的情况创建特定的cR?

· l构cdQ结构类型的模式帮助开发h员将单对象组合在一起以后的更加复杂的结构?

· 行ؓ(f)cdQ行为类型的模式帮助开发h员控制类之间的通讯?

创徏cd的模?

所有创建类型的模式都和如何有效地创建类的实例相兟뀂在Java中,如果开发h员要生成一个类的实例,最单的Ҏ(gu)是用new关键字:(x)

MyFoo = new Foo();  // 生成一个Foo的实?BR> 


q种Ҏ(gu)只能够在E序中生成固定的cR但是在很多情况下,E序需要根据不同的情况生成不同的类的实例,q就需要将实例的生成过E抽象到一个特D的创徏cMQ由该类在运行时军_生成哪种cȝ实例。这样得程序有更好的灵zL和通用性?

创徏cd的模式包括:(x)

· 工厂模式QF(tun)actory PatternQ:(x)Ҏ(gu)工厂模式实现的类可以Ҏ(gu)提供的数据生成一l类中某一个类的实例,而这一l类有一个公q抽象父类?

· 抽象工厂模式QAbstract Factory PatternQ:(x)抽象工厂模式也可以根据提供的数据生成一l类中某一个类的实例,而这一l类有一个公q抽象父类。只不过它定义的是一个接口?

· 构造者模式(Builder PatternQ:(x)构造者模式将一个复杂对象的构造过E和它的表现层分d来,q样cd可以Ҏ(gu)不同情况展现Z同的表现方式?

· 原型模式QPrototype PatternQ:(x)原型模式通过对类的实例进行拷贝来创徏新的实例?

· 单一模式QSingleton PatternQ:(x)Ҏ(gu)单一模式实现的类只允许有一个是c,q且提供了一个全局指针来引用该实例?

l构cd的模?

l构cd的模式将cd对象l合hQ以构成更加复杂的结构。它又被划分为类模式和对象模式。类模式和对象模式之间的区别在于cL式通过l承关系来提供有效的接口Q而类模式通过对象合成或将对象包含在其它对象中的方式构成更加复杂的l构?

l构cd的模式包括了以下模式Q?

· 适配器模式(Adapter PatternQ:(x)适配器模式可以将一个类的接口和另一个类的接口匹配v来?

· 桥梁模式QBridge PatternQ:(x)桥梁模式对客L(fng)E序提供一个固定的接口Q但是允许开发h员变化实际的实现cR这样开发h员就可以接口是具体的实现类分离开来?

· 复合模式QComposite PatternQ:(x)复合模式可以多个对象进行复合,其中的每个对象可以是单对象,也可以是复合对象?

· 代理模式QProxy PatternQ:(x)代理模式利用一个简单的对象替代一个复杂的对象Q当复杂对象在需要的时候才?x)被加蝲到系l中Q这样可以节U系l资源,提高pȝ的响应速度。在|络环境中这U模式很有用处?

· 修饰模式QDecorator PatternQ:(x)通过修饰模式Q开发h员可以在q行时将特定的功能绑定在对象上?

· 轻量模式QF(tun)lyweight PatternQ:(x)轻量模式通过对象中的一部分数据保存在对象外Q在调用对象中的Ҏ(gu)时再这些数据传回对象。这样做可以减少大量比较单的对象占用的空间?

· 正面模式QF(tun)a?ade PatternQ:(x)正面模式复杂的cdơ结构组lv来,通过一个简单的接口来获得层ơ结构中的数据?

行ؓ(f)cd的模?

行ؓ(f)cd的模式主要是那些处理对象之间通讯的模式,该类型的包括以下模式Q?

· 观测者模式(Observer PatternQ:(x)观测者模式可以在发生变化时将变化通知多个cR?

· 中介模式QMediator PatternQ:(x)中介模式可以通过一个中间类来控制若q个cM间的通讯Qƈ且这些类怺之间不需要了解对方的信息?

· 回忆模式QMemento PatternQ:(x)回忆模式可以在不破坏对象装性的前提下保存和恢复对象的内部状态?

· 职责链模式(Chain of ResponsibilityQ:(x)职责链模式将h传递给一l对象,只有特定的对象才?x)处理该h。这样就q一步削q之间的联pR?

· 命o(h)模式QCommand PatternQ:(x)命o(h)模式请求传递给特定的对象,q样客户端即使在不知道服务器端如何处理请求的情况下也可以发送请求?

· 模板模式QTemplate PatternQ:(x)模板模式提供了对法的抽象定义?

· {略模式QStrategy PatternQ? {略模式定义了一l算法,每个算法都装hQƈ且它们之间可以互换。策略模式ɘq些法在客L(fng)调用它们的时候能够互不媄响地变化?

· 讉K者模式(Visitor PatternQ:(x)讉K者模式通过一个访问类来访问其他类中的数据?

· 状态模式(State PatternQ:(x)状态模式将一个类实例的变量保存在独立的内存空间中?

· q代模式QIterator PatternQ:(x)q代模式在不知道数据的内部表现Ş式的前提下,通过标准的接口来遍历数据集合中的数据?



Sung 2005-10-20 11:03 发表评论
]]>
Web servicesa計模式--企業觀?/title><link>http://www.aygfsteel.com/qq13367612/articles/16019.html</link><dc:creator>Sung</dc:creator><author>Sung</author><pubDate>Sat, 15 Oct 2005 08:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/qq13367612/articles/16019.html</guid><wfw:comment>http://www.aygfsteel.com/qq13367612/comments/16019.html</wfw:comment><comments>http://www.aygfsteel.com/qq13367612/articles/16019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/qq13367612/comments/commentRss/16019.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/qq13367612/services/trackbacks/16019.html</trackback:ping><description><![CDATA[<P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>三部?SPAN lang=EN-US>:Web services之規劃策?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?></SPAN></B> </P> <P class=MsoNormal style="LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: right" align=right><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>李清?/SPAN></B></P> <P class=MsoNormal style="LAYOUT-GRID-MODE: char; WORD-BREAK: break-all; TEXT-ALIGN: right" align=right><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>弈飛資訊首席問<SPAN lang=EN-US> /台灣微軟特約資深</SPAN></SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>師</SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?></SPAN></B> </P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>在上一文章中Q我們談C</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>?SPAN lang=EN-US>Web services作為存取介面的服務導向應用程式架?/SPAN></SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Q以?qing)其與企業應用程式之間的關聯Q其中最重要的關鍵點在於如何利用“服務導向的應用E式架構”滿企業應用程式D烈的<SPAN lang=FR> </SPAN>“彈性”與“整合?之需?SPAN lang=FR> </SPAN>。這個月Q我們將進一步的談談Q如何將<SPAN lang=FR>Web services</SPAN>應用在真實的企業環境Q以?qing)其規劃{略?/SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN lang=FR style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>Web services</SPAN></B><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>企業運用a計模式</SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>在談到如何將<SPAN lang=FR>Web services</SPAN></SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>入C業的pȝ(dng)架構中之?/SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Q還要再弯一ơ,雖然在以下的各種應用模式中,使用的是<SPAN lang=FR>Internet</SPAN>的技術,?SPAN lang=FR>Internet</SPAN></SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>只是</SPAN></B><B><SPAN lang=FR style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Web services</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>的手D?/SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Q?/SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>而非</SPAN></B><B><SPAN lang=FR style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Web services</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>的目的?SPAN lang=EN-US>Web services不是只為了Internet而設a,重點在於他是一E用標準技術的分散式應用程式?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>分散式應用程式讓企業在徏|資a系i時不論在採g或徏|上都更為彈性,企業可依需要不L(fng)擴充pȝ(dng)Q而不需在初期即一ơ購I企業也可以將pȝ(dng)以功能模i的方式分階D徏|或升級Q企業也可以依實際需求,資料n或資a系i分布在不同的地方,再以E\加以連結。分散式應用E式有助於將商業邏輯集中理Q並取得較佳的安全機Ӟ另外在伺服器與資料n資源的充分利用以?qing)多樣化的用戶端的設a模式,更是分散式應用程式所帶來的好處?/SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>然而隨著市場全球化以及(qing)E\E濟的成形,雖然i了分散式應用程式一個絕佳的揮灑I間。卻也因此突了一個嚴重的問題Q也是在上一文章中所提到異質q_的問。理論上Q分散式應用E式只要a計得當Q便可以分散在各地的系ip資料整合成一個抽象的大系i,但由於各家系i廠商所使用的技術不同,以及(qing)新舊pȝ(dng)技術與a計概念不同Q所致的不相容問題Q得分散式運算的優點大打折扣。因此在發展C代分散式應用E式時,׃業觀點而言首先必須解決的,是企業內pȝ(dng)整合的問,包括資料的整合與應用E式的整合,如何讓異質^台或新舊pȝ(dng)間的資料能互通,以及(qing)新開發的應用E式能繼U用舊pȝ(dng)或異質^台的應用E式Q以保留有投資的價倹{再來則是跨企業間的E式互通,包括<SPAN lang=EN-US>B2B的電子商務,以及(qing)供應鏈的整合。最後則是各應用E式的流E整合。而W(xu)eb services則是W合這些需求的重要技術?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>除了解決企業全球化與E\化的整合需求以外,延?SPAN lang=EN-US>Web services的特D技術,也為企業帶來了另一E商業價|這種價gxWeb services的商品化Q也是在上一題到的軟體服務。這種直接出售Web services的軟體服務,包括功能性的隨選服務 (Services-on-Demand)Q以?qing)組成應用程式的軟體I木{?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>接下來我們就一一的介紹如何將<SPAN lang=EN-US>Web services入C業的真實環境Q以?qing)其規劃{略與所帶來的好處?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>企業應用E式的整?/SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>於a多企業而言Q?SPAN lang=EN-US> Web services 的第一個實作通常會是內部應用E式的整合。利?Web services 延或擴充原有應用程式的功能Q或不同系i,?Web services 加以連結或整合?/SPAN></SPAN></B></P> <P class=MsoNormal style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?><IMG height=217 src="http://move-to.net/Comm/Document/9_image001.jpg" width=360></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>企業應用E式整合工作如果加以細分Q包括應用程式的整合、資料整合、與程整合。關於流E整合在後面再來談。應用程式與資料的整合需求對a多企業來講是很重要的議。當企業合併或併購時Q原本不同企業的資訊pȝ(dng)需要整合成一個完整的資訊pȝ(dng)Q開發新的系i必須與舊的pȝ(dng)整合Q企業因需求與a計考量Q將原本集中式大型主系i改為分散式應用E式pȝ(dng)時也需要整合,其當系i或資料庫是分散在各地時Q必須透過<SPAN lang=EN-US>Internet整合加以整合Q再來則是企業再進行軟體採購或委外服務時Q為了符合最佳的E濟效率或協力廠商用技術的限制Q常無法取得與原有系iq同技術或q_之解決方案,這時候也需要整合?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>企業應用E式整合的市場仍相當龐大Q而每個專案動則花L癄x千萬的預。目前市場上整合的解決方案很多,但大多是一一的整合,典型的像連結<SPAN lang=EN-US>MSMQ與MQSeries的FalconMQ?Web services 則提供另一E全然不同的Ҏ(gu)Q利用實作標準介面的方式Q進行多點的整合。只要將現有的傳iqi可以包裝成Web Service Q便可與企業內的其他pȝ(dng)整合使用。利用這種技術,複雜的舊系i包裝在標準的XML之後Q以Web services的標準溝通介面,取代原有一一的整合方式,同時在規劃時Q還可以依需要,僅選擇一部分或全部的功能作為整合的介面?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>供應鏈的建立與開?/SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>另一個驅?SPAN lang=EN-US> Web services 發展的主要力量則?B2B 的商業模式。有人甚xa供應鏈整合將會是最具威力的 Web services 應用E式。主要是因為供應鏈媄響的圍廣,?Web services 提供供應鏈應用程式所需?XML ?qing)相關之產業標準。在一份由InfoWorld (<A target=_blank>http://www.InfoWorld.com</A>) 針對CTO所作的調查ipQ?0%的CTO認為Web services 企業最有媄響的是在B2Bd商務上。B2B應用E式可以像信用卡驗證這樣單或者像產業的供應鏈這樣複雜的程式。徏|B2B應用E式的挑戰結合B2B背後的廣大市場潛(jng)力是驅Web Service快速改進的原動力?/SPAN></SPAN></B></P> <P class=MsoNormal style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?><IMG height=240 src="http://move-to.net/Comm/Document/9_image002.jpg" width=372 border=0></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>台灣?SPAN lang=EN-US>B2Ba畫Q最重要的應該是qȟ部技術處d的A、B、C、D、Ea畫。其中Aa畫Q讓HP、Compaq、IBM採Da下攑ֈ台灣來;Ba畫則把華碩、仁寶、英業達{?5家台灣廠商的資訊與美國採購商搭上R,讓台灣的製造業在世界PC市場上,保住一q?80億美元的市場。A、Ba畫的核心,是以「大廠為中心廠,帶動下游供應商加入」的垂直聯結方式Q藉由Internet市場變動的資訊Q即時回饋到a畫中的產業Q讓廠商可以針對變動來調整n存?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>另一個不同於<SPAN lang=EN-US>A、Ba畫的,則是׃渔Rig大廠明基與資{會合作的「星動計畫」,在這個計畫中QInternet所連結的是一E水qx通的d交易q_QHubQ,以「水q뀍的產業q_Q取代「垂直」的供應鏈體pR星動計畫是以資{會開發的viaHub作為公共q_Q讓參與廠商、供應商之間可以跨越不同的系i^CRosettaNet的資料存取?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>除了製造業以外Q傳i各產業之間其實都存著一套共通的d交換格式<SPAN lang=EN-US>EDI以進行B2B的資料交換,不同於Web services的是Q這些交換格式都並須徏立產業間Ҏ(gu)的交換^台與資料格式或規,而W(xu)eb services不需要特定^収ͼInternet本n是一個很好的q_Q只需依XML的規,定義各產業的SchemaQ即可在共通的標準上進行交易Q利用Web services建置的好處在g的徏|成本低Q參與的廠商利用Web services的標準規徏|溝通介面,只需按照各產業所a的標準定義描述資料的名詞及(qing)內容格式卛_Q例如一{訂單資料應包含哪幾個項目,a單是用Orders還是PO來表C等。另外一個好處在於這樣的規還可以是跨產業的,B2B不是只有供應鏈而已Q還必須考慮金流、物等Q這些都會應用到跨產業的溝通方式。因此,以Web services作為B2B溝通介面的規劃{略Q具有相當大的彈性與E濟效益Q也因此有些Ɗ威人士認為供應鏈整合將會是一個殺手級的Web Service 應用E式?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>現有與未來應用程式的擴充</SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>由於目前個h所能取得的怽週邊a備相當豐富Q除傳箔(dng)<SPAN lang=EN-US>PC與筆a型電腦以外QPDA、手、簡a等Q得用戶端E式的客製化得非常重要Q其中尤以手最為嚴重,由於消費性產品的市場化,各家在樣式上求新求變QɽE式開發工作更為困難。Web services J承自分散式應用E式商業邏輯集中的優點,可以快速開發多樣化的用戶端E式。只要將商業邏輯以Web services呈現Q再針對不同用戶端撰寫資料展C的方式可以了。目前市場上的用戶端E式開發工具Q大多數都支援Web services的存取,其中Visual Studio .NET更可以在單一的畫面裡面,完成所有應用程式的開發?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>然而對大部分的企業而言Q許多的商業邏輯都已寫完Q而且行之多年Q不可能Z開發一L的E式Q而將整個程式重寫。前面提刎ͼ<SPAN lang=EN-US>Web Service提供一i吸引h的技術,是現有的傳箔(dng)pȝ(dng)包裝成Web Service Q以提供其他應用E式使用。藉由這種方式Q不只可以n有Web services所帶來的便利,更可因此延原有應用E式的生命週期?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>在這裡舉一個典型的例子Q在擔Q<SPAN lang=EN-US>.NET開發技術的師與顧問的兩年多時間裡Q?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?> 最常碰到的問題是有關ASP.NETE頁a計的問。由於ASP.NET提供像VB開發視窗E式一樣拖曳的視覺化開發環境,使得很多人就慣性的兩者拿來比Q但事實上這兩者還是有差異的。網頁的E式Q由於透過Internet在伺服器上執行完畢後Q再結果傳回用戶端展示層,因此有其先天上的限制?/SPAN></B></P> <P class=MsoNormal style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?><IMG height=334 src="http://move-to.net/Comm/Document/9_image003.jpg" width=408 border=0></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>很多人會希望能符合老闆以及(qing)市場形象的需求,使用<SPAN lang=EN-US>Web based的架構,(在一些特D的個案中,企業選擇Web based的原因是因為老闆認為這樣才跟得上時代)但用希望像視H程式一樣的使用者操作介面,其實透過Web services可以解決這樣的問?/SPAN></SPAN></B></P> <P class=MsoNormal style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?><IMG height=295 src="http://move-to.net/Comm/Document/9_image004.jpg" width=468 border=0></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>另外一E則應用E式擴充的例子,則是應用程式系i分為核心程式與服務E式Q將必要的程式邏輯部分也在核心程式,在以<SPAN lang=EN-US>Web services的方式依功能分類Q撰寫各個服務程式。可以將核心E式當作是主板與CPU{重要元Ӟ而各個服務程式則有如週邊a備一?可依需要隨時擴增?/SPAN></SPAN></B></P> <P class=MsoNormal style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?><IMG height=301 src="http://move-to.net/Comm/Document/9_image005.jpg" width=420 border=0></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?></SPAN></B> </P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>降低pȝ(dng)建置的時間與成本</SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>除了解決應用pȝ(dng)整合與溝通上的問外</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Q?/SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>於新系iq開發</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Q?SPAN lang=FR>Web services</SPAN></SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>也可以降低開發的時間與成?/SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Q這一的a計模式大概可分為幾E狀況?/SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>W一E稱體積木的開發方式Q?/SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>企業直接利用</SPAN></B><B><SPAN lang=FR style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Internet</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>上的</SPAN></B><B><SPAN lang=FR style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Web services</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Q以軟體I木的方式,加快pȝ(dng)開發的速度Q尤其對g些輔助性的功能Q或一些共通的商業智慧。在上一文章中Q我們也舉了<SPAN lang=FR>Google</SPAN>的例子,</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>(zhn)可以直接?/SPAN></B><B><SPAN lang=FR style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?> Google </SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>所提供?/SPAN></B><B><SPAN lang=FR style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?> Web services</SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>Q?/SPAN></B><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>可在應用程式中加入此一功能。除此以外,由微軟所提供?SPAN lang=EN-US>.NET My Service也提供了非常多的軟體I木可供使用Q其中最為熟(zhn)的應屬Passport驗證制?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>另外於新市場的開發Q企業往往必須重新熟?zhn)這一個市場的商業邏輯或專門的技術,而透過<SPAN lang=EN-US>Web services的服務即可快速的修正pȝ(dng)的功能,以加快新市場的開拓。例如企業在進行全球貿易時,除了基本的商務應用程式外Q可能還會徏立連接貨運倉儲部門與國際貨運公叔R的B2B運׾pȝ(dng)。這樣的系i通常是以R密i合的方式所建立Q也是企業的資料n裡,必須知道貨運公司的價根{航班、週期、速度{。當企業的業務拓展到新的國家時,如果原有的貨運公司無法到達時Q這時候只有兩E選擇,W一是放市_(d)W二是重新洽談另一家貨運公司,重新改寫E式。但如果反過來,這些B2B的關係是建立在Web services的連結上,只要透過UDDI扑ֈ所需的服務,便可輕易的進入新市場?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>再來則是企業在提供全球技術服務時Q也可以利用<SPAN lang=EN-US>Web services來達到技術支援的目的。例如目前主要汽車大廠的服務點都以全球部|作為其市場競爭的利器。而針高階h士設a的{記型電腦,為因應國際商務的需求,也都弯全球保固的服務。然而這也衍生一個問,由於服務點遍佈全球,各地的技術水q並不一_(d)如何達到相同的服務品質,則是一個很大的考驗?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>以汽車廠ZQ假a今天擁有一部數百萬的進口名車Q在台灣要找到維護場並不難,但今天如果在某些落後國家Q狀況可能不一樣了Q即使原廠所a的服務點,也會應當地的技術h力,而有所不同。幸運的是,目前大多進口名車都採取電腦診L(fng)方式以進行故障排除Q因此只要能提供詳細的檢修步驟,讓維修h員按照步驟完成檢修工作?/SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>然而這樣還不能完全解決問。由gL(fng)iq高度密與價|不大可能在所有的地方都徏|一套這樣的系i,這時又是<SPAN lang=EN-US>Web services發揮其D大功能的時候了。這些汽車大廠可依各服務點的規模及(qing)技術能力等Q徏|一般功能的E修檢測pȝ(dng)Q以應付一般性的檢修工作Q對於重大的或具密性的技術,則至於原廠或各地區之核心廠。當各小型檢修場無法判讀汽車電腦晶片內的數據時,再透過Web services連接原廠或各地區之核心廠取得盔R檢修步驟。如此不但保有技術的密性外Q又可符合全球服務的需求,更重要的是,當擴點需求產生時Q可加快建置的時間,而當重要的技術問產生時Q只需更新原廠或各地區之核心廠的資料nQ即可將資料傳送至全球的檢測系i?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>軟體U用新模?/SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>以上所舉的例子都是以用者的角度區看,在上一文章中提到服務向應用成架構實提到Q參與這個架構的還包括服務提供者與服務登錄與代理兩個角艌Ӏ前面也提到<SPAN lang=EN-US>Web services本n也可以當作一項產品來販賣。出售服務的架構其實到處都有Q只不過型式不同|了Q目前網際網路裡面,R上刷卡代收服務是最典型的例子?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>?SPAN lang=EN-US> Web services 當作交易的標圎ͼ可能影響到資a系iqa計、部|與採購模式。企業可E由外部所提供之軟體服務,取得埯商業行為所需之應用程式功能,而不需全然由內部來開發。透過這種方式Q程式開D不須再使用傳箔(dng)建立單一、集中式伺服器應用程式的Ҏ(gu)Q即可快速地建立或g伸現有應用程式的規模。企業因此可省系i開發所需之時間,加快市場開發速度?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>服務的提供者而言Q大概可以有q模式Q第一E可能在軟體銷售<SPAN lang=EN-US>/採購的方式改為租用或隨選服務的模式;這裡提到的租用與隨選服務事實上是有差異的。ISV可以核心程式及(qing)部分的模i直接安裝於客戶端,以租用的方式實施Q而為了避免租期與U金的爭譎ͼ可保留一部分的啟動制xISV的伺服器上。在U約期間Q客戉過Web services制Q聯i至ISV啟動其應用程式;U約到期QISV僅須關閉此一制卛_。至於隨選服務,則針一些工h務,或g伸的功能Q讓客戶依需要連結使用?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>企業也可以利?SPAN lang=EN-US> Web services 原有企業的智慧財產或成功經驗,重新包裝出售Q以開拓全新的軟體服務市場。對ISV或VAR、OEM{廠商,更是提升商品附加價值的方式?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>於一些電子資a提供者,也可以改變提供的格式Q目前大部分都是透過d郵g或網頁瀏覽方式Q未來也可以利用<SPAN lang=EN-US>Web services提供相同的資a,讓用戶端可以直接加以利用Q將Web services當作資料來源Q直接提供應用程式存取。例如在a計E頁時,若希望能取得氣象、股、球賽、產E最新消息,只要所需之資a版面空下,利用E頁上的控制項直接連結個資料來源之Web servicesQ即可取得最新的資訊。而服務的提供者則可依a戶的需求收取不同之ȝ?/SPAN></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>企業程理</SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>最後則來談談流E整合的部分Q之所以會留到最後在來講Q主要上避免在談到流E整合時Q只侷限在企業內得整合。利?SPAN lang=EN-US> Web services 加上程理軟體Q可以讓企業內部或與外部合作夥伴間徏立v天衣無縫的作業流E,更可依需要不L(fng)加入應用E式模組Q而不影響到其他的應用E式Q這些模組可以自行開發Q也可以直接使用ISV所提供資訊服務。如此不但能提升企業i織的效率並降低企業E營的成本?SPAN style="COLOR: black">或許(zhn)要問,目前已有很多的流E管理軟體與跨^台整合軟體,位什麼還要有Web servicesQ這是因為這些軟體都是為個別pȝ(dng)間整合所a計Q即使主要大廠所提供的流E管理軟體,</SPAN>包括Microsoft、IBM、BEA{?SPAN style="COLOR: black">Q也須為不同的Adapter付出不同的軟體授Ɗ費Q若採用Web services則不須為不同的系i就要採購另一套整合或程軟體?/SPAN></SPAN></SPAN></B></P> <P class=MsoNormal style="LAYOUT-GRID-MODE: char; TEXT-ALIGN: center" align=center><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 標楷?><IMG height=358 src="http://move-to.net/Comm/Document/9_image006.jpg" width=553 border=0></SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN lang=EN-US style="FONT-SIZE: 14pt; COLOR: black; FONT-FAMILY: 標楷?></SPAN></B> </P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 20pt; FONT-FAMILY: 標楷?>入時機</SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>看完了以上的文章Q或a會L(fng)Q這樣的技術成熟了嗎?我需不需要導入?要如何導入?而且在前兩年Q資a界還傳著一個很奇怪的說法Q雖然各主要大廠?SPAN lang=FR>WS-I</SPAN>i織以提供相當完整的規範與技術,但還是有些所權威h士會?SPAN lang=FR>Web services</SPAN>是個不成熟的技術,還不能導C業中使用。雖然對於全面性的?SPAN lang=FR>Web services</SPAN>應用到全球的E\E濟還有些技術與規範要克服的Q但也有不少廠商與政府或非政府機構以成功的導?SPAN lang=FR>Web services</SPAN>。若要等一套技術完全成熟在一ơ導入,那時候可能又已經推出另外一套更新的技術,或許我們把他當作是一E市場競爭的手段|了Q對於技術跟不上速度的廠商,通常會以這種方式以減R對手搶d場的速度?/SPAN></B></P> <P class=MsoNormal style="TEXT-JUSTIFY: inter-ideograph; LAYOUT-GRID-MODE: char; TEXT-INDENT: 26.9pt; TEXT-ALIGN: justify"><B><SPAN style="FONT-SIZE: 14pt; FONT-FAMILY: 標楷?>下回我們再來分析哪些技術是可以入的,哪些是還有限制的Q哪些是目前不可行的Q以?qing)導入的步驟?/SPAN></B></P><img src ="http://www.aygfsteel.com/qq13367612/aggbug/16019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/qq13367612/" target="_blank">Sung</a> 2005-10-15 16:56 <a href="http://www.aygfsteel.com/qq13367612/articles/16019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过Java Swing看透MVC设计模式http://www.aygfsteel.com/qq13367612/articles/15981.htmlSungSungSat, 15 Oct 2005 08:55:00 GMThttp://www.aygfsteel.com/qq13367612/articles/15981.htmlhttp://www.aygfsteel.com/qq13367612/comments/15981.htmlhttp://www.aygfsteel.com/qq13367612/articles/15981.html#Feedback0http://www.aygfsteel.com/qq13367612/comments/commentRss/15981.htmlhttp://www.aygfsteel.com/qq13367612/services/trackbacks/15981.html  看清楚这两点你就发现了一个很强大的设计方法,q种Ҏ(gu)鼓励重用reuseQ而不是重新设计redesign。你发现按钮都有相同的机理,你只要在按钮的顶上喷上不同的字母便能刉出“不同”的按钮Q而不用ؓ(f)了每个按钮而重新设计一份图U。这大大减轻了设计工作的旉和难度?BR>  如果(zhn)把上述设计思想应用到Y件开发领域,那么取得怼的效果一炚w不让人惊奇。一个在软g开发领域应用的非常q泛的技术Model/View/Controller(MVC)便是q种思想的一个实现?BR>  q当然很不错Q但是或许?zhn)又开始疑惑这和java基础cJFC(Java Foundation Class)中的用户界面设计部分(Swing)又有什么关pdQ好的,我来告诉你?BR>  管MVC设计模式通常是用来设计整个用L(fng)?GUI)的,JFC的设计者们却独创性的把这U设计模式用来设计Swing中的单个的组?Component)Q例如表格Jtable,?wi)Jtree,l合下拉列表框JcomboBox{等{等。这些组仉有一个Model,一个ViewQ一个ControllerQ而且Q这些model,view,controller可以独立的改变,是当组件正在被使用的时候也是如此。这U特性得开发GUI界面的工具包昑־非常的灵zR?BR>  MVC设计模式把一个Y件组件区分ؓ(f)三个不同的部分,model,view,controller?BR>
  Model是代表组件状态和低行ؓ(f)的部分,它管理着自己的状态ƈ且处理所有对状态的操作Qmodel自己本nq不知道使用自己的view和controller是谁Q系l维护着它和view之间的关p,当model发生了改变系l还负责通知相应的view?BR>  View代表了管理model所含有的数据的一个视觉上的呈现。一个Model可以有一个以上的View,但是Swing中却很少有这L(fng)情况?BR>  Controller理着model和用户之间的交互的控制。它提供了一些方法去处理当model的状态发生了变化时的情况?BR>  使用键盘上的按钮的例子来说明一下:(x)Model是按钮的整个机械装|,View/Controller是按钮的表面部分?BR>  下面的图解释了如何把一个JFC开发的用户界面分ؓ(f)model,view,controllerQ注意,view/Controller被合q到了一Pq是MVC设计模式通常的用法,它们提供了组件的用户界面(UI)?BR> 
  用Button的例子详l说?BR>  Z更好的理解MVC设计模式和Swing用户界面lg之间的关p,让我们更加深入的q行分析。我采用最常见的组件button来说明?BR>  我们从model来开始?BR>  Model
  一个按钮的model所应该具备的行为由一个接口ButtonModel来完成。一个按钮model实例装了其内部的状态,q且定义了按钮的行ؓ(f)。它的所有方法可以分为四c:(x)
  1、查询内部状?BR>  2、操作内部状?BR>  3、添加和删除事g监听?BR>  4、发生事?BR>  其他的用L(fng)面组件有它们各自的与lg相关的ModelQ但是所有的lgModel都提供这四类Ҏ(gu)?BR>  View & Controller
  上面的图中讲qC个按钮的view/controller׃个接口ButtonUI完成。如果一个类实现了这个接口,那么它将?x)负责创Z个用L(fng)面,处理用户的操作。它的所有方法可以被分ؓ(f)三大c:(x)
  1、绘制Paint
  2、返回几何类型的信息
  3、处理AWT事g
  其他用户界面lg有他们自qlg相关的View/ControllerQ但是他们都提供上述三类Ҏ(gu)?BR>  E序员通常q不?x)直接和model以及(qing)view/controller打交道,他们通常隐藏于那些承自java.awt.Component的组仉面了Q这些组件就像胶水一hMVC三者合三ؓ(f)一。也正是׃q些l承的组件对象,一个程序员可以很方便的混合使用Swinglg和AWTlgQ然后,我们知道QSwinglg有很多都是直接承自相应的AWTlgQ它能提供比AWTlg更加方便易用的功能,所以通常情况下,我们没有必要混合使用两者?BR>  一个实?BR>  现在我们已经明白了JavacMMVC各个部分的对应关p,我们可以更加深入一点去分析问题了。下面我们将要讲qC个小型的使用MVC模式开发的例子。因为JFC十分的复杂,我只能把我的例子局限于一个用L(fng)面组仉面(如果你猜是一个按钮的例子Q那么你对了Q)
  让我们来看看q个例子的所有部分吧?BR>  Buttonc?BR>  最显而易见的开始的地方是代表了按钮组件本省的代码Q因个类是大部分E序员会(x)接触的?BR>  像我前面提到的Q按钮用L(fng)面组件类实际上就是model和view/controller的之间的黏合剂。每个按钮组仉和一个model以及(qing)一个controller兌Qmodel定义了按钮的行ؓ(f)Q而view/controller定义了按钮的表现。而应用程序可以在M事g改变q些兌。让我们看看得以实现此功能的代码?BR>public void setModel(ButtonModel buttonmodel)
{
 if (this.buttonmodel != null)
 {
  this.buttonmodel.removeChangeListener(buttonchangelistener);
  this.buttonmodel.removeActionListener(buttonactionlistener);

  buttonchangelistener = null;
  buttonactionlistener = null;
 }

 this.buttonmodel = buttonmodel;

 if (this.buttonmodel != null)
 {
  buttonchangelistener = new ButtonChangeListener();
  buttonactionlistener = new ButtonActionListener();

  this.buttonmodel.addChangeListener(buttonchangelistener);
  this.buttonmodel.addActionListener(buttonactionlistener);
 }

 updateButton();
}

public void setUI(ButtonUI buttonui)
{
 if (this.buttonui != null)
 {
  this.buttonui.uninstallUI(this);
 }

 this.buttonui = buttonui;

 if (this.buttonui != null)
 {
  this.buttonui.installUI(this);
 }

 updateButton();
}

public void updateButton()
{
 invalidate();

  在进入下一节之前,你应该多׃些时间来仔细阅读一下Buttoncȝ源代码?BR>  ButtonModelc?BR>  ButtonModell护着三种cd的状态信息:(x)是否被按下(pressedQ,是否“武装上了”(armedQ,是否被选择QselectedQ。它们都是booleancd的倹{?BR>  一个按钮被按下QpressedQ是指当鼠标在按钮上面的时候,按下鼠标但是q没有松开鼠标按钮的状态,?qing)时用户此时把鼠标拖拽到按钮的外面也没有改变q种状态?BR>  一个按钮是否“武装了”(armedQ是指按钮被按下Qƈ且鼠标还在按钮的上面?BR>  一些按钮还可能被选择QselectedQ,q种状态通过重复的点?yn)L钮取得true或者f(xi)alse的倹{?BR>  下面的代码是状态pressed的一个缺省的实现。状态armed以及(qing)selected实现的代码与之类伹{ButtonModelcd该被l承Q这样可以覆盖缺省的状态定义,实现有个性的按钮?BR>private boolean boolPressed = false;

public boolean isPressed()
{
 return boolPressed;
}

public void setPressed(boolean boolPressed)
{
 this.boolPressed = boolPressed;
 fireChangeEvent(new ChangeEvent(button));

  按钮的模型button modelq负责通知其他对象Q事件监听器Q它们所感兴的事g。从下面的代C我们可以看出当按钮的转台发生改变的时候就?x)发Z个ChangeEvent。下面就是代码:(x)
private Vector vectorChangeListeners = new Vector();

public void addChangeListener(ChangeListener changelistener)
{
 vectorChangeListeners.addElement(changelistener);
}

public void removeChangeListener(ChangeListener changelistener)
{
 vectorChangeListeners.removeElement(changelistener);
}

protected void fireChangeEvent(ChangeEvent changeevent)
{
 Enumeration enumeration = vectorChangeListeners.elements();
 while (enumeration.hasMoreElements())
 {
  ChangeListener changelistener =(ChangeListener)enumeration.nextElement();
  changelistener.stateChanged(changeevent);
 }
}
  在进入下一节之前,你应该多׃些时间来仔细阅读一下ButtonModelcȝ源代码。?BR>  ButtonUIc?BR>  按钮的view/controller是负责构C层的。缺省情况下它仅仅是用背景色M个矩形而已Q他们的子类l承了他们ƈ且覆盖了l制的方法,使得按钮可以有许多不同的表现Q例如MOTIFQW(xu)indows 95QJava样式{等?BR>public void update(Button button, Graphics graphics)
{
}

public void paint(Button button, Graphics graphics)
{
 Dimension dimension = button.getSize();
 Color color = button.getBackground();
 graphics.setColor(color);
 graphics.fillRect(0, 0, dimension.width, dimension.height); 
}
  ButtonUIcdƈ不自己处理AWT事gQ他们会(x)使用一个定制的事g监听器把低的AWT事g译为高U的Button模型期望的语义事件。下面就是安?卸蝲事g监听器的代码?BR>private static ButtonUIListener buttonuilistener = null;

public void installUI(Button button)
{
 button.addMouseListener(buttonuilistener);
 button.addMouseMotionListener(buttonuilistener);
 button.addChangeListener(buttonuilistener);
}

public void uninstallUI(Button button)
{
 button.removeMouseListener(buttonuilistener);
 button.removeMouseMotionListener(buttonuilistener);
 button.removeChangeListener(buttonuilistener);
}
  View/Controller实际上就是一些方法。他们不l护M自己的状态信息。因此,许多按钮的实例可以共享一个ButtonUI实例。ButtonUI是通过在方面的参数列表里面加上按钮的引用来区分各个不同的按钮?BR>  同样Q希望你能多׃些时间来看看ButtonUIc,然后׃q入下一节?BR>  ButtonUIListenerc?BR>  ButtonUIListenercd以帮助Buttoncd转变鼠标或者键盘的输入为对按钮模型的操作。这个监听器cdCQMouseListener,MouseMotionListener,ChangeListener接口Qƈ且处理一下事Ӟ(x)
public void mouseDragged(MouseEvent mouseevent)
{
 Button button = (Button)mouseevent.getSource();
 ButtonModel buttonmodel = button.getModel();

 if (buttonmodel.isPressed())
 {
  if (button.getUI().contains(button, mouseevent.getPoint()))
  {
   buttonmodel.setArmed(true);
  }
  else
  {
   buttonmodel.setArmed(false);
  }
 }
}

public void mousePressed(MouseEvent mouseevent)
{
 Button button = (Button)mouseevent.getSource();
 ButtonModel buttonmodel = button.getModel();
 buttonmodel.setPressed(true);
 buttonmodel.setArmed(true);
}

public void mouseReleased(MouseEvent mouseevent)
{
 Button button = (Button)mouseevent.getSource();
 ButtonModel buttonmodel = button.getModel();
 buttonmodel.setPressed(false);
 buttonmodel.setArmed(false);
}

public void stateChanged(ChangeEvent changeevent)
{
 Button button = (Button)changeevent.getSource();
 button.repaint();
}
  ȝ
  我希望你能按照上面讲q的Ҏ(gu)d。如果不能,那么所有的努力都将白费。这个例子以?qing)Swing用户界面lg的好处在于你不用去花旉d明白他们底层是如何设计实现的可以很方便的用他们了。他们都提供了缺省的model以及(qing)view/controllerQ然后,当你自己做组件的时候,你会(x)发现上面的思想的强大之处?BR>

Sung 2005-10-15 16:55 发表评论
]]>
Beyond MVC: A New Look at the Servlet Infrastructurehttp://www.aygfsteel.com/qq13367612/articles/16246.htmlSungSungFri, 09 Sep 2005 06:57:00 GMThttp://www.aygfsteel.com/qq13367612/articles/16246.htmlhttp://www.aygfsteel.com/qq13367612/comments/16246.htmlhttp://www.aygfsteel.com/qq13367612/articles/16246.html#Feedback0http://www.aygfsteel.com/qq13367612/comments/commentRss/16246.htmlhttp://www.aygfsteel.com/qq13367612/services/trackbacks/16246.html阅读全文

Sung 2005-09-09 14:57 发表评论
]]>
վ֩ģ壺 ˺| | ֶ| ʲ| Զ| ̳| | ɽ| | ̨| | | | | ĩ| | կ| | | ̰| | | | | | | | ݳ| ̨| | | ͷ| | | ʻ| ȷɽ| | | | | |