SCA概念与应用实践(7.SCA装配模型--7.5属性 property)

7.5.        属性 Property

7.5.1.       解释

通过属性可以对实现内的变量进行设置。一个实现可以定义0个或多个属性。每个属性都有一个类型,可以是简单类型也可以是复杂类型。实现内可以为属性设置一个默认值。在运行时,实现会查看对应的component是否定义了该属性,如果定义了,那么实现使用component上定义的属性值。属性也可以定义在composite上,component可以通过source直接使用composite上定义的属性。

7.5.2.       一个简单的例子

打开TipServiceImpl, 会发现这个定义了一个property tipRate 缺省值是10,这里计算含小费的价格公式是price * this.tipRate/100 + price。我们在component TipServiceInnerComponent上定义一个属性tipRate 然后把值设为0 那么最后价格就不包含tip

Ø         palette上选择property

 

7_5_17_5_1

Ø        点到component上,给属性填上名字为tipRate

 

7_5_2

7_5_2

Ø        property的属性上,value上填入0

 

7_5_3

7_5_3

Ø         运行TipServiceServerRestaurantServiceServer, soapUI测试,运行后得到到的结果是38.5.而之前含小费的账单是42.35

 7_5_4

7_5_4

7.5.3.       property的属性

打开TipServiceInnerComponent,会看到属性定义的行

<sca:component name="TipServiceInnerComponent">

    <sca:implementation.java class="restaurant2.lib.TipServiceImpl"/>

    <sca:service name="TipService">

      <sca:interface.java callbackInterface="restaurant2.api.TipServiceCallback" interface="restaurant2.api.TipService"/>

      <sca:binding.ws uri="http://localhost:8086/TipServiceComponent"/>

    </sca:service>

    <sca:property name="tipRate">0</sca:property>

  </sca:component>

这个是最简单的属性定义,只有名称和值。看上面那个property的属性的图,会看到它有其他的属性。

Name,必填。

Type,属性的类型 –XML schema类型的限定名

Element,属性的类型为某个XML schema全局元素的类型

Manyfalse属性的值是一个值;false属性的值是多个值. 多值情况下,在实现中的属性变量类型一定是集合。

mustSupply 是否必须有值

file,定义属性值的文件

source,引用的属性来源,component可以引用composite上的property

value,属性值

 

7.5.4.       一个复杂的例子

Ø         Restaurant2TipInnerComposite上添加属性allTipRatesComposite. 由于eclipsse sca tools不支持复杂类型的属性定义,所以这个只能直接编辑Restaurant2Tip.composite文件

<sca:property element="foo:PropertyRate" many="true" name="allTipRatesComposite">

           <PropertyRate  xmlns="">

                <country>China</country>

                <tipSet>

                    <low>0</low>

                    <normal>0</normal>

                    <high>0</high>

                </tipSet>

            </PropertyRate>

            <PropertyRate>

                <country>US</country>

                <tipSet>

                    <low>5</low>

                    <normal>10</normal>

                    <high>15</high>

                </tipSet>

            </PropertyRate>

            <PropertyRate  xmlns="">

                <country>Canada</country>

                <tipSet>

                    <low>5</low>

                    <normal>10</normal>

                    <high>15</high>

                </tipSet>

            </PropertyRate>

</sca:property>

 

Ø         Component上添加属性country,值使用文件country.property

<sca:property file="country.property" name="country"/>

Ø         Component 上添加属性allTipRates,引用composite上定义的属性

<sca:property name="allTipRates" source="$allTipRatesComposite"/>

Ø         最后结果为

 7_5_5


7_5_5

<?xml version="1.0" encoding="UTF-8"?>

<sca:composite xmlns:foo="http://foo" xmlns:sca="http://www.osoa.org/xmlns/sca/1.0" xmlns:tip="http://eclipse.org/Restaurant2Tip/src/Restaurant2Tip" name="Restaurant2TipInner" targetNamespace="http://eclipse.org/Restaurant2Tip/src/Restaurant2Tip">

  <sca:component name="TipServiceInnerComponent">

    <sca:implementation.java class="restaurant2.lib.TipServiceImpl"/>

    <sca:service name="TipService">

      <sca:interface.java callbackInterface="restaurant2.api.TipServiceCallback" interface="restaurant2.api.TipService"/>

      <sca:binding.ws uri="http://localhost:8086/TipServiceComponent"/>

    </sca:service>

    <sca:property name="tipRate">0</sca:property>

    <sca:property file="country.property" name="country"/>

    <sca:property name="allTipRates" source="$allTipRatesComposite"/>

  </sca:component>

  <sca:property element="foo:PropertyRate" many="true" name="allTipRatesComposite">

           <PropertyRate  xmlns="">

                <country>China</country>

                <tipSet>

                    <low>0</low>

                    <normal>0</normal>

                    <high>0</high>

                </tipSet>

            </PropertyRate>

            <PropertyRate>

                <country>US</country>

                <tipSet>

                    <low>10</low>

                    <normal>15</normal>

                    <high>20</high>

                </tipSet>

            </PropertyRate>

            <PropertyRate  xmlns="">

                <country>Canada</country>

                <tipSet>

                    <low>5</low>

                    <normal>10</normal>

                    <high>15</high>

                </tipSet>

            </PropertyRate>

</sca:property>

</sca:composite>

Ø         在项目Restaurant2Tipsrc添加文件country.property

内容为:

<country>China</country>

Ø         在项目Restaurant2Tip下的包restaurant2.api下添加一个java bean TipPropertyBean来传递属性值

package restaurant2.api;

 

public class TipPropertyBean {

 

    private String country;

    private double low;

    private double normal;

    private double high;

   

    private TipPropertyBean[] tipSet;

 

    public String getCountry() {

       return country;

    }

 

    public void setCountry(String country) {

       this.country = country;

    }

 

    public double getLow() {

       return low;

    }

 

    public void setLow(double low) {

       this.low = low;

    }

 

    public double getNormal() {

       return normal;

    }

 

    public void setNormal(double normal) {

       this.normal = normal;

    }

 

    public double getHigh() {

       return high;

    }

 

    public void setHigh(double high) {

       this.high = high;

    }

 

    public TipPropertyBean[] getTipSet() {

       return tipSet;

    }

 

    public void setTipSet(TipPropertyBean[] tipSet) {

       this.tipSet = tipSet;

    }

}

Ø         修改TipServiceImpl 来使用这些属性。新添加两个属性变量country allTipRates,在方法getPriceWithTip里,利用country的值,去allTipRates里找相应的tip值,然后利用这个tip值进行计算。

Ø         运行TipServiceServerRestaurantServiceServer, soapUI测试,运行后得到到的结果是38.5

Ø         修改文件country.property

内容为:

<country>Canada</country>

运行TipServiceServerRestaurantServiceServer, soapUI测试,运行后得到到的结果是42.35

Ø         修改文件country.property

内容为:

<country>US</country>

运行TipServiceServerRestaurantServiceServer, soapUI测试,运行后得到到的结果是44.275

 

7.5.5.       属性值支持xpath表达式

修改tipRate的属性值为

<sca:property name="tipRate" source="$allTipRatesComposite/PropertyRate[country='US']/tipSet/normal"/>

       那么在TipServiceImpl里面获得的tipRate的值就为15.0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值