Java与RESTful

来源:互联网 发布:针式打印机用什么软件 编辑:程序博客网 时间:2024/04/29 15:30

         REST(REpresentation State Transfer),用于描述一个架构样式的网络系统,如web应用程序。

         说实了,就是如下的一个URL访问样式:localhost:8080/project_name/databases/database_name/collections/collection_name

       

         其实,这样的URL样式有什么好处呢?可以先对比传统一些的URL访问样式,即POST和GET方法。POST的参数传递在URL上是反映不出来的,而GET方式,以上为例即为localhost:8080/project_name/ONEPAGE?databases=database_name&collections=collection_name。那么,哪一种方式更能清晰的描述资源的访问?毫无疑问是RESTful的方式。

         在Web的应用上,RESTful已促成了不少的框架出现。甚至在一些框架上,取代了Servlet这个中间件。RESTful是很强大的技术?这个靠大家发掘。

         这次我的应用,主要的就是以下的一个应用Demo。不过,过程中有个小难点,就是如何与Servlet交互上或者说调用Servlet的方法。RESTful下的Java类,是比Servlet更纯的class。RESTful架构下的Java类功能也相当的丰富或者说强大。要获取Servlet中的request、response对象,可以通过配置注释@Context 获取。对GET方法或者POST方法的支持,以及在接受或返回方式上,都有相当大的平台。

        另外,在调用Servlet方法上,可以使用HttpClient对象,可动态选择是POST还是GET方法。但是在具体使用到request、response对象时并不怎么好用,如不能支持对Cookie的读写。


附上一个Demo

        

在RESTful+Java+Tomcat架构中,

web.xml配置文件为:

  <servlet>    <servlet-name>Jersey REST Service</servlet-name>    <servlet-class>  com.sun.jersey.spi.container.servlet.ServletContainer  </servlet-class>  <init-param>    <param-name>com.sun.jersey.config.property.packages</param-name>    <param-value>demo.restful.res</param-value>  </init-param>  <load-on-startup>1</load-on-startup>  </servlet>  <servlet-mapping>    <servlet-name>Jersey REST Service</servlet-name>    <url-pattern>/collections/*</url-pattern>  </servlet-mapping>  <servlet-mapping>    <servlet-name>Jersey REST Service</servlet-name>    <url-pattern>/databases/*</url-pattern>  </servlet-mapping>

在Databases类中:

package demo.restful.res;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import javax.ws.rs.core.MediaType;@Path("{db}/collections/{coll}")public class Databases {@GET@Produces(MediaType.TEXT_HTML)public String showCollections(@PathParam(value="db")String db, @PathParam(value="coll")String coll){ ... } 
如果访问的URL为localhost:8080/project_name/collections/collection_name

在Collections类中:

package demo.restful.res;import javax.ws.rs.GET;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import javax.ws.rs.core.MediaType;@Path("/{coll}")public class Collections {@GET@Produces(MediaType.TEXT_HTML)public String selectCollection(@PathParam(value="coll")String coll){ ... }
另外,@Produces的返回类型视乎具体场景。



原创粉丝点击