<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 41  文章 - 29  trackbacks - 0
    <2009年3月>
    22232425262728
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    常用鏈接

    留言簿(5)

    隨筆分類(28)

    隨筆檔案(23)

    收藏夾(6)

    Inside JVM

    Java

    java performance

    Solr

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    Recently, Rest architecture style or Restful web service is a hot topic for SOA, web service design and architecture style. But unfortunately, there are not many articles introducing how to develop a real restful web services. So, this series of articles try to introduce how to develop a Restful web services with CXF. The reason why i choose CXF is just because we are using CXF to develop SOAP web service, and CXF 2.1.X already supports JSR-311 API version 0.8 and CXF 2.2 plans to support JSR-311 1.0 API.

    Some of the examples and comments are directly copies from CXF Restful page (http://cwiki.apache.org/CXF20DOC/restful-services.html), thanks for CXF team's great work.

    This article will focus on a simplest service and how to config it as a Restful web service in tomcat. My tomcat version is 6.0.X.

    Software: Tomcat 6.0.x, CXF 2.1
    1. use CXF in Tomcat. please refer to CXF doc. It is pretty easy.
    2. the major configuration file for CXF is  WEB-INF/cxf-servlet.xml, we will add related configuration into this file.

    <beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi
    ="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:jaxrs
    ="http://cxf.apache.org/jaxrs"   <!-- This is the name space for jax rs -->
          xmlns:jaxws
    ="http://cxf.apache.org/jaxws"
          xmlns:soap
    ="http://cxf.apache.org/bindings/soap"
          xsi:schemaLocation
    ="
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
          http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
          http://cxf.apache.org/jaxrs                                            
    <!-- This is the schema location for CXF jax rs -->
          http://cxf.apache.org/schemas/jaxrs.xsd                     <!-- This is the schema location for CXF jax rs xsd -->
          http://cxf.apache.org/jaxws
          http://cxf.apache.org/schemas/jaxws.xsd"
    >

        
    <!-- JAX-RS -->
      
    <jaxrs:server id="customerService" address="/">    <!--NOTE: the address is relative address, the whole URL pattern will be http://localhost:8080/web app/services/, and the services  -->
        <jaxrs:serviceBeans>
           
    <bean class="com.starcite.commonsearch.example.rs.CustomerServiceImpl" />    <!-- this is the class path, cannot be interface-->
        
    </jaxrs:serviceBeans>
      
    </jaxrs:server>

    </beans>

    3. Sample Service interface & implementation class
    @Path("/customerservice/")            <!-- URI for this service, the whole URI will be http://localhost:8080/web app/services/customerservice/ -->
    public interface CustomerService {

        @GET                                    <!-- i guess @GET and @Path annotation is pretty easy to understand, if not, please read
    http://www.tkk7.com/justinchen/archive/2008/11/05/238760.html -->
        @Path("/customers/")       <!-- URI for this service, the whole URI will be http://localhost:8080/web app/services/customerservice/customers/ -->
        public Customer getCustomers();
        
        @GET
        @Path(
    "/customers/{id}/")    <!-- URI for this service, the whole URI will be http://localhost:8080/web app/services/customerservice/customers/123/ etc -->
        public Customer getCustomer(@PathParam("id") String id);  <!-- @PathParam is the parameter extracts the value of a URI template parameter. -->

        @PUT
        @Path(
    "/customers/")
        
    public Response updateCustomer(Customer customer);
        
        @POST
        @Path(
    "/customers/")
        
    public Response addCustomer(Customer customer);
        
        @DELETE
        @Path(
    "/customers/{id}/")
        
    public Response deleteCustomer(@PathParam("id") String id);
        
        @Path(
    "/orders/{orderId}/")
        
    public Order getOrder(@PathParam("orderId") String orderId);
        
    }

    Service impl class code. NOTE: there are no need any annotation. But also, there are a little bit different on return value comparing to SOAP web service. In SOAP web service, we can directly use any java class. But here, we used some special class, like Response, we will disucss this more in other articles.
    public class CustomerServiceImpl implements CustomerService {
        
        
    private long currentId = 123;
        Map
    <Long, Customer> customers = new HashMap<Long, Customer>();
        Map
    <Long, Order> orders = new HashMap<Long, Order>();

        
    public CustomerServiceImpl() {
            init();
        }

        
    public Customer getCustomers() {
            System.out.println(
    "----invoking getCustomer, Customer id is: XXX " ); 
            
            Customer c 
    = customers.get(123);
            
            
    return c;
        }
        
        
    public Customer getCustomer(String id) {
            System.out.println(
    "----invoking getCustomer, Customer id is: " + id);
            
    long idNumber = Long.parseLong(id);
            Customer c 
    = customers.get(idNumber);
            
    return c;
        }

        
    public Response updateCustomer(Customer customer) {
            System.out.println(
    "----invoking updateCustomer, Customer name is: " + customer.getName());
            Customer c 
    = customers.get(customer.getId());
            Response r;
            
    if (c != null) {
                customers.put(customer.getId(), customer);
                r 
    = Response.ok().build();
            } 
    else {
                r 
    = Response.notModified().build();
            }

            
    return r;
        }

        
    public Response addCustomer(Customer customer) {
            System.out.println(
    "----invoking addCustomer, Customer name is: " + customer.getName());
            customer.setId(
    ++currentId);

            customers.put(customer.getId(), customer);

            
    return Response.ok(customer).build();
        }

        
    public Response deleteCustomer(String id) {
            System.out.println(
    "----invoking deleteCustomer, Customer id is: " + id);
            
    long idNumber = Long.parseLong(id);
            Customer c 
    = customers.get(idNumber);

            Response r;
            
    if (c != null) {
                r 
    = Response.ok().build();
                customers.remove(idNumber);
            } 
    else {
                r 
    = Response.notModified().build();
            }

            
    return r;
        }

        
    public Order getOrder(String orderId) {
            System.out.println(
    "----invoking getOrder, Order id is: " + orderId);
            
    long idNumber = Long.parseLong(orderId);
            Order c 
    = orders.get(idNumber);
            
    return c;
        }

        
    final void init() {
            Customer c 
    = new Customer();
            c.setName(
    "John");
            c.setId(
    123);
            customers.put(c.getId(), c);

            Order o 
    = new Order();
            o.setDescription(
    "order 223");
            o.setId(
    223);
            orders.put(o.getId(), o);
        }

    }

    4. POJO Class, such as Customer. POJO class is pretty similar, we can also use JAXB to covert object to XML.
    @XmlRootElement(name = "Customer")
    public class Customer {
        
    private long id;
        
    private String name;

        
    public long getId() {
            
    return id;
        }

        
    public void setId(long id) {
            
    this.id = id;
        }

        
    public String getName() {
            
    return name;
        }

        
    public void setName(String name) {
            
    this.name = name;
        }
    }

    5. Now, you can deploy this web app as normal web app. and after you start tomcat, you are able to try the following link in browser -
    http://localhost:8080/vendor_search/services/customerservice/customers/ Or
    http://localhost:8080/vendor_search/services/customerservice/customers/123/

    the browser will return a XML for a cusomer object.

    In next articles, we will implement more complex user case to prove the Restful web service. 
    posted on 2008-11-05 18:24 Justin Chen 閱讀(3519) 評論(1)  編輯  收藏 所屬分類: Rest

    FeedBack:
    # re: Create Restful Web Service With CXF 2.1.X/CXF 2.2, Part 1: Create a service in Tomcat[未登錄] 2009-03-10 20:28 Jason
    public Customer getCustomers() {
    System.out.println("----invoking getCustomer, Customer id is: XXX " );

    Customer c = customers.get(123);

    return c;
    }

    according to CXF's suggestions, we need to define a collection to hold a set of Customer.So the codes will be
    public Customers getCustomers() {

    Customers c = customers.getAll();

    return c;
    }  回復  更多評論
      
    主站蜘蛛池模板: 久久久久久久岛国免费播放| 99人中文字幕亚洲区| 毛片免费观看的视频在线| 久久WWW免费人成人片| 亚洲精品无码激情AV| 亚洲AV无码成人精品区天堂 | 91成人免费观看在线观看| 免费人成在线观看网站品爱网| 在线观看无码AV网站永久免费| 亚洲日本中文字幕一区二区三区 | 亚洲精品乱码久久久久久V| 国产精品极品美女自在线观看免费| 91香焦国产线观看看免费| 可以免费观看一级毛片黄a| 久久99国产亚洲高清观看首页| 久久精品国产亚洲av麻豆蜜芽| 一级毛片不卡免费看老司机| 99久久免费精品国产72精品九九 | 在线观看免费国产视频| 亚洲人成电影亚洲人成9999网| 美女被免费视频网站a| 99久久精品日本一区二区免费| 亚洲一区精品无码| 羞羞视频免费网站入口| 亚洲中文字幕不卡无码| 免费人成在线观看播放a| 中字幕视频在线永久在线观看免费 | 久久精品国产免费一区| 日韩亚洲精品福利| 中文字幕 亚洲 有码 在线| 无码日韩精品一区二区三区免费| 亚洲美女精品视频| 青青草无码免费一二三区| 亚洲六月丁香婷婷综合| 亚洲色婷婷综合开心网| 美丽的姑娘免费观看在线播放| 亚洲AV无码精品色午夜果冻不卡| 在线看免费观看AV深夜影院| 黄色网址在线免费观看| 亚洲手机中文字幕| 国产在线jyzzjyzz免费麻豆|