学习黄勇smart-framework的笔记
黄勇的码云地址:https://gitee.com/huangyong/smart-framework
黄勇的oschina博客地址:https://my.oschina.net/huangyong/blog/158380
mvc就是将请求中的路径分配给对应的方法,一切都是从DispatcherServlet开始。
/**
* 前端控制器
* 把请求对应到响应的action方法中
* 我们对javax.servlet进行封装,来实现mvc,实际进行http处理的还是servlet
* 通过继承HttpServelet实现,HttpServelet提供了处理get,post等请求的方法,
* 实现service方法,重写对请求的处理
* @author huangyong
* @since 1.0
*/
@WebServlet(urlPatterns = "/*", loadOnStartup = 0)
public class DispatcherServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(DispatcherServlet.class);
// 映射处理器,用来设置请求与action中方法的对应关系
private HandlerMapping handlerMapping = InstanceFactory.getHandlerMapping();
// 调用处理器,通过反射调用action中的方法,并处理返回的结果
private HandlerInvoker handlerInvoker = InstanceFactory.getHandlerInvoker();
// 异常处理器,处理web层的异常
private HandlerExceptionResolver handlerExceptionResolver = InstanceFactory.getHandlerExceptionResolver();
@Override
public void init(ServletConfig config) throws ServletException {
// 初始化相关配置
// servletContext 是整个servlet的全局环境
ServletContext servletContext = config.getServletContext();
UploadHelper.init(servletContext);
}
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置请求编码方式
request.setCharacterEncoding(FrameworkConstant.UTF_8);
// 获取当前请求的方式
String currentRequestMethod = request.getMethod();
// 获取请求路径
String currentRequestPath = WebUtil.getRequestPath(request);
logger.debug("[Smart] {}:{}", currentRequestMethod, currentRequestPath);
// 将“/”请求重定向到首页
if (currentRequestPath.equals("/")) {
WebUtil.redirectRequest(FrameworkConstant.HOME_PAGE, request, response);
return;
}
// 去掉当前请求路径末尾的“/”,如果有“/”的话
if (currentRequestPath.endsWith("/")) {
currentRequestPath = currentRequestPath.substring(0, currentRequestPath.length() - 1);
}
// 获取 Handler,Handler中有处理当前请求所需要的参数
Handler handler = handlerMapping.getHandler(currentRequestMethod, currentRequestPath);
// 若未找到 Action,则跳转到 404 页面
if (handler == null) {
WebUtil.sendError(HttpServletResponse.SC_NOT_FOUND, "", response);
return;
}
// 初始化 DataContext
// DataContext 将request和 response 封装在了ThreadLocal中, 一个线程一个DataContext
// 保证之后获取的 request,response ,session等对象都是当前线程产生的
DataContext.init(request, response);
try {
// 调用 Handler
handlerInvoker.invokeHandler(request, response, handler);
} catch (Exception e) {
// 处理 Action 异常
handlerExceptionResolver.resolveHandlerException(request, response, e);
} finally {
// 销毁 DataContext
DataContext.destroy();
}
}
}