2016-10-18 16:58
@Noobs jfinal 的做法考虑了更多的应用场景,尤其是为了让开发者在写代码的时候体验更好
2016-10-18 16:53
@Noobs 用如下几行代码做个测试,可以验证我前面贴出的 jfinal 源码:
String timeStampPattern = "yyyy-MM-dd HH:mm:ss";
String s = "2011-11-22 9:8:7";
Date d = new SimpleDateFormat(timeStampPattern).parse(s);
System.out.println(d);
会看到输出结果中有 09:08:07 数据,证明时分秒是在的
2016-10-18 16:46
失去时分秒并不是这个原因引起的,因为 getModel 方法最底层利的 TypeConverter.java 这个类进行的转换,注意看一下里面有关对 Date 的转换源代码,会先判断你字段的长度,然后优先会转成 Timestamp
所以解决方案极其简单,让表单中提供的 time 满足这个格式:"yyyy-MM-dd HH:mm:ss"
以外我再将 jfinal 这部分源码copy来此,你一看便知,与类型无关:
if (type == java.util.Date.class) {
if (s.length() >= timeStampLen) {
return new SimpleDateFormat(timeStampPattern).parse(s);
}
else {
return new SimpleDateFormat(datePattern).parse(s);
}
}
注意看这个 if 语句,先是优先转换为 timestamp
2016-10-18 16:35
因为 java.util.Date 是 java.sql.Timestamp 父类,你可以对这类字段直接 setXxx(new Date()),而不用去苦哈哈去创建一个 Timestamp 对象,得这样写:
timestamp = new Timestamp(new Date().getTime()); 然后再
setXxx(timestamp) 在功能上与 jfinal 现在的做法是一样的,何必舍简求繁?
生成器的扩展极其简单,直接创建继承类,覆盖掉父类的相关方法即可,jfinal 所有生成器是面向扩展设计的,所有属性与方法是 protected 的,继承即可扩展
2016-10-18 16:27
不可以不继承,struts 2 用过三年多的时间,他的可以不继承 ActionSupport 的搞法,理想上是去除去框架的依赖,但是这样搞却要去依赖 ActionContext 这样的东东
这种对框架的 “必要” 的依赖是逃不掉的,在某一个地方暂时性的逃掉了,但在后面某处必然要补回来,例如通过 ActionContext.getContent() 这样的静态方法给补回来,出来混迟早要还的
所以, jfinal 并不避讳让用户的代码有轻量的依赖,例如,你的控制层可以是继承 Controller,而你希望的可独立运行于其它环境的控制层完全不需要依赖 jfinal,所以在 jfinal 的世界观里面,对框架的绑定在某个地方必不可少,并且是使用框架所提供功能的必要手段,但你可以将需要独立的地方独立出来,例如业务层,可以与任何框架毫无依赖关系
2016-10-18 11:40
别折腾得这么麻烦,直接下载本站的 jquery form 文件:http://www.jfinal.com/assets/jquery_form/jquery.form.min.js 然后用下面几行代码搞定:
$(document).ready(function() {
$("#myArticleForm").ajaxForm({
dataType: "json"
, success: function(ret) {}
, error: function(ret) {}
});
});
这行代码的两个关键点注意一下:
1:注意页面 form 表单的 id 属性为:myArticleForm,这个可以改,注意对上js中的选择器使用的名称就好,也可以使用别的选择器
2:注意页面 form 表单需要设置 method 与 enctype 属性: method="POST" enctype="multipart/form-data"
2016-10-18 11:32
以上介绍的方式中,有几个关键点:
1:去掉 Account 这些个 model 中的 public Account dao 对象创建,首先是避免有人误用,引发线程安全问题,其次是在强调所有数据库操作放在业务中,而不是张口就来写 sql, Account.dao.find(sql) 这种代码永远不要出现,而是要先在 service 层中创建一个方法,在此方法中 dao.find(sql),别处需要使用的就转调这个业务方法
2:dao 对象只存在于业务层,业务层以外永远不要出现数据库查询这样的代码,让业务层承载所有的数据库查询,当某个数据库查询的功能还没有的时候,就在相应的 Serivce 业中创建一个,如果没有合适的 serivce 类,则创建一个
养成好的业务层构建习惯,用上三天,就会知道这样做的巨大好处