JFinalConfig
基于 JFinal 的 web 项目需要创建一个继承自 JFinalConfig 类的子类,该类用于对整个 web项目进行配置。JFinalConfig 子类需要实现五个抽象方法,如下所示:
1.configConstant(Constants me),此方法用来配置 JFinal 常量值,如开发模式常量 devMode 的配置,默认视图类型 ViewType的配置,如下代码配置了 JFinal 运行在开发模式下且默认视图类型为 JSP:
在开发模式下,JFinal 会对每次请求输出报告,如输出本次请求的 Controller、Method 以及请求所携带的参数。JFinal 支持 JSP、FreeMarker、Velocity 三种常用视图。
2.configRoute(Routes me) ,此方法用来配置 JFinal 访问路由,如下代码配置了将”/hello”映射到 HelloController 这个控制器, 通 过 以 下 的 配 置 ,http://localhost/hello 将 访 问 HelloController.index() 方法,而http://localhost/hello/methodName 将访问到 HelloController.methodName()方法。
Routes 类主要有如下两个方法:
第一个参数 controllerKey 是指访问某个 Controller 所需要的一个字符串,该字符串唯一对应一个 Controller,controllerKey 仅能定位到 Controller。第二个参数 controllerClass 是该controllerKey 所对应到的 Controller。第三个参数 viewPath 是指该 Controller 返回的视图的相对路径(该参数具体细节将在 Controller 相关章节中给出)。当 viewPath 未指定时默认值为controllerKey。
JFinal 路由规则如下表:
从表中可以看出,JFinal 访问一个确切的Action(Action 定义见3.2节)需要使用controllerKey与 method 来精确定位,当 method 省略时默认值为 index。urlPara 是为了能在 url 中携带参数值,urlPara 可以在一次请求中同时携带多个值,JFinal 默认使用减号“-”来分隔多个值(可通过 constants. setUrlParaSeparator(String)设置分隔符),在 Controller 中可以通过 getPara(int index)分别取出这些值。controllerKey、method、urlPara 这三部分必须使用正斜杠“/”分隔。 注意,controllerKey 自身也可以包含正斜杠“/”,如“/admin/article”,这样实质上实现了struts2 的 namespace 功能。
JFinal 在以上路由规则之外还提供了 ActionKey 注解,可以打破原有规则,以下是代码示例:
假定 UserController 的 controllerKey 值为“/user”,在使用了@ActionKey(“/login”)注解以后,actionKey 由原来的“/user/login”变为了“/login”。该注解还可以让 actionKey 中使用减号或数字等字符,如“/user/123-456”。
如果 JFinal 默认路由规则不能满足需求,开发者还可以根据需要使用 Handler 定制更加个性化的路由,大体思路就是在 Handler 中改变第一个参数 String target 的值。
JFinal 路由还可以进行拆分配置,这对大规模团队开发特别有用,以下是代码示例:
如上三段代码,FrontRoutes 类中配置了系统前端路由,AdminRoutes 配置了系统后端路由,MyJFinalConfig.configRoute(…)方法将拆分后的这两个路由合并起来。使用这种拆分配置不仅可以让 MyJFinalConfig 文件更简洁,而且有利于大规模团队开发,避免多人同时修改MyJFinalConfig 时的版本冲突。
3. configPlugin (Plugins me)
此方法用来配置 JFinal 的 Plugin,如下代码配置了 C3p0 数据库连接池插件与 ActiveRecord数据库访问插件。通过以下的配置,可以在应用中使用 ActiveRecord 非常方便地操作数据库。
JFinal 插件架构是其主要扩展方式之一,可以方便地创建插件并应用到项目中去。
4.configInterceptor (Interceptors me)
此方法用来配置 JFinal 的全局拦截器,全局拦截器将拦截所有 action 请求,除非使用@Clear 在 Controller 中清除,如下代码配置了名为 AuthInterceptor 的拦截器。
JFinal 的 Interceptor 非常类似于 Struts2,但使用起来更方便,Interceptor 配置粒度分为Global、Class、Method三个层次,其中以上代码配置粒度为全局。Class与Method级的Interceptor配置将在后续章节中详细介绍。
5.configHandler (Handlers me)
此方法用来配置JFinal的Handler,如下代码配置了名为ResourceHandler的处理器,Handler可以接管所有 web 请求,并对应用拥有完全的控制权,可以很方便地实现更高层的功能性扩展。
afterJFinalStart()与 beforeJFinalStop()
JFinalConfig中的afterJFinalStart()与beforeJFinalStop()方法供开发者在JFinalConfig继承类中覆盖。JFinal 会在系统启动完成后回调 afterJFinalStart()方法,会在系统关闭前回调beforeJFinalStop()方法。这两个方法可以很方便地在项目启动后与关闭前让开发者有机会进行额外操作,如在系统启动后创建调度线程或在系统关闭前写回缓存。
PropKit
PropKit 工具类用来操作外部配置文件。PropKit 可以极度方便地在系统任意时空使用,如下是示例代码:
如上代码所示,PropKit 可同时加载多个配置文件,第一个被加载的配置文件可以使用PorpKit.get(…)方法直接操作,非第一个被加载的配置文件则需要使用 PropKit.use(…).get(…)来操作。PropKit 的使用并不限于在 YourJFinalConfig 中,可以在项目的任何地方使用,JFinalConfig 的 getProperty 方法其底层依赖于 PropKit 实现。
相关推荐
- 定义一个抽象类 `Shape`,其中有一个抽象方法 `area()`。 - 创建两个子类 `Circle` 和 `Rectangle`,分别实现 `area()` 方法。 - 在测试类中,尝试实例化 `Shape` 会报错,因为它是抽象类。 通过上述概念和...
- 如果一个方法被声明为`final`,如`public final void myMethod()`,则不允许子类重写这个方法。 - `final`修饰变量时,如果是类级别的常量,通常遵循全大写命名约定,如`public static final String MY_CONSTANT...
方法重写是指子类中提供一个和父类中同名的方法,但是这个方法的实现不同。方法重载是指多个同名的方法,但是参数列表不同。 3. 抽象类 抽象类是指不能被实例化的类,抽象类可以包含抽象方法、普通方法、构造方法...
- 抽象类:至少包含一个抽象方法的类必须被声明为抽象类,用`abstract`关键字标识。抽象类可以包含抽象方法,也可以有非抽象方法(即已实现的方法)。 2. **继承抽象类** - 子类继承抽象类时,如果不想让子类也...
例如,在设计一个图形绘制系统时,可以定义一个抽象类`Shape`,它包含一个抽象方法`draw()`,所有具体形状类(如`Circle`、`Rectangle`等)都继承自`Shape`类,并且必须实现`draw()`方法。 #### 五、代码示例解析 ...
今天我们将深入探讨这个主题,特别是在Java基础课程的第五天,讲师徐培成讲解的"抽象类-抽象方法-修饰符组合"部分。下面将详细阐述相关知识点。 首先,我们来了解什么是抽象类。在Java中,抽象类是一种不能被实例化...
如果一个类包含至少一个抽象方法,那么该类必须声明为抽象类,使用`abstract`关键字修饰。 2. **抽象方法** 抽象方法不包含任何实现代码,只定义了方法签名,包括返回类型、方法名和参数列表。例如: ```java ...
在子类中,除了重写父类的抽象方法外,子类还可以定义自己的属性,或者覆盖父类的非final属性。这允许子类根据自身的需求定制行为和状态。子类可以通过`super`关键字调用父类的构造函数,确保初始化时父类的属性得到...
如果一个类包含至少一个抽象方法,那么该类必须被声明为抽象类。例如: ```java public abstract class Shape { abstract float area(); } ``` 在这个例子中,`Shape`类定义了一个抽象方法`area()`,没有提供具体...
5. **静态方法**:抽象类中可以包含静态方法,静态方法属于类而不是类的实例,因此与抽象类的实例化无关。 6. **抽象类与内部类**:除了顶级类,内部类也可以声明为抽象的。这样做时,外部类不必也是抽象的,但如果...
抽象类的主要特点是包含至少一个抽象方法,这些方法没有具体的实现,只定义了方法签名。抽象类本身不能被实例化,只能通过其子类来实例化。 首先,我们来探讨一下为什么需要使用抽象类。在面向对象编程中,类是对...
5. 抽象类可以继承其他抽象类或接口。 抽象类的应用: 1. 抽象类可以用来定义一个公共的父类,以便于子类继承和实现。 2. 抽象类可以包含一些公共的方法和变量,以便于子类使用。 3. 抽象类可以用来定义一个接口,...
也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。 3.abstract ...
5. 构造方法:抽象类可以有构造方法,用于初始化子类共享的属性;接口不能有构造方法。 6. 继承关系:抽象类遵循传统的继承关系,接口之间可以采用多重继承,即一个接口可以继承多个其他接口。 在实际开发中,我们...
本篇文章将详细讲解抽象类、抽象方法、final关键字以及接口。 首先,抽象类是一种不能被实例化的类,它通常包含至少一个抽象方法。抽象方法是一个只有声明而没有具体实现的方法,它使用`abstract`关键字进行标识。...
在抽象类中,可以包含零个或多个抽象方法,也可以包含非抽象的方法。抽象方法是没有实现体的方法,仅包含方法签名。当一个类包含抽象方法时,这个类也必须被声明为抽象的。抽象类可以使用构造方法,但是这些构造方法...
- 抽象类中的非抽象方法可以是final的,防止子类重写,但抽象方法不能是final的。 13. **实现多个接口**: - 抽象类可以实现多个接口,获取多个接口的特性。 14. **静态内部类**: - 抽象类可以包含静态内部类...