(转)CXF开发RESTFUL的实例练习

根据上篇博客,我们知道WebService有两种实现规范,实现了JAX-RS这种规范的技术有CXF、RESTLET、JERSEY。这篇博客简单地介绍以CXF来实现WebService的实例。

JAX-RS规范定义了创建RESTful服务的语法。JAX-RS使用annotations注解实现RESTful的服务,使用annotations注解POJO将它暴露为RESTful资源。

0.创建一个Web项目,引入jar包:

包结构如图:

1.使用@XmlRootElement注解POJO类

[java] view plain copy

  1. package entity;
  2. import java.util.Set;
  3. import javax.xml.bind.annotation.XmlRootElement;
  4. @XmlRootElement(name="Categorys")
  5. public class Category {
  6. private String categoryId;
  7. private String categoryName;
  8. public String getCategoryId() {
  9. return categoryId;
  10. }
  11. public void setCategoryId(String categoryId) {
  12. this.categoryId = categoryId;
  13. }
  14. public String getCategoryName() {
  15. return categoryName;
  16. }
  17. public void setCategoryName(String categoryName) {
  18. this.categoryName = categoryName;
  19. }
  20. }


POJO类Category中,注解@XmlRootElement指定Category为XML的根元素。Category类的属性默认指定映射为
@XmlElement。@XmlElement用来定义XML中的子元素。@XmlRootElement和@XmlElement允许自定义命名空间
和XML中元素的名称。如果没有定义的话,JAXB在运行的时候默认的使用同样的属性名和类名来定义XML元素。

该POJO类可以对应XML文件为:

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  2. <Category>
  3. <categoryId>005</categoryId>
  4. <categoryName>Fiction Series</categoryName>
  5. </Category>

2、dao代码,未使用数据库存储数据,采用map容器存储数据。下面代码中有对Category增删改查四个方法。

[java] view plain copy

  1. package dao;
  2. import java.util.HashMap;
  3. import java.util.HashSet;
  4. import java.util.Map;
  5. import java.util.Set;
  6. import entity.Category;
  7. public class CategoryDao {
  8. private static Map<String,Category> categoryMap = new HashMap<String,Category>();
  9. static{
  10. Category c1  = new Category();
  11. c1.setCategoryId("001");
  12. c1.setCategoryName("java");
  13. categoryMap.put(c1.getCategoryId(), c1);
  14. }
  15. public void addCategory(Category category){
  16. categoryMap.put(category.getCategoryId(), category);
  17. }
  18. public Category getCategory(String id){
  19. Category cat = null;
  20. if(categoryMap.get(id) != null){
  21. cat = new Category();
  22. cat.setCategoryId(categoryMap.get(id).getCategoryId());
  23. cat.setCategoryName(categoryMap.get(id).getCategoryName());
  24. }
  25. return cat;
  26. }
  27. public void deleteCategory(String id) {
  28. categoryMap.remove(id);
  29. // Remove association of books
  30. bookMap.remove(id);
  31. }
  32. public void updateCategory(Category category) {
  33. categoryMap.put(category.getCategoryId(), category);
  34. }
  35. }

3.Service层

[java] view plain copy

  1. </pre><p></p><pre>

[java] view plain copy

  1. package service;
  2. import javax.websocket.server.PathParam;
  3. import javax.ws.rs.Consumes;
  4. import javax.ws.rs.DELETE;
  5. import javax.ws.rs.GET;
  6. import javax.ws.rs.POST;
  7. import javax.ws.rs.PUT;
  8. import javax.ws.rs.Path;
  9. import javax.ws.rs.Produces;
  10. import javax.ws.rs.QueryParam;
  11. import javax.ws.rs.WebApplicationException;
  12. import javax.ws.rs.core.MediaType;
  13. import javax.ws.rs.core.Response;
  14. import javax.ws.rs.core.Response.ResponseBuilder;
  15. import javax.ws.rs.core.Response.Status;
  16. import dao.CategoryDao;
  17. import entity.Category;
  18. @Path("/categoryservice")
  19. @Produces({"application/json","application/xml"})
  20. public class CategoryService {
  21. private CategoryDao categorydao = new CategoryDao();
  22. public CategoryDao getCategorydao() {
  23. return categorydao;
  24. }
  25. public void setCategorydao(CategoryDao categorydao) {
  26. this.categorydao = categorydao;
  27. }
  28. @GET
  29. @Path("/category")
  30. @Produces(MediaType.APPLICATION_XML)
  31. public Category getCategory(@QueryParam("id") String id){
  32. System.out.println("获取的ID为"+id);
  33. Category category = categorydao.getCategory(id);
  34. if(category == null){
  35. ResponseBuilder builder = Response.status(Status.BAD_REQUEST);
  36. builder.type("application/xml");
  37. builder.entity("<error>Category Not Found</error>");
  38. throw new WebApplicationException(builder.build());
  39. }else{
  40. return category;
  41. }
  42. }
  43. /*@GET
  44. @Path("/category/{idno}")
  45. @Produces({"application/json","application/xml"})
  46. public Category getCategory(@PathParam("idno") String id){
  47. System.out.println("获取的ID为"+id);
  48. Category category = categorydao.getCategory(id);
  49. if(category == null){
  50. ResponseBuilder builder = Response.status(Status.BAD_REQUEST);
  51. builder.type("application/xml");
  52. builder.entity("<error>Category Not Found</error>");
  53. throw new WebApplicationException(builder.build());
  54. }else{
  55. return category;
  56. }
  57. }*/
  58. @POST
  59. @Path("/category")
  60. @Consumes({"application/json","application/xml"})
  61. public Response addCategory(Category category){
  62. Category cat = (Category) categorydao.getCategory(
  63. category.getCategoryId());
  64. if (cat != null) {
  65. return Response.status(Status.BAD_REQUEST).build();
  66. } else {
  67. categorydao.addCategory(category);
  68. return Response.ok(category).build();
  69. }
  70. }
  71. @DELETE
  72. @Path("/category/{id}")
  73. @Consumes({"application/json","application/xml"})
  74. public Response deleteCategory(@PathParam("id") String id) {
  75. System.out.println("deleteCategory with category id : " + id);
  76. Category cat = (Category) categorydao.getCategory(id);
  77. if (cat == null) {
  78. return Response.status(Status.BAD_REQUEST).build();
  79. } else {
  80. categorydao.deleteCategory(id);
  81. return Response.ok().build();
  82. }
  83. }
  84. @PUT
  85. @Path("/category")
  86. @Consumes({"application/json","application/xml"})
  87. public Response updateCategory(Category category) {
  88. System.out.println("updateCategory with category id : "
  89. + category.getCategoryId());
  90. Category cat = (Category) categorydao.getCategory(
  91. category.getCategoryId());
  92. if (cat == null) {
  93. return Response.status(Status.BAD_REQUEST).build();
  94. } else {
  95. categorydao.updateCategory(category);
  96. return Response.ok(category).build();
  97. }
  98. }
  99. }

服务类注
解:CategoryService的类声明上定义了@Path
和@Produces注解。@Path定义了URI路径,客户端可以通过这个路径访问到CategoryService对象。如
@Path("/categoryservice"),那么URI请求,就可以是http://localhost:9000
/categoryservice/。@Produces定义了服务类和方法生产内容的类型。如@Produces("application
/xml"),那么CategoryService只会生产application/xml。方法注解:每个方法都和@Produces相关,它决定了这
个方法生产什么样的响应。每个方法都有和HTTP方法映射的的注解,例如@GET

和@POST。方法中的@Path注解指定了该方法的URI。例如getCategory()方法上的@Path("/category/{id}"),
可以使用http://localhost:9000/categoryservice/category/001,访问到category id
为001的分类。{id}就好比参数。接着,让我们看看@PathParam注解。@PathParam注解是用来给URI
路径一个模板变量,方法的输入参数。@PathParam("id") 就是URI中的 @Path ("/category/{id}")。

4.启动RESTFUL服务

[java] view plain copy

  1. package client;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
  6. import entity.Category;
  7. import service.CategoryService;
  8. public class CategoryServerStart {
  9. public static void main(String[] args) {
  10. // Service instance
  11. CategoryService categoryService = new CategoryService();
  12. JAXRSServerFactoryBean restServer = new JAXRSServerFactoryBean();
  13. restServer.setResourceClasses(Category.class);
  14. restServer.setServiceBean(categoryService);
  15. restServer.setAddress("http://localhost:9000/");
  16. restServer.create();
  17. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  18. try {
  19. br.readLine();
  20. } catch (IOException e) {
  21. }
  22. System.out.println("Server Stopped");
  23. System.exit(0);
  24. }
  25. }

5.现在我们可以简单地测试一个查询方法。直接在浏览器中地址栏输入地址。采用@PathParam使用如下地址:http://localhost:9000/categoryservice/category/001,采用@QueryParam使用如下地址http://localhost:9000/categoryservice/category?id=001

看到的效果如下:

原文(http://blog.csdn.net/wangyajin333/article/details/47175405)

时间: 2024-10-29 01:07:21

(转)CXF开发RESTFUL的实例练习的相关文章

Web Service学习-CXF开发Web Service实例demo(一)

Web Service是什么? Web Service不是框架.更甚至不是一种技术. 而是一种跨平台,跨语言的规范 Web Service解决什么问题: 为了解决不同平台,不同语言所编写的应用之间怎样调用问题.比如.有一个C语言写的程序.它想去调用java语言写的某个方法. 集中解决:1,远程调用 2.跨平台调用 3,跨语言调用 实际应用: 1.同一个公司的新,旧系统的整合.Linux上的java应用,去调用windows平台的C应用 2,不同公司的业务整合.业务整合就带来不同公司的系统整合.不

Web Service笔记(五):CXF开发RESTful风格的Web Service

前言: 1.Web Service笔记(五):利用CXF结合Spring开发web service 2.XML学习笔记(三):Jaxb负责xml与javaBean映射 3.jax-rs详解 4.可以使用浏览器的工具调试:如 Firefox 的RESTClient 和chrome的REST Console. 一.配置Spring的配置文件 1.需要引入新的 jar 包. 2.配置 applicationContext-server.xml 文件.使用 jaxrs:server ,记得引入jaxrs

cxf开发Restful Web Services

一.restful web services rest全称是Representation State Transfer(表述性状态转移).它是一种软件架构风格,只是提供了一组设计原则和约束条件.在restful web services的设计原则中,所有的事物都应该拥有唯一的URI,通过对URI的请求访问,完成相应的操作.访问的方法与http协议中的若干方法相对应.如下: 创建资源,使用 POST 方法. 获取某个资源,使用 GET 方法. 对资源进行更新,使用 PUT 方法. 删除某个资源,使

基于cxf开发restful风格的Web Service

一.写在前面 webservice一些简单的其他用法和概念,就不在这里赘述了,相信大家都可以在网上查到,我也是一个新手,写这篇文章的目的一方面是想记录自己成长的历程,另一方面是因为学习这个的时候花了点时间,希望本文章能为大家节约点时间.当然描述的可能不到位,望谅解. 二.创建项目 2.1.创建公用接口project 为了方便服务端和客户端调用接口可以先创建一个接口java project,单独建一个接口project的用处后面再说. 然后导入对应jar包,可以去cxf官网下载http://cxf

开发RESTful WebService

RESTful风格的webservice越来越流行了,sun也推出了RESTful WebService的官方规范:JAX-RS,全称:Java API for RESTful WebService.该规范定义了一系列的注解 RESTful简化了web service的设计,它不再需要wsdl,也不再需要soap协议,而是通过最简单的http协议传输数据(包括xml或json).既简化了设计,也减少了网络传输量(因为只传输代表数据的xml或json,没有额外的xml包装) 下面为大家介绍使用cx

开发基于CXF的 RESTful WebService web 项目 webservice发布

配置步骤 开发基于CXF的 RESTful WebService 1.创建Web项目并导入CXF的jar 2.在Web.xml中配置 CXFServlet <servlet> <servlet-name>cxf</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> </servlet> <servlet-

Web Service 那点事儿(4)—— 使用 CXF 开发 REST 服务

现在您已经学会了如何使用 CXF 开发基于 SOAP 的 Web 服务,也领略了 Spring + CXF 这个强大的组合,如果您错过了这精彩的一幕,请回头看看这篇吧: Web Service 那点事儿(2) —— 使用 CXF 开发 SOAP 服务 今天我们将视角集中在 REST 上,它是继 SOAP 以后,另一种广泛使用的 Web 服务.与 SOAP 不同,REST 并没有 WSDL 的概念,也没有叫做“信封”的东西,因为 REST 主张用一种简单粗暴的方式来表达数据,传递的数据格式可以是

Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务

选框架犹如选媳妇,选来选去,最后我还是选了“丑媳妇(CXF)”,为什么是它?因为 CXF 是 Apache 旗下的一款非常优秀的 WS 开源框架,具备轻量级的特性,而且能无缝整合到 Spring 中. 其实 CXF 是两个开源框架的整合,它们分别是:Celtix 与 XFire,前者是一款 ESB 框架,后者是一款 WS 框架.话说早在 2007 年 5 月,当 XFire 发展到了它的鼎盛时期(最终版本是 1.2.6),突然对业界宣布了一个令人震惊的消息:“XFire is now CXF”,

使用CXF开发Web Service服务

1.使用CXF开发Web Service服务端 1.1 开发一个Web Service业务接口,该接口要用@WebService修饰 (1)创建一个Java项目MyServer (2)在MyServer项目中创建一个接口HelloWorld package com.xju.ws; import javax.jws.WebService; @WebService public interface HelloWorld { String sayHello(String name); } 1.2 开发