code: public String calculateActionPathByJspPath(String requestPath) { // only for JSP
          final String lastPathElement = substringLastRear(requestPath, URL_DELIMITER);
          if (!lastPathElement.contains(".")) { // no JSP
              return requestPath;
          }
          // basically JSP here
          final String frontPathElement = substringLastFront(requestPath, URL_DELIMITER);
          final String fileNameNoExt = substringLastFront(lastPathElement, ".");
          final String pathBase = frontPathElement + URL_DELIMITER;
          if (!fileNameNoExt.contains("_")) { // e.g. list.jsp
              return pathBase; // e.g. /member/ (submit name is needed in this case)
          }
          // the file name has package prefix here
          // e.g. /member/member_list.jsp or /member/list/member_purchase_list.jsp
          final List<String> wordList = splitList(fileNameNoExt, "_"); // e.g. [member, list] or [member, purchase, list]
          if (wordList.size() < 2) { // no way (just in case)
              return pathBase;
          }
          final String firstHit = resolveJspActionPath(requestPath, frontPathElement, pathBase, wordList);
          if (firstHit != null) {
              return firstHit; // e.g. /member/list/ (from /member/member_list.jsp)
          }
          final List<String> retryList = prepareHtmlRetryWordList(requestPath, wordList);
          if (retryList != null && !retryList.isEmpty()) { // e.g. [member, list] (from sp_member_list.jsp)
              final String retryHit = resolveJspActionPath(requestPath, frontPathElement, pathBase, retryList);
              if (retryHit != null) {
                  return retryHit; // e.g. /member/list/ (from /member/sp_member_list.jsp)
              }
          }
          // e.g. /member/purchase_list.jsp
          return pathBase; // e.g. /member/ (submit name is needed in this case)
      }
docs: ======================