先说明本篇文章要实现的功能,仍然做一些假设,当前系统是基于Restlet的企业信息管理系统,而关于企业员工的管理,已经有人力资源系统,那么需求是人资系统可以实时查看企业信息管理系统中的人员资料是否与自己系统中的资料,这就涉及到Get操作,而另外,如果人员资料在人资系统中改变或者新增加员工,则需要通知企业信息管理系统去做相应的维护。
下文将演示一个人资系统从企业信息管理系统取用户的操作,以及员工信息改变,而通知企业管理信息系统做相应变更的功能。实际变成过程中,基于上述描述,我们用HttpClient来模拟人资系统,通过get和put xml来实现我们想要的功能。
1. 从企业信息管理系统取员工信息,对应的resource是UserReource
public class UserResource extends Resource {
UserDAO userDAO;
String userId;
public UserResource(Context context, Request request, Response response) {
super(context, request, response);
userId = (String) request.getAttributes().get("userId");
getVariants().add(new Variant(MediaType.TEXT_PLAIN));
}
@Override
public Representation represent(Variant variant) {
// get user data from database through user id
User user = userDAO.getUserById(userId);
Representation representation = new StringRepresentation(getUserXml(user),
MediaType.TEXT_PLAIN);
return representation;
}
private String getUserXml(User user){
StringBuffer userXml = new StringBuffer();
userXml.append("<user id=\"1\">");
userXml.append("<name>ajax</name>");
userXml.append("<phone>13888888888</phone>");
userXml.append("<email>ajax@iteye.com</email>");
userXml.append("<address>Shanghai</address>");
userXml.append("</user>");
return userXml.toString();
}
public void setUserDAO(UserDAO userDAO){
this.userDAO = userDAO;
}
}
代码中的getUserXml是模拟真实环境中从数据库取值,然后转换成xml的过程,这样硬编码只是想让读者有个更清楚的认识。
然后用Httpclient模拟人资系统进行测试:
String url = "http://localhost:8080/restlet/resources/users/1";
HttpClient httpclient = new HttpClient();
Credentials defaultcreds = new UsernamePasswordCredentials("admin",
"admin");
httpclient.getState().setCredentials(AuthScope.ANY, defaultcreds);
GetMethod httpget = new GetMethod(url);
try {
httpclient.getHttpConnectionManager().getParams()
.setConnectionTimeout(1000 * 60);
httpclient.executeMethod(httpget);
System.out.println(new String(httpget.getResponseBody()));
} catch (HttpException e) {
System.out.println("Please check your provided http address!");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
httpget.releaseConnection();
}
注意上述代码中的System.out.println(new String(httpget.getResponseBody())); 如果没有错误的话,这行代码应该打印出整个从Server构建的XML:
<user id="1"> <name>ajax</name> <phone>13888888888</phone> <email>ajax@iteye.com</email> <address>Shanghai</address> </user>
如果在客户端(即模拟的人资系统)拿到上面的xml后,然后通过xml的工具分析,然后做相应的操作,这些都依赖于需求了。
2. 人资系统通知企业信息管理系统更新员工信息,对应的资源依然是UserResource,向UserResource加入一些代码:
@Override
public boolean allowPut() {
return true;
}
@Override
public void storeRepresentation(Representation entity) throws ResourceException {
try {
if(entity.getMediaType().equals(MediaType.TEXT_XML)){
String userXml = entity.getText();
User user = getInfoFromXml(userXml);
//update the user into db
}
} catch (IOException e) {
e.printStackTrace();
}
}
思路很简单,接收从客户端请求传来的xml,然后解析出需要的数据,根据这些数据,更新数据库。看看客户端代码:
String url = "http://localhost:8080/restlet/resources/users/1";
HttpClient httpclient = new HttpClient();
Credentials defaultcreds = new UsernamePasswordCredentials("admin",
"admin");
httpclient.getState().setCredentials(AuthScope.ANY, defaultcreds);
PutMethod put = new PutMethod(url);
StringBuffer userXml = new StringBuffer();
userXml.append("<user id=\"2\">").append("<name>Wood</name>").append(
"<phone>13555555555</phone>").append(
"<email>wood@iteye.com</email>").append(
"<address>Guangzhou</address>").append("</user>");
try {
put .setRequestEntity(new StringRequestEntity(userXml.toString(),
"text/xml", "utf-8"));
httpclient.getHttpConnectionManager().getParams()
.setConnectionTimeout(1000 * 60);
int status = httpclient.executeMethod(put);
System.out.println(status);
} catch (HttpException e) {
System.out.println("Please check your provided http address!");
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
put .releaseConnection();
}
本篇文章把企业信息管理系统(Restlet)作为服务端,着重演示了服务端如何相应相应相应的请求。实际上作为客户端的人资系统,例如获取xml后,同样需要解析之,并需要做进一步的处理;另外,发送xml过去更新员工信息,如果没有更新成功,要不要重发?还是不在发,这都是需要考虑的,还是那句话,这个要根据你项目的具体需求来的。所以,本篇文章就没有铺开展示了。