// Path: src/main/java/org/smart4j/framework/FrameworkConstant.java
// public interface FrameworkConstant {
// 
//     String UTF_8 = "UTF-8";
// 
//     String CONFIG_PROPS = "smart.properties";
//     String SQL_PROPS = "smart-sql.properties";
// 
//     String PLUGIN_PACKAGE = "org.smart4j.plugin";
// 
//     String JSP_PATH = ConfigHelper.getString("smart.framework.app.jsp_path", "/WEB-INF/jsp/");
//     String WWW_PATH = ConfigHelper.getString("smart.framework.app.www_path", "/www/");
//     String HOME_PAGE = ConfigHelper.getString("smart.framework.app.home_page", "/index.html");
//     int UPLOAD_LIMIT = ConfigHelper.getInt("smart.framework.app.upload_limit", 10);
// 
//     String PK_NAME = "id";
// }
// 
// Path: src/main/java/org/smart4j/framework/InstanceFactory.java
// public class InstanceFactory {
// 
//     /**
//      * 用于缓存对应的实例
//      */
//     private static final Map<String, Object> cache = new ConcurrentHashMap<String, Object>();
// 
//     /**
//      * ClassScanner
//      */
//     private static final String CLASS_SCANNER = "smart.framework.custom.class_scanner";
// 
//     /**
//      * DataSourceFactory
//      */
//     private static final String DS_FACTORY = "smart.framework.custom.ds_factory";
// 
//     /**
//      * DataAccessor
//      */
//     private static final String DATA_ACCESSOR = "smart.framework.custom.data_accessor";
// 
//     /**
//      * HandlerMapping
//      */
//     private static final String HANDLER_MAPPING = "smart.framework.custom.handler_mapping";
// 
//     /**
//      * HandlerInvoker
//      */
//     private static final String HANDLER_INVOKER = "smart.framework.custom.handler_invoker";
// 
//     /**
//      * HandlerExceptionResolver
//      */
//     private static final String HANDLER_EXCEPTION_RESOLVER = "smart.framework.custom.handler_exception_resolver";
// 
//     /**
//      * ViewResolver
//      */
//     private static final String VIEW_RESOLVER = "smart.framework.custom.view_resolver";
// 
//     /**
//      * 获取 ClassScanner
//      */
//     public static ClassScanner getClassScanner() {
//         return getInstance(CLASS_SCANNER, DefaultClassScanner.class);
//     }
// 
//     /**
//      * 获取 DataSourceFactory
//      */
//     public static DataSourceFactory getDataSourceFactory() {
//         return getInstance(DS_FACTORY, DefaultDataSourceFactory.class);
//     }
// 
//     /**
//      * 获取 DataAccessor
//      */
//     public static DataAccessor getDataAccessor() {
//         return getInstance(DATA_ACCESSOR, DefaultDataAccessor.class);
//     }
// 
//     /**
//      * 获取 HandlerMapping
//      */
//     public static HandlerMapping getHandlerMapping() {
//         return getInstance(HANDLER_MAPPING, DefaultHandlerMapping.class);
//     }
// 
//     /**
//      * 获取 HandlerInvoker
//      */
//     public static HandlerInvoker getHandlerInvoker() {
//         return getInstance(HANDLER_INVOKER, DefaultHandlerInvoker.class);
//     }
// 
//     /**
//      * 获取 HandlerExceptionResolver
//      */
//     public static HandlerExceptionResolver getHandlerExceptionResolver() {
//         return getInstance(HANDLER_EXCEPTION_RESOLVER, DefaultHandlerExceptionResolver.class);
//     }
// 
//     /**
//      * 获取 ViewResolver
//      */
//     public static ViewResolver getViewResolver() {
//         return getInstance(VIEW_RESOLVER, DefaultViewResolver.class);
//     }
// 
//     @SuppressWarnings("unchecked")
//     public static <T> T getInstance(String cacheKey, Class<T> defaultImplClass) {
//         // 若缓存中存在对应的实例，则返回该实例
//         if (cache.containsKey(cacheKey)) {
//             return (T) cache.get(cacheKey);
//         }
//         // 从配置文件中获取相应的接口实现类配置
//         String implClassName = ConfigHelper.getString(cacheKey);
//         // 若实现类配置不存在，则使用默认实现类
//         if (StringUtil.isEmpty(implClassName)) {
//             implClassName = defaultImplClass.getName();
//         }
//         // 通过反射创建该实现类对应的实例
//         T instance = ObjectUtil.newInstance(implClassName);
//         // 若该实例不为空，则将其放入缓存
//         if (instance != null) {
//             cache.put(cacheKey, instance);
//         }
//         // 返回该实例
//         return instance;
//     }
// }


import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.smart4j.framework.FrameworkConstant;
import org.smart4j.framework.InstanceFactory;
import org.smart4j.framework.util.WebUtil;
package org.smart4j.framework.mvc;


/**
 * 前端控制器
 *
 * @author huangyong
 * @since 1.0
 */
@WebServlet(urlPatterns = "/*", loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {

    private static final Logger logger = LoggerFactory.getLogger(DispatcherServlet.class);

// Path: src/main/java/org/smart4j/framework/FrameworkConstant.java
// public interface FrameworkConstant {
// 
//     String UTF_8 = "UTF-8";
// 
//     String CONFIG_PROPS = "smart.properties";
//     String SQL_PROPS = "smart-sql.properties";
// 
//     String PLUGIN_PACKAGE = "org.smart4j.plugin";
// 
//     String JSP_PATH = ConfigHelper.getString("smart.framework.app.jsp_path", "/WEB-INF/jsp/");
//     String WWW_PATH = ConfigHelper.getString("smart.framework.app.www_path", "/www/");
//     String HOME_PAGE = ConfigHelper.getString("smart.framework.app.home_page", "/index.html");
//     int UPLOAD_LIMIT = ConfigHelper.getInt("smart.framework.app.upload_limit", 10);
// 
//     String PK_NAME = "id";
// }
// 
// Path: src/main/java/org/smart4j/framework/InstanceFactory.java
// public class InstanceFactory {
// 
//     /**
//      * 用于缓存对应的实例
//      */
//     private static final Map<String, Object> cache = new ConcurrentHashMap<String, Object>();
// 
//     /**
//      * ClassScanner
//      */
//     private static final String CLASS_SCANNER = "smart.framework.custom.class_scanner";
// 
//     /**
//      * DataSourceFactory
//      */
//     private static final String DS_FACTORY = "smart.framework.custom.ds_factory";
// 
//     /**
//      * DataAccessor
//      */
//     private static final String DATA_ACCESSOR = "smart.framework.custom.data_accessor";
// 
//     /**
//      * HandlerMapping
//      */
//     private static final String HANDLER_MAPPING = "smart.framework.custom.handler_mapping";
// 
//     /**
//      * HandlerInvoker
//      */
//     private static final String HANDLER_INVOKER = "smart.framework.custom.handler_invoker";
// 
//     /**
//      * HandlerExceptionResolver
//      */
//     private static final String HANDLER_EXCEPTION_RESOLVER = "smart.framework.custom.handler_exception_resolver";
// 
//     /**
//      * ViewResolver
//      */
//     private static final String VIEW_RESOLVER = "smart.framework.custom.view_resolver";
// 
//     /**
//      * 获取 ClassScanner
//      */
//     public static ClassScanner getClassScanner() {
//         return getInstance(CLASS_SCANNER, DefaultClassScanner.class);
//     }
// 
//     /**
//      * 获取 DataSourceFactory
//      */
//     public static DataSourceFactory getDataSourceFactory() {
//         return getInstance(DS_FACTORY, DefaultDataSourceFactory.class);
//     }
// 
//     /**
//      * 获取 DataAccessor
//      */
//     public static DataAccessor getDataAccessor() {
//         return getInstance(DATA_ACCESSOR, DefaultDataAccessor.class);
//     }
// 
//     /**
//      * 获取 HandlerMapping
//      */
//     public static HandlerMapping getHandlerMapping() {
//         return getInstance(HANDLER_MAPPING, DefaultHandlerMapping.class);
//     }
// 
//     /**
//      * 获取 HandlerInvoker
//      */
//     public static HandlerInvoker getHandlerInvoker() {
//         return getInstance(HANDLER_INVOKER, DefaultHandlerInvoker.class);
//     }
// 
//     /**
//      * 获取 HandlerExceptionResolver
//      */
//     public static HandlerExceptionResolver getHandlerExceptionResolver() {
//         return getInstance(HANDLER_EXCEPTION_RESOLVER, DefaultHandlerExceptionResolver.class);
//     }
// 
//     /**
//      * 获取 ViewResolver
//      */
//     public static ViewResolver getViewResolver() {
//         return getInstance(VIEW_RESOLVER, DefaultViewResolver.class);
//     }
// 
//     @SuppressWarnings("unchecked")
//     public static <T> T getInstance(String cacheKey, Class<T> defaultImplClass) {
//         // 若缓存中存在对应的实例，则返回该实例
//         if (cache.containsKey(cacheKey)) {
//             return (T) cache.get(cacheKey);
//         }
//         // 从配置文件中获取相应的接口实现类配置
//         String implClassName = ConfigHelper.getString(cacheKey);
//         // 若实现类配置不存在，则使用默认实现类
//         if (StringUtil.isEmpty(implClassName)) {
//             implClassName = defaultImplClass.getName();
//         }
//         // 通过反射创建该实现类对应的实例
//         T instance = ObjectUtil.newInstance(implClassName);
//         // 若该实例不为空，则将其放入缓存
//         if (instance != null) {
//             cache.put(cacheKey, instance);
//         }
//         // 返回该实例
//         return instance;
//     }
// }


// Path: src/main/java/org/smart4j/framework/mvc/DispatcherServlet.java
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.smart4j.framework.FrameworkConstant;
import org.smart4j.framework.InstanceFactory;
import org.smart4j.framework.util.WebUtil;

package org.smart4j.framework.mvc;


/**
 * 前端控制器
 *
 * @author huangyong
 * @since 1.0
 */
@WebServlet(urlPatterns = "/*", loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {

    private static final Logger logger = LoggerFactory.getLogger(DispatcherServlet.class);

    private HandlerMapping handlerMapping = InstanceFactory.getHandlerMapping();