`
小笨熊
  • 浏览: 62161 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

WebService的学习成长过程(一)

阅读更多
最近一直在学习SOA(服务为导向的体系结构),而WebService就是首先要研究的!
概念嘛,我就不说了,网上太多了,一搜就是一堆!

先来做个简单的,用xfire做的例子:
步骤:
1、从xfire官网下载xfire-distribution-1.2.6.zip,将解压缩后的lib下所有包和xfire-all-1.2.6.jar拷贝到你的新建web工程的WEB-INF/lib下。

2、修改web.xml:
         
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <servlet>
         <servlet-name>XFireServlet</servlet-name>
         <servlet-class>
                 org.codehaus.xfire.transport.http.XFireConfigurableServlet
         </servlet-class>
     </servlet>
     
     <servlet-mapping>
         <servlet-name>XFireServlet</servlet-name>
         <url-pattern>/servlet/XFireServlet/*</url-pattern>
     </servlet-mapping>
 
     <servlet-mapping>
         <servlet-name>XFireServlet</servlet-name>
          <url-pattern>/services/*</url-pattern>
     </servlet-mapping>
</web-app>


3、编写服务接口和实现类:
         
package com.zhuweisky.xfireDemo;

import java.io.Serializable;

public class User implements Serializable {
	private String name;
	private int age;
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public User(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}


        
package com.zhuweisky.xfireDemo;

import java.util.List;

public interface UserService {
	public User getUser();
	public List<User> getUsers();
}


        
package com.zhuweisky.xfireDemo;

import java.util.List;
import java.util.Vector;

public class UserServiceImpl implements UserService {
	public List<User> getUsers(){
		List list=new Vector();
		User user1 = new User("tom",23);
		User user2 = new User("jerry",26);
		list.add(user1);
		list.add(user2);
		return list;
	}
	
	public User getUser(){
		User user = new User("tom",23);
		return user;
	}
}


4、在src下建 META-INF\xfire\services.xml:
          
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xfire.codehaus.org/config/1.0">
    <service>
      <name>UserService</name>
      <namespace>http://com.zhuweisky.xfireDemo/UserService</namespace>
      <serviceClass>com.zhuweisky.xfireDemo.UserService</serviceClass>
      <implementationClass>com.zhuweisky.xfireDemo.UserServiceImpl</implementationClass>
    </service>
</beans>


哈哈,很简单吧!这样就做好了一个WebService了。
我们可以通过http://localhost:8080/你的工程名/services/UserService?wsdl来访问。看到xml了,就表示你的服务发表成功了!

下面我们来测试一下:
         
package com.zhuweisky.xfireDemo.test;

import java.net.MalformedURLException;   
import java.net.URL;   
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
  
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.Client; 
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.w3c.dom.Document;


import com.sun.org.apache.xerces.internal.dom.DocumentImpl;

import com.zhuweisky.xfireDemo.User;
import com.zhuweisky.xfireDemo.UserService;

public class TestCallWebService {

    public static void main(String[] args)
	{
		Service srvcModel = new ObjectServiceFactory().create(UserService.class);
		XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
		String helloWorldURL = "http://localhost:8080/XFireZhuweiTest/services/UserService";
		try{
			UserService srvc = (UserService) factory.create(srvcModel, helloWorldURL);
			System.out.println(srvc.getUser().getName());
			List users=srvc.getUsers();
			for (Iterator iter = users.iterator(); iter.hasNext();) {
				User user = (User) iter.next();
				System.out.println(user.getName());
			}
		}catch (MalformedURLException e){
			e.printStackTrace();
		}
	}

}


大家可以考虑上面服务接口的代码,如果不用泛型,还可以调用成功吗?
答案是不行的!因为不知道List中到底是什么!这时,就需要有配置文件来描述了,也就是绑定!
WebService的绑定有很多,我们在这里只讨论aegis的绑定。
绑定配置文件的名字必须要和服务的名字一样:UserService.aegis.xml.
UserService.aegis.xml:
        
<?xml version="1.0" encoding="UTF-8"?>
<mappings>
  <mapping>
    <method name="getUsers">
      <return-type componentType="com.zhuweisky.xfireDemo.User"/>
    </method>
  </mapping>
</mappings>

这样,我们即使不用泛型也可以测试通过!如果返回类型是map,我们又怎么配呢?

其实都一样的,假如服务接口中方法为:
          
public Map getUsersMap(int count);


          
<mapping>
		<method name="getUsersMap">
			<parameter index="0" mappedName="count" keyType="java.lang.Integer" />
			<return-type mappedName="UserMap"
				keyType="java.lang.Integer"
				componentType="com.zhuweisky.xfireDemo.User" ignore="true" />
		</method>
	</mapping>


到此为止,我们就算完全做完了一个WebService!后续会对此例升级!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics