前两天用了点webservice部分,这里记一下,呵呵
1 首先服务器端(我这里是struts+spring环境,客户端在另一个工程)
和普通的类没什么区别,主要是要让它发布成webservice,可以通过?wsdl查看的
1.1需要一个接口和一个实现类,接口主要控制你要暴露的方法
public interface UserInfoInterface {
public String[] getUser(String arg)throws Exception ;
public String sayHello(String arg)throws Exception;
}
public class UserInfoImpl implements UserInfoInterface {
private UserService userService;//注入需要的service,添加相应的get,set方法
public String[] getUser(String arg)throws Exception{
String[] results = new String[3];
if(!StringUtil.isBlank(arg)){
//results[0] = userService.getUser(arg);可以放入string类型的任意数据
results[0] = userService.getUser(arg);
results[1] = userService.getUser(arg);
results[2] = userService.getUser(arg);
}
return results;
}
pubic String sayHello(String arg)throws Exception{
return "hello,"+ arg;//最常见的,呵呵,这里主要用于测试接收的数据
}
}
1.2配置文件
首先xml文件 ,添加
<!-- webservice xfire配置开始 --> <servlet> <servlet-name>xfire</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>xfire</servlet-name> <url-pattern>*.ws</url-pattern> </servlet-mapping> <servlet> <servlet-name>XFireServlet</servlet-name> <servlet-class>org.codehaus.xfire.spring.XFireSpringServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>XFireServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <!-- webservice xfire配置结束 -->
webservice相关配置文件,只要在web.xml配置当启动时候加载就可以
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 引入XFire预配置信息 --> <import resource="classpath:org/codehaus/xfire/spring/xfire.xml" /> <bean id="getUserInfo" class="com.crazycat.UserInfoImpl" singleton="true"> <!-- 用户service --> <property name="userService"> <ref bean="userService" /> </property> </bean> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="urlMap"> <map> <entry key="/GetUserInfo.ws"> <ref bean="getUserInfo" /> </entry> </map> </property> </bean> <!-- 使用XFire导出器 --> <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" lazy-init="false" abstract="true"> <!-- 引用xfire.xml中定义的工厂 --> <property name="serviceFactory" ref="xfire.serviceFactory" /> <!-- 引用xfire.xml中的xfire实例 --> <property name="xfire" ref="xfire" /> </bean> <bean id="GetDealStatisticInfoService" class="org.codehaus.xfire.spring.remoting.XFireExporter" parent="baseWebService"> <!-- <property name="xfire" ref="xfire" />--> <property name="serviceBean" ref="getUserInfo" /> <property name="serviceClass" value="com.crazycat.UserInfoInterface" /> </bean> </beans>
好了,重启服务器,就可以发布了。访问http://IP:端口号/工程名/services/ 就可以看到了
2 客户端
因为我的客户端在另一个工程,所以是用动态方式获取的,(网上有很多方式的,根据自己需要选择)
public class UserInfoClient {
public List getUserInfo(String arg){
List<String> resultsList = new ArrayList<String>();
Client client = null;
try{
client =new Client("http://IP:端口号/工程名/services/" + "UserInfoInterface?wsdl"));
Object[] results = client.invoke("getUserInfo",new Object[] {arg});
if(results.length > 0) {
DocumentImpl doc = (DocumentImpl)results[0];
Document document = DocumentHelper.parseText(doc.saveXML(null));
List<Node> uids = document.selectNodes("//ns1:string");
for(int j = 0;j< uids.size();j++){
Node node = uids.get(j);
resultsList.add(node.getText());
// System.out.println(node.getText());
}
}
}catch(MalformedURLException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
return resultsList;
}
}
我主要想说的是里面粉色的部分,处理返回的数据,对于返回String类型的,直接去results[0]就可以了,不用解析