背景知识 
Representational state transfer (REST) Web Service: 
它是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构风格。在目前三种主流的Web Service实现方案中,因为REST与SOAP和XML-RPC相比显的更加简洁,因此越来越多的Web Service开始采用REST风格设计和实现。

参考资料:http://en.wikipedia.org/wiki/Representational_State_Transfer

Jersey: 
它是Sun对JSR311的官方参考实现,而JSR311是java中实现Restful Web Service的API规范(JSR311: JAX-RS: The Java API for RESTful Web Services)。JSR311有一个重要目标:使用注解(annotation)把POJO暴露成Web Service,这样就比较轻量级。

参考资料:https://jsr311.dev.java.net/nonav/releases/1.0/spec/index.html

Grizzly: 
Grizzly于2004年诞生在GlassFish中,开始目的是要建构一个HTTP Web服务器,用来代替Tomcat的Coyote连接器和Sun WebServ er6.1。后来,Grizzly成为一种应用程序框架,专门解决编写成千上万用户访问服务器时候产生的各种问题。使用JAVA NIO作为基础,并隐藏其编程的复杂性。在本例中,我们将其用作内嵌的Servlet Container。

参考资料:https://grizzly.dev.java.net/

准备工作 
首先,下载grizzly和jersey。其中,grizzly的下载地址为:http://download.java.net/maven/2/com/sun/grizzly/grizzly-servlet-webserver/1.9.18a/grizzly-servlet-webserver-1.9.18a.jar,jersey的下载地址为:http://download.java.net/maven/2/com/sun/jersey/jersey-archive/1.1.2-ea/jersey-archive-1.1.2-ea.zip

在Eclipse中建一个Java工程,名为jsr331,然后把下载的jersey-archive-1.1.2-ea.zip解压,将jersey-archive-1.1.2-ea/contribs、jersey-archive-1.1.2-ea/lib两个目录下的jar包,连同下载的grizzly-http-webserver-1.9.18a.jar都拷贝到jsr331工程下的lib目录,并加入到该工程的Build Path。(实测中,发现还需要引入一个包,下载地址:http://repository.jboss.org/maven2/org/jvnet/mimepull/1.2/mimepull-1.2.jar)

编写最简单的服务 
JSR331把准备提供Web Service的类称为Resource class。Resource class是一个普通类(POJO),但是按照规范要求增加了特定的注解(annotation)。我们首先实现最简单的hello world服务。

在jinxfei.test.jsr311.service下,建立HelloService类,内容如下:

[java] view plaincopy
  1. package jinxfei.test.jsr311.service;  
  2.   
  3. import javax.ws.rs.GET;  
  4. import javax.ws.rs.Path;  
  5. import javax.ws.rs.Produces;  
  6.   
  7. @Path("/hello")  
  8. public class HelloService {  
  9.     @GET   
  10.     @Produces("text/plain")  
  11.     public String helloWorld(){  
  12.         return "Hello world!";  
  13.     }     
  14. }  

代码中的注解(annotation)决定了程序发布成Web Service后的行为和特性。其中,HelloService类前面的@PATH,表明该Service的URL路径,这种类名前面带@PATH注解的类被称为Root Resource Class,因为他们决定了访问Service时URI中的第一级路径;@GET表示访问该服务使用HTTP GET方法;@Produces规定该服务返回结果的类型,这里的”text/plain”表名返回纯文本。

发布服务 
实现服务类后,我们要启动一个内嵌的grizzly servlet container,并把HelloService发布到该Container中,这样就能通过HTTP协议访问该服务。Jersey提供了两种发布方式,标准的做法需要在web.xml中做配置,所以比较适用于部署在独立的Web Container下的应用,本文不做深入介绍,可参见:http://docs.sun.com/app/docs/doc/820-4867/6nga7f5o4?l=en&a=view。本例与grizzly整合,所以使用grizzly的工具类,通过代码进行部署配置。

在jinxfei.test.jsr311包下创建ServiceDeployer类,内容如下:

[java] view plaincopy
  1. package jinxfei.test.jsr311;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.URI;  
  5. import java.util.HashMap;  
  6. import java.util.Map;  
  7. import javax.ws.rs.core.UriBuilder;  
  8. import com.sun.grizzly.http.SelectorThread;  
  9. import com.sun.jersey.api.container.grizzly.GrizzlyWebContainerFactory;  
  10.   
  11. public class ServiceDeployer {  
  12.       
  13.     public static void main(String[] args) throws IOException {  
  14.         URI ServerURI=UriBuilder.fromUri("http://localhost/").port(9876).build();  
  15.         startServer(ServerURI);  
  16.         System.out.println("服务已启动,请访问:"+ServerURI);  
  17.     }      
  18.       
  19.     protected static SelectorThread startServer(URI serverURI) throws IOException {  
  20.         final Map<String, String> initParams = new HashMap<String, String>();  
  21.         initParams.put("com.sun.jersey.config.property.packages","jinxfei.test.jsr311.service");  
  22.         System.out.println("Grizzly 启动中...");  
  23.         SelectorThread threadSelector = GrizzlyWebContainerFactory.create(serverURI, initParams);       
  24.         return threadSelector;  
  25.     }      
  26. }  

代码很简单,其中:initParams.put("com.sun.jersey.config.property.packages" , "jinxfei.test.jsr311.service"); 这一行的第二个参数表明服务实现类所在的包名,系统会自动搜索做了注解的类并将其发布成服务。

在Eclipse中运行该类,控制台上打印“服务已启动”字样,表示系统启动成功,打开浏览器,输入:http://localhost:9876/hello,即可看到效果,如下图所示:

让功能再强一点点 
接下来,我们要让服务能够接受参数,并根据参数打印不同的信息,最简单的就是回显(Echo)。为了实现这一功能,我们给HelloService类增加一个方法:

[java] view plaincopy
  1. @POST @Path("echo")
  2. @Consumes("application/x-www-form-urlencoded")
  3. public String echo(@FormParam("msg") String message){
  4. return "Are you saying:"+message;
  5. }

@POST表明该方法要用HTTP Post来访问,@Path表明访问该方法的相对路径是echo,@Consumes表明该方法处理HTTP Post请求中何种类型的数据。该方法参数中的注解@FormParam("msg")说明后面的“String message”参数取自表单提交数据中的msg。

由于该方法需要Post访问,且需要通过表单提交数据,所以我们创建一个test.htm,在其中写一个简单的Form:

[xhtml] view plaincopy
  1. <form action="http://localhost:9876/hello/echo" method="post">
  2. <input type="text" name="msg">
  3. <input type="submit" value="submit">
  4. </form>

重启ServiceDeployer,然后在浏览器中打开test.htm,表单中输入任意信息: 

然后点提交按钮,可以看到如下信息: 

这说明HelloService已经提取了表单参数,并回显给用户。

深入学习 
请参考官方资料: 
JSR311规范:https://jsr311.dev.java.net/nonav/releases/1.0/spec/index.html 
JSR311参考实现的主要特性:http://wikis.sun.com/display/Jersey/Overview+of+JAX-RS+1.0+Features

JSR311发布Restful WebService工程相关推荐

  1. CXF发布restful WebService的入门例子(服务器端)

    研究了两天CXF对restful的支持.    现在,想实现一个以  http://localhost:9999/roomservice 为入口,  http://localhost:9999/roo ...

  2. CXF发布RestFul WebService和SOAP WebService

    CXF发布RestFul WebService和SOAP WebService Apache CXF可以发布多种协议的WebService,Spring支持整合cxf到项目中,可以简化后台构架,以下是 ...

  3. Eclipse + Apache Axis2 发布RESTful WebService(一)基础知识

    1.什么是WebService 学习 WebService 第一步:体系结构.三元素SOAP/WSDL/UDDI 2.什么是Axis2 Axis2是Apache一套崭新的WebService引擎(框架 ...

  4. Linux使用Java将C++程序发布为webservice(wsdl)

    现有一个c++程序,如图,我们要将此程序发布为webservice. 文件夹中的samplebase为可执行文件. 1. 配置环境 由于程序中引用了gdal环境,mpi和tomcat,因此我们首先要在 ...

  5. WebService大讲堂之Axis2(7):将Spring的装配JavaBean发布成WebService

    在现今的Web 应用中经常使用Spring 框架来装载JavaBean .如果要想将某些在Spring 中装配的JavaBean 发布成WebService ,使用Axis2 的Spring 感知功能 ...

  6. SAP系统中在发布了webservice,获得了WSDN地址后,外部系统怎么传数据到SAP?

    SAP系统中在发布了webservice,获得了WSDN地址后,外部系统怎么传数据到SAP? 你是先创建了rfc,然后根据rfc发布的webservice吧? rfc里不是订了传入传出参数,那生成的w ...

  7. 使用CXF与Spring集成实现RESTFul WebService

    以下引用与网络中!!! 一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制. ...

  8. 开发RESTful WebService

    RESTful风格的webservice越来越流行了,sun也推出了RESTful WebService的官方规范:JAX-RS.全称:Java API for RESTful WebService. ...

  9. SAP ECC EHP7 RFC 发布成WebService

    http://www.cnblogs.com/mingdashu/p/6877622.html 1.说明介绍 本文将RFC发布成WebService的详细步骤 不介绍如何创建rfc. 2.WebSer ...

最新文章

  1. Linux内存手动释放方法
  2. ZOJ3370. Radio Waves(2-sat)
  3. MUI框架之输入框Input
  4. 如何卸载linux中的docker,linux centos7 安装、卸载docker
  5. [转]完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
  6. 运用Nginx代理和UWSGI将Flask项目部署在Linux中 详细步骤
  7. STL vector用法介绍
  8. 计算机硬件基础英语ppt,计算机硬件技术基础,computer hardware technology elements,音标,读音,翻译,英文例句,英语词典...
  9. 今天通过了QCC评审
  10. python 操作ps_Python实现PS滤镜碎片特效功能示例
  11. 非谓语动词作后置定语
  12. electron使用regedit模块时的正确配置方法
  13. TPH-YOLOv5: Improved YOLOv5 Based on Transformer Prediction Head forObject Detection on Drone-captur
  14. 【Azure Data Platform】ETL工具(22)——Azure Databricks与ADF整合
  15. 安卓逆向--凤凰新闻app简单分析
  16. YOYO软件使用指南
  17. 保护水资源公益网站html,保护水资源公益广告策划书
  18. 关于开学第一周的总结
  19. RK3326 RESET按键进入loader
  20. video-player [ 视频播放插件 ]

热门文章

  1. python创建配置文件_如何写python的配置文件
  2. 学习busybox源码与移植
  3. arm汇编:.balignl伪指令理解
  4. #8ms平台,是一个支持ESP32/Sigamastar201、202/RK等硬件的开发平台,现平台Slogan有奖征集# 我们的广告语,将由你们来定!
  5. list中抽出某一个字段的值_使用LINQ获取List列表中的某个字段值
  6. Android 常用的函数记录
  7. deepin卸载了python_Deepin-Linux下python卸载与安装(失败的折腾)
  8. 光栅尺与PLC的配合使用
  9. LightOJ 1093 - Ghajini 线段树
  10. 电量模块MODBUS RTU寄存器解读