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