TypeMappingRegistry registry = service.getTypeMappingRegistry(); TypeMapping map = registry.getDefaultTypeMapping();
QName employeeQName = new QName(\ map.register(UserBean.class, employeeQName,
new BeanSerializerFactory(UserBean.class, employeeQName), new BeanDeserializerFactory(UserBean.class, employeeQName));
QName faultQName = new QName(\ map.register(NoSuchUserException.class, faultQName,
new BeanSerializerFactory(NoSuchUserException.class, faultQName), new BeanDeserializerFactory(NoSuchUserException.class, faultQName));
Call call = service.createCall(); call.setTargetEndpointAddress(url);
call.setOperationName( new QName(uri, \ Object obj = call.invoke(new Object[]{ new Integer(3)}); UserBean user = (UserBean) obj; System.out.println(user.getName());
} catch (ServiceException e) { e.printStackTrace();
}catch(NoSuchUserException e){ e.printErrorMessage();
}catch (RemoteException e) { e.printStackTrace(); } } }
看到第一个申明的uri了么?我们通过这个uri和service来取得对应的service。 之后我们用TypeMappingRegistry得到一个默认的TypeMapping。在map里面映射我们的bean。之后和往常的代码一样没有特别的。invoke唤起方法,返回UserBean,并打出UserBean的name。值得注意的是后面的catch部分,我们catch了一个我们自己申明的NoSuchUserException,抓住这个异常之后打出我们要的错误信息。
因为1 2 4 6在数据库里都是有对应的数值的,所以当我要查找ID为3个user的name的时候,service就会返回一个NoSuchUserException给我。之后在本地抓住这个exception之后,控制台打出了如下信息。 No such user: 3
如果输入的是1 2 4 6的话,则会返回user的名字。在这里就不测试了。各位自己可以试试。
利用AXIS开发Webservice(五) —— 如何传递文件
直入主题,我们先来编写服务器代码
Java代码
package com.chnic.webservice;
import java.io.File;
import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream;
import javax.activation.DataHandler;
public class FileTransfer {
public FileTransfer(){ }
public String transfer(DataHandler handler, String fileName){ String fullPath = \ File file = new File(fullPath); int flag = 0;
if(handler == null) return \ if(fileName == null) return \ try {
InputStream input = handler.getInputStream();
FileOutputStream fos = new FileOutputStream(file); byte[] buffer=new byte[4096];
while((flag=input.read(buffer))!=-1){ fos.write(buffer,0,flag); }
input.close(); fos.close();
} catch (IOException e) { e.printStackTrace();
return \ }
return \ } }
transfer方法是service端接受客户端传来文件的方法,方法里面有两个参数,第一个是DataHandler。这个类可以看成是一个传送器,通过专门的序列化类将文件序列化。这个类的具体方法可以查一下SUN的API文档。第二个参数是一个String字符串,参数名就可以看出来,传递的是文件名。
这个方法从DataHandler得到一个输入流,从这个流里读出数据然后写到一个新文件里。这些都是一些基本的Java I/O操作。应该不会太难。服务器代码编写完之后下来是deploy.wsdd发布文件。 Xml代码
xmlns:java=\ qname=\ xmlns:operNS=\ returnQName=\ returnType=\ xmlns:rtns=\ xmlns:tns=\ xmlns:tns=\ serializer=\ deserializer=\ encodingStyle=\
这个配置文件也不多介绍了,前几篇关于这几个元素的介绍已经比较清楚了,在这里有必要提一下org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory 这个类。前面序列化对象的时候提到序列化不同对象的时候需要不同的工厂类,同样在序列化文件的时候就要用这
个工厂类。编写完一切,启动tomcat然后发布服务。
服务器端的代码已经编写完成了,现在轮到客户端代码。因为是个简单的sample,所以做的事情也比较简单就是把C盘根目录上的一个文件通过webwervice储存到C盘,当然文件名要用另外一个。下面是客户端代码。 Java代码
String fileName = \
DataHandler dh=new DataHandler(new FileDataSource(fileName)); String endpoint=\
Service service=new Service();
Call call=(Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new QName(endpoint, \
QName qnameattachment=new QName(\ \
call.registerTypeMapping(dh.getClass(), qnameattachment,
JAFDataHandlerSerializerFactory.class, JAFDataHandlerDeserializerFactory.class);
call.addParameter(\
call.addParameter(\,ParameterMode.IN); call.setReturnClass(String.class);
String ret=(String)call.invoke(new Object[] {dh,\ System.out.println(\ System.out.println(ret);
客户端通过DataHandler取得源文件,之后注册DataHandler,注册两个输入参数和一个输出参数。之后传入相关的参数。新文件也在C盘下面名字为aaaaa.txt。运行测试代,控制台打出两句话。
transfer success.... Success
说明测试成功,到C盘上也可以找到aaaaa.txt这个文件。
axis+webservice教程



