• webservice的优缺点

优点:

1)跨防火墙通信

2)跨平台跨语言(应用集成)

3)跨公司的业务交易集成(B2B集成)

4)软件和数据的重用

缺点:

1)单机应用程序不适合

2)局域网内应用不适合

  • webservice支持的调用方式

SOAP、XML/HTTP、RESTful HTTP 或者 CORBA

  • CXF
  • webservice的使用  传递string和复杂类型  对象、javabean、集合、map

  • Restful理解

1)名称:Representational  state  transfer 表现层状态变化            主语是resourses资源   的表现层状态变化的一种架构

2)资源:网上的所有资源通过全球标识ID访问,这个地址叫做URI,通过它就能访问到网络上得任何资源

3)表现层:是指资源的一种表现形式,可以是html、txt、json、xml、或者图片格式等等

4)状态转化:是指客户端想要操作服务器资源,就需要通过某种方式对服务器资源的状态进行改变,客户端能用到的手段只能是HTTP协议,http协议里包含四种操作分别是

GET(获取资源)  POST(新建资源、更新资源) 、PUT(更新资源)、Delete(删除资源)来对服务器资源改变,从而实现资源的表现层的状态变化。


  • Jersy  Rest  在spring 中得使用

1)导入jersy包到工程中

2)在web。xml中配置jersy的servlet

3)具体代码调用


         

名词解释

1 Rest Web Services

Representational State Transfer, 具象状态传输。

REST 中最重要的概念是资源(resources),使用全球 ID(通常使用 URI)标识。客户端应用程序使用 HTTP 方法(GET/ POST/ PUT/ DELETE)操作资源或资源集。RESTful Web 服务是使用 HTTP 和 REST 原理实现的 Web 服务。通常,RESTful Web 服务应该定义以下方面:

· Web 服务的基/根 URI,比如 http://host/<appcontext>/resources。

· 支持 MIME 类型的响应数据,包括 JSON/XML/ATOM 等等。

· 服务支持的操作集合(例如 POST、GET、PUT 或 DELETE)。

2  @注释说明

2.1 @Produces 表示返回的格式

@Produces( {MediaType.APPLICATION_XML })   表示返回的xml格式

@Produces( {MediaType.APPLICATION_JSON })  表示返回的json格式

@Produces( { MediaType.TEXT_PLAIN })  表示返回的纯文本格式

2.2 @ Consumes

@Consumes ( { application/x-www-form-urlencoded }) 窗体数据被编码为名称/值对

@Consumes @Singleton @XmlRootElement@Provider

二、初始化工程

1下载jar包

 

2 新建web工程

使用MyEclipse8.5新建web工程,命名为RestfulDemo,将上述下载jar包导入lib

3 修改web.xml

添加如下内容

<servlet>
   <servlet-name>ServletAdaptor</servlet-name>   
   <servlet-class>
com.sun.jersey.server.impl.container.servlet.ServletAdaptor
</servlet-class>
      <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>ServletAdaptor</servlet-name>
      <url-pattern>/*</url-pattern>
   </servlet-mapping>
4 将工程部署至tomcat
服务器生成url,例如http://localhost:8080/RestfulDemo
这个url是服务的最基本的url,后面的服务都是基于这个地址添加路径组合,例如
http://localhost:8080/RestfulDemo/HelloWorldRS
三、使用jersey开发简单的rest web services
1 @GET
1.1服务端
package com.cn;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
@Path("/HelloWorldRS") // 本服务的访问路径,与工程路径组合使用
public class HelloWorldRS {
    Map<String,String> map = new HashMap<String,String>();
    public HelloWorldRS() {
        map.put("1","A");
        map.put("2","B");
        map.put("3","C");
}
@GET表明是一个GET方法
@Path("/sayHelloByGET")调用的时候要加入此路径,精确指定调用的函数
@Produces("text/html") // 输出参数的类型
public String sayHelloByGET(
@QueryParam("from")String fromValue, //客户端传来的参数key为"from"
@Context HttpServletRequest request) {      
System.out.println(fromValue);     
       return map.get(fromValue);
 }
1.2 调用1.1get服务的客户端
package com.client;
import javax.ws.rs.core.*;
import com.sun.jersey.api.client.*;
import com.sun.jersey.core.util.*;
public class JerseyClientGet {
//基础的服务url+服务类的@path
String url = 
"http://localhost:8080/RestfulDemo/HelloWorldRS";
    public static void main(String[] args) {
        new JerseyClientGet().go();
    }
    public void go() {
        Client client = Client.create();
        // /sayHelloByGET为某精确函数的@path
        WebResource webResource = client.resource(url+"/sayHelloByGET");
        // 设定要帶的参数
        MultivaluedMap queryParams = new MultivaluedMapImpl();  
        queryParams.add("from", "3");  //from是个key,服务端要根据"from"获得"3",类似map
        //调用@GET服务时使用如下方法
String str = webResource.queryParams(queryParams).get(String.class);
        System.out.println(str);
    }
}
如果调用服务端的函数是@GET,则要用上述红颜色的.get方法
2 @POST
2.1服务端
package com.cn;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
@Path("/HelloWorldRS") // 本服务的访问路径,与工程路径组合使用
public class HelloWorldRS {
    Map<String,String> map = new HashMap<String,String>();
    public HelloWorldRS() {
        map.put("1","A");
        map.put("2","B");
        map.put("3","C");
}
@POST表明是一个POST方法
@Path("/sayHelloByPOST")调用的时候要加入此路径,精确指定调用的函数
@Produces("text/html") // 输出参数的类型
public String sayHelloByPOST (
@QueryParam("from")String fromValue, //客户端post传来的参数key为"from"
@Context HttpServletRequest request) {      
System.out.println(fromValue);     
       return map.get(fromValue);
 }
2.2调用2.1post服务的客户端
package com.client;
import javax.ws.rs.core.*;
import com.sun.jersey.api.client.*;
import com.sun.jersey.core.util.*;
public class JerseyClientGet {
//基础的服务url+服务类的@path
    private String url = "http://localhost:8080/RestfulDemo/HelloWorldRS";
    public static void main(String[] args) {
        new JerseyClientGet().go();
    }
    public void go() {
       Client client = Client.create();       
      //POST
      WebResource webResource = client.resource(url+"/sayHelloByPOST");
      MultivaluedMap queryParams = new MultivaluedMapImpl();
      queryParams.add("from", "2");
      String resp = webResource.queryParams(queryParams)
      .post(String.class, queryParams);
      System.out.println(resp); 
    }
}
3 @DELETE
3.1服务端
package com.cn;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
@Path("/HelloWorldRS") // 本服务的访问路径,与工程路径组合使用
public class HelloWorldRS {
    Map<String,String> map = new HashMap<String,String>();
    public HelloWorldRS() {
        map.put("1","A");
        map.put("2","B");
        map.put("3","C");
}
@DELETE表明是一个delete方法
@Path("/delSomePor")调用的时候要加入此路径,精确指定调用的函数
@Produces("text/html") // 输出参数的类型
public String delSomePor (
@QueryParam("from")String fromValue, //客户端delete传来的参数key为"from"
@Context HttpServletRequest request) {      
System.out.println(fromValue);    
   map.remove(fromValue);
       return String.valueOf(map.size());
 }
3.2调用3.1delete服务的客户端
package com.client;
import javax.ws.rs.core.*;
import com.sun.jersey.api.client.*;
import com.sun.jersey.core.util.*;
public class JerseyClientGet {
//基础的服务url+服务类的@path
    private String url = "http://localhost:8080/RestfulDemo/HelloWorldRS";
    public static void main(String[] args) {
        new JerseyClientGet().go();
    }
    public void go() {
       Client client = Client.create();
     //DELETE
     WebResource webResource = client.resource(url+"/delSomePor");
     MultivaluedMap queryParams = new MultivaluedMapImpl();
     queryParams.add("from", "2");
     String str = webResource.queryParams(queryParams).delete((String.class));
     System.out.println(str);
      
    }
}