Tuscany下典型的Web架構(gòu):

乍一看,平淡無奇,這不就是我們常用的Web目錄結(jié)構(gòu)么?沒錯!
但玄機(jī)出在Web.xml和Calculator.composite上,下面我們分別看下這兩個文件:
Web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>Apache Tuscany Calculator Web Service Sample</display-name>
<filter>
<filter-name>tuscany</filter-name>
<filter-class>org.apache.tuscany.sca.host.webapp.TuscanyServletFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>tuscany</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list id="WelcomeFileList">
<welcome-file>calc.jsp</welcome-file>
</welcome-file-list>
</web-app>
這里使用了TuscanyServletFilter過濾器,此過濾器的作用我們會在后文提到。
Calculator.composite
<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://sample"
xmlns:sample="http://sample"
name="Calculator">
<component name="CalculatorServiceComponent">
<implementation.java class="calculator.CalculatorServiceImpl"/>
<reference name="addService" target="AddServiceComponent"></reference>
<reference name="subtractService" target="SubtractServiceComponent"></reference>
<reference name="multiplyService" target="MultiplyServiceComponent"></reference>
<reference name="divideService" target="DivideServiceComponent"></reference>
</component>
<component name="AddServiceComponent">
<implementation.java class="calculator.AddServiceImpl"/>
</component>
<component name="SubtractServiceComponent">
<implementation.java class="calculator.SubtractServiceImpl"/>
</component>
<component name="MultiplyServiceComponent">
<implementation.java class="calculator.MultiplyServiceImpl"/>
</component>
<component name="DivideServiceComponent">
<implementation.java class="calculator.DivideServiceImpl"/>
</component>
</composite>
此文件類似Spring,是Tuscany的服務(wù)配置文件,在此文件中提供了組件、實現(xiàn)的聲明及配置。
下面,再結(jié)合調(diào)用時序圖,來詳述Tuscany在此應(yīng)用中的位置及作用。

由此時序圖可知,整個流程如下:
1、應(yīng)用服務(wù)器啟動;
2、客戶端訪問calc.jsp頁面,服務(wù)器調(diào)用Web.xml中的配置TuscanyServletFilter過濾器;
3、在TuscanyServletFilter過濾器中,首先得到一個WebAppServletHost實例,WebAppServletHost是在Web應(yīng)用環(huán)境中使用的Tuscany功能提供者;
4、在WebAppServletHost中,得到一個SCADomain實例,并將之放入ServletContext上下文中,以后可藉由相應(yīng)的key得到此SCADomain實例;
5、calc.jsp中成功取得SCADomain實例;
6、通過SCADomain實例取得CalculatorServiceComponent組件;
7、調(diào)用CalculatorServiceComponent組件的各種業(yè)務(wù)方法實施計算。
這一個完整的過程,演示了Tuscany在一個Web應(yīng)用中所充當(dāng)?shù)慕巧谀撤N意義上Tuscany和Spring是相同的,只不過粒度不一樣,
Spring注重的是bean的管理,是技術(shù)層面的,粒度相對較細(xì);而Tuscany關(guān)注 則是業(yè)務(wù)組件的管理,是業(yè)務(wù)層面的,粒度相對較粗。
從軟件重用角度講,業(yè)務(wù)重用比技術(shù)重用更加受歡迎,操作起來也更加容易。業(yè)務(wù)重用是趨勢。現(xiàn)在的SAAS熱潮更加證明,軟件即服務(wù)的
時代已經(jīng)到來。