package org.neframework.mvc.core; import java.io.IOException; import java.lang.reflect.Method; import java.util.List; import java.util.logging.Logger; import java.util.regex.Pattern; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.neframework.mvc.annotation.ResponseBody; import org.neframework.mvc.util.FormTools; import org.neframework.mvc.util.WebTools; import org.neframework.mvc.util.json.JsonTools; import org.neframework.mvc.web.interceptor.InteceptorInvoke; public class DispatcherServlet extends HttpServlet { private static final long serialVersionUID = 1L; private Logger log = Logger.getLogger("ne framework DispatcherServlet"); @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取web访问的地址url String webUrl = WebTools.getUri(req); log.info(webUrl); // 封装Controller(action)映射到map ControlModel cm = ActionInvoke.getControllModel(webUrl); if (cm == null) { log.info("end --->" + webUrl); resp.sendError(404); return; } Class<?> actionClass = cm.getAction(); Method method = cm.getMethod(); Pattern restPattern = cm.getRestPattern(); try { // 初始化action实例 BaseController action = (BaseController) actionClass.newInstance(); action.setReq(req); action.setResp(resp); // 执行前置拦截器 boolean before = InteceptorInvoke.invokeBefore(action, method, req, resp); if (before == false) { return; } // 封装 form bean List<Object> params = null; if (restPattern != null) { params = FormTools.getFormBeanRest(method, webUrl, restPattern, req, resp); } else { params = FormTools.getFormBean(method, req, resp); } Object invoke = method.invoke(action, params.toArray()); if (invoke != null && method.getReturnType() == String.class) { action.return_url = invoke.toString(); } // 执行后置拦截器 boolean after = InteceptorInvoke.invokeAfter(action, method, req, resp); if (after == false) { return; } /** * 判断返回值,确定重定向还是转发 */ // ajax 方式 if (method.isAnnotationPresent(ResponseBody.class)) { if (method.getReturnType() == String.class) { resp.getWriter().print(action.return_url); } else { resp.getWriter().print(JsonTools.toJson(action.result)); } resp.getWriter().flush(); return; } else if (action.return_url != null) { // URL 方式 String return_url = action.return_url; if (return_url.startsWith("redirect:")) { return_url = return_url.substring(return_url.indexOf(":") + 1); String end_url = null; if (return_url.startsWith("http://")) { end_url = return_url; } else if (return_url.startsWith("/")) { end_url = req.getContextPath() + return_url; } else { int lastIndexOf = webUrl.lastIndexOf("/"); end_url = req.getContextPath() + webUrl.substring(0, lastIndexOf) + "/" + return_url; } resp.sendRedirect(end_url);// 重定向 } else { if (WebTools.isForward(req)) { req.getRequestDispatcher(return_url).forward(req, resp);// 转发 } else { // jsp:include 的情况 req.getRequestDispatcher(return_url).include(req, resp); } } } else { return; } } catch (Exception e) { e.printStackTrace(); } }// #doPost }