①从web.xml文件中可以看出jfinal框架本质上是一个Filter
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>jfinal</display-name> <filter> <filter-name>jfinal</filter-name> <filter-class>com.jfinal.core.JFinalFilter</filter-class> <init-param> <param-name>configClass</param-name> <param-value>com.demo.config.DemoConfig</param-value> </init-param> </filter> <filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> </web-app>
②JFinalFilter重写了doFilter方法,所有的处理都在该方法中完成
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)res; request.setCharacterEncoding(encoding); String target = request.getRequestURI(); if (contextPathLength != 0) target = target.substring(contextPathLength); boolean[] isHandled = {false}; try { handler.handle(target, request, response, isHandled); } catch (Exception e) { if (log.isErrorEnabled()) { String qs = request.getQueryString(); log.error(qs == null ? target : target + "?" + qs, e); } } if (isHandled[0] == false) chain.doFilter(request, response); }
Handler的实现类
③Hander接口有多个实现类,我们分析ActionHandler的handler()方法
/** * handle * 1: Action action = actionMapping.getAction(target) * 2: new ActionInvocation(...).invoke() * 3: render(...) */ public final void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) { if (target.indexOf(".") != -1) { return ; } isHandled[0] = true; String[] urlPara = {null}; Action action = actionMapping.getAction(target, urlPara); //根据ActionMapping中的映射获取处理当前请求的Action if (action == null) { if (log.isWarnEnabled()) { String qs = request.getQueryString(); log.warn("404 Action Not Found: " + (qs == null ? target : target + "?" + qs)); } renderFactory.getErrorRender(404).setContext(request, response).render(); return ; } try { Controller controller = action.getControllerClass().newInstance(); //实例化Controller处理类 controller.init(request, response, urlPara[0]); //初始化Controller if (devMode) { boolean isMultipartRequest = ActionReporter.reportCommonRequest(controller, action); new ActionInvocation(action, controller).invoke(); if (isMultipartRequest) ActionReporter.reportMultipartRequest(controller, action); } else { new ActionInvocation(action, controller).invoke(); //调用Controller中相应的处理方法(详见) } Render render = controller.getRender(); //根据Controller中的设置获取数据和视图的对应类Render if (render instanceof ActionRender) { //如果render是一个ActionRender,则再交给对应的Handler处理 String actionUrl = ((ActionRender)render).getActionUrl(); if (target.equals(actionUrl)) throw new RuntimeException("The forward action url is the same as before."); else handle(actionUrl, request, response, isHandled); return ; } if (render == null) //如果render,则使用默认Render render = renderFactory.getDefaultRender(action.getViewPath() + action.getMethodName()); render.setContext(request, response, action.getViewPath()).render(); //调用Render实现类的render()方法进行渲染 } catch (RenderException e) { if (log.isErrorEnabled()) { String qs = request.getQueryString(); log.error(qs == null ? target : target + "?" + qs, e); } } catch (ActionException e) {
Render的实现类
④在ActionInvocation的invoke()方法中,请求先经过一系列拦截器
/** * Invoke the action. */ public void invoke() { if (index < inters.length) inters[index++].intercept(this); else if (index++ == inters.length) // index++ ensure invoke action only one time // try {action.getMethod().invoke(controller, NULL_ARGS);} catch (Exception e) {throw new RuntimeException(e);} try { action.getMethod().invoke(controller, NULL_ARGS); } catch (InvocationTargetException e) { Throwable cause = e.getTargetException(); if (cause instanceof RuntimeException) throw (RuntimeException)cause; throw new RuntimeException(e); } catch (RuntimeException e) { throw e; } catch (Exception e) { throw new RuntimeException(e); } }
相关推荐
反之,如果Token正确,服务器会继续处理请求。 5. **Token的过期与刷新**:为了增加安全性,Token通常设置有有效期。一旦过期,客户端需要重新获取新的Token。有时,服务器也会提供一个刷新Token的功能,允许客户端...
Jfinal的核心组件包括:Controller、Model、View和Interceptor(拦截器),它们共同构成了一个完整的Web应用程序。Jfinal还支持多种数据库,如MySQL、Oracle等,并且提供了ActiveRecord模式,使得数据库操作更加便捷...
通过自定义控制器,开发者可以控制请求的处理流程。 2. `Model`:JFinal 的 Model 类是数据操作的基础,提供了自动映射数据库记录到 Java 对象的功能。通过注解或配置文件,可以定义字段与数据库列的对应关系,简化...
### JFinalDemo流程详解 #### 一、JFinal框架简介 JFinal是一个基于Java语言的极速Web+ORM框架,它的核心设计理念在于简化开发过程、减少代码量、易于学习与使用,同时保持强大的功能和轻量级特性。通过采用MVC...
- **Handler**:Handler是JFinal的核心组件之一,它负责对请求进行进一步处理,如解析参数、处理异常等。 - **Action**:Action 类对应于具体的业务逻辑,是对用户请求的响应。开发者可以定义自己的Action类,...
在整个过程中,JFinal负责接收请求,展示页面,而Activiti则负责流程的流转和状态管理。 六、总结 JFinal与Activiti的整合,为Java Web应用提供了强大的业务流程管理能力。通过Jetty的嵌入式服务,整个应用变得...
JFinal采用MVC(Model-View-Controller)架构模式,通过Action来处理HTTP请求,将数据模型与视图层分离,提高了代码的可维护性和可扩展性。JFinal提供了一套强大的API,如Interceptor(拦截器)用于实现AOP(面向切...
1. **平台架构**:利用Jfinal作为后端框架,处理HTTP请求,实现业务逻辑,并通过Snaker进行流程控制。这样,Jfinal可以专注于快速响应用户请求,而Snaker则负责流程的流转和决策。 2. **业务流程**:对于需要审批或...
1. **拦截器(Interceptor)**:JFinal的拦截器允许在请求处理前后插入自定义逻辑,实现权限控制、日志记录等功能。 2. **插件(Plugin)**:JFinal提供了丰富的插件支持,如ActiveRecord、Shiro安全框架、Quartz定时...
**Controller** 类是 MVC 架构中的控制器部分,在 JFinal 中用于处理用户的请求并控制流程。具体包括以下功能: 1. **Action**:控制器的方法通常被称为 Action,负责处理 HTTP 请求。 2. **getPara 系列方法**:...
通过“jfinaldemo”实例,你可以逐步学习并实践这些步骤,理解JFinal如何将请求转发给控制器,如何通过Service处理业务,再到视图展示结果。同时,还可以了解JFinal的配置方式、数据库操作、模板引擎使用等,全面...
在 JFinal 中,我们创建一个 Controller 类,继承 `com.jfinal.core.Controller`,然后定义对应的方法来处理请求。 **视图(View)** 视图层负责展示数据。JFinal 支持 Velocity 和 FreeMarker 两种模板语言,...
- **configInterceptor()**:注册拦截器,用于处理请求前后的逻辑,如权限验证、日志记录等。 - **configHandler()**:配置处理器,处理特定的请求或响应,如错误处理、上传下载等。 #### 四、Controller与...
在项目中,可以定义JFinal的Controller类,这些类会处理HTTP请求,并通过Db和Record进行数据库操作。由于Spring Boot和JFinal都遵循了 MVC 模式,所以Controller可以很容易地与Spring Boot的Restful风格相结合,提供...
1. Controller:控制器是处理请求的入口,通过注解定义路由,调用Service层处理业务逻辑。 2. Model:模型层封装了数据库操作,与数据库表进行映射,提供CRUD(创建、读取、更新、删除)功能。 3. Service:服务层...
4. **创建Controller**:按照JFinal的约定,创建Controller类,定义处理请求的方法。 5. **编写Model**:JFinal支持ActiveRecord模式,创建Model类并关联数据库表,方便进行CRUD操作。 四、JFinal 3.3 主要模块详解...
Controller 负责处理请求,Model 处理业务逻辑,View 负责数据展示,三者分工明确,降低了代码的耦合度。 2. AOP 支持:JFinal 提供了基于注解的 AOP(面向切面编程)支持,如 @Before、@After 等,可以方便地进行...
通过分析和运行这些Demo,开发者能快速上手,了解Jfinal3.0的实际运用技巧,如如何进行表单验证、如何处理Ajax请求、如何使用拦截器等。 此外,Jfinal3.0还强调模块化设计,鼓励开发者通过插件进行功能扩展。例如,...
3. 性能优化:通过对核心模块的重构,JFinal 3.1 在处理请求速度上有所提升,进一步降低了系统开销。 4. 日志升级:引入了新的日志框架,提供了更好的日志管理,便于开发者调试和追踪问题。 5. 异常处理:增强了异常...
通过阅读这些源码,我们可以了解到JFinal如何优雅地处理Web请求,如何利用AOP进行业务逻辑扩展,以及如何通过简单的配置实现数据库操作和模板渲染。这对于提升我们的Java Web开发能力,理解MVC架构的内在运作,甚至...