利用RAD和WAS开发JAX-RS服务
来源:互联网 发布:润和软件怎么样 编辑:程序博客网 时间:2024/05/15 09:58
JAX-RS
Notes
WebSphere Application
Server
1.0
Requires Dynamic Web
Module 2.3 or higher and
Java 1.5 or higher
7.0 with Feature Pack for
Web 2.0
8.0
1.1
Requires Dynamic Web
Module 2.4 or higher and
Java 1.6 or higher. Based
on Apache Wink 1.1.1
7.0 with Feature Pack for
Web 2.0
8.0
可以看出,WAS8.0自带的JAX-RS运行时是基于Apache Wink。
JAX-RS的规范的具体的包有:
javax.ws.rs
javax.ws.rs.core
javax.ws.rs.ext
其中javax.ws.rs中有几个常用的标注:
GET,POST,PUT,DELETE,HEAD,OPTIONS
Path
Produces,Consumes
PathParam,QueryParam,HeaderParam,CookieParam,MatrixParam,FormParam,DefaultValue ,Encoded
PermitAll, DenyAll, RolesAllowed (JSR 250)
JAX-RS的规范一般存在于WAS运行时的j2ee.jar中。而其实现则是存在于WAS运行时的com.ibm.ws.jaxrs.jar中。
Rational ApplicationDeveloper (RAD)是专门为WAS设计的一款Java EE的开发工具。下面我们以一个实例来说明如何用RAD和WAS来开发一个简单的JAX-RS服务。
首先创建一个REST Service的Web Project。
在该项目中,创建一个类StartApplication来继承javax.ws.rs.core.Application.并将所创建的资源类加入到该类中。
publicclassStartApplication extends Application { @Override publicSet<Class<?>> getClasses() { Set<Class<?>> classes = newHashSet<Class<?>>(); classes.add(HelloService.class); return classes; } }
同时在web.xml中注册该类作为init-param。
<servlet> <description> JAX-RS Tools Generated - Do notmodify</description> <servlet-name>JAX-RS Servlet</servlet-name> <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>applications.StartApplication</param-value> </init-param> <load-on-startup>1</load-on-startup> <enabled>true</enabled> <async-supported>false</async-supported> </servlet>
接下来,创建一个JavaBean来保存相应的数据。
publicclass User { private String firstName; private String lastName; public StringgetFirstName() { returnfirstName; } publicvoidsetFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { returnlastName; } publicvoidsetLastName(String lastName) { this.lastName = lastName; }}
最后,创建一个服务。
@javax.ws.rs.Path("/HelloService")publicclass HelloService { privatestaticList<User> users = new ArrayList<User>(); public UsergetUserByFirstName(String firstName){ for(User u : users){ if(u.getFirstName().equals(firstName)){ return u; } } returnnull; } publicList<User> getUsers() { returnusers; } static { User user1 = new User(); user1.setFirstName("tom"); user1.setLastName("cat"); User user2 = new User(); user2.setFirstName("tom1"); user2.setLastName("cat1"); User user3 = new User(); user3.setFirstName("tom2"); user3.setLastName("cat2"); users.add(user1); users.add(user2); users.add(user3); } @javax.ws.rs.Path("/getuser/{firstName}") @javax.ws.rs.GET @javax.ws.rs.Produces("application/json") public JSONObjectgetUser(@javax.ws.rs.PathParam(value="firstName")String firstName){ JSONObject obj = new JSONObject(); User user =getUserByFirstName(firstName); obj.put("firstname",user.getFirstName()); obj.put("lastname",user.getLastName()); return obj; } @javax.ws.rs.Path("/getalluser") @javax.ws.rs.GET @javax.ws.rs.Produces("application/json") public JSONArraygetAllUser(){ List<User> users = this.getUsers(); System.out.println("users.size():"+users.size()); JSONArray array = newJSONArray(users.size()); for(User u :users){ JSONObject obj = new JSONObject(); obj.put("firstname",u.getFirstName()); obj.put("lastname",u.getLastName()); array.add(obj); } return array; } @javax.ws.rs.Path("/createuser") @javax.ws.rs.POST @javax.ws.rs.Consumes("application/json") @javax.ws.rs.Produces("application/json") public JSONObjectcreateUser(JSONObject obj){ User user = new User(); String firstName = (String)obj.get("firstname"); String lastName = (String)obj.get("firstname"); user.setFirstName(firstName); user.setLastName(lastName); this.users.add(user); for(User u : users){ System.out.println(u.getFirstName()+": "+u.getLastName()); } JSONObject response = new JSONObject(); response.put("firstname",user.getFirstName()); response.put("lastname",user.getLastName()); return response; } }
在这个服务中,我们使用了javax.ws.rs中有几个常用的标注用于创建GET和POST的RESTful服务,以及JSON4J的API。
最后把该Web Project发布到WAS上,就可以利用一些第三方测试工具(如REST Client)对该服务进行测试。
关于客户端:
比较遗憾的是,JAX-RS 1.0没有带标准的Java Client API。但是我们可以用一些第三方库来调用JAX-RS服务。这里有个讨论帖子
JAX-RS is perfect for implementing REST. What do you use to call REST services in Java?
high-level: REST Service的库,比如Restlet,Jersey,RESTEasy,Apache CXF等。
好消息是,JavaEE7发布的JAX-RS2.0开始带标准的Java Client API,期待中。。。
这篇文章写得非常好,包括如何用JAX-RS/Jersey创建服务端,如何用URL编程、HttpClient、Jersey来访问服务
How to build RESTful Service with Java using JAX-RS and Jersey (Example) http://crunchify.com/how-to-build-restful-service-with-java-using-jax-rs-and-jersey/ 个人比较倾向于Jersey,因为它是JAX-RS的标准实现,可以和JAX-RS的规范接轨。另外的好处是,可以在Jersey Client的API中直接Marshell Pojo,无需再去处理返回的字符串(主要为XML或JSON格式字符串)。文档http://stackoverflow.com/questions/10924984/jax-rs-jersey-client-marshaling-json-response-with-pojo-mapping-jackson中提到了一些注意事项。当然,有时候我们还是需要用JSON的API来解析JSON字符串,来自定义一些操作。
参考资料:
使用 JAX-RS 简化 REST 应用开发:http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/index.html
- 利用RAD和WAS开发JAX-RS服务
- java 利用JAX-RS快速开发RESTful 服务
- java 利用JAX-RS快速开发RESTful 服务
- java 利用JAX-RS快速开发RESTful 服务
- java 利用JAX-RS快速开发RESTful 服务
- java 利用JAX-RS快速开发RESTful 服务
- java 利用JAX-RS快速开发RESTful 服务
- java 利用JAX-RS快速开发RESTful 服务
- JAX-RS:开发一个简单的服务
- JAX-RS:开发一个简单的服务
- JAX-RS 和 和 Spring 整合开发
- JAX-RS 和 Spring 整合开发
- 利用JAX-WS RI开发JAX-WS服务
- 利用JAX-WS开发Web服务
- 利用JAX-WS开发Web服务
- 利用Apache Axis开发JAX-RPC服务
- 利用JAX-WS开发Web服务
- 利用JAX-WS开发Web服务
- 【Android社区】史上最牛最全android开发知识汇总
- 人们眼中的程序员
- (百例编程)82.四方定理
- phpunit 在kohana3.3中的使用方法
- Jython
- 利用RAD和WAS开发JAX-RS服务
- 收集一下核函数-Kernel Function
- 【VB6至VB.Net的进步】字符串转UTF-8的URL
- 笔试题
- 进程概述及创建(VC_Win32)
- 某天是星期几
- 第一,谈谈final, finally,finalize的区别。
- HDU 4091 - Zombie’s Treasure Chest
- showModalDialog