写在前面的话
前两天听说了JFinal,简介甚是牛擦,号称java框架终结者,也是醉了,言归正传,我们就不研究他的宣传语了。不过他这个框架确实有他所说的一些特性,一起看看。
官网
JFinal 极速开发
JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。 在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率!为您节约更多时间,去陪恋人、家人和朋友 :)
JFinal有如下主要特点:
- MVC架构,设计精巧,使用简单
- 遵循COC原则,零配置,无xml
- 独创Db + Record模式,灵活便利
- ActiveRecord支持,使数据库开发极致快速
- 自动加载修改后的java文件,开发过程中无需重启web server
- AOP支持,拦截器配置灵活,功能强大
- Plugin体系结构,扩展性强
- 多视图支持,支持FreeMarker、JSP、Velocity
- 强大的Validator后端校验功能
- 功能齐全,拥有struts2的绝大部分功能
- 体积小仅248K,且无第三方依赖
注:以上全部摘自官网,勿喷,该了解的还是要了解。
JFinal+maven部署
- 首先创建一个maven本地web工程,至于怎么创建在此就不再赘述,利用eclipse或者直接mvn命令创建
- pom.xml添加相关依赖
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>com.jfinal</groupId> <artifactId>jetty-server</artifactId> <version>8.1.8</version> <scope>provided</scope> <exclusions> <exclusion> <artifactId>jetty-server</artifactId> <groupId>org.eclipse.jetty</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.jfinal</groupId> <artifactId>jfinal</artifactId> <version>1.9</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.20</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.16</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.20</version> </dependency> <dependency> <groupId>com.jfinal</groupId> <artifactId>cos</artifactId> <version>26Dec2008</version> </dependency> </dependencies>
3. web.xml添加如下代码
<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.jfinal.config.DemoConfig</param-value> </init-param> </filter> <filter-mapping> <filter-name>jfinal</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
4. 创建一个JFinal入口配置文件DemoConfig,需要继承JFinal的JFinalConfig类
package com.demo.jfinal.config; import java.util.Properties; import com.demo.jfinal.controller.BlogController; import com.demo.jfinal.controller.HelloController; import com.demo.jfinal.model.Blog; import com.jfinal.config.Constants; import com.jfinal.config.Handlers; import com.jfinal.config.Interceptors; import com.jfinal.config.JFinalConfig; import com.jfinal.config.Plugins; import com.jfinal.config.Routes; import com.jfinal.core.JFinal; import com.jfinal.ext.handler.ContextPathHandler; import com.jfinal.plugin.activerecord.ActiveRecordPlugin; import com.jfinal.plugin.c3p0.C3p0Plugin; import com.jfinal.render.FreeMarkerRender; import com.jfinal.render.ViewType; /** * @author jack.song * @time 2014年12月26日 */ public class DemoConfig extends JFinalConfig{ @Override public void configConstant(Constants arg0) { arg0.setDevMode(true);//开发模式设置 arg0.setBaseViewPath("template");//页面模板根路径 arg0.setFreeMarkerViewExtension(".ftl");//freemarker 模板后缀名 } @Override public void configHandler(Handlers arg0) { arg0.add(new ContextPathHandler("base"));//添加项目contextPath,以便在页面直接获取该值 ${base?if_exists} } @Override public void configInterceptor(Interceptors arg0) { // TODO Auto-generated method stub } @Override public void configPlugin(Plugins me) { loadPropertyFile("common_config.txt");//添加相关插件,读取配置文件 C3p0Plugin c3p0Plugin = new C3p0Plugin(getProperty("jdbcUrl"), getProperty("user"), getProperty("password")); me.add(c3p0Plugin); ActiveRecordPlugin arp = new ActiveRecordPlugin(c3p0Plugin); me.add(arp); arp.addMapping("blog", Blog.class);//添加相关model配置 } @Override public void configRoute(Routes arg0) { arg0.add("/", HelloController.class);//添加项目路由,类似于struts的action 配置文件,此处配置controller名,action名称对应方法名 arg0.add("/blog", BlogController.class); } public void afterJFinalStart() { Properties p = loadPropertyFile("freemarker.properties");//由于我们用到freemarker,所以在此进行freemarker配置文件的装载 FreeMarkerRender.setProperties(p); } /** * 建议使用 JFinal 手册推荐的方式启动项目 * 运行此 main 方法可以启动项目,此main方法可以放置在任意的Class类定义中,不一定要放于此 */ public static void main(String[] args) { JFinal.start("src/main/webapp", 80, "/", 5);//启动配置项 } }
5. 上一步中为JFinal的主要入口类,我们必须创建它,并进行相应的配置改动,其中的common_config.txt,freemarker.properties附下
##common_config.txt jdbcUrl = jdbc:mysql://127.0.0.1/jfinal_demo?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull user = root password = password
#freemarker.properties default_encoding=utf-8 #for production environment template_exception_handler=ignore #for testing #template_exception_handler=DEBUG template_update_delay=5 auto_import=/macros/demo.ftl as demo locale=no_NO datetime_format=yyyy-MM-dd HH:mm:ss date_format=yyyy-MM-dd number_format=#.##
6. 创建第一个controller,需要继承JFinal的controller 类
package com.demo.jfinal.controller; import com.jfinal.core.Controller; /** * @author jack.song * @time 2014年12月26日 */ public class HelloController extends Controller { public void index(){ render("/index.ftl"); } }
7. 创建index.ftl
<@demo.layout> <h1>JFinal Demo 项目首页</h1> <div class="table_box"> <p>欢迎来到 JFinal极速开发世界!</p> <br><br><br> 本Demo采用FreeMarker 作为视图文件,您还可以使用Jsp、Velocity或自定义类型视图。 点击<a href="${base?if_exists}/blog"><b>此处</b></a>开始试用Demo。 <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> <br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/><br/> </div> </@demo.layout>
8. 上一步中的layout是freemarker的宏定义,代码如下
<#assign staticCssPath="${base}/static/css/"/> <#assign staticImgPath="${base}/static/img/"/> <#macro layout> <!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xml:lang="zh-CN" xmlns="http://www.w3.org/1999/xhtml" lang="zh-CN"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> <link href="${staticCssPath}manage.css" media="screen" rel="stylesheet" type="text/css" /> </head> <body> <div class="manage_container"> <div class="manage_head"> <div class="manage_logo"><a href="http://www.jfinal.com">JFinal web framework</a></div> <div id="nav"> <ul> <li><a href="${base?if_exists}/"><b>首页</b></a></li> <li><a href="${base?if_exists}/blog"><b>Blog管理</b></a></li> </ul> </div> </div> <div class="main"> <#nested> </div> </div> </body> </html> </#macro> <#macro paginate currentPage totalPage actionUrl urlParas=""> <#if (totalPage <= 0) || (currentPage > totalPage)><#return></#if> <#local startPage = currentPage - 4> <#if (startPage < 1)><#local startPage = 1></#if> <#local endPage = currentPage + 4> <#if (endPage > totalPage)><#local endPage = totalPage></#if> <div class="pagination"> <#if (currentPage <= 8)> <#local startPage = 1> </#if> <#if ((totalPage - currentPage) < 8)> <#local endPage = totalPage> </#if> <#if (currentPage == 1)> <span class="disabled prev_page">上页</span> <#else> <a href="${actionUrl}#{currentPage - 1}${urlParas!}" class="prev_page">上页</a> </#if> <#if (currentPage > 8)> <a href="${actionUrl}#{1}${urlParas!}">#{1}</a> <a href="${actionUrl}#{2}${urlParas!}">#{2}</a> <span class="gap">…</span> </#if> <#list startPage..endPage as i> <#if currentPage == i> <span class="current">#{i}</span> <#else> <a href="${actionUrl}#{i}${urlParas!}">#{i}</a> </#if> </#list> <#if ((totalPage - currentPage) >= 8)> <span class="gap">…</span> <a href="${actionUrl}#{totalPage - 1}${urlParas!}">#{totalPage - 1}</a> <a href="${actionUrl}#{totalPage}${urlParas!}">#{totalPage}</a> </#if> <#if (currentPage == totalPage)> <span class="disabled next_page">下页</span> <#else> <a href="${actionUrl}#{currentPage + 1}${urlParas!}" class="next_page" rel="next">下页</a> </#if> </div> </#macro>
9. 启动
eclipse用run as 配置Main class为com.jfinal.core.JFinal
或者直接jetty配置启动如下图
上述就是一些简单的部署启动步骤,由于是入门级,所以比较简单,一些代码也为直接放出,但是在此给出整个demo的代码,大家可以下载直接浏览
demo实例下载地址:TestJFinal.rar
总结:初步感觉JFinal确实比较快速,易学,以及一站化(前端+ORM),但是有比较大的侵入性,比如必须继承之类的
转载请注明出处http://blog.csdn.net/abudexiatian/article/details/42234617