首先根据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.