Controller是MVC中的C,用来接收和处理浏览器提交的信息的核心类.
Jfinal的访问流程:
当一个请求发送过来的时候,会去调用JfinalFilter过滤器,然后逐层调用Handle,Handle是实现JfinalFilter类中configHandler(Handlers handlers)方法自己加的,没有配置Handle的话会默认走ActionHandler,
这里我们简单的分析下JfinalFilter的doFilter方法:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
//获取request和response
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
//设置在实现类中设置的字符编码
request.setCharacterEncoding(this.encoding);
//相对路径
String target = request.getRequestURI();
if (this.contextPathLength != 0) {
target = target.substring(this.contextPathLength);
}
boolean[] isHandled = new boolean[]{false};
try {
//这边的handle会去实现类configHandler(Handlers handlers)中找自己定义的handle,如果没有,会默认执行ActionHandler中的handle()方法.
this.handler.handle(target, request, response, isHandled);
} catch (Exception var10) {
if (log.isErrorEnabled()) {
String qs = request.getQueryString();
log.error(qs == null ? target : target + "?" + qs, var10);
}
}
if (!isHandled[0]) {
chain.doFilter(request, response);
}
}
ActionHandle中的handle方法
public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
//target.indexOf(46)是看target中有没有包含"."
if (target.indexOf(46) == -1) {
isHandled[0] = true;
String[] urlPara = new String[]{null};
Action action = this.actionMapping.getAction(target, urlPara);
if (action == null) {
//找不到映射方法,直接返回404
if (log.isWarnEnabled()) {
String qs = request.getQueryString();
log.warn("404 Action Not Found: " + (qs == null ? target : target + "?" + qs));
}
renderManager.getRenderFactory().getErrorRender(404).setContext(request, response).render();
} else {
Controller controller = null;
try {
String actionUrl;
try {
controller = this.controllerFactory.getController(action.getControllerClass());
controller.init(action, request, response, urlPara[0]);
if (this.devMode) {
//开发模式
if (ActionReporter.isReportAfterInvocation(request)) {
//先执行方法后打印日志
(new Invocation(action, controller)).invoke();
ActionReporter.report(target, controller, action);
} else {
//先打印日志,后执行方法
ActionReporter.report(target, controller, action);
(new Invocation(action, controller)).invoke();
}
} else {
//不是开发模式,直接执行方法
(new Invocation(action, controller)).invoke();
}
Render render = controller.getRender();
if (!(render instanceof ForwardActionRender)) {
if (render == null) {
render = renderManager.getRenderFactory().getDefaultRender(action.getViewPath() + action.getMethodName());
}
render.setContext(request, response, action.getViewPath()).render();
return;
}
actionUrl = ((ForwardActionRender)render).getActionUrl();
if (target.equals(actionUrl)) {
throw new RuntimeException("The forward action url is the same as before.");
}
this.handle(actionUrl, request, response, isHandled);
} catch (RenderException var17) {
if (log.isErrorEnabled()) {
actionUrl = request.getQueryString();
log.error(actionUrl == null ? target : target + "?" + actionUrl, var17);
}
return;
} catch (ActionException var18) {
int errorCode = var18.getErrorCode();
String msg = null;
if (errorCode == 404) {
msg = "404 Not Found: ";
} else if (errorCode == 401) {
msg = "401 Unauthorized: ";
} else if (errorCode == 403) {
msg = "403 Forbidden: ";
}
String qs;
if (msg != null) {
if (log.isWarnEnabled()) {
qs = request.getQueryString();
log.warn(msg + (qs == null ? target : target + "?" + qs));
}
} else if (log.isErrorEnabled()) {
qs = request.getQueryString();
log.error(qs == null ? target : target + "?" + qs, var18);
}
var18.getErrorRender().setContext(request, response, action.getViewPath()).render();
return;
} catch (Exception var19) {
if (log.isErrorEnabled()) {
actionUrl = request.getQueryString();
log.error(actionUrl == null ? target : target + "?" + actionUrl, var19);
}
renderManager.getRenderFactory().getErrorRender(500).setContext(request, response, action.getViewPath()).render();
return;
}
} finally {
if (controller != null) {
controller.clear();
}
}
}
}
}