- 总体说明
XML和JSON 是最为常用的数据交换格式。本例子演示如何将java对象,转成XML/JSON输出。
2.流程
1.在上文的例子中,创建一个包“com.waylau.rest.bean”
2.在该包下创建一个JAVA类"User"
package com.waylau.rest.bean;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class User {
private String userId;
private String userName;
private String age;
public User() {};
public User(String userId, String userName, String age) {
this.userId = userId;
this.userName = userName;
this.age = age;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
注意:该类上面增加了一个注解“@XmlRootElement”,在将该类转化成XML时,说明这个是XML的根节点。
3.在“com.waylau.rest.resources”中,增加资源“UserResource“,代码如下:
package com.waylau.rest.resources;
import java.util.*;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import com.waylau.rest.bean.User;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
@Path("/users")
public class UserResource {
private static Map<String, User> userMap = new HashMap<String, User>();//存储用户
/**
* 增加
*
* @param user
*/
@POST
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void createStudent(User user) {
userMap.put(user.getUserId(), user);
}
/**
* 删除
*
* @param id
*/
@DELETE
@Path("/del/{id}")
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void deleteStudent(@PathParam("id") String id) {
userMap.remove(id);
}
/**
* 修改
*
* @param user
*/
@PUT
@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public void updateStudent(User user) {
userMap.put(user.getUserId(), user);
}
/**
* 根据id查询
*
* @param id
* @return
*/
@GET
@Path("/{id}")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public User getUserById(@PathParam("id") String id) {
User u = userMap.get(id);
return u;
}
/**
* 查询所有
*
* @return
*/
@GET
// @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public List<User> getAllUser() {
List<User> user = new ArrayList<User>();
user.addAll(userMap.values());
return user;
}
//
/**
* 查询所有
*
* @return
*/
@GET
@Path("/getUserXml")
@Produces(MediaType.APPLICATION_XML)
public User getUserXml() {
User user = new User();
user.setAge("21");
user.setUserId("004");
user.setUserName("Amand");
return user;
}
@GET
@Path("/getUserJson")
@Produces(MediaType.APPLICATION_JSON)
public User getUserJson() throws JSONException {
User user = new User();
user.setUserId("05");
user.setUserName("chenliu");
user.setAge("30");
return user;
}
}
最后在客户端新建一个client类
package com.waylau.rest.client;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import com.waylau.rest.bean.User;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
/**
* 用户客户端,用来测试资源
*/
public class UserClient {
private static String serverUri = "http://localhost:8080/api";
/**
* @param args
*/
public static void main(String[] args) {
addUser("01","zhangsan","15");
addUser("02","lisi","20");
addUser("03","wangwu","25");
getUserById("02");
System.out.println("----------------------");
getAllUser();
// getAllUser();
// updateUser();
// getAllUsers();
// delUser();
// getAllUsers();
}
/**
* 添加用户
*/
private static void addUser(String id,String name,String age) {
System.out.println("****增加用户addUser****");
User user = new User(id,name,age);
// Client client = ClientBuilder.newClient();
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class); // 注册json 支持
WebTarget target = client.target(serverUri + "/users");
Response response = target.request().buildPost(Entity.entity(user, MediaType.APPLICATION_XML)).invoke();
// User user1 = response.readEntity(User.class);
// System.out.println(user1.getUserId() + user1.getUserName() + user1.getAge());
System.out.println(response);
response.close();
}
/**
* 删除用户
*/
private static void delUser(String id) {
System.out.println("****删除用户****");
// Client client = ClientBuilder.newClient();
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class); // 注册json 支持
WebTarget target = client.target(serverUri + "/users/"+id);
Response response = target.request().delete();
response.close();
}
/**
* 修改用户
*/
private static void updateUser(String id,String name,String age) {
System.out.println("****修改用户updateUser****");
User user = new User(id,name,age);
// Client client = ClientBuilder.newClient();
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class); // 注册json 支持
WebTarget target = client.target(serverUri + "/users");
Response response = target.request().buildPut( Entity.entity(user, MediaType.APPLICATION_XML)).invoke();
response.close();
}
/**
* 根据id查询用户
*/
private static void getUserById(String id) {
System.out.println("****根据id查询用户****");
//Client client = ClientBuilder.newClient();
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);// 注册json 支持
WebTarget target = client.target(serverUri + "/users/"+id);
Response response = target.request().get();
User user = response.readEntity(User.class);
System.out.println(user.getUserId() + user.getUserName() + user.getAge());
response.close();
}
/**
* 查询所有用户
*/
private static void getAllUser() {
System.out.println("****查询所有getAllUsers****");
Client client = ClientBuilder.newClient().register(JacksonJsonProvider.class);// 注册json 支持
WebTarget target = client.target(serverUri + "/users");
Response response = target.request().get();
String value = response.readEntity(String.class);
JSONObject ab = JSONObject.fromObject(value);
System.out.println();
// System.out.println(user.getUserId() + user.getUserName() + user.getAge());
// }
response.close();
}
}
其中MediaType.APPLICATION_XML 说明了是以XML形式输出
在浏览器输入http://localhost:8080/api/users/getUserXml,输出单个对象
在浏览器输入 http://localhost:8080/api/users 输出对象的集合
------------------------------------------------------------------------------------------------
json
1.在上文项目中,
在“com.waylau.rest.resources.UserResource“中增加代码,代码如下:
@GET
@Path("/getUserJson")
@Produces(MediaType.APPLICATION_JSON)
public User getUserJson() {
User user = new User();
user.setAge("27");
user.setUserId("005");
user.setUserName("Fmand");
return user;
}
MediaType.APPLICATION_JSON 说明输出的是JSON格式
如果此时和xml一样的输入网址.则会报错,这是因为需要获取json转换包的支持
综合许多博客经验,都是选择 jackson-all-1.9.11.jar,而这个包比较难找,特存网盘中(链接: https://pan.baidu.com/s/1b49HiY 密码: e33e),项目中引入jackson-all-1.9.11.jar
2在“com.waylau.rest”目录下创建RestApplication.java
package com.waylau.rest;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.glassfish.jersey.filter.LoggingFilter;
import org.glassfish.jersey.server.ResourceConfig;
/**
* 应用
* @author waylau.com
* 2014-3-18
*/
public class RestApplication extends ResourceConfig {
public RestApplication() {
//服务类所在的包路径
packages("com.waylau.rest.resources");
//注册JSON转换器
register(JacksonJsonProvider.class);
}
}
3 修改web.xml,初始化从RestApplicaton进入应用,如下:
<servlet>
<servlet-name>Way REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.waylau.rest.RestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Way REST Service</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
4 运行项目,再次访问http://localhost:8080/api//users/getUserJson
即可输出JSON文本.不同浏览器出现的结果不同,这一步骤也许会出现各种各样的错误,应该是由于操作问题,请细心练习.