一、JFinal初识
1 MVC架构,设计精巧,使用简单
2 遵循COC原则,零配置,无xml
3 独创Db + Record模式,灵活便利
4 ActiveRecord支持,使数据库开发极致快速
5 自动加载修改后的Java文件,开发过程中无需重启web server
6 AOP支持,拦截器配置灵活,功能强大
7 Plugin体系结构,扩展性强
8 多视图支持,支持FreeMarker、JSP、Velocity
9 强大的Validator后端校验功能
10 功能齐全,拥有struts2的绝大部分功能
11 体积小仅218K,且无第三方依赖
二、JFinal开发核心
**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());
}
三、运行结果:
四、源码
http://git.oschina.net/null_133_5373/JFinalDemo