麻雀虽小,五脏俱全:JSR311让Restful WebService变简单

原创 2009年10月22日 20:17:00

麻雀虽小,五脏俱全 ”系列

---

需求
公司有一个产品,包括前台WEB界面和多个后台服务,各个服务都需要在前面界面中进行配置和控制,以调整服务的行为。以前,配置文件都存放在数据库中,界面上修改配置后入库,并发送消息(Socket)通知特定的服务重新加载配置。这样有些问题,一方面自己维护Socket带来很多麻烦,二来数据库重建的时候,需要备份/恢复这些配置数据。

所以,我们想把配置文件局部化到各个服务(比如用本地文件存储),然后在界面上修改的时候,实时向服务请求当前配置数据(XML格式),修改完毕后,再直接发给服务进行更新和存储。而在通信方式上,我们希望各个服务提供Web Service接口来实现配置的检索和更新。

但Web Service通常需要在Web Container(比如,tomcat, jboss)中实现,而我们不想把所有的服务都跑在tomcat里,于是想找到一种更加轻量级的方式。

今天偶然看到JSR311,进而发现在Java后台服务中内嵌grizzly(基于NIO的实现)和Jersey(Sun的JSR311参考实现)来提供Restful Web Service能力,是非常方便的。个人认为这种方式适用于后台Java程序的控制、配置和监视,其作用有些类似于JMX,但比实现JMX要简单的多(JSR311基于POJO)。

背景知识
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类,内容如下:

代码中的注解(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类,内容如下:

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

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

clip_image002

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

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

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

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

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

这说明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相关

背景知识  Representational state transfer (REST) Web Service:  它是Roy Fielding博士在2000年他的博士论文中提出来的一种软件架构...
  • lipei1220
  • lipei1220
  • 2016年12月02日 11:21
  • 376

JSR311让Restful WebService变简单

需求 公司有一个产品,包括前台WEB界面和多个后台服务,各个服务都需要在前面界面中进行配置和控制,以调整服务的行为。以前,配置文件都存放在数据库中,界面上修改配置后入库,并发送消息(Socket)...
  • renzhe333
  • renzhe333
  • 2013年08月23日 09:03
  • 899

JSR311 jar包

  • 2011年11月30日 09:34
  • 45KB
  • 下载

麻雀虽小,五脏俱全:JSR311让Restful WebService变简单

--- 需求  公司有一个产品,包括前台WEB界面和多个后台服务,各个服务都需要在前面界面中进行配置和控制,以调整服务的行为。以前,配置文件都存放在数据库中,界面上修改配置后入库,并发送消息(So...
  • ccecwg
  • ccecwg
  • 2014年08月27日 10:48
  • 346

RestFul WebService的创建和使用实例

一. RestFul WebService的创建: 本例使用SpringMVC来写RestFul Web Service。 1.创建【Dynamic Web Prject】 2.添加代码: Res...
  • sunroyi666
  • sunroyi666
  • 2016年07月15日 16:05
  • 21275

WebService为什么不如RESTful API流行

1 WebService有很多协议,为什么HTTP比较流行? WebService是个很重型的规范,它的应用协议是SOAP(简单对象访问协议),它所依赖的下层通信方式不单单是HTTP,也有SOA...
  • baolin811
  • baolin811
  • 2015年08月20日 23:27
  • 7201

推荐系统(RS),麻雀虽小,五脏俱全

基于Surprise推荐系统实战 本文就movielens数据集做测试,实践推荐。movielens数据集格式为:user item rating timestamp 其中主要用到前三列,timest...
  • bingo281002
  • bingo281002
  • 2017年11月14日 23:48
  • 44

一起代码,两分钟,实现 java restful webservice

新接手个项目中用到了restful webservice, 开始研究JAX-RX,JAX-WS,CXF,jaxb等概念,也从网上找一些简单的例子,其实java实现rest还是非常简单的(要不怎么叫re...
  • gaowenhui2008
  • gaowenhui2008
  • 2015年11月17日 18:38
  • 1177

【论坛项目】简单的论坛小项目-麻雀虽小,五脏俱全

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自【大学之旅_谙忆的博客】 这是我们数据库的一个课程设计,时间不多,老师只留给我们5天的时间做。数据库为MySQ...
  • qq_26525215
  • qq_26525215
  • 2017年01月07日 21:26
  • 2373

JAVA温习:WebService和RESTful的区别

REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性。...
  • huanghr_1
  • huanghr_1
  • 2016年05月19日 19:23
  • 578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:麻雀虽小,五脏俱全:JSR311让Restful WebService变简单
举报原因:
原因补充:

(最多只允许输入30个字)