2016-10-30 17:46
在详细了解了那篇博文之后,我再给出如下的认知,补充那篇博文里面所说的:
1:假定你的资源路径使用的是相对路径,也就是说没有以 "/" 打头,或者是没有以 "http://" 打头的路径
2:根据 java web 规范,资源的最终路径会跟着地址栏当前路径去变化,例如,你的某个资源是 <img src="abc.jpg">
3:假定你当前地址栏里面是 "localhost/xxx" 那么资源的最终路径会变成: "locahost/xxx/abc.jpg",而当地址栏里面的路径是 "localhost/yyy" 的时候,你的资源最终路径会立即变成 "/localhost/yyy/abc.jpg"
4:这个问题与 jfinal 毫无关系,无论你用的什么 java 开发框架都是这个行为,是需要自己先有个认知
解决办法无非就是两个:
1:资源使用绝对路径,以 "/" 打头,或者以 "http://" 打头,并且将 contextpath 设置为 "" 值
2:否则就需要在资源路径前面使用一个变量,例如: <img src="${CONTEXT_PATH}abc.jpg"> 然后将这个 CONTEXT_PATH 始终赋上正确的值即可
很显然方法一最省事,不折腾
2016-10-30 00:18
@lyh061619 在业务层创建 dao 是可以的,但仍然不要去调用它的 dao.put/save/update/set 之类的方法,这个对象是共享的,不是线程安全的, java 这门语言是多线程语言,必须要考虑对象在多线程共享情况下的线程安全问题,这是极其重要的java基础知识,必须要对java 线程极其熟悉才能写出健壮的程序
2016-10-29 22:39
@lyh061619 去掉 final 没有意义,虽然这里不是 static 的,但是如果多线程使用的是同一个 LogService 对象,那么与使用 static 在本质上是一样的错误,总之这里的 dao 是共享变量,不能用于 set、put、save、update 等一切写数据的操作,只能使用 find 系列的方法
2016-10-29 17:37
@johnhan sql 可以采用外部配置文件管理起来,不一定要写在代码中,为此 jfinal 提供了 com.jfinal.plugin.activerecord.Sqls.java 这个工具类来管理
此外 jfinal 2.3 会提供一个功能非常强大的 sql 管理支持,不仅可以管理,而且可以方便地动态生成带参的 sql
2016-10-28 17:55
@Romeo jfinal 社区的 UI 我能保证做到简洁但美观方面,我不是学美术的,一定会有所欠缺,好在简洁的 UI 在美观方法也不会太差
2016-10-28 17:32
@andywei 还有一个办法是仿照 CaseInsensitiveContainerFactory 写一个 CamelCaseContainerFactory 在拿数据的时候来做个转换,转换的方法可以直接调用 com.jfinal.kit.Str.java 中的 toCamelCase(...)
2016-10-28 17:28
@andywei 因为这个配置就是通过字段名去取的值,所以最好的办法是将数据表字段也用驼峰命名,这样所有全部都统一了,三年前就已经采用这种方式为字段命名了,极爽
2016-10-28 10:52
model 采用的是 ActiveRecord 设计模式,每个 model 事先与 table 建立了关联,所以很多操作会更加便捷,例如: user.set(...).set(...).save();
而 Db + Record 是 jfinal 独创的设计模式,Record 与 table 没有关联关系,所以是在调用方法时指令的,例如: Db.save("user", new Record().set(...).set(...));
Model 也是与具体某个数据源关联的,而 Record 在使用的时候如果使用非主数据源,需要使用 Db.use(...).save(...) 这种形式来切换
此外, model 可以生成 getter、setter 符合 java bean 规范,有助于整合很多依赖于 java bean 规范的第三方
Db + Record 模式更适合于那种需要灵活查询的应用场景,例如做报表的场景,报表中的数据是跨很多 table join 起来的,这种天然就与某个特定的 table 关联不大