1 MVC架構,設計精巧,使用簡單java
2 遵循COC原則,零配置,無xmlmysql
3 首創Db + Record模式,靈活便利git
4 ActiveRecord支持,使數據庫開發極致快速web
5 自動加載修改後的Java文件,開發過程當中無需重啓web serversql
6 AOP支持,攔截器配置靈活,功能強大數據庫
7 Plugin體系結構,擴展性強json
8 多視圖支持,支持FreeMarker、JSP、Velocity後端
9 強大的Validator後端校驗功能架構
10 功能齊全,擁有struts2的絕大部分功能app
11 體積小僅218K,且無第三方依賴
**1.項目結構: **
2. 配置文件a_little_config.txt:
jdbcUrl = jdbc:mysql://localhost/jfinal_demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull user = root password =123456 devMode = true
3. web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <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> </web-app>
4. DemoConfig:
/** * API引導式配置 */ public class DemoConfig extends JFinalConfig { /** * 配置常量 */ public void configConstant(Constants me) { // 加載少許必要配置文件,隨後可用PropKit.get(...)獲取值 PropKit.use("a_little_config.txt"); //設置是否開發模式 me.setDevMode(PropKit.getBoolean("devMode", false)); //設置字符集 me.setEncoding("UTF-8"); } /** * 配置路由 */ public void configRoute(Routes me) { me.add("/", IndexController.class, "/index"); // 第三個參數爲該Controller的視圖存放路徑 me.add("/blog", BlogController.class); // 第三個參數省略時默認與第一個參數值相同,在此即爲 "/blog" } /** * 配置引擎 */ public void configEngine(Engine engine) { } /** * 配置插件 */ public void configPlugin(Plugins me) { // 配置C3p0數據庫鏈接池插件 DruidPlugin druidPlugin = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim()); me.add(druidPlugin); // 配置ActiveRecord插件 ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin); // 全部映射在 MappingKit 中自動化搞定 _MappingKit.mapping(arp); me.add(arp); } public static DruidPlugin createDruidPlugin() { return new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim()); } /** * 配置全局攔截器 */ public void configInterceptor(Interceptors me) { } /** * 配置處理器 */ public void configHandler(Handlers me) { } }
5. _JFinalDemoGenerator:
/** * 在數據庫表有任何變更時,運行一下 main 方法,極速響應變化進行代碼重構 */ public class _JFinalDemoGenerator { public static DataSource getDataSource() { PropKit.use("a_little_config.txt"); DruidPlugin druidPlugin = DemoConfig.createDruidPlugin(); druidPlugin.start(); return druidPlugin.getDataSource(); } public static void main(String[] args) { // base model 所使用的包名 String baseModelPackageName = "com.demo.model.base"; // base model 文件保存路徑 String baseModelOutputDir = PathKit.getWebRootPath() + "/src/main/java/com/demo/model/base"; // model 所使用的包名 (MappingKit 默認使用的包名) String modelPackageName = "com.demo.model"; // model 文件保存路徑 (MappingKit 與 DataDictionary 文件默認保存路徑) String modelOutputDir = baseModelOutputDir + "/src/main"; // 建立生成器 Generator generator = new Generator(getDataSource(), baseModelPackageName, baseModelOutputDir, modelPackageName, modelOutputDir); // 設置是否生成鏈式 setter 方法 generator.setGenerateChainSetter(false); // 添加不須要生成的表名 generator.addExcludedTable("adv"); // 設置是否在 Model 中生成 dao 對象 generator.setGenerateDaoInModel(true); // 設置是否生成鏈式 setter 方法 generator.setGenerateChainSetter(true); // 設置是否生成字典文件 generator.setGenerateDataDictionary(false); // 設置須要被移除的表名前綴用於生成modelName。例如表名 "osc_user",移除前綴 "osc_"後生成的model名爲 "User"而非 OscUser generator.setRemovedTableNamePrefixes("t_"); // 生成 generator.generate(); } }
6. BlogController:
/** * BlogController * 全部 sql 與業務邏輯寫在 Model 或 Service 中,不要寫在 Controller 中,養成好習慣,有利於大型項目的開發與維護 */ @Before(BlogInterceptor.class) public class BlogController extends Controller { static BlogService service = new BlogService(); public void index() { //以json形式返回數據 renderJson(service.paginate(getParaToInt(0, 1), 10)); } }
7. BlogService
/** * BlogService * 全部 sql 與業務邏輯寫在 Service 中,不要放在 Model 中,更不 * 要放在 Controller 中,養成好習慣,有利於大型項目的開發與維護 */ public class BlogService { /** * 全部的 dao 對象也放在 Service 中 */ private static final Blog dao = new Blog().dao(); public Page<Blog> paginate(int pageNumber, int pageSize) { return dao.paginate(pageNumber, pageSize, "select *", "from blog order by id asc"); } public Blog findById(int id) { return dao.findById(id); } public void deleteById(int id) { dao.deleteById(id); } }
8. BlogInterceptor
/** * BlogInterceptor * 此攔截器僅作爲示例展現,在本 demo 中並不須要 */ public class BlogInterceptor implements Interceptor { public void intercept(Invocation inv) { System.out.println("Before invoking " + inv.getActionKey()); inv.invoke(); System.out.println("After invoking " + inv.getActionKey()); }