JFinal如何分层?想了好久都没搞明白,贴一波大神的理解

JFinal如何分层?


JFinal 项目通常建议至少 MVC 三层,Controller 是控制层,只做这几件事:
1:使用 getPara 系列方法获取请求参数
2:使用得到的 para 做为参数(如果有需要的话),调用业务层
3:将业务层调用的结果利用 setAttr 存入 request
4:render
    Model 是业务层,除了封装业务以外主要注意如下几点:
1:sql 通常需要写在业务层,controller 中不要写 sql
2:可以根据引入单独的业务层
3:Model 中的业务方通常不要是 static 方法,业务通常是对当前对象而言的,而非全局。例如有个订单 model为 Order,那么判断该订单是否已经支付则为  order.isPaid(),而非 Order.isPaid(order)
    View 是视图层,主要注意如下问题:
1:只读取并展现数据,绝对不要有业务逻辑,也不要有复杂的逻辑控制
2:当展现逻辑很复杂时,可以建立相应的 Helper 类来辅助生成 String
3:对于通用的view层辅助类,可以创建通用的工具类,全局共享使用
4:界面布局一定要使用 layout,极大减少代码冗余提升开发效率,具体可见jfinal_demo项目
   Validator 可以当做是独立于 MVC 之外的一层,起安全保护作用。访问数据库时验证用户是否重复属于业务层的事。
    关于项目模块简单划分方式:
1:根据需求设计好数据库表
2:通常根据数据库表建好相应的包以及类,例如有 user、blog两张表,那么建好 com.xxx.user、com.xxx.blog两个包,然后在各自的包下建好UserController、User、BlogController、Blog等等类。
3:访问的路由正好是表名: "/user" 、"/blog",这正好是 restful 风格。
4:对于不存在表名但需要的功能,可以抽象出资源名,然后做 controller、model


(摘自:http://www.jfinal.com/feedback/296)
jfinal 项目建议分为 MVCS 四层结构:
1:M (Model)层用 jfinal 2.2 生成,model 中不要使用 static Xxx dao 这样的对象,避免新手误用,model 中只放一些与字段状态相关的方法,例如 User 这个 model 你可以针对 status 字段,放一个 public boolean isStatusOk() 这样的方法
2:V (View)层就是展现层,尽可能只去展现数据,避免复杂逻辑
3:C (Controller)是控制层,只负责得到前端参数,转调业务层,render。避免写业务逻辑,绝不可写数据库查询之类的代码
4:最最核心是 S (service)业务层,基本上来说, 95% 以上的代码要写在这里,只要是对数据库的操作代码也全部写在这里。如果业务层以外需要操作数据库,那么也要先在业务层去创建方法,然后再让业务层以外去转调这个业务层代码,这样可实现尽可能大的代码重用
5:事务控制,我个人习惯于使用 Db.tx(...) 来做,如果要用拦截器,建议使用业务层拦截器,控制层坚持只做我前面 3 中所说的事情
6:只在需要的时候使用接口、抽象类,业务层在绝大部分情况下不需要使用接口,直接是 XxxService.java 就可以了
model 中不要创建 dao 对象以后,将 dao 对象创建在 service 层中这样来:private static Xxx dao = new Xxx(); 记得是 private,这样就防止其它业务插手本业务的事情


业务层:
public class XxxService {
public static final XxxService me = new XxxService();
final Xxx dao = new Xxx();


public Ret justDoIt(...) {
if (...)
return Ret.error("msg", "xxxx");
....
return Ret.ok(key, value);
}
}
这样做以后,外界可以这样调用:XxxService.me.justDoIt(...); dao 对象仅供 XxxService 内部使用,而且由于 me 对象是 static 的,所以内部所有其它的属性和方法都不要弄成 static 的
此外,如果用到业务层 AOP,将 new XxxService() 改成 Duang.duang(XxxService.class) 即可


package分类

出处:http://blog.csdn.net/u012995856.
config是JFinal的项目配置
controller是控制器
handler可以设置全局处理器,例如判断用户请求中是否直接请求
FreeMarker的模板文件ftl或者html的后缀,重定向到404
interceptor拦截器,例如后台admin的每项操作拦截判断admin是否有权限或者是否已经登录
model.base用于JFinal的Generator生成器自动生成数据库映射基础模型类
model用于继承基础模型类的dao操作
routes用于设置单独路由配置,例如大项目可单独设计后端路由AdminRoutes、前端路由FrontRoutes
service作为controller与model的层,处理业务逻辑
test用于项目测试
utils用于公共的工具类,例如apache poi的word在线生成打印工具
validate用于后端验证,比前端JS验证安全、靠谱


String username = user.getStr("user");//获取User数据表中字段为user的值。
String password = user.getStr("password");//获取User数据表中字段为password的值。
String sql = User.user.getSql("getUser");//将sql赋值为


public map login
Map是以键值形式存储数据,有点类似于数组。
public是一个访问修饰符
map中string是它的键,存储的类型为String
object是它的值,object为所有数据类型的父类,就是说可以存储任何类型的数据,调用时,可以进行转型
login是它的方法名
完整的应该是
public map login(){
//定义一个map,通过put进行赋值,返回
    return map;
}


Description Resource Path  Location Type
Dynamic Web Module 3.0 requires Java 1.6 or newer.


那么为什么demo和手册里面都有Model.dao这样的用法呢。
有2个好处。
1 让做数据访问时候api调用简洁快速。
2 理论上省内存,因为每一次数据访问的时候使用的是同一个对象。
但是从目前的情况来看起带来了不好的后果,很多新手有误用的情况,用静态的dao对象来承载数据并持久化,这是一个错误的用法,是非线程安全的。
简单的说,只有到选择model做数据访问的时候才能使用静态dao对象来调用api,其他做实体承载数据的,必须new Model().

你可能感兴趣的:(JFinal如何分层?想了好久都没搞明白,贴一波大神的理解)