servlet
servlet 结构如下图
在olingo中,我们需要添加在xml文件中添加如下代码
<servlet>
<servlet-name>ODataServiceServlet</servlet-name>
<servlet-class>org.apache.olingo.odata2.core.servlet.ODataServlet</servlet-class>
<init-param>
<param-name>org.apache.olingo.odata2.service.factory</param-name>
<param-value>myFactory</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ODataServiceServlet</servlet-name>
<url-pattern>/ODataSrv/*</url-pattern>
</servlet-mapping>
这里myFactory是继承了ODataServiceFactory的一个子类,需要我们来实现,里面包含了我们想要对外提供的一些数据返回的方法,servlet-mapping则映射到我们url中的位置。
在servlet中,先获得一个factory的实例
ODataServiceFactory serviceFactory = getServiceFactory(req);
然后对于每一个request请求,每次都从factory中拿到一个新的service
ODataService service = serviceFactory.createService(context);
最后通过handler处理并返回response
ODataRequestHandler requestHandler = new ODataRequestHandler(serviceFactory, service, context);
final ODataResponse odataResponse = requestHandler.handle(odataRequest);
至于handler怎么处理,实际上还是调用了serviceFactory里面的函数,这一部分就是我们需要实现的啦。
handle方法里面调用了dispatch
odataResponse =
dispatcher.dispatch(method, uriInfo, request.getBody(), request.getContentType(), acceptContentType.toContentTypeString());
public ODataResponse dispatch(final ODataHttpMethod method, final UriInfoImpl uriInfo, final InputStream content,
final String requestContentType, final String contentType) throws ODataException {
switch (uriInfo.getUriType()){
case URI0:
if (method == ODataHttpMethod.GET) {
return service.getServiceDocumentProcessor().readServiceDocument(uriInfo, contentType);
} else {
...
}
...
相当于分配一个URL到哪一个部分去实现,根据CRUD的种类等等,并返回一个response
最后讲讲serviceFactory 生成了什么东西,其实最后只返回两个东西给service:
return createODataSingleProcessorService(edmProvider, singleProcessor);
- edmProvider:用于提供metadata
- singleProcessor:用于处理CRUD操作
这两个是我们要去是实现的。