Restlet实战(十三)如何在Servlet中呼叫Restlet

看到这个题目,或许你会问,你之前的很多文章不都是与servlet有关吗?这不是重复吗?

 

No,假设你现在正在用MVC的framework,如Struts,Spring MVC等来建造一个Web系统,但是当前需求要求你的代码能灵活的与另外的一个系统对接。那么你想到了使用Restlet来构建Restful web service。因此,你想在你的servlet里面使用restlet。

 

场景是这样,但是理解起来其实很简单,如果和在servlet里面使用restlet。

 

首先拷贝一份Restlet里面关于ServletConverer的API doc里面的说明的代码:

 

Java代码   收藏代码
  1. public class TestServlet extends HttpServlet {  
  2.     private ServletConverter converter;  
  3.   
  4.     public void init() throws ServletException {  
  5.         super.init();  
  6.         this.converter = new ServletConverter(getServletContext());  
  7.   
  8.         Restlet trace = new Restlet(this.converter.getContext()) {  
  9.             public void handle(Request req, Response res) {  
  10.                 getLogger().info("Hello World");  
  11.                 res.setEntity("Hello World!", MediaType.TEXT_PLAIN);  
  12.             }  
  13.         };  
  14.   
  15.         this.converter.setTarget(trace);  
  16.     }  
  17.   
  18.     protected void service(HttpServletRequest req, HttpServletResponse res)  
  19.             throws ServletException, IOException {  
  20.         this.converter.service(req, res);  
  21.     }  
  22. }  

 

上面代码还是比较简单的,无非需要做三步:

1. 实例化一个ServletConverter

  

Java代码   收藏代码
  1. this.converter = new ServletConverter(getServletContext());  

 

2. 给第一步的ServletConverter实例设置一个restlet实例,这个实例在被调用时,执行restlet自己的代码

  

Java代码   收藏代码
  1. Restlet trace = new Restlet(this.converter.getContext()) {  
  2.     public void handle(Request req, Response res) {  
  3.         getLogger().info("Hello World");  
  4.         res.setEntity("Hello World!", MediaType.TEXT_PLAIN);  
  5.     }  
  6. };  
  7.   
  8. this.converter.setTarget(trace);  

 

3.调用执行的方法

   

Java代码   收藏代码
  1. this.converter.service(req, res);  

 

让我们打开源代码看一下上面的service方法:

 

Java代码   收藏代码
  1. public void service(HttpServletRequest request, HttpServletResponse response)  
  2.         throws ServletException, IOException {  
  3.     if (getTarget() != null) {  
  4.         Context.setCurrent(getContext());  
  5.   
  6.         // Convert the Servlet call to a Restlet call  
  7.         final ServletCall servletCall = new ServletCall(request  
  8.                 .getLocalAddr(), request.getLocalPort(), request, response);  
  9.         final HttpRequest httpRequest = toRequest(servletCall);  
  10.         final HttpResponse httpResponse = new HttpResponse(servletCall,  
  11.                 httpRequest);  
  12.   
  13.         // Adjust the relative reference  
  14.         httpRequest.getResourceRef().setBaseRef(getBaseRef(request));  
  15.   
  16.         // Adjust the root reference  
  17.         httpRequest.setRootRef(getRootRef(request));  
  18.   
  19.         // Handle the request and commit the response  
  20.         getTarget().handle(httpRequest, httpResponse);  
  21.         commit(httpResponse);  
  22.     } else {  
  23.         getLogger().warning("Unable to find the Restlet target");  
  24.     }  
  25. }  

 

上面代码的注释,已经清楚的说明整个调用过程,不再分析。

猜你喜欢

转载自chenjianfei2016.iteye.com/blog/2355192