コード例 #1
0
  @Override
  public void dispatcher(HttpServletRequest request, HttpServletResponse response) {
    String encoding = webContext.getEncoding();
    try {
      request.setCharacterEncoding(encoding);
    } catch (Throwable t) {
      log.error("dispatcher error", t);
    }
    response.setCharacterEncoding(encoding);

    String uri = request.getRequestURI();
    String prePath = request.getContextPath() + request.getServletPath();
    String invokeUri = uri.substring(prePath.length());
    String key = request.getMethod() + "@" + invokeUri;
    String beforeIntercept = "b#" + invokeUri;
    String afterIntercept = "a#" + invokeUri;
    Set<MvcMetaInfo> beforeSet = webContext.getBean(beforeIntercept);
    Set<MvcMetaInfo> afterSet = webContext.getBean(afterIntercept);

    log.debug("uri map [{}]", key);
    MvcMetaInfo mvcMetaInfo = webContext.getBean(key);
    if (mvcMetaInfo != null) {
      Object ret = null;
      Object beforeRet = null; // 前置拦截器的返回值
      MvcMetaInfo lastBefore = null; // 最后得到的前置拦截器
      Object afterRet = null; // 后置拦截器的返回值
      MvcMetaInfo lastAfter = null; // 最后得到的后置拦截器

      // 前置拦截栈调用
      if (beforeSet != null) {
        for (MvcMetaInfo before : beforeSet) {
          Object[] beforeP = getParams(request, response, before, null);
          beforeRet = before.invoke(beforeP);
          if (beforeRet != null) {
            lastBefore = before;
            break;
          }
        }
      }

      if (beforeRet == null) {
        // controller调用
        Object[] p = getParams(request, response, mvcMetaInfo, null);
        ret = mvcMetaInfo.invoke(p);

        // 后置拦截栈调用
        if (afterSet != null) {
          for (MvcMetaInfo after : afterSet) {
            Object[] afterP = getParams(request, response, after, ret);
            afterRet = after.invoke(afterP);
            if (afterRet != null) {
              lastAfter = after;
              break;
            }
          }
        }
      }

      // 视图渲染
      try {
        if (afterRet != null) {
          lastAfter.getViewHandle().render(request, response, afterRet);
        } else if (beforeRet != null) {
          lastBefore.getViewHandle().render(request, response, beforeRet);
        } else {
          mvcMetaInfo.getViewHandle().render(request, response, ret);
        }
      } catch (Throwable t) {
        log.error("dispatcher error", t);
      }
    } else {
      String msg = request.getRequestURI() + " not register";
      SystemHtmlPage.responseSystemPage(
          request, response, webContext.getEncoding(), HttpServletResponse.SC_NOT_FOUND, msg);
    }
  }