CXF创建webservice服务端_第1页
CXF创建webservice服务端_第2页
CXF创建webservice服务端_第3页
CXF创建webservice服务端_第4页
CXF创建webservice服务端_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、CXF创建webservice服务端2010-05-24 11:28cxf api 帮助网址:/apidocs/org/apache/cxf/jaxrs/ext /MessageContext.html首先来介绍下 cxf:Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataB

2、inding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。目前它仍只是 Apache 的一个孵化项目。Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HT

3、TP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。CXF 包含了大量的功能特性,但是主要集中在以下几个方面:1. 支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP、Basic Profile、WS-Addressing、WS-Policy、WS-ReliableMessaging 和 WS-Security。 2. Frontends:CXF 支持多种“Frontend”编程模型,CXF 实现了 JAX-WS API (遵循 JAX-WS

4、2.0 TCK 版本),它也包含一个“simple frontend”允许客户端和 EndPoint 的创建,而不需要 Annotation 注解。CXF 既支持 WSDL 优先开发,也支持从 Java 的代码优先开发模式。 3. 容易 使用: CXF 设计得更加直观与容易使用。有大量简单的 API 用来快速地构建代码优先的 Services,各种 Maven 的插件也使集成更加容易,支持 JAX-WS API ,支持 Spring 2.0 更加简化的 XML 配置方式,等等。 4. 支持二进制和遗留协议:CXF 的设计是一种可插拨的架构,既可以支持 XML ,也可以支持非 XML 的类型绑定

5、,比如:JSON 和 CORBA。 我们来利用cxf创建一个简单的webservice吧。首先cxf 所需要的包:更具网站说明以下的包都是必须的,但是在我的实际项目中红色部分的包并没有用到。大家可更具自己需求来添加适应的包。 cxf.jar commons-logging.jar geronimo-activation.jar (Or the Sun equivalent)/ geronimo-annotation.jar (Or the Sun equivalent)/ geronimo-javamail.jar (Or the Sun equivalent)/ neethi.jar jax

6、b-api.jar jaxb-impl.jar stax-api.jar/ XmlSchema.jar wstx-asl.jar xml-resolver.jar 包 有了,那么就开始建立工程1: new web service project (创建一个webservice项目,当然如果你不是建立单独的web service 而是和其他的项目放在一起也可以new web project)2:配置 web.xmlCXFServletorg.apache.cxf.transport.servlet.CXFServlet1CXFServlet/services/*至于spring的配置以及您所用到

7、的其他框架的配置我这边就不做介绍了。这 里只对cxf的配置做介绍。3:建立自己的包以及java文件。在这里可能据自己的业务逻辑去填充自己的dao, entity,等文件及业务。这边主要说明service层的写法。4:创建一个接口:import javax.jws.WebService;import javax.ws.rs.core.Response;import org.apache.cxf.jaxrs.impl.MetadataMap;import com.sns.bestv.entity.VisCustomer;WebService/ 此注解说明该接口是提供与webservice的。pub

8、lic interface CustomerService / Transactional/可根据自己的需求添加事物Response addCustomer(MetadataMap map);/cxf可以以map的形式接收参数。/ TransactionalResponse deleteCustomer(String app_key,String pidarr);/也可以通过参数接收/ TransactionalResponse bindCustomer(VisCustomer cust);/对象接收。/ TransactionalVisCustomer getCustomer(String

9、app_key,int uid,String type);该接口的实现类:import java.util.ArrayList;import java.util.List;import javax.jws.WebMethod;import javax.jws.WebService;import javax.ws.rs.GET;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import javax.ws.rs.QueryParam;i

10、mport javax.ws.rs.core.Context;import javax.ws.rs.core.Response;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import org.apache.cxf.jaxrs.impl.MetadataMap;import org.springframework.transaction.annotation.Transactional;import com.sns.bestv.dao.VisApiLogD

11、ao;import com.sns.bestv.dao.VisApiUsersDao;import com.sns.bestv.dao.VisCustomerDao;import com.sns.bestv.dao.VisCustomerUsersDao;import com.sns.bestv.dao.VisUsersDao;import com.sns.bestv.entity.VisApiLog;import com.sns.bestv.entity.VisApiUsers;import com.sns.bestv.entity.VisCustomer;import com.sns.be

12、stv.entity.VisCustomerUsers;import com.sns.bestv.entity.VisUsers;import com.sns.bestv.service.Authentication;import com.sns.bestv.service.CustomerService;Path(/custermerservice/)/在类的上方定义path 指定该类的访问路径。Produces(application/xml)/此处可有可无。一般情况是要写上的。在客户端调用的时候httpclient.setHeaders需要和此处匹配。WebService(endpoin

13、tInterface = com.sns.bestv.service.CustomerService)/此处不太明 白为什么。如果有明白的还请指教。我认为是和spring配置文件中做匹配的,在spring中可以这么配置。 访问的时候就用/test。目前还没懂2者之间的联系与意义。public class CustomerServiceImpl implements CustomerService/messageContext是接收httpclent传输过来的信息,如headers中传递http的验证信 息。可通过 messageContext.getHttpHeaders().getReque

14、stHeaders().getFirst(user);来获取 user的值。private org.apache.cxf.jaxrs.ext.MessageContext messageContext;Contextpublic void setMessageContext(org.apache.cxf.jaxrs.ext.MessageContext messageContext) this.messageContext = messageContext;SuppressWarnings(unchecked)POST/指定方法是 由post还是get传参。Path(/addcustermer

15、)/ 指定方法的访问路劲。Transactional(readOnly=false,rollbackFor = Throwable.class)/事务处理,此处事务配置还未成熟。希望和大家一起探讨。public Response addCustomer(MetadataMap map)VisCustomer cut=new VisCustomer();System.out.println( aa=+map.get(uid);/可用map的get方式获取参数。if(Authentication.validate(messageContext)/ 校验http用户名密码的验证。以上以有介绍过获取参

16、数的方式。/以下业务逻辑可根据自己需求来定。VisApiUsers apiusers=aipUsersDao.getApiUsersByKey(cut.getApp_key();if(apiusers!=null)VisUsers users=userDao.getUserByUid(cut.getUid();if(users!=null)cut.setCname(users.getUsername();if(customerDao.saveOrUpdate(cut)0)VisCustomerUsers customer=new VisCustomerUsers();customer.setC

17、id(customerDao.getMaxID();customer.setUid(Integer.parseInt(cut.getUid();if(custUserDao.saveOrUpdate(customer)0)VisApiLog logs=new VisApiLog();logs.setApi_id(apiusers.getApi_id();logs.setContent(apiusers.getApp_key()+? ? ? ? ? ? ? );if(aipLogDao.saveOrUpdate(logs)0)String xml=+TRUE+? ? ? ? ? ? ? +;re

18、turn Response.status(200).entity(xml).build();/返回给客户端的 信息。elseString xml=+FALSE+? ? ? ? ? ? ? ? ? ? ? app_key? ? +;return Response.status(401).entity(xml).build();String xml=+ERROR+? ? ? ? ? ? +;return Response.status(401).entity(xml).build();OverrideGET/由get方式传递参数。Path(/deletecustermer)public Respo

19、nse deleteCustomer(QueryParam(app_key)String app_key,QueryParam(Cidarr)String Cidarr) /获得参数,不 同的获取方式,客户端传递方法不同。后续将写入客户端访问方法。if(Authentication.validate(messageContext)VisApiUsers apiusers=aipUsersDao.getApiUsersByKey(app_key);if(apiusers!=null)if(customerDao.delete(Cidarr)0)if(custUserDao.delete(Cida

20、rr)0)VisApiLog logs=new VisApiLog();logs.setApi_id(apiusers.getApi_id();logs.setContent(apiusers.getApp_key()+? ? ? ? ? ? ? );if(aipLogDao.saveOrUpdate(logs)0)String xml=+TRUE+? ? ? ? ? ? ? +;return Response.status(200).entity(xml).build();elseString xml=+FALSE+? ? ? ? ? ? ? ? ? ? ? app_key? ? +;ret

21、urn Response.status(401).entity(xml).build();String xml=+ERROR+? ? ? ? ? ? +;return Response.status(401).entity(xml).build();SuppressWarnings(unchecked)OverrideGET/由get方式传递参数。Path(/getcustermer/app_key/uid/type)/访问路 劲,get方式参数由 参数名public VisCustomer getCustomer(PathParam(app_key)String app_key,PathPa

22、ram(uid) int uid,PathParam(type)String type) /PathParam(“这 里的参数名词必须与Path(中的名称匹配)”)/ TODO Auto-generated method stubVisApiUsers apiusers=aipUsersDao.getApiUsersByKey(app_key);if(apiusers!=null)List customers=custUserDao.getCutstomerByUid(uid);String cid=;if(customers!=null & customers.size()0)for(int

23、 i=0;icustomers.size();i+)if(.equals(cid)cid+=customers.get(i).getCid();elsecid+=,+customers.get(i).getCid();return customerDao.getByCidsType(cid, type);return null;private VisApiUsersDao aipUsersDao;private VisApiLogDao aipLogDao;private VisUsersDao userDao;private VisCustomerDao customerDao;privat

24、e VisCustomerUsersDao custUserDao;WebMethod(exclude = true)/dao的注入public void setCustomerDao(VisCustomerDao customerDao) this.customerDao = customerDao;WebMethod(exclude = true)public void setCustUserDao(VisCustomerUsersDao custUserDao) this.custUserDao = custUserDao;WebMethod(exclude = true)public

25、void setAipLogDao(VisApiLogDao aipLogDao) this.aipLogDao = aipLogDao;WebMethod(exclude = true)public void setUserDao(VisUsersDao userDao) this.userDao = userDao;WebMethod(exclude = true)public void setAipUsersDao(VisApiUsersDao aipUsersDao) this.aipUsersDao = aipUsersDao;/Xml 的节点名称,此处配置返回一个list泛型的值。

26、返回结果类似如下:/XmlRootElement(name = Customers)public static class CustomersXmlElement(name = customer)public List list = new ArrayList();5:spring与cxf的整合。在spring中注入dao,service 我想应该不需要介绍了吧?service 的注入与普通service注入是相同的。serviceContext.xml:servcie的注入,为service注入 dao。/关键在这里,这里才是 cxf的配置,其他的都是spring的配置。配置很简单,只要把s

27、pring的beanname 引入进来即可/此处id可随意 写,address就是你该项目的访问路劲。写/是代表项目的跟路劲。/*另一种配置方式,但这种方式貌似只能配置一个。在文章的前面也有提到过 这 样的方式, implementor中写入你要访问的类文件的路劲。id随意写。address是路劲。这种方式并不是很明白。*/服 务端基本算是写完了。接下来客户端调用验证服务端的正确性。由于cxf支持wsdl的方式。也可以 http:/localhost:8080/project_name/test?wsdl的方式访问您的接口。(未得到验证)客户端介绍:请对应上面服务端查看客 户端的代码及方法。i

28、mport java.io.IOException;import java.io.UnsupportedEncodingException;import .URLEncoder;import mons.httpclient.HttpClient;import mons.httpclient.HttpException;import mons.httpclient.HttpStatus;import mons.httpclient.methods.GetMethod;i

29、mport mons.httpclient.methods.InputStreamRequestEntity;import mons.httpclient.methods.PostMethod;import org.junit.Test;/* author Leon*/public class CustomerServiceTest Test/保存客户public void testSave()String url = http:/localhost:8080/sns_bestv/services/custermerservice/add

30、custermer;HttpClient httpClient = new HttpClient();PostMethod postMethod = new PostMethod(url);postMethod.setRequestHeader(Content-type,application/xml);postMethod.setRequestHeader(user, aaa);postMethod.setRequestHeader(pass, bbb);trypostMethod.setRequestEntity(new InputStreamRequestEntity(this.getC

31、lass().getResourceAsStream(testAddCustomer.xml);int status = httpClient.executeMethod(postMethod);if(status = HttpStatus.SC_OK)System.out.println(new String(postMethod.getResponseBody(), utf-8);catch (HttpException e) throw new RuntimeException(,e); catch (IOException e) throw new RuntimeException(,e);finallypostMethod.releaseConnection();/Test/删除客户public void testdeletePost()String url = http:/localhost:8081/services/custermerservice/deletecustermer?app_key=%s&Cidarr=%s;try url = String.format(url,URLEncoder.encode

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论