ofbiz 服务引擎(一) controller中服务的调用解析

本文深入探讨OFBiz服务引擎的工作原理,重点关注如何在Controller中调用服务,通过handler-controller.xml配置文件和RequestHandler的runEvent方法进行解析。
摘要由CSDN通过智能技术生成

首先根据handler-controller.xml文件中对应handler文件,然后运行RequestHandler中的runEvent方法,方法如下:


/**
     * @Description: 查找event处理句柄,并调用。通过request-map节点的event子节点的type属性值
     * 从handler节点的解析map(type非view)中查找类,即handler节点的class属性值,
     * 实例化、初始化后,其将调用其中处理event子节点中invoke属性值对应的方法。
     * @param request 请求对象
     * @param response 应答对象
     * @param event event对象
     * @param requestMap request-map节点对应的解析对象
     * @param trigger 调用的类别,如event、view
     * @throws EventHandlerException
     * @return: String
     */
    public String runEvent(HttpServletRequest request, HttpServletResponse response,
            ConfigXMLReader.Event event, ConfigXMLReader.RequestMap requestMap, String trigger) throws EventHandlerException {
        //根据request-map节点的子节点event的type属性值,从eventFactory中获取相应eventhandler实现类,即event的type属性值=handler的name属性值对应的handler中class属性值对应的eventhandler
    	EventHandler eventHandler = eventFactory.getEventHandler(event.type);
    	//调用处理句柄的invoke方法
        String eventReturn = eventHandler.invoke(event, requestMap, request, response);
        if (Debug.verboseOn() || (Debug.infoOn() && "request".equals(trigger))) Debug.logInfo("Ran Event [" + event.type + ":" + event.path + "#" + event.invoke + "] from [" + trigger + "], result is [" + eventReturn + "]", module);
        return eventReturn;
    }

      使用举例:

 <request-map uri="updateBlog">
        <security https="true" auth="true"/>
        <event type="service" invoke="updateContent"/>
        <response name="success" type="view" value="blogMain"/>
        <response name="error" type="view" value="EditBlog"/>
 </request-map>

    调用解析:

public class ServiceEventHandler implements EventHandler {

    public static final String module = ServiceEventHandler.class.getName();

    public static final String SYNC = "sync";
    public static final String ASYNC = "async";

    /**
     * @see com.hanlin.fadp.webapp.event.EventHandler#init(javax.servlet.ServletContext)
     */
    public void init(ServletContext context) throws EventHandlerException {
    }

    /**
     * @author 郑小康
     * 
     * 1.获取本地任务调度器
     *
     * 2.获取默认mode
     *
     * 3.获取event节点元素的path 如果为空的话mode赋值为SYNC,不为空就是其path
     *
     * 4.获取调用服务名,服务名不存在就扔出异常
     *
     * 5.获取本地化及session
     *
     * 6.通过调度器根据serviceName获取当前服务ModelService实例
     *
     * 7.判断是否是二进制请求,是的话获取属性值,注入到multiPartMap
     *
     * 8.获取request中的参数存入rawParametersMap这个Map
     *
     * 9.根据参数构造对应的这个map 获取值得优先级multiPartMap Attribute parameter session
     *
     * 10.调用夫妇服务,若有返回结果将该Map给遍历返回存入到request的Attribute中去
     *
     * */
    public String invoke(Event event, RequestMap requestMap, HttpServletRequest request, HttpServletResponse response) throws EventHandlerException {
        // make sure we have a valid reference to the Service Engine
        LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
        if (dispatcher == null) {
            throw new EventHandlerException("The local service dispatcher is null");
        }
        DispatchContext dctx = dispatcher.getDispatchContext();
        if (dctx == null) {
            throw new EventHandlerException("Dispatch context cannot be found");
        }

        // get the details for the service(s) to call
        String mode = SYNC;
        String serviceName = null;

        if (UtilValidate.isEmpty(event.path)) {
            mode = SYNC;
        } else {
            mode = event.path;
        }

        // make sure we have a defined service to call
        serviceName = event.invoke;
        if (serviceName == null) {
            throw new EventHandlerException("Service name (eventMethod) cannot be null");
        }
        if (Debug.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值