??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
3) 创徏services.xmlq把它放到WEB-INF/classes/META-INF/xfire目录下,q是默认的做?也可以将services.xml的\径配|到web.xml文g中?/p>
4) XFire和其它第三方库添加到Web应用的WEB-INF/lib目录下?/p>
FAQ
1) Weblogic8.1中应用XFireQ启动wlsӞ出现java.lang.NoSuchMethodError的解军_法?br> 首先Q将XFire提供的QName JARQqname.jar)放进WEB-INF/lib目录下。然后,weblogic.xml文g攑ֈWEB-INF下?br>weblogic.xml的内容ؓQ?/p>
具体的详l解_LXFire的User's Guide.
技?br>1. 如果Web Services的方法的参数是CollectionsQ那需要徏一个Mapping文gQ而且Mapping文g的命名ؓclassName.aegis.xmlQƈ且与class攑֜同一个package下?br>如:
public interface IConstraceSerice {
boolean editConstraceInfo(List aList);
}
Mapping文g如下QIConstraceService.aegis.xml
<?xml version="1.0" encoding="utf-8"?>
<mappings>
<mapping>
<method name="editConstraceInfo">
<parameter index="0" componentType="java.lang.String"/>
</method>
</mapping>
</mappings>
<parameter index="0" componentType="java.lang.String"/>表示W一个参敎ͼ里面实际值的cd,q里实际值的cd是java.lang.String.
如果是一个JavaBean,如com.test.TestBean,那以p写成<parameter index="0" compentType="com.test.TestBean"/>
2. 如果q回cd是List或MapQƈ且里面存攄是自定义cȝ话,则需要增加一个对于服务接口的配置文g。该文g的命名规则是 接口文g?aegis.xml。例如接口是UserService.java的话Q则此配|文件命名ؓUserService.aegis.xml。注意此配置文gM接口攑֜同一目录下面?br><?xml version="1.0" encoding="UTF-8"?>
<mappings>
<mapping >
<method name="getUsers">
<return-type componentType="com.test.domain.User"/>
</method>
</mapping>
</mappings>
getUsersҎq回cd是ListQ里面装的User对象。对于这U类型的ҎQ在配置文g中描qC它的q回值类型?/p>
如果q回的类型是Map的话Q做法和List一栗但定义的类型,是Map中的Value部分Qƈ且这L话,Map中Value所存放的对象就必须全部是同一U类啦?/p>
下面l出一个详l的例子Q?br>1Q服务接?
public interface MyService2
{
boolean getInfo();
Collection getCollection(); //method 1
Collection getCollection(int id); //method 2
Collection getCollection(String id); //method 3
Collection getCollectionForValues(String id, Collection c); //method 4
Collection getCollectionForValues(int value, Collection c); //method 5
}
2) Mapping文g内容:
<mappings>
<mapping>
<!-- mapping 1 -->
<method name="getCollection">
<return-type componentType="java.lang.Double"/>
</method>
<!-- mapping 2 -->
<method name="getCollection">
<return-type componentType="java.lang.Float"/>
<parameter index="0" class="int"/>
</method>
<!-- mapping 3 -->
<method name="getCollectionForValues">
<return-type componentType="java.math.BigDecimal"/>
</method>
<!-- mapping 4 -->
<method name="getCollectionForValues">
<parameter index="0" class="java.lang.String"/>
<parameter index="1" componentType="java.util.Date"/>
</method>
<!-- mapping 5 -->
<method name="getCollectionForValues">
<return-type componentType="java.util.Calendar"/>
<parameter index="0" class="int"/>
<parameter index="1" componentType="java.lang.Bit"/>
</method>
</mapping>
</mappings>
3. 如果一个方法的q回cd是一个JavaBean,而这个JavaBean当中又存在Collections,那么需要定义一个与JavaBean相关的Mapping文g,文g名要与JavaBean名相??User.aegis.xmll,q且与JavaBean攑֜同一个目?
例子:
1) 服务接口
public interface IYMServiceFacade {
User getUser();
}
2) JavaBean
public class User {
private Strirng userName;
// q里是一个Collection
private Set rooms;
.....
.....
}
3) Mapping文g(User.aegis.xml)
<?xml version="1.0" encoding="utf-8"?>
<mappings>
<mapping>
<property name="rooms" componentType="com.powerunion.ymservice.dto.Room"/>
</mapping>
</mappings>
介绍:<property name="rooms" componentType="com.powerunion.ymservice.dto.Room"/>
其中的name属性就是JavaBean里面定义的rooms,componentType上面的相?表示Collections里真正存储的cd.
注:如果服务接口的参数或者返因类型是基本cdQint, float, double{?׃需要创建Mapping文g?br>详细的信息见XFire的User's Guide.
4.如果Web Services和客Lq行在同一个JVM上,可以选择使用本地传输Q可以大q提升性能。如Q以下指定服务端URL的这行?br>String serviceUrl = "http://localhost:8080/YM/services/ContractService";
替换?br>String serviceUrl = "xfire.local://ContractService";
5. 用ant task 生成xfire 客户端代?
用xfire不管是配|web serviceQ还是生成客户代码都很方便.
生成客户代码只要在用ant生成可以了Q?/p>
build.xml
代码
<?xml version="1.0"?>
<project default="genfiles" basedir=".">
<property name="lib" value="WebRoot/WEB-INF/lib" />
<path id="myclasspath">
<fileset dir="${lib}">
<include name="*.jar" />
</fileset>
<pathelement location="${genfiles}" />
</path>
<property name="code_path" value="src" />
<property name="wsdl_path" value="Echo1Service.xml" />
<property name="code_package" value="com.client" />
<target name="genfiles" description="Generate the files">
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="myclasspath" />
<wsgen outputDirectory="${code_path}" wsdl="${wsdl_path}" package="${code_package}" binding="xmlbeans" />
</target>
</project>
工厂模式是最重要的模式,因ؓ大多数模式都需要用到工厂模式。如果不能正的q用工厂模式Q那么可以说无法成ؓ合格的架构师?
多数设计模式的内容讲解的都是如何设计接口?
接口如何产生呢?如果在客户代码(cd的用者称之ؓ客户Q中直接使用具体c,那么失M接口的意义。因为接口的使用目的Q就是要降低客户对具体类的依赖程度。如果在客户代码中直接用接口,那么造成了客户对具体cdU的依赖。(客户最l需要以某种方式指明所需要的具体c,如配|文件或代码Q但是只需要指Zơ,所以说降低对具体类的依赖程度)。要使客户代码不依赖具体c,唯一的方法,是让客户代码不依赖具体cȝ部分不知道具体类的名U。知道具体类名称的部分,仅仅是配|部分。(配置文g或者配|代码)?
依赖不可能完全消除,除非二者毫无联pR但是可以将q种依赖的程度降到最低?
既然不能直接创徏具体c,那么需要通过一个创类来创建接口的实现cR这样就产生了工厂类?
那么现在已经知道工厂cd在的理由Q抽象创建接口的q程?/strong>
q样Q就可以使用单工厂?
单工厂,一般是两l构。工厂类创徏接口?
随着接口创徏复杂性的增强Q可能在接口创徏的过E中Q一个创类Q无法承担创建所有的接口cȝ职责?
可能会有q样的情况,我们定义了一个接口,?个实现类分别?23456受但是,q六个实现类不可能用一个工厂创建出来,因ؓ123h windows下的实现Q?56hlinux上的实现。(假设我们使用的语a不是q大人民众热爱的java语言Q,那么q个时候,我还需要客h用相同的方式来创个借口Q而不是在代码中到处写
好了Q现在门面选好且已装修完毕Q具体经营什么品牌也早想好,׃丹奴和班D\吧?br /> 开始联pdӞ厂家要能生Shirt和PantsQ而且要有生Giordano、Balenoq两个品牌?/p>
我们都知道服装都有一些共同的特征Q每件衣服都有所属的品牌、每条短裤都有一个尺码?/p>
佐丹奴的衣服自然会印上Giordano字样的标?/p>
班尼路的也不例外Q加上自q品牌标志
q气不错Q很快就扑ֈ了厂家?br />
// 生Giordano上衣和短裤的工厂
厂家开始供货,开业大吉,哈哈?/p>
以后惛_l营几个品牌Q只需直接L了厂家供货即可?/p>
最后,Z充分理解抽象工厂模式Q画出它的UML图是很有必要的?br />
每个property都有一个name(名称)和一个value(?Q要引用某个property可以使用${property-name}Q像上面?{app.home}?br>q些属性的g可以在执行的时候指定,如:ant -Dapp.home="d:\dev\book"Q如果执行时没有指定Q那么就会用value上定义的倹{?/p>
?创徏目录Q?lt;mkdir>
标签 | 属?/td> | 描述 | 必需?/td> |
project | name | 目名称 | No |
default | 没有指定targetӞ~省使用的target | Yes | |
basedir | 作ؓ计算其它路径的基路径。该属性可以被basedir property覆盖Q当覆盖Ӟ该属性被忽略。如果属性和basedir property都没有设定,׃用buildfile文g的父目录 | No | |
target | name | target的名?/td> | Yes |
depends | 用逗号隔开的target名字列表Q设定些属性,意味着本target依赖于depends讑֮的target | No | |
if | 执行target所需讑֮的属性名 | No | |
unless | 执行target所需要清除设定的属性名 | No | |
description | 关于target的描q?/td> | No |
正确的安装Ant和设|好环境变量后,可以开始运行ant了?br>q行Ant很简单,只要输入ant可以了